From b8078bb673e89573a218d0bc4dbb6979675b2cc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Ros=C5=82aniec?= Date: Sun, 24 May 2026 07:24:30 +0000 Subject: [PATCH 1/3] chore: extract v1 random beacon to keep-core-v1 repo Move docs-v1/ and solidity-v1/ into a new dedicated repository threshold-network/keep-core-v1 to reduce this repo's footprint and remove dead-weight CI paths, CODEOWNERS noise, and pre-commit hooks that target inert legacy code. - Remove docs-v1/ and solidity-v1/ trees. - Remove scripts/install-v1.sh (only set up v1 truffle migrations). - Remove crytic-config.json (only pointed at solidity-v1). - Preserve docs-v1/development/go-guidelines.adoc under docs/development/ since it documents Go code that still lives here. - Strip v1 entries from CODEOWNERS, .dockerignore, paths-ignore / path-filter in client workflow, and v1-specific pre-commit hooks. - Drop the v1 npm install from scripts/macos-setup.sh, keep the generic npm install (v2 contracts still need it). - Repoint narrative links in README.adoc, docs/retired-components.md, docs/development/README.adoc and solidity/random-beacon/README.adoc at the new keep-core-v1 repository. The historical solc-input deployment artifacts under solidity/random-beacon/deployments/ and solidity/ecdsa/deployments/ still reference 'solidity-v1' inside frozen compiler metadata; those are immutable build artifacts and are intentionally left untouched. Likewise, solidity/random-beacon/contracts/libraries/BytesLib.sol keeps a permalink-by-commit-SHA pointer to the original v1 source in keep-network/keep-core; that link remains valid. --- .dockerignore | 1 - .github/workflows/client.yml | 4 +- .pre-commit-config.yaml | 18 - CODEOWNERS | 33 - README.adoc | 44 +- crytic-config.json | 3 - docs-v1/.gitignore | 9 - docs-v1/Makefile | 27 - docs-v1/README.adoc | 7 - docs-v1/development-process.adoc | 151 - docs-v1/development/README.adoc | 125 - docs-v1/development/local-keep-network.adoc | 647 - docs-v1/glossary.adoc | 62 - docs-v1/img-src/libp2p-join.tikz | 23 - docs-v1/img-src/relay-diagram.tikz | 55 - .../relay-entry-request-processing.tikz | 28 - docs-v1/img-src/relay-entry-verification.tikz | 20 - docs-v1/img-src/relay-group-assignment.tikz | 17 - .../img-src/relay-group-initialization.tikz | 36 - docs-v1/img-src/relay-group-setup.tikz | 54 - docs-v1/img-src/startup-diagram.tikz | 14 - docs-v1/monitoring-and-alerting.adoc | 97 - docs-v1/random-beacon/README.adoc | 30 - docs-v1/random-beacon/alt_bn128.adoc | 48 - docs-v1/random-beacon/authorizations.adoc | 197 - docs-v1/random-beacon/beacon-pricing.py | 147 - docs-v1/random-beacon/contract-structure.adoc | 112 - docs-v1/random-beacon/delegation-notes.adoc | 544 - docs-v1/random-beacon/dkg/alternative.adoc | 428 - docs-v1/random-beacon/dkg/concepts.adoc | 50 - docs-v1/random-beacon/dkg/dkg.py | 397 - docs-v1/random-beacon/dkg/dkg_bls.py | 240 - docs-v1/random-beacon/dkg/dkg_util.py | 235 - docs-v1/random-beacon/dkg/index.adoc | 428 - docs-v1/random-beacon/dkg/notes.adoc | 257 - docs-v1/random-beacon/dkg/terms.adoc | 148 - docs-v1/random-beacon/glossary.adoc | 62 - .../random-beacon/group-expiration/index.adoc | 532 - .../random-beacon/group-expiration/terms.adoc | 1 - .../group-selection/general.adoc | 207 - .../random-beacon/group-selection/index.adoc | 311 - .../random-beacon/group-selection/terms.adoc | 1 - docs-v1/random-beacon/group_selection.py | 242 - docs-v1/random-beacon/incentives.adoc | 394 - docs-v1/random-beacon/index.adoc | 172 - docs-v1/random-beacon/misbehavior.adoc | 332 - docs-v1/random-beacon/pricing.adoc | 341 - docs-v1/random-beacon/signing/index.adoc | 114 - docs-v1/random-beacon/signing/sign.py | 72 - docs-v1/random-beacon/signing/terms.adoc | 1 - docs-v1/random-beacon/slashing.adoc | 206 - docs-v1/random-beacon/staking/index.adoc | 529 - docs-v1/random-beacon/staking/notes.adoc | 350 - docs-v1/random-beacon/terms.adoc | 153 - docs-v1/random-beacon/upgrades.adoc | 81 - docs-v1/relay-states.tex | 134 - .../rfc-1-network-security-requirements.adoc | 217 - .../rfc/rfc-11-upgrade-authorizations.adoc | 461 - .../rfc/rfc-12-keep-network-interface.adoc | 194 - docs-v1/rfc/rfc-13-continuous-delivery.adoc | 299 - docs-v1/rfc/rfc-14-token-grants.adoc | 739 - docs-v1/rfc/rfc-15-slashing.adoc | 447 - docs-v1/rfc/rfc-16-pricing.adoc | 551 - docs-v1/rfc/rfc-17-undelegation.adoc | 383 - .../rfc/rfc-18-files/release-flow-chart.png | Bin 348256 -> 0 bytes docs-v1/rfc/rfc-18-release-management.adoc | 490 - ...rfc-2-network-security-implementation.adoc | 197 - .../rfc-3-stake-delegation-requirements.adoc | 362 - .../rfc/rfc-4-secure-contract-upgrades.adoc | 89 - .../rfc-5-stake-delegation-specification.adoc | 243 - ...roup-expiration-minimal-specification.adoc | 97 - ...rfc-7-dkg-voting-update-specification.adoc | 80 - ...8-beacon-signature-share-verification.adoc | 125 - ...rfc-9-upgradeable-contract-components.adoc | 405 - docs-v1/rfc/rfc.adoc | 61 - docs-v1/run-random-beacon.adoc | 563 - docs-v1/scripts/generate-pngs.sh | 27 - docs-v1/scripts/package-lock.json | 154 - docs-v1/scripts/package.json | 6 - docs-v1/scripts/yellowpaper-probabilities.js | 68 - .../2020-11-11-retro-geth-hardfork.adoc | 125 - .../tbtc-2020-09-15-to-2020-10-13.adoc | 330 - docs/development/README.adoc | 2 +- .../development/go-guidelines.adoc | 0 docs/retired-components.md | 17 +- scripts/install-v1.sh | 85 - scripts/macos-setup.sh | 3 +- solidity-v1/.babelrc | 3 - solidity-v1/.eslintrc | 15 - solidity-v1/.soliumrc.json | 17 - solidity-v1/Makefile | 16 - solidity-v1/README.md | 7 - solidity-v1/contracts/.gitignore | 1 - .../contracts/AdaptiveStakingPolicy.sol | 98 - solidity-v1/contracts/Authorizations.sol | 171 - .../contracts/BeaconBackportRewards.sol | 148 - solidity-v1/contracts/BeaconRewards.sol | 239 - solidity-v1/contracts/Escrow.sol | 45 - solidity-v1/contracts/GasPriceOracle.sol | 103 - solidity-v1/contracts/GrantStakingPolicy.sol | 15 - .../GuaranteedMinimumStakingPolicy.sol | 64 - solidity-v1/contracts/IRandomBeacon.sol | 106 - .../contracts/KeepRandomBeaconOperator.sol | 827 - .../contracts/KeepRandomBeaconService.sol | 304 - .../KeepRandomBeaconServiceImplV1.sol | 540 - solidity-v1/contracts/KeepRegistry.sol | 235 - solidity-v1/contracts/KeepToken.sol | 51 - solidity-v1/contracts/ManagedGrant.sol | 192 - solidity-v1/contracts/ManagedGrantFactory.sol | 172 - solidity-v1/contracts/Migrations.sol | 23 - .../contracts/PermissiveStakingPolicy.sol | 23 - solidity-v1/contracts/PhasedEscrow.sol | 283 - solidity-v1/contracts/Rewards.sol | 731 - solidity-v1/contracts/StakeDelegatable.sol | 61 - solidity-v1/contracts/StakingPortBacker.sol | 290 - solidity-v1/contracts/TokenGrant.sol | 596 - solidity-v1/contracts/TokenGrantStake.sol | 109 - solidity-v1/contracts/TokenSender.sol | 10 - solidity-v1/contracts/TokenStaking.sol | 702 - .../contracts/cryptography/AltBn128.sol | 587 - solidity-v1/contracts/cryptography/BLS.sol | 63 - .../contracts/examples/CallbackContract.sol | 19 - .../KeepRandomBeaconServiceUpgradeExample.sol | 56 - solidity-v1/contracts/geyser/IStaking.sol | 47 - .../contracts/geyser/KeepTokenGeyser.sol | 101 - solidity-v1/contracts/geyser/KeepVault.sol | 39 - solidity-v1/contracts/geyser/TokenGeyser.sol | 687 - solidity-v1/contracts/geyser/TokenPool.sol | 46 - .../contracts/libraries/RolesLookup.sol | 92 - .../libraries/grant/UnlockingSchedule.sol | 29 - .../operator/DKGResultVerification.sol | 118 - .../libraries/operator/DelayFactor.sol | 50 - .../libraries/operator/GroupSelection.sol | 400 - .../contracts/libraries/operator/Groups.sol | 474 - .../libraries/operator/Reimbursements.sol | 67 - .../libraries/staking/GrantStaking.sol | 166 - .../contracts/libraries/staking/LockUtils.sol | 85 - .../contracts/libraries/staking/Locks.sol | 119 - .../staking/MinimumStakeSchedule.sol | 28 - .../contracts/libraries/staking/TopUps.sol | 150 - .../KeepRandomBeaconOperatorStatistics.sol | 99 - .../stubs/DelegatedAuthorityStub.sol | 21 - .../contracts/stubs/EvilStakingPolicy.sol | 22 - .../stubs/GasPriceOracleConsumerStub.sol | 17 - .../contracts/stubs/GrantStakingStub.sol | 24 - .../contracts/stubs/GroupsExpirationStub.sol | 44 - .../contracts/stubs/GroupsSelectionStub.sol | 47 - .../contracts/stubs/GroupsTerminationStub.sol | 29 - ...pRandomBeaconOperatorBeaconRewardsStub.sol | 45 - .../KeepRandomBeaconOperatorCallbackStub.sol | 45 - .../KeepRandomBeaconOperatorDKGResultStub.sol | 57 - ...RandomBeaconOperatorGroupSelectionStub.sol | 36 - ...RandomBeaconOperatorInitializationStub.sol | 34 - ...eepRandomBeaconOperatorMisbehaviorStub.sol | 43 - ...KeepRandomBeaconOperatorPricingDKGStub.sol | 53 - ...aconOperatorPricingRewardsWithdrawStub.sol | 46 - .../KeepRandomBeaconOperatorPricingStub.sol | 57 - .../KeepRandomBeaconOperatorRewardsStub.sol | 55 - ...RandomBeaconOperatorServicePricingStub.sol | 56 - .../KeepRandomBeaconOperatorSlashingStub.sol | 32 - .../stubs/KeepRandomBeaconOperatorStub.sol | 59 - solidity-v1/contracts/stubs/LockStub.sol | 33 - .../stubs/MinimumStakeScheduleStub.sol | 11 - .../contracts/stubs/NewRewardsStub.sol | 17 - .../contracts/stubs/OldTokenStaking.sol | 149 - .../contracts/stubs/OperatorParamsStub.sol | 64 - solidity-v1/contracts/stubs/RewardsStub.sol | 148 - .../contracts/stubs/RolesLookupStub.sol | 56 - solidity-v1/contracts/stubs/TestAltBn128.sol | 449 - .../contracts/stubs/TestArrayUtils.sol | 114 - solidity-v1/contracts/stubs/TestModUtils.sol | 298 - .../stubs/TestPhasedEscrowBeneficiaries.sol | 55 - solidity-v1/contracts/stubs/TestToken.sol | 15 - .../stubs/TokenStakingSlashingStub.sol | 43 - .../contracts/stubs/TokenStakingStub.sol | 32 - .../token-distribution/TokenDistributor.sol | 258 - .../contracts/utils/AddressArrayUtils.sol | 34 - solidity-v1/contracts/utils/BytesLib.sol | 491 - solidity-v1/contracts/utils/ModUtils.sol | 114 - .../contracts/utils/OperatorParams.sol | 134 - solidity-v1/contracts/utils/PercentUtils.sol | 20 - .../contracts/utils/UintArrayUtils.sol | 21 - solidity-v1/migrations/1_initial_migration.js | 5 - solidity-v1/migrations/2_deploy_contracts.js | 184 - solidity-v1/migrations/3_initialize.js | 51 - solidity-v1/package-lock.json | 60646 ---------------- solidity-v1/package.json | 70 - solidity-v1/requirements.txt | 1 - solidity-v1/scripts/create-grants.js | 77 - solidity-v1/scripts/delegate-tokens.js | 81 - solidity-v1/scripts/etherscan-verify.sh | 37 - solidity-v1/scripts/gas-used-test.js | 41 - solidity-v1/scripts/generate-api-docs.js | 54 - solidity-v1/scripts/genesis.js | 20 - solidity-v1/scripts/keep-token-geyser-init.js | 58 - solidity-v1/scripts/lcl-client-config.js | 87 - solidity-v1/scripts/manage-stake.js | 176 - solidity-v1/scripts/misbehaved-groups.js | 51 - solidity-v1/scripts/pricing-test.js | 336 - .../request-relay-entry-with-callback.js | 52 - solidity-v1/scripts/request-relay-entry.js | 94 - solidity-v1/scripts/rewards.js | 149 - .../staking-port-backer-dapp-starter.js | 200 - solidity-v1/scripts/unlock-eth-accounts.js | 32 - solidity-v1/slither.config.json | 4 - solidity-v1/tenderly.yaml | 7 - solidity-v1/test-environment.config.js | 5 - solidity-v1/test/RolesLookupTest.js | 486 - solidity-v1/test/TestAltBn128.js | 136 - solidity-v1/test/TestArrayUtils.js | 42 - solidity-v1/test/TestBLS.js | 162 - solidity-v1/test/TestEscrow.js | 181 - solidity-v1/test/TestGasPriceOracle.js | 194 - solidity-v1/test/TestKeepRegistry.js | 574 - solidity-v1/test/TestModUtils.js | 46 - solidity-v1/test/TestOperatorParams.js | 128 - solidity-v1/test/TestPhasedEscrow.js | 1114 - solidity-v1/test/TestToken.js | 47 - .../test/geyser/TestKeepTokenGeyser.js | 427 - solidity-v1/test/geyser/TestTokenGeyser.js | 140 - solidity-v1/test/helpers/data.js | 52 - solidity-v1/test/helpers/delegateStake.js | 71 - solidity-v1/test/helpers/generateTickets.js | 22 - solidity-v1/test/helpers/grantTokens.js | 65 - solidity-v1/test/helpers/initContracts.js | 173 - solidity-v1/test/helpers/numbers.js | 35 - solidity-v1/test/helpers/packTicket.js | 17 - solidity-v1/test/helpers/shuffle.js | 9 - solidity-v1/test/helpers/signature.js | 19 - solidity-v1/test/helpers/snapshot.js | 50 - solidity-v1/test/helpers/stakeAndGenesis.js | 169 - solidity-v1/test/helpers/stakeDelegate.js | 19 - .../TestDkgMisbehavior.js | 237 - .../TestGroupExpiration.js | 331 - .../TestGroupSelection.js | 362 - .../TestGroupTermination.js | 250 - .../TestInitialization.js | 45 - .../TestManageServiceContracts.js | 80 - .../TestPricingRewards.js | 284 - .../TestPricingRewardsWithdraw.js | 381 - .../TestPublishDkgResult.js | 653 - .../random_beacon_operator/TestRelayEntry.js | 99 - .../TestRelayEntryTimeout.js | 251 - .../random_beacon_operator/TestSlashing.js | 389 - .../TestTicketsOrdering.js | 257 - .../test/random_beacon_service/TestPricing.js | 256 - .../random_beacon_service/TestPricingDkg.js | 131 - .../random_beacon_service/TestPricingFees.js | 72 - .../TestRelayRequestCallback.js | 891 - .../TestSelectOperator.js | 157 - .../test/random_beacon_service/TestUpgrade.js | 344 - .../random_beacon_service/TestViaProxy.js | 235 - .../test/rewards/TestBeaconBackportRewards.js | 169 - solidity-v1/test/rewards/TestBeaconRewards.js | 408 - .../test/rewards/TestRewardUpgrades.js | 294 - solidity-v1/test/rewards/TestRewards.js | 586 - solidity-v1/test/rewards/rewardsData.js | 61 - .../TokenDistributorTest.js | 691 - .../test/token-distribution/testData.json | 82 - .../token_grant/TestManagedGrantFactory.js | 218 - .../test/token_grant/TestStakingPolicy.js | 452 - .../test/token_grant/TestTokenGrant.js | 241 - .../token_grant/TestTokenGrantWithdraw.js | 169 - .../token_stake/TestDelegatedAuthority.js | 371 - .../test/token_stake/TestGrantStakingLib.js | 90 - solidity-v1/test/token_stake/TestLockUtils.js | 94 - .../test/token_stake/TestMinimumStake.js | 82 - .../test/token_stake/TestPunishment.js | 285 - .../test/token_stake/TestStakingPortBacker.js | 779 - .../test/token_stake/TestTokenStake.js | 1075 - .../test/token_stake/TestTokenStakeLock.js | 351 - solidity-v1/truffle-config.js | 84 - solidity/random-beacon/README.adoc | 2 +- 273 files changed, 35 insertions(+), 108038 deletions(-) delete mode 100644 crytic-config.json delete mode 100644 docs-v1/.gitignore delete mode 100644 docs-v1/Makefile delete mode 100644 docs-v1/README.adoc delete mode 100644 docs-v1/development-process.adoc delete mode 100644 docs-v1/development/README.adoc delete mode 100644 docs-v1/development/local-keep-network.adoc delete mode 100644 docs-v1/glossary.adoc delete mode 100644 docs-v1/img-src/libp2p-join.tikz delete mode 100644 docs-v1/img-src/relay-diagram.tikz delete mode 100644 docs-v1/img-src/relay-entry-request-processing.tikz delete mode 100644 docs-v1/img-src/relay-entry-verification.tikz delete mode 100644 docs-v1/img-src/relay-group-assignment.tikz delete mode 100644 docs-v1/img-src/relay-group-initialization.tikz delete mode 100644 docs-v1/img-src/relay-group-setup.tikz delete mode 100644 docs-v1/img-src/startup-diagram.tikz delete mode 100644 docs-v1/monitoring-and-alerting.adoc delete mode 100644 docs-v1/random-beacon/README.adoc delete mode 100644 docs-v1/random-beacon/alt_bn128.adoc delete mode 100644 docs-v1/random-beacon/authorizations.adoc delete mode 100644 docs-v1/random-beacon/beacon-pricing.py delete mode 100644 docs-v1/random-beacon/contract-structure.adoc delete mode 100644 docs-v1/random-beacon/delegation-notes.adoc delete mode 100644 docs-v1/random-beacon/dkg/alternative.adoc delete mode 100644 docs-v1/random-beacon/dkg/concepts.adoc delete mode 100644 docs-v1/random-beacon/dkg/dkg.py delete mode 100644 docs-v1/random-beacon/dkg/dkg_bls.py delete mode 100644 docs-v1/random-beacon/dkg/dkg_util.py delete mode 100644 docs-v1/random-beacon/dkg/index.adoc delete mode 100644 docs-v1/random-beacon/dkg/notes.adoc delete mode 100644 docs-v1/random-beacon/dkg/terms.adoc delete mode 100644 docs-v1/random-beacon/glossary.adoc delete mode 100644 docs-v1/random-beacon/group-expiration/index.adoc delete mode 100644 docs-v1/random-beacon/group-expiration/terms.adoc delete mode 100644 docs-v1/random-beacon/group-selection/general.adoc delete mode 100644 docs-v1/random-beacon/group-selection/index.adoc delete mode 100644 docs-v1/random-beacon/group-selection/terms.adoc delete mode 100644 docs-v1/random-beacon/group_selection.py delete mode 100644 docs-v1/random-beacon/incentives.adoc delete mode 100644 docs-v1/random-beacon/index.adoc delete mode 100644 docs-v1/random-beacon/misbehavior.adoc delete mode 100644 docs-v1/random-beacon/pricing.adoc delete mode 100644 docs-v1/random-beacon/signing/index.adoc delete mode 100644 docs-v1/random-beacon/signing/sign.py delete mode 100644 docs-v1/random-beacon/signing/terms.adoc delete mode 100644 docs-v1/random-beacon/slashing.adoc delete mode 100644 docs-v1/random-beacon/staking/index.adoc delete mode 100644 docs-v1/random-beacon/staking/notes.adoc delete mode 100644 docs-v1/random-beacon/terms.adoc delete mode 100644 docs-v1/random-beacon/upgrades.adoc delete mode 100644 docs-v1/relay-states.tex delete mode 100644 docs-v1/rfc/rfc-1-network-security-requirements.adoc delete mode 100644 docs-v1/rfc/rfc-11-upgrade-authorizations.adoc delete mode 100644 docs-v1/rfc/rfc-12-keep-network-interface.adoc delete mode 100644 docs-v1/rfc/rfc-13-continuous-delivery.adoc delete mode 100644 docs-v1/rfc/rfc-14-token-grants.adoc delete mode 100644 docs-v1/rfc/rfc-15-slashing.adoc delete mode 100644 docs-v1/rfc/rfc-16-pricing.adoc delete mode 100644 docs-v1/rfc/rfc-17-undelegation.adoc delete mode 100644 docs-v1/rfc/rfc-18-files/release-flow-chart.png delete mode 100644 docs-v1/rfc/rfc-18-release-management.adoc delete mode 100644 docs-v1/rfc/rfc-2-network-security-implementation.adoc delete mode 100644 docs-v1/rfc/rfc-3-stake-delegation-requirements.adoc delete mode 100644 docs-v1/rfc/rfc-4-secure-contract-upgrades.adoc delete mode 100644 docs-v1/rfc/rfc-5-stake-delegation-specification.adoc delete mode 100644 docs-v1/rfc/rfc-6-group-expiration-minimal-specification.adoc delete mode 100644 docs-v1/rfc/rfc-7-dkg-voting-update-specification.adoc delete mode 100644 docs-v1/rfc/rfc-8-beacon-signature-share-verification.adoc delete mode 100644 docs-v1/rfc/rfc-9-upgradeable-contract-components.adoc delete mode 100644 docs-v1/rfc/rfc.adoc delete mode 100644 docs-v1/run-random-beacon.adoc delete mode 100644 docs-v1/scripts/generate-pngs.sh delete mode 100644 docs-v1/scripts/package-lock.json delete mode 100644 docs-v1/scripts/package.json delete mode 100644 docs-v1/scripts/yellowpaper-probabilities.js delete mode 100644 docs-v1/status-reports/2020-11-11-retro-geth-hardfork.adoc delete mode 100644 docs-v1/status-reports/tbtc-2020-09-15-to-2020-10-13.adoc rename {docs-v1 => docs}/development/go-guidelines.adoc (100%) delete mode 100755 scripts/install-v1.sh delete mode 100644 solidity-v1/.babelrc delete mode 100644 solidity-v1/.eslintrc delete mode 100644 solidity-v1/.soliumrc.json delete mode 100644 solidity-v1/Makefile delete mode 100644 solidity-v1/README.md delete mode 100644 solidity-v1/contracts/.gitignore delete mode 100644 solidity-v1/contracts/AdaptiveStakingPolicy.sol delete mode 100644 solidity-v1/contracts/Authorizations.sol delete mode 100644 solidity-v1/contracts/BeaconBackportRewards.sol delete mode 100644 solidity-v1/contracts/BeaconRewards.sol delete mode 100644 solidity-v1/contracts/Escrow.sol delete mode 100644 solidity-v1/contracts/GasPriceOracle.sol delete mode 100644 solidity-v1/contracts/GrantStakingPolicy.sol delete mode 100644 solidity-v1/contracts/GuaranteedMinimumStakingPolicy.sol delete mode 100644 solidity-v1/contracts/IRandomBeacon.sol delete mode 100644 solidity-v1/contracts/KeepRandomBeaconOperator.sol delete mode 100644 solidity-v1/contracts/KeepRandomBeaconService.sol delete mode 100644 solidity-v1/contracts/KeepRandomBeaconServiceImplV1.sol delete mode 100644 solidity-v1/contracts/KeepRegistry.sol delete mode 100644 solidity-v1/contracts/KeepToken.sol delete mode 100644 solidity-v1/contracts/ManagedGrant.sol delete mode 100644 solidity-v1/contracts/ManagedGrantFactory.sol delete mode 100644 solidity-v1/contracts/Migrations.sol delete mode 100644 solidity-v1/contracts/PermissiveStakingPolicy.sol delete mode 100644 solidity-v1/contracts/PhasedEscrow.sol delete mode 100644 solidity-v1/contracts/Rewards.sol delete mode 100644 solidity-v1/contracts/StakeDelegatable.sol delete mode 100644 solidity-v1/contracts/StakingPortBacker.sol delete mode 100644 solidity-v1/contracts/TokenGrant.sol delete mode 100644 solidity-v1/contracts/TokenGrantStake.sol delete mode 100644 solidity-v1/contracts/TokenSender.sol delete mode 100644 solidity-v1/contracts/TokenStaking.sol delete mode 100644 solidity-v1/contracts/cryptography/AltBn128.sol delete mode 100644 solidity-v1/contracts/cryptography/BLS.sol delete mode 100644 solidity-v1/contracts/examples/CallbackContract.sol delete mode 100644 solidity-v1/contracts/examples/KeepRandomBeaconServiceUpgradeExample.sol delete mode 100644 solidity-v1/contracts/geyser/IStaking.sol delete mode 100644 solidity-v1/contracts/geyser/KeepTokenGeyser.sol delete mode 100644 solidity-v1/contracts/geyser/KeepVault.sol delete mode 100644 solidity-v1/contracts/geyser/TokenGeyser.sol delete mode 100644 solidity-v1/contracts/geyser/TokenPool.sol delete mode 100644 solidity-v1/contracts/libraries/RolesLookup.sol delete mode 100644 solidity-v1/contracts/libraries/grant/UnlockingSchedule.sol delete mode 100644 solidity-v1/contracts/libraries/operator/DKGResultVerification.sol delete mode 100644 solidity-v1/contracts/libraries/operator/DelayFactor.sol delete mode 100644 solidity-v1/contracts/libraries/operator/GroupSelection.sol delete mode 100644 solidity-v1/contracts/libraries/operator/Groups.sol delete mode 100644 solidity-v1/contracts/libraries/operator/Reimbursements.sol delete mode 100644 solidity-v1/contracts/libraries/staking/GrantStaking.sol delete mode 100644 solidity-v1/contracts/libraries/staking/LockUtils.sol delete mode 100644 solidity-v1/contracts/libraries/staking/Locks.sol delete mode 100644 solidity-v1/contracts/libraries/staking/MinimumStakeSchedule.sol delete mode 100644 solidity-v1/contracts/libraries/staking/TopUps.sol delete mode 100644 solidity-v1/contracts/statistics/KeepRandomBeaconOperatorStatistics.sol delete mode 100644 solidity-v1/contracts/stubs/DelegatedAuthorityStub.sol delete mode 100644 solidity-v1/contracts/stubs/EvilStakingPolicy.sol delete mode 100644 solidity-v1/contracts/stubs/GasPriceOracleConsumerStub.sol delete mode 100644 solidity-v1/contracts/stubs/GrantStakingStub.sol delete mode 100644 solidity-v1/contracts/stubs/GroupsExpirationStub.sol delete mode 100644 solidity-v1/contracts/stubs/GroupsSelectionStub.sol delete mode 100644 solidity-v1/contracts/stubs/GroupsTerminationStub.sol delete mode 100644 solidity-v1/contracts/stubs/KeepRandomBeaconOperatorBeaconRewardsStub.sol delete mode 100644 solidity-v1/contracts/stubs/KeepRandomBeaconOperatorCallbackStub.sol delete mode 100644 solidity-v1/contracts/stubs/KeepRandomBeaconOperatorDKGResultStub.sol delete mode 100644 solidity-v1/contracts/stubs/KeepRandomBeaconOperatorGroupSelectionStub.sol delete mode 100644 solidity-v1/contracts/stubs/KeepRandomBeaconOperatorInitializationStub.sol delete mode 100644 solidity-v1/contracts/stubs/KeepRandomBeaconOperatorMisbehaviorStub.sol delete mode 100644 solidity-v1/contracts/stubs/KeepRandomBeaconOperatorPricingDKGStub.sol delete mode 100644 solidity-v1/contracts/stubs/KeepRandomBeaconOperatorPricingRewardsWithdrawStub.sol delete mode 100644 solidity-v1/contracts/stubs/KeepRandomBeaconOperatorPricingStub.sol delete mode 100644 solidity-v1/contracts/stubs/KeepRandomBeaconOperatorRewardsStub.sol delete mode 100644 solidity-v1/contracts/stubs/KeepRandomBeaconOperatorServicePricingStub.sol delete mode 100644 solidity-v1/contracts/stubs/KeepRandomBeaconOperatorSlashingStub.sol delete mode 100644 solidity-v1/contracts/stubs/KeepRandomBeaconOperatorStub.sol delete mode 100644 solidity-v1/contracts/stubs/LockStub.sol delete mode 100644 solidity-v1/contracts/stubs/MinimumStakeScheduleStub.sol delete mode 100644 solidity-v1/contracts/stubs/NewRewardsStub.sol delete mode 100644 solidity-v1/contracts/stubs/OldTokenStaking.sol delete mode 100644 solidity-v1/contracts/stubs/OperatorParamsStub.sol delete mode 100644 solidity-v1/contracts/stubs/RewardsStub.sol delete mode 100644 solidity-v1/contracts/stubs/RolesLookupStub.sol delete mode 100644 solidity-v1/contracts/stubs/TestAltBn128.sol delete mode 100644 solidity-v1/contracts/stubs/TestArrayUtils.sol delete mode 100644 solidity-v1/contracts/stubs/TestModUtils.sol delete mode 100644 solidity-v1/contracts/stubs/TestPhasedEscrowBeneficiaries.sol delete mode 100644 solidity-v1/contracts/stubs/TestToken.sol delete mode 100644 solidity-v1/contracts/stubs/TokenStakingSlashingStub.sol delete mode 100644 solidity-v1/contracts/stubs/TokenStakingStub.sol delete mode 100644 solidity-v1/contracts/token-distribution/TokenDistributor.sol delete mode 100644 solidity-v1/contracts/utils/AddressArrayUtils.sol delete mode 100644 solidity-v1/contracts/utils/BytesLib.sol delete mode 100644 solidity-v1/contracts/utils/ModUtils.sol delete mode 100644 solidity-v1/contracts/utils/OperatorParams.sol delete mode 100644 solidity-v1/contracts/utils/PercentUtils.sol delete mode 100644 solidity-v1/contracts/utils/UintArrayUtils.sol delete mode 100644 solidity-v1/migrations/1_initial_migration.js delete mode 100644 solidity-v1/migrations/2_deploy_contracts.js delete mode 100644 solidity-v1/migrations/3_initialize.js delete mode 100644 solidity-v1/package-lock.json delete mode 100644 solidity-v1/package.json delete mode 100644 solidity-v1/requirements.txt delete mode 100644 solidity-v1/scripts/create-grants.js delete mode 100644 solidity-v1/scripts/delegate-tokens.js delete mode 100755 solidity-v1/scripts/etherscan-verify.sh delete mode 100644 solidity-v1/scripts/gas-used-test.js delete mode 100644 solidity-v1/scripts/generate-api-docs.js delete mode 100644 solidity-v1/scripts/genesis.js delete mode 100644 solidity-v1/scripts/keep-token-geyser-init.js delete mode 100644 solidity-v1/scripts/lcl-client-config.js delete mode 100644 solidity-v1/scripts/manage-stake.js delete mode 100644 solidity-v1/scripts/misbehaved-groups.js delete mode 100644 solidity-v1/scripts/pricing-test.js delete mode 100644 solidity-v1/scripts/request-relay-entry-with-callback.js delete mode 100644 solidity-v1/scripts/request-relay-entry.js delete mode 100644 solidity-v1/scripts/rewards.js delete mode 100644 solidity-v1/scripts/staking-port-backer-dapp-starter.js delete mode 100644 solidity-v1/scripts/unlock-eth-accounts.js delete mode 100644 solidity-v1/slither.config.json delete mode 100644 solidity-v1/tenderly.yaml delete mode 100644 solidity-v1/test-environment.config.js delete mode 100644 solidity-v1/test/RolesLookupTest.js delete mode 100644 solidity-v1/test/TestAltBn128.js delete mode 100644 solidity-v1/test/TestArrayUtils.js delete mode 100644 solidity-v1/test/TestBLS.js delete mode 100644 solidity-v1/test/TestEscrow.js delete mode 100644 solidity-v1/test/TestGasPriceOracle.js delete mode 100644 solidity-v1/test/TestKeepRegistry.js delete mode 100644 solidity-v1/test/TestModUtils.js delete mode 100644 solidity-v1/test/TestOperatorParams.js delete mode 100644 solidity-v1/test/TestPhasedEscrow.js delete mode 100644 solidity-v1/test/TestToken.js delete mode 100644 solidity-v1/test/geyser/TestKeepTokenGeyser.js delete mode 100644 solidity-v1/test/geyser/TestTokenGeyser.js delete mode 100644 solidity-v1/test/helpers/data.js delete mode 100644 solidity-v1/test/helpers/delegateStake.js delete mode 100644 solidity-v1/test/helpers/generateTickets.js delete mode 100644 solidity-v1/test/helpers/grantTokens.js delete mode 100644 solidity-v1/test/helpers/initContracts.js delete mode 100644 solidity-v1/test/helpers/numbers.js delete mode 100644 solidity-v1/test/helpers/packTicket.js delete mode 100644 solidity-v1/test/helpers/shuffle.js delete mode 100644 solidity-v1/test/helpers/signature.js delete mode 100644 solidity-v1/test/helpers/snapshot.js delete mode 100644 solidity-v1/test/helpers/stakeAndGenesis.js delete mode 100644 solidity-v1/test/helpers/stakeDelegate.js delete mode 100644 solidity-v1/test/random_beacon_operator/TestDkgMisbehavior.js delete mode 100644 solidity-v1/test/random_beacon_operator/TestGroupExpiration.js delete mode 100644 solidity-v1/test/random_beacon_operator/TestGroupSelection.js delete mode 100644 solidity-v1/test/random_beacon_operator/TestGroupTermination.js delete mode 100644 solidity-v1/test/random_beacon_operator/TestInitialization.js delete mode 100644 solidity-v1/test/random_beacon_operator/TestManageServiceContracts.js delete mode 100644 solidity-v1/test/random_beacon_operator/TestPricingRewards.js delete mode 100644 solidity-v1/test/random_beacon_operator/TestPricingRewardsWithdraw.js delete mode 100644 solidity-v1/test/random_beacon_operator/TestPublishDkgResult.js delete mode 100644 solidity-v1/test/random_beacon_operator/TestRelayEntry.js delete mode 100644 solidity-v1/test/random_beacon_operator/TestRelayEntryTimeout.js delete mode 100644 solidity-v1/test/random_beacon_operator/TestSlashing.js delete mode 100644 solidity-v1/test/random_beacon_operator/TestTicketsOrdering.js delete mode 100644 solidity-v1/test/random_beacon_service/TestPricing.js delete mode 100644 solidity-v1/test/random_beacon_service/TestPricingDkg.js delete mode 100644 solidity-v1/test/random_beacon_service/TestPricingFees.js delete mode 100644 solidity-v1/test/random_beacon_service/TestRelayRequestCallback.js delete mode 100644 solidity-v1/test/random_beacon_service/TestSelectOperator.js delete mode 100644 solidity-v1/test/random_beacon_service/TestUpgrade.js delete mode 100644 solidity-v1/test/random_beacon_service/TestViaProxy.js delete mode 100644 solidity-v1/test/rewards/TestBeaconBackportRewards.js delete mode 100644 solidity-v1/test/rewards/TestBeaconRewards.js delete mode 100644 solidity-v1/test/rewards/TestRewardUpgrades.js delete mode 100644 solidity-v1/test/rewards/TestRewards.js delete mode 100644 solidity-v1/test/rewards/rewardsData.js delete mode 100644 solidity-v1/test/token-distribution/TokenDistributorTest.js delete mode 100644 solidity-v1/test/token-distribution/testData.json delete mode 100644 solidity-v1/test/token_grant/TestManagedGrantFactory.js delete mode 100644 solidity-v1/test/token_grant/TestStakingPolicy.js delete mode 100644 solidity-v1/test/token_grant/TestTokenGrant.js delete mode 100644 solidity-v1/test/token_grant/TestTokenGrantWithdraw.js delete mode 100644 solidity-v1/test/token_stake/TestDelegatedAuthority.js delete mode 100644 solidity-v1/test/token_stake/TestGrantStakingLib.js delete mode 100644 solidity-v1/test/token_stake/TestLockUtils.js delete mode 100644 solidity-v1/test/token_stake/TestMinimumStake.js delete mode 100644 solidity-v1/test/token_stake/TestPunishment.js delete mode 100644 solidity-v1/test/token_stake/TestStakingPortBacker.js delete mode 100644 solidity-v1/test/token_stake/TestTokenStake.js delete mode 100644 solidity-v1/test/token_stake/TestTokenStakeLock.js delete mode 100644 solidity-v1/truffle-config.js diff --git a/.dockerignore b/.dockerignore index 9c48e7b076..6f381299e4 100644 --- a/.dockerignore +++ b/.dockerignore @@ -17,7 +17,6 @@ Dockerfile **/node_modules/* # Solidity stuff. -solidity-v1/ solidity/ # Token Stakedrop stuff. diff --git a/.github/workflows/client.yml b/.github/workflows/client.yml index 7daced9b82..468686798a 100644 --- a/.github/workflows/client.yml +++ b/.github/workflows/client.yml @@ -7,12 +7,10 @@ on: branches: - main paths-ignore: - - "docs-v1/**" - "docs/**" - "infrastructure/**" - "scripts/**" - "solidity/**" - - "solidity-v1/**" pull_request: workflow_dispatch: inputs: @@ -45,7 +43,7 @@ jobs: with: filters: | path-filter: - - './!((docs-v1|docs|infrastructure|scripts|solidity|solidity-v1)/**)' + - './!((docs|infrastructure|scripts|solidity)/**)' electrum-integration-detect-changes: runs-on: ubuntu-latest diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e0de398304..344fb1e331 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -30,24 +30,6 @@ repos: files: '\.(json|yaml)$' language: script description: "Checks JSON/YAML code according to the package's linter configuration" - - id: lint-js-v1 - name: 'lint solidity-v1 js' - entry: /usr/bin/env bash -c "cd solidity-v1 && npm run lint:js" - files: 'solidity-v1\/.*\.js$' - language: script - description: "Checks JS code according to the package's linter configuration" - - id: lint-sol-v1 - name: 'lint solidity-v1 sol' - entry: /usr/bin/env bash -c "cd solidity-v1 && npm run lint:sol" - files: 'solidity-v1\/.*\.sol$' - language: script - description: "Checks solidity code according to the package's linter configuration" - - id: format-dashboard - name: 'format dashboard' - entry: /usr/bin/env bash -c "cd solidity-v1/dashboard && npm run format" - files: 'solidity-v1/dashboard/' - language: script - description: "Checks dashboard code according to the package's formatting configuration" - id: lint-faucet-js name: 'lint faucet js' entry: /usr/bin/env bash -c "cd infrastructure/gcp/keep-test/google-functions/keep-faucet && npm run lint:js" diff --git a/CODEOWNERS b/CODEOWNERS index 899eb9e154..3e0d8a9a6d 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,35 +1,2 @@ -/solidity-v1/contracts/KeepToken.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/TokenGrant.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/TokenGrantStake.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/TokenStaking.sol @Shadowfiend @pdyraga @nkuba -/solidity-v1/contracts/StakeDelegatable.sol @Shadowfiend @pdyraga @nkuba -/solidity-v1/contracts/ManagedGrant.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/ManagedGrantFactory.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/AdaptiveStakingPolicy.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/MinimumStakingPolicy.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/GuaranteedMinimumStakingPolicy.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/PermissiveStakingPolicy.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/KeepRegistry.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/Escrow.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/KeepRandomBeaconOperator.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/KeepRandomBeaconService.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/KeepRandomBeaconServiceImplV1.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/statistics/KeepRandomBeaconOperatorStatistics.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/libraries/grant/UnlockingSchedule.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/libraries/operator/DelayFactor.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/libraries/operator/DKGResultVerification.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/libraries/operator/Groups.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/libraries/operator/GroupSelection.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/libraries/operator/Reimbursements.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/libraries/staking/GrantStaking.sol @Shadowfiend @pdyraga @nkuba -/solidity-v1/contracts/libraries/staking/LockUtils.sol @Shadowfiend @pdyraga @nkuba -/solidity-v1/contracts/libraries/staking/Locks.sol @Shadowfiend @pdyraga @nkuba -/solidity-v1/contracts/libraries/staking/MinimumStakeSchedule.sol @Shadowfiend @pdyraga @nkuba -/solidity-v1/contracts/utils/AddressArrayUtils.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/utils/BytesLib.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/utils/OperatorParams.sol @Shadowfiend @pdyraga @nkuba -/solidity-v1/contracts/utils/PercentUtils.sol @Shadowfiend @pdyraga -/solidity-v1/contracts/utils/UIntArrayUtils.sol @Shadowfiend @pdyraga -/solidity-v1/package.json @Shadowfiend @pdyraga /solidity/ecdsa/contracts/ @pdyraga @nkuba @lukasz-zimnoch @dimpar @tomaszslabon /solidity/random-beacon/contracts/ @pdyraga @nkuba @lukasz-zimnoch @dimpar @tomaszslabon diff --git a/README.adoc b/README.adoc index 5553f08c7b..f38d0c320a 100644 --- a/README.adoc +++ b/README.adoc @@ -45,10 +45,11 @@ https://github.com/keep-network/keep-core/issues[is appreciated!] === Moving to a new random beacon -The legacy core contracts of the random beacon are moved to the -link:solidity-v1/[`solidity-v1/`] directory which can be referred as "v1". The -newest "v2" random beacon contracts can be found in -link:solidity/random-beacon/[`solidity/random-beacon`] directory. The full +The legacy "v1" random beacon contracts have been moved out of this repository +and now live in +https://github.com/threshold-network/keep-core-v1[`threshold-network/keep-core-v1`] +(under its `solidity/` directory). The current "v2" random beacon contracts can +be found in link:solidity/random-beacon/[`solidity/random-beacon`]. The full specification of the "v2" random beacon is written in link:/docs/rfc/rfc-19-random-beacon-v2.adoc[`rfc-19-random-beacon-v2.adoc`]. Retired KEEP-era packages and operational tooling are listed in @@ -59,12 +60,11 @@ link:docs/retired-components.md[`docs/retired-components.md`]. dApp developers will be most interested in the smart contracts exposing Keep's on-chain facilities. -The core contracts can be found in the link:solidity-v1/[`solidity-v1/`] -directory. They can be used to request -link:solidity-v1/contracts/IRandomBeacon.sol[miner-resistant random numbers], as -well as creating and managing keeps. To generate new ECDSA key material and -request signatures, the contracts can be found in -link:solidity/ecdsa/contracts/[`solidity/ecdsa/contracts/`]. +The legacy v1 core contracts (miner-resistant random numbers, keep creation and +management) live in +https://github.com/threshold-network/keep-core-v1[`threshold-network/keep-core-v1`]. +To generate new ECDSA key material and request signatures, the contracts can be +found in link:solidity/ecdsa/contracts/[`solidity/ecdsa/contracts/`]. === Client Developers @@ -85,35 +85,33 @@ keep-core/ solidity/ <1> ecdsa/ random-beacon/ - solidity-v1/ <2> - cmd/ <3> - pkg/ <4> + cmd/ <2> + pkg/ <3> net/ - net.go, *.go <5> + net.go, *.go <4> libp2p/ chain/ - chain.go, *.go <5> + chain.go, *.go <4> ethereum/ gen/ - gen.go <6> + gen.go <5> relay/ relay.go, *.go ``` <1> Core contracts of the Keep contracts. Random beacon contracts are stored under `/solidity/random-beacon` whereas ECDSA under `/solidity/ecdsa`. -<2> Legacy core contracts of the random beacon (v1). While the Keep network only - uses Solidity at the moment, the directory structure allows for other - contract languages. -<3> Keep client subcommands are implemented here, though they should be minimal + Legacy v1 contracts live in the separate + https://github.com/threshold-network/keep-core-v1[`keep-core-v1`] repo. +<2> Keep client subcommands are implemented here, though they should be minimal and deal solely with user interaction. The meat of the commands should exist in a package fit for the appropriate purpose. -<4> All additional packages live in `pkg/`. -<5> The high-level interfaces for a package `mypackage` live in `mypackage.go`. +<3> All additional packages live in `pkg/`. +<4> The high-level interfaces for a package `mypackage` live in `mypackage.go`. `net` and `chain` are interface packages that expose a common interface to network and blockchain layers. Their subpackages provide particular implementations of these common interfaces. Only `cmd/` and the main package should interact with the implementations directly. -<6> When a package requires generated code, it should have a subpackage named +<5> When a package requires generated code, it should have a subpackage named `gen/`. This subpackage should contain a single file, `gen.go`, with a `// go:generate` annotation to trigger appropriate code generation. All code generation is done with a single invocation of `go generate` at build time. diff --git a/crytic-config.json b/crytic-config.json deleted file mode 100644 index 34cb256d2e..0000000000 --- a/crytic-config.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "cwd": "solidity-v1" -} diff --git a/docs-v1/.gitignore b/docs-v1/.gitignore deleted file mode 100644 index e1074103a6..0000000000 --- a/docs-v1/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -*.aux -*.log -*.gz -*.pdf -*.fls -*.out -*.fdb_latexmk -img/generated -*.html \ No newline at end of file diff --git a/docs-v1/Makefile b/docs-v1/Makefile deleted file mode 100644 index 6fc8ab59e0..0000000000 --- a/docs-v1/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -SHELL = /bin/bash - -generated_img_dir=img/generated - -tikz_files := $(wildcard img-src/*.tikz) - -tikz_pngs := $(foreach file, $(tikz_files), $(generated_img_dir)/$(notdir $(basename $(file))).png) - -.PHONY: clean docs pngs - -clean: - shopt -s nullglob; \ - rm -f *.aux *.log *.gz *.pdf *.ps *.dvi *.out *.fls *.fdb_latexmk \ - img-src/*.aux img-src/*.log img-src/*.gz img-src/*.pdf img-src/*.ps \ - img-src/*.dvi img-src/*.out img-src/*.fls img-src/*.fdb_latexmk; \ - rm -rf img/generated - -relay-states.pdf: relay-states.tex - pdflatex -halt-on-error relay-states.tex; \ - pdflatex -halt-on-error relay-states.tex - -$(tikz_pngs): img/generated/%.png: img-src/%.tikz - bash scripts/generate-pngs.sh /tmp/png-generate img/generated $< $(basename $(*F)) - -pngs: $(tikz_pngs) - -docs: relay-states.pdf $(tikz_pngs) \ No newline at end of file diff --git a/docs-v1/README.adoc b/docs-v1/README.adoc deleted file mode 100644 index c107dba8d1..0000000000 --- a/docs-v1/README.adoc +++ /dev/null @@ -1,7 +0,0 @@ -= Keep Network v1 Documentation (Legacy) - -WARNING: This directory contains historical specifications and design documents -for the *v1 random beacon*. They are preserved for reference only and do not -reflect the current protocol. - -For current documentation, see the link:../docs/[`docs/`] directory. diff --git a/docs-v1/development-process.adoc b/docs-v1/development-process.adoc deleted file mode 100644 index cd508147de..0000000000 --- a/docs-v1/development-process.adoc +++ /dev/null @@ -1,151 +0,0 @@ -:toc: macro - -= Keep Development Process - -:icons: font -:numbered: -toc::[] - -In this document, we describe the Keep development process from an -organizational perspective. We identify events and artifacts allowing for -a transparent, adaptable and predictable development process. - -== Sprint - -Sprint is a time-box of one week during which a product increment is created. -Product increment is a sum of all items completed within the sprint by the team. -Each sprint has a goal of what is to be built, and a plan guiding the building -process. A new sprint starts immediately after the conclusion of the previous -sprint. The scope of a sprint is identified during the sprint planning meeting. -Individual team members may have a specialized area of focus but they all -cooperate on the implementation of sprint items and accountability for reaching -the sprint goal belongs to the team as a whole. - -== Milestone - -Milestone is a box of items identifying releasable product increment with no -more than one-month horizon of development effort. Milestone contains items from -one or more sprints. Each milestone has an expected delivery date assigned, -evaluated from estimates. - -== Sprint planning meeting - -The sprint planning meeting is a time-boxed event of one hour happening at the -beginning of each new sprint where all dsciplines, such as growth, design and -engineering identify work planned for the next sprint. - -Planning meeting consists of two parts: retrospective and new sprint planning. - -=== Retrospective - -Retrospective part is time-boxed to a maximum of 15 minutes. During this part, -the Keep team inspects how the previous sprint went. Every member has a chance -to tell what in their opinion went particularly well and what could be improved. - -=== New sprint planning - -The input to new sprint planning is product backlog, latest product increment, -and any other prior planning work performed by specialized disciplines -independently. The entire team collaborates on understanding the work that is -going to be performed in the next sprint. Sprint planning should result in -crafting a sprint goal which is an objective to be met by the implementation of -items in the sprint. - -== Engineering planning meeting - -Before each new sprint planning, engineering team meets to collaborate on -estimating, breaking down, and discussing all the technical issues related to -backlog product items. Engineering team consist of all disciplines involved in -the software development process: research, devops, and developers. - -Everyone is welcome to join the meeting but only purely technical subjects -are discussed. - -Engineering planning meeting is time-boxed to one hour. - -At the beginning of meeting, there is a 10-minutes time-box for technical -retrospective. - -Before the meeting, tech lead sends to all participants a list of items from the -top of the backlog that are going to be discussed during the meeting. -Items should be presented in a clear way allowing the development team to -understand all the details to the level needed. Each development team member -should invest some time in preparation for the meeting by thoroughly reviewing -selected items and writing down questions. - -Estimates are provided by team members and should include enough development -effort to meet the definition of done for the given item. At the end of the -planning meeting, each individual item should have at least one team member -assigned, but accountability for completion of the items in the sprint belongs -to the whole team. - -By the end of the engineering planning meeting, each team member should be able -to explain how they intend to work to implement the selected items. Individual -tasks may be clarified and re-organized later as more is learned. - -== Daily Standup - -The goal of the daily standup is to optimize team performance and collaboration. -The target audience of daily standup is not primarily the manager; instead, it -is a way for the other team members to track sprint progress, identify -impediments, and synchronize about required development work. - -Everyone should answer three questions for a daily standup: - -1. What did I do since the last daily standup? -2. What will I do today to progress work towards achieving the sprint goal? -3. Are there any blockers that prevent me from progressing the work? - -Development team members should be specific and provide enough details so that -other team members know the current status, and if they work on the same -item, what should they do next and in what order. - -=== Example of a good daily standup - -*Yesterday* - -* DKG result conflict resolution phase -** Opened PR with a stub interface for the on-chain part: , -** Did initial work on off-chain voting event handling code, just local chain -stub implementation, no PR yet. - -*Today* - -* Continuing work on the DKG result conflict resolution phase -** I received a review on my stub on-chain interface, want to address all -comments. Should be ready today for another review round, -** I want to finish Ethereum off-chain voting event handling code and open -PR today. It will contain local chain stub implementation as well. -Should be ready for review at the end of the day. - -*Blockers* - -* I do not understand how conflict resolution phase votes are summarized, need -to talk with someone about it. - - -== Definition of Done - -When sprint item is described as “Done” everyone must share the same -understanding of what “Done” means. For a milestone item to be considered as -“Done”, the following requirements must be met: - -* The implemented code has been reviewed and approved by at least one other development team member -* Code merged to `main` branch -* The feature described by the item works as expected -* The code is implemented according to the guidelines -* No technical debt other than agreed in the item’s description -* Tests implemented and passing -* Item does not break other existing functionalities - -== Work tracking - -We use GitHub to capture backlog items, plan development team work and track -progress on sprint and milestone. - -Each item is a separate GitHub issue. Each sprint has a separate board -under the Keep Network project. Each milestone has a separate milestone board -under Keep Network project. All backlog items are ordered under a separate -backlog project in the Keep Network project. - -All pull requests implementing sprint items reference appropriate issue. diff --git a/docs-v1/development/README.adoc b/docs-v1/development/README.adoc deleted file mode 100644 index 27e80f4624..0000000000 --- a/docs-v1/development/README.adoc +++ /dev/null @@ -1,125 +0,0 @@ -:toc: macro - -= Keep developer documentation - -toc::[] - -== Getting Set Up - -If you're on macOS, install Homebrew and run `scripts/macos-setup.sh`. Note -that if you don't have Homebrew or you're not on macOS, the below information -details what you'll need. The script additionally sets up pre-commit hooks. - -== Building - -Currently the easiest way to build is using the `Dockerfile` at the root of the -repository. A simple `docker build` should get you a functioning container. - -If you want to build natively, there are a few prereqs you'll need to go through. -In particular, you'll need the -https://developers.google.com/protocol-buffers/docs/downloads[protobuf -compiler]. You'll also need to install the `protoc-gen-go` toolchain, -which you can install using `go get`: - -``` -go install google.golang.org/protobuf/cmd/protoc-gen-go@latest -``` - -Run `+go generate ./.../+` from `keep-core` and if everything is fine, start the -Keep client with `go run main.go`. - -== <> - -For development purposes, it is convenient to set up local Ethereum client with -a group of connected peers. A note-taken walkthrough covers the entire process -including setting up local Ethereum client, deploying Keep contracts and -configuring Keep peers. - -== Quick installation - -To quickly install and start a client use the following scripts. - -=== Install script - -The `+install.sh+` script will: - -* migrate contracts -* update client config files -* build client - -The script will ask you for the password to previously created ethereum -accounts. - -To start the installation execute: - -.... -./scripts/install.sh -.... - -=== Starting a client - -To start a client execute: - -.... -./scripts/start.sh -.... - -The `+start.sh+` script will ask you to: - -* provide ethereum password -* provide path to `keep-core` config files directory -* select a config `.toml` file for your client - -== Development Guidelines - -There are two primary languages in the Keep code right now: - -Go:: - Go code largely adheres to community practices where they have been decided. - Divergences and additional tidbits are listed in the link:go-guidelines.adoc[Go - Guidelines] document. - -Solidity:: - Solidity code generally adheres to the - https://solidity.readthedocs.io/en/latest/style-guide.html[Solidity style guide]. - Contracts and their functions are documented using - https://github.com/ethereum/wiki/wiki/Ethereum-Natural-Specification-Format[the - Ethereum Natural Specification Format] (NatSpec). - -== Relay States - -There is a set of threshold relay state diagrams auto-generated from this -repo's `docs` available at https://docs.keep.network/relay-states.pdf. The -images in the diagram, whose sources are at `img-src/*.tikz`, are also -available at `+https://docs.keep.network/img/generated/*.png+` (the filenames -are identical to their TikZ sources, with a `.png` suffix instead of -`.tikz`). These URLs are for the `main` version of the repo; non-`main` -branches are instead published to `+https://docs.keep.network//+`. - -== Common problems - -- Please avoid using `~` when defining `$GOBIN` location and use `$HOME` instead. - We've been observing https://github.com/google/protobuf/issues/3355[some issues] - with locating `protoc-gen-go` when running `go generate` and `$GOBIN` - contained `~`. - -- For Mojave, if you have a problem with missing include or missing library and - you are sure that you have installed xcode with `xcode-select --install`. Then - install the following package: - `/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg` - -== Working with Solidity contracts - -The fastest and easiest way to have local Ethereum testent is to use Ganache app. -https://truffleframework.com/ganache/ - -You can also use a demo script to help you deploy contracts to your local testnet -and to have demo balances (token, staking and token grants) allocated between first -two accounts. - -Go to `solidity` directory and run: - -``` -npm install -npm run demo -``` diff --git a/docs-v1/development/local-keep-network.adoc b/docs-v1/development/local-keep-network.adoc deleted file mode 100644 index a37ace3ade..0000000000 --- a/docs-v1/development/local-keep-network.adoc +++ /dev/null @@ -1,647 +0,0 @@ -:toc: macro - -= Setting up local Keep network for development purposes - -toc::[] - -== Pre-requirements -* Installed `geth` Ethereum client -* Installed `truffle` framework - -The `scripts/macos-setup.sh` installs all required packages. Please consult -<> for details. - -[#set-up-local-ethereum] -== Setting up local Ethereum client - -Create directories for Ethereum client data: - -``` -$ mkdir ~/ethereum -$ mkdir ~/ethereum/data -$ mkdir ~/ethereum/data/keystore -``` - -[#ethereum-accounts] -=== Generate ethereum accounts - -Create a new account for Ethereum client, set the password to just `password`. -For a real environment, please use some better password. -``` -$ geth account new --keystore ~/ethereum/data/keystore - -INFO [10-31|14:28:07.264] Maximum peer count ETH=25 LES=0 total=25 -Your new account is locked with a password. Please give a password. Do not forget this password. -Passphrase: -Repeat passphrase: -Address: {3e208f39da1bc335464f40d85546ad6a1b66a9a4} -``` - -Create a new account for each Keep peer individually. Peer's network identifier -is derived from the account's address and all messages from the peer are signed -with the private key belonging to the account. In this document, we will create -5 accounts for 5 peers. For simplicity, please set the password to just -`password`. For a real environment, please use some better password. -``` -$ geth account new --keystore ~/ethereum/data/keystore - -INFO [10-31|14:31:18.980] Maximum peer count ETH=25 LES=0 total=25 -Your new account is locked with a password. Please give a password. Do not forget this password. -Passphrase: -Repeat passphrase: -Address: {a232599810ecc03816adf607272705b71ff271ac} - -$ geth account new --keystore ~/ethereum/data/keystore - -INFO [10-31|14:31:38.690] Maximum peer count ETH=25 LES=0 total=25 -Your new account is locked with a password. Please give a password. Do not forget this password. -Passphrase: -Repeat passphrase: -Address: {b7314de01d5f3188c7df0a9e95f3477bcaae2120} - -$ geth account new --keystore ~/ethereum/data/keystore - -INFO [10-31|14:34:46.260] Maximum peer count ETH=25 LES=0 total=25 -Your new account is locked with a password. Please give a password. Do not forget this password. -Passphrase: -Repeat passphrase: -Address: {5ef1e10dd1830af50924db623c7a9d90bf8a71be} - -$ geth account new --keystore ~/ethereum/data/keystore - -INFO [10-31|14:35:08.025] Maximum peer count ETH=25 LES=0 total=25 -Your new account is locked with a password. Please give a password. Do not forget this password. -Passphrase: -Repeat passphrase: -Address: {64c20c1ae603c30553de4ea5dd10cc1760b956be} - -$ geth account new --keystore ~/ethereum/data/keystore -INFO [10-31|14:35:27.173] Maximum peer count ETH=25 LES=0 total=25 -Your new account is locked with a password. Please give a password. Do not forget this password. -Passphrase: -Repeat passphrase: -Address: {c4cba981a8edb64276f71a49f9392bad7a726417} -``` - -Check if accounts have been created correctly and `geth` can recognize them: -``` -$ geth account list --keystore ~/ethereum/data/keystore/ - -Account #0: {3e208f39da1bc335464f40d85546ad6a1b66a9a4} keystore:///Users/piotr/ethereum/data/keystore/UTC--2018-10-31T13-28-13.525596422Z--3e208f39da1bc335464f40d85546ad6a1b66a9a4 -Account #1: {a232599810ecc03816adf607272705b71ff271ac} keystore:///Users/piotr/ethereum/data/keystore/UTC--2018-10-31T13-31-24.735759049Z--a232599810ecc03816adf607272705b71ff271ac -Account #2: {b7314de01d5f3188c7df0a9e95f3477bcaae2120} keystore:///Users/piotr/ethereum/data/keystore/UTC--2018-10-31T13-31-43.391759751Z--b7314de01d5f3188c7df0a9e95f3477bcaae2120 -Account #3: {5ef1e10dd1830af50924db623c7a9d90bf8a71be} keystore:///Users/piotr/ethereum/data/keystore/UTC--2018-10-31T13-34-52.920270040Z--5ef1e10dd1830af50924db623c7a9d90bf8a71be -Account #4: {64c20c1ae603c30553de4ea5dd10cc1760b956be} keystore:///Users/piotr/ethereum/data/keystore/UTC--2018-10-31T13-35-12.560028755Z--64c20c1ae603c30553de4ea5dd10cc1760b956be -Account #5: {c4cba981a8edb64276f71a49f9392bad7a726417} keystore:///Users/piotr/ethereum/data/keystore/UTC--2018-10-31T13-35-31.551964909Z--c4cba981a8edb64276f71a49f9392bad7a726417 -``` - -=== Initialize chain - -Initialize your local Ethereum node from `genesis.json` file. This allows to -issue some tokens to the accounts we just created. We assign tokens to all -addresses. The account under alloc is the address of the account prepended with -`0x`. - -``` -{ - "config": { - "chainId": 1101, - "eip150Block": 0, - "eip155Block": 0, - "eip158Block": 0, - "byzantiumBlock": 0, - "homesteadBlock": 0, - "constantinopleBlock": 0, - "petersburgBlock": 0, - "daoForkBlock": 0, - "istanbulBlock": 0, - "daoForkSupport": true - }, - "difficulty": "0x20", - "gasLimit": "0x7A1200", - "alloc": { - "0x3e208f39da1bc335464f40d85546ad6a1b66a9a4": { "balance": "1000000000000000000000000000000000000000000000000000000" }, - "0xa232599810ecc03816adf607272705b71ff271ac": { "balance": "1000000000000000000000000000000000000000000000000000000" }, - "0xb7314de01d5f3188c7df0a9e95f3477bcaae2120": { "balance": "1000000000000000000000000000000000000000000000000000000" }, - "0x5ef1e10dd1830af50924db623c7a9d90bf8a71be": { "balance": "1000000000000000000000000000000000000000000000000000000" }, - "0x64c20c1ae603c30553de4ea5dd10cc1760b956be": { "balance": "1000000000000000000000000000000000000000000000000000000" }, - "0xc4cba981a8edb64276f71a49f9392bad7a726417": { "balance": "1000000000000000000000000000000000000000000000000000000" } - } -} - -``` - -Save the path to your data directory and `geth` client's account in -environment variables: -``` -$ export GETH_DATA_DIR=/Users/piotr/ethereum/data/ -$ export GETH_ETHEREUM_ACCOUNT=0x3e208f39da1bc335464f40d85546ad6a1b66a9a4 -``` - -``` -$ geth --datadir=$GETH_DATA_DIR init genesis.json - -INFO [10-31|15:55:25.811] Maximum peer count ETH=25 LES=0 total=25 -INFO [10-31|15:55:25.823] Allocated cache and file handles database=/Users/piotr/ethereum/data/geth/chaindata cache=16 handles=16 -INFO [10-31|15:55:25.825] Writing custom genesis block -INFO [10-31|15:55:25.825] Persisted trie from memory database nodes=8 size=1.30kB time=77.501µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B -INFO [10-31|15:55:25.826] Successfully wrote genesis state database=chaindata hash=d15d63…61dab6 -INFO [10-31|15:55:25.826] Allocated cache and file handles database=/Users/piotr/ethereum/data/geth/lightchaindata cache=16 handles=16 -INFO [10-31|15:55:25.827] Writing custom genesis block -INFO [10-31|15:55:25.827] Persisted trie from memory database nodes=8 size=1.30kB time=57.219µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B -INFO [10-31|15:55:25.846] Successfully wrote genesis state database=lightchaindata hash=d15d63…61dab6 -``` - -=== Run ethereum client - -Start Ethereum client locally using client's wallet address. - -``` -$ geth --port 3000 --networkid 1101 --identity "somerandomidentity" \ - --ws --wsaddr "127.0.0.1" --wsport "8546" --wsorigins "*" \ - --rpc --rpcport "8545" --rpcaddr "127.0.0.1" --rpccorsdomain "" \ - --rpcapi "db,ssh,miner,admin,eth,net,web3,personal" \ - --wsapi "db,ssh,miner,admin,eth,net,web3,personal" \ - --datadir=$GETH_DATA_DIR --syncmode "fast" \ - --miner.etherbase=$GETH_ETHEREUM_ACCOUNT --mine --miner.threads=1 \ - --allow-insecure-unlock - -INFO [10-31|15:02:22.113] Maximum peer count ETH=25 LES=0 total=25 -INFO [10-31|15:02:22.128] Starting peer-to-peer node instance=Geth/somerandomidentity/v1.8.14-stable/darwin-amd64/go1.10.3 -INFO [10-31|15:02:22.128] Allocated cache and file handles database=/Users/piotr/ethereum/data/geth/chaindata cache=768 handles=1024 -INFO [10-31|15:02:22.140] Initialised chain configuration config="{ChainID: 1101 Homestead: 0 DAO: DAOSupport: false EIP150: 0 EIP155: 0 EIP158: 0 Byzantium: 0 Constantinople: Engine: unknown}" -INFO [10-31|15:02:22.141] Disk storage enabled for ethash caches dir=/Users/piotr/ethereum/data/geth/ethash count=3 -INFO [10-31|15:02:22.141] Disk storage enabled for ethash DAGs dir=/Users/piotr/.ethash count=2 -INFO [10-31|15:02:22.141] Initialising Ethereum protocol versions="[63 62]" network=1101 -INFO [10-31|15:02:22.142] Loaded most recent local header number=0 hash=840a3c…be07a4 td=32 -INFO [10-31|15:02:22.142] Loaded most recent local full block number=0 hash=840a3c…be07a4 td=32 -INFO [10-31|15:02:22.142] Loaded most recent local fast block number=0 hash=840a3c…be07a4 td=32 -INFO [10-31|15:02:22.143] Regenerated local transaction journal transactions=0 accounts=0 -INFO [10-31|15:02:22.145] Starting P2P networking -INFO [10-31|15:02:24.256] UDP listener up self=enode://ef6ad0b1527093a1d3794acc16f3a914816006b1725ce47c5d0fb082f458cb8636c722c6173563f034e0e6ab74fb5230f343755334f1d3db487c744c058b4133@[::]:3000 -INFO [10-31|15:02:24.257] RLPx listener up self=enode://ef6ad0b1527093a1d3794acc16f3a914816006b1725ce47c5d0fb082f458cb8636c722c6173563f034e0e6ab74fb5230f343755334f1d3db487c744c058b4133@[::]:3000 -INFO [10-31|15:02:24.264] IPC endpoint opened url=/Users/piotr/ethereum/data/geth.ipc -INFO [10-31|15:02:24.265] HTTP endpoint opened url=http://127.0.0.1:8545 cors= vhosts=localhost -INFO [10-31|15:02:24.265] WebSocket endpoint opened url=ws://127.0.0.1:8546 -INFO [10-31|15:02:24.265] Transaction pool price threshold updated price=18000000000 -INFO [10-31|15:02:24.266] Commit new mining work number=1 uncles=0 txs=0 gas=0 fees=0 elapsed=388.897µs -INFO [10-31|15:02:25.650] Generating DAG in progress epoch=0 percentage=0 elapsed=786.175ms -INFO [10-31|15:02:26.422] Generating DAG in progress epoch=0 percentage=1 elapsed=1.558s -INFO [10-31|15:02:27.199] Generating DAG in progress epoch=0 percentage=2 elapsed=2.335s - -(...) - -INFO [10-31|15:03:46.999] Generating DAG in progress epoch=0 percentage=97 elapsed=1m22.134s -INFO [10-31|15:03:47.641] Generating DAG in progress epoch=0 percentage=98 elapsed=1m22.777s -INFO [10-31|15:03:48.684] Generating DAG in progress epoch=0 percentage=99 elapsed=1m23.820s -INFO [10-31|15:03:48.687] Generated ethash verification cache epoch=0 elapsed=1m23.822s -INFO [10-31|15:03:49.846] Successfully sealed new block number=1 hash=927e38…9579e6 elapsed=1m25.580s -INFO [10-31|15:03:49.852] 🔨 mined potential block number=1 hash=927e38…9579e6 - -(...) -``` - -[#quick-installation] -== Quick installation - -To quickly install and start a single client use the installation script. - -=== Prerequisites -To run the script some manual preparation is needed: - -- <>, -- <> for the single client (default name: `config.toml`). - -=== Install script -The `install.sh` script will: - -- run <>, -- run <>, -- update <> -- <>. - -The script will ask you for password to <> -ethereum accounts and the client config file path. - -To start the installation execute: -``` -./scripts/install.sh -``` - -=== Start client - -To start the client execute: -``` -./scripts/start.sh -``` - -=== Run genesis entry request - -For the network to be fully functional you need to initialize the -<>. - -[#contracts-deployment] -== Keep contracts deployment - -Before we deploy Keep contracts to the local Ethereum network or stake Keep -tokens, it is required to unlock addresses that will be used by Keep clients. -We also unlock the account that will be used by Ethereum client since it will -be used later to set up staking contract. - -``` -$ geth attach http://127.0.0.1:8545 -Welcome to the Geth JavaScript console! - -instance: Geth/somerandomidentity/v1.8.14-stable/darwin-amd64/go1.10.3 -coinbase: 0x3e208f39da1bc335464f40d85546ad6a1b66a9a4 -at block: 87 (Wed, 31 Oct 2018 15:06:39 CET) - datadir: /Users/piotr/ethereum/data - modules: admin:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 web3:1.0 - -> personal.unlockAccount("0x3e208f39da1bc335464f40d85546ad6a1b66a9a4", "password", 150000); -true -> personal.unlockAccount("0xa232599810ecc03816adf607272705b71ff271ac", "password", 150000); -true -> personal.unlockAccount("0xb7314de01d5f3188c7df0a9e95f3477bcaae2120", "password", 150000); -true -> personal.unlockAccount("0x5ef1e10dd1830af50924db623c7a9d90bf8a71be", "password", 150000); -true -> personal.unlockAccount("0x64c20c1ae603c30553de4ea5dd10cc1760b956be", "password", 150000); -true -> personal.unlockAccount("0xc4cba981a8edb64276f71a49f9392bad7a726417", "password", 150000); -true -> exit -``` -In several versions of geth (1.9.0 and above) you might encounter an error while executing account -unlock commands described above. -If you get `Account unlock with HTTP access is forbidden` you should run -Ethereum client (described in the previous section) with param: -`--allow-insecure-unlock` - -We also need to create a new network entry in `keep-core/solidity-v1/truffle-config.js` -pointing to our local node and its account. This account will pay gas for Keep -contract deployment. - -``` -local: { - host: "localhost", - port: 8545, - network_id: "*", - from: "0x3e208f39da1bc335464f40d85546ad6a1b66a9a4" -}, -``` - -Having done all those steps we can finally run a migration and deploy our -contracts. Please save the output of as we will need to use some of the -outputted contract addresses in the Keep peer configuration later. - -``` -$ cd keep-core/solidity-v1 -$ truffle migrate --reset --network local - -Using network 'local'. - -Running migration: 1_initial_migration.js - Replacing Migrations... - ... 0x38580e8248c8687a3a93e69a6a81687467efded85a3267b82ada3e7cc4f0a7a4 - Migrations: 0x7dd3bb48298b28444dc573e17c239d462600a802 -Saving successful migration to network... - ... 0x4244901d95e662bff04dec6335e8c35163d12b9f9ca12fc2fe29a000c188c816 -Saving artifacts... -Running migration: 2_deploy_contracts.js - Running step... - Replacing ModUtils... - ... 0x55babc411b1d34279f5f93d81c629b8ff0d99966f397a6516b90a9bf26468e88 - ModUtils: 0x31f0535aec74aa862030bbc1bfe954d9e6cf7269 - Linking ModUtils to AltBn128 - Replacing AltBn128... - ... 0x345a9de3bdbd476c1af75e11d4c2f2741d378f62fc31d7d149fb03accc41d59b - AltBn128: 0x632988bc199f504cd57f9953f1896db1d5aa530e - Replacing KeepToken... - ... 0x2e1472bcf86de889e451828de94a3f6b673304767e49f050989d2bfcfba739ce - KeepToken: 0xcb6a6a58f0badc45827d4bb221f5387f70ea6184 - Replacing TokenStaking... - ... 0x61af5445af82db5b8da75a8e8fcd272c7c2a542a81b372662cde9b98d37a0cb0 - TokenStaking: 0xce812232c495262ff1423fa68b237177eda3af4c - Replacing TokenGrant... - ... 0xf3d4a78110ddd2003bd4c47bb59a0165e8468b3f38777131731d0829a5a3cfbf - TokenGrant: 0x24e006907b85482b86c335c0c8e15c9ca49e6800 - Replacing KeepRandomBeaconServiceImplV1... - ... 0x03a560288292005f2181fe561461aa70b521741349641c31525f64c1482caf25 - KeepRandomBeaconServiceImplV1: 0x3179d9c794e597d6316736189bf040b74a2f1dd7 - Replacing KeepRandomBeaconService... - ... 0x9facb5fe566862e67e50d6ad0fc622f717ee5cb795c7044ba9ad2ff32f9faa70 - KeepRandomBeaconService: 0x15045ff30d6327345cc052cc4b8c28dbe974a74b - Replacing KeepRandomBeaconOperator... - ... 0x9e49a94de6dfbc6496c89bb3edff8201ad407ba906893029185f72be2c4e9528 - KeepRandomBeaconOperator: 0x9da7876f5404dde662bf5cbc6ca1462e777571ff -Saving successful migration to network... - ... 0xcb9a9ab4d9a0c153a7a24786d4aa1b61feb2b0278fd6fa2d91222e7324cce187 -Saving artifacts... -``` - -[#token-staking] -== Keep token staking - -Each Keep peer needs to have a minimum number of KEEP tokens staked under its -account. The `delegate-tokens.js` script transfers KEEP tokens and stake them for all -addresses available. - -``` -$ truffle exec ./scripts/delegte-tokens.js --network local - -Using network 'local'. - -successfully staked KEEP tokens for account 0x3e208f39da1bc335464f40d85546ad6a1b66a9a4 -successfully staked KEEP tokens for account 0xa232599810ecc03816adf607272705b71ff271ac -successfully staked KEEP tokens for account 0xb7314de01d5f3188c7df0a9e95f3477bcaae2120 -successfully staked KEEP tokens for account 0x5ef1e10dd1830af50924db623c7a9d90bf8a71be -successfully staked KEEP tokens for account 0x64c20c1ae603c30553de4ea5dd10cc1760b956be -successfully staked KEEP tokens for account 0xc4cba981a8edb64276f71a49f9392bad7a726417 -``` - -== Setting up local Keep peers - -[#client-config-file] -=== Prepare configuration file - -For each Keep peer we need to create a separate configuration file. We need at -least one bootstrap peer in the network. Other peers are not required. -Here, we will create one bootstrap peer and 4 other peers pointing to it. - -Let's create a configuration for the bootstrap peer first: -``` -$ cp config.toml.SAMPLE config.local.1.toml -``` - -Next, edit `config.local.1.toml` and update `[ethereum.account]` section to -point to the second <> (the first -one is used by Ethereum client): -```toml -[ethereum.account] - Address = "0x3e208f39da1bc335464f40d85546ad6a1b66a9a4" - KeyFile = "/Users/piotr/ethereum/data/keystore/UTC--2018-10-31T13-28-13.525596422Z--3e208f39da1bc335464f40d85546ad6a1b66a9a4" -``` - -[#client-contracts-config] -Update `[ethereum.ContractAddresses]` section to point to the previously -*deployed contract* instances. - -NOTE: Updating contracts addresses is not required when running <> -script. - -Please use addresses of `KeepRandomBeaconOperator`, `KeepRandomBeaconService` and -`TokenStaking` contracts: - -```toml -[ethereum.ContractAddresses] - KeepRandomBeaconService = "0x15045ff30d6327345cc052cc4b8c28dbe974a74b" - KeepRandomBeaconOperator = "0xdff3075ca23fe28697d5c4f171cf04abd79bd837" - TokenStaking = "0xDfc7251170abd753342B585Adcd8BCEE48aDb379" -``` - -In the `config.local.1.toml` enable *network settings* for bootstrap peer: -```toml -[LibP2P] - Port = 3919 -``` - -And set a *storage directory* for the bootstrap peer: -```toml -[Storage] - DataDir = "/Users/username/.keep/keep-core/storage/client-1" -``` -This directory must be created before peer start. - -Next, create *configuration files for other peers*: -``` -$ cp config.local.1.toml config.local.2.toml -$ cp config.local.1.toml config.local.3.toml -$ cp config.local.1.toml config.local.4.toml -$ cp config.local.1.toml config.local.5.toml -``` - -NOTE: Configuration of other peers will <> -after running the bootstrap peer. - -[#build-client] -=== Build client - -Build the `keep-core` executable: -``` -go generate ./... -go build -a -o keep-core . -``` - -=== Start bootstrap peer - -Start the bootstrap peer: -``` -$ LOG_LEVEL="info" KEEP_ETHEREUM_PASSWORD="password" ./keep-core --config config.local.1.toml start ------------------------------------------------------------------------------------------------- -| Port: 3919 | -| IPs : /ip6/::1/tcp/3919/ipfs/16Uiu2HAkvcmFM53nzHN4dAB4sfemFAu86ytA8wJveKQqYsHvfsca | -| /ip4/192.168.1.103/tcp/3919/ipfs/16Uiu2HAkvcmFM53nzHN4dAB4sfemFAu86ytA8wJveKQqYsHvfsca | -| /ip4/127.0.0.1/tcp/3919/ipfs/16Uiu2HAkvcmFM53nzHN4dAB4sfemFAu86ytA8wJveKQqYsHvfsca | ------------------------------------------------------------------------------------------------- -``` - -[#update-peers-config] -==== Update other peers configuration - -The next thing we need to do is to alter configuration file of each peer. -Please modify `Port` number so that it is unique for each -peer and update the address of the bootstrap peer. We also need to update -ethereum account and key file so that each Keep client uses a different account. - -In `config.local.2.toml`: -```toml -[LibP2P] - Peers = ["/ip4/127.0.0.1/tcp/3919/ipfs/16Uiu2HAkvcmFM53nzHN4dAB4sfemFAu86ytA8wJveKQqYsHvfsca"] - Port = 3920 -``` -```toml -[ethereum.account] - Address = "0xb7314de01d5f3188c7df0a9e95f3477bcaae2120" - KeyFile = "/Users/piotr/ethereum/data/keystore/UTC--2018-10-31T13-31-43.391759751Z--b7314de01d5f3188c7df0a9e95f3477bcaae2120" -``` -```toml -[Storage] - DataDir = "/Users/username/.keep/keep-core/storage/client-2" -``` - -In `config.local.3.toml`: -```toml -[LibP2P] - Peers = ["/ip4/127.0.0.1/tcp/3919/ipfs/16Uiu2HAkvcmFM53nzHN4dAB4sfemFAu86ytA8wJveKQqYsHvfsca"] - Port = 3921 -``` -```toml -[ethereum.account] - Address = "0x5ef1e10dd1830af50924db623c7a9d90bf8a71be" - KeyFile = "/Users/piotr/ethereum/data/keystore/UTC--2018-10-31T13-34-52.920270040Z--5ef1e10dd1830af50924db623c7a9d90bf8a71be" -``` -```toml -[Storage] - DataDir = "/Users/username/.keep/keep-core/storage/client-3" -``` - -In `config.local.4.toml`: -```toml -[LibP2P] - Peers = ["/ip4/127.0.0.1/tcp/3919/ipfs/16Uiu2HAkvcmFM53nzHN4dAB4sfemFAu86ytA8wJveKQqYsHvfsca"] - Port = 3922 -``` -```toml -[ethereum.account] - Address = "0x64c20c1ae603c30553de4ea5dd10cc1760b956be" - KeyFile = "/Users/piotr/ethereum/data/keystore/UTC--2018-10-31T13-35-12.560028755Z--64c20c1ae603c30553de4ea5dd10cc1760b956be" -``` -```toml -[Storage] - DataDir = "/Users/username/.keep/keep-core/storage/client-4" -``` - -In `config.local.5.toml`: -```toml -[LibP2P] - Peers = ["/ip4/127.0.0.1/tcp/3919/ipfs/16Uiu2HAkvcmFM53nzHN4dAB4sfemFAu86ytA8wJveKQqYsHvfsca"] - Port = 3923 -``` -```toml -[ethereum.account] - Address = "0xc4cba981a8edb64276f71a49f9392bad7a726417" - KeyFile = "/Users/piotr/ethereum/data/keystore/UTC--2018-10-31T13-35-31.551964909Z--c4cba981a8edb64276f71a49f9392bad7a726417" -``` -```toml -[Storage] - DataDir = "/Users/username/.keep/keep-core/storage/client-5" -``` - -==== Start other peers - -Finally, we can start each instance: -``` -$ LOG_LEVEL="info" KEEP_ETHEREUM_PASSWORD="password" ./keep-core --config config.local.2.toml start ------------------------------------------------------------------------------------------------- -| Port: 3920 | -| IPs : /ip4/127.0.0.1/tcp/3919/ipfs/16Uiu2HAmGsfKJaP4UGoGWYV6nxY8RPhVoHxT9rUQbPsxFedMHzEr | -| /ip6/::1/tcp/3919/ipfs/16Uiu2HAmGsfKJaP4UGoGWYV6nxY8RPhVoHxT9rUQbPsxFedMHzEr | -| /ip4/192.168.1.103/tcp/3919/ipfs/16Uiu2HAmGsfKJaP4UGoGWYV6nxY8RPhVoHxT9rUQbPsxFedMHzEr | ------------------------------------------------------------------------------------------------- -``` - -``` -$ LOG_LEVEL="info" KEEP_ETHEREUM_PASSWORD="password" ./keep-core --config config.local.3.toml start ------------------------------------------------------------------------------------------------- -| Port: 3921 | -| IPs : /ip4/127.0.0.1/tcp/3919/ipfs/16Uiu2HAmAeFbeTZstFhAiEL8jGQiNR9sygKstrhpG4F2wKmt1784 | -| /ip6/::1/tcp/3919/ipfs/16Uiu2HAmAeFbeTZstFhAiEL8jGQiNR9sygKstrhpG4F2wKmt1784 | -| /ip4/192.168.1.103/tcp/3919/ipfs/16Uiu2HAmAeFbeTZstFhAiEL8jGQiNR9sygKstrhpG4F2wKmt1784 | ------------------------------------------------------------------------------------------------- -``` - -``` -$ LOG_LEVEL="info" KEEP_ETHEREUM_PASSWORD="password" ./keep-core --config config.local.4.toml start ------------------------------------------------------------------------------------------------- -| Port: 3922 | -| IPs : /ip4/127.0.0.1/tcp/3919/ipfs/16Uiu2HAmQcPbBVftPR8SKctpG9ToDmu7kLpaKPUc3AreEwzWbuyb | -| /ip6/::1/tcp/3919/ipfs/16Uiu2HAmQcPbBVftPR8SKctpG9ToDmu7kLpaKPUc3AreEwzWbuyb | -| /ip4/192.168.1.103/tcp/3919/ipfs/16Uiu2HAmQcPbBVftPR8SKctpG9ToDmu7kLpaKPUc3AreEwzWbuyb | ------------------------------------------------------------------------------------------------- -``` - -``` -$ LOG_LEVEL="info" KEEP_ETHEREUM_PASSWORD="password" ./keep-core --config config.local.5.toml start ------------------------------------------------------------------------------------------------- -| Port: 3923 | -| IPs : /ip4/127.0.0.1/tcp/3919/ipfs/16Uiu2HAm7wzWEs3fUbA9rgzKRP82Zhtnq2CxZZdXPMrJJgNNra1p | -| /ip6/::1/tcp/3919/ipfs/16Uiu2HAm7wzWEs3fUbA9rgzKRP82Zhtnq2CxZZdXPMrJJgNNra1p | -| /ip4/192.168.1.103/tcp/3919/ipfs/16Uiu2HAm7wzWEs3fUbA9rgzKRP82Zhtnq2CxZZdXPMrJJgNNra1p | ------------------------------------------------------------------------------------------------- -``` - -[#genesis-entry] -== Genesis entry - -In order to trigger creation of the first group genesis entry must be submitted. The script includes -the required DKG fee. -``` -$ truffle exec ./scripts/genesis.js --network local - -Using network 'development'. - -Genesis entry successfully submitted. -``` - - -== Request relay entry - -Once the first group is created we can request relay entry with the following script: -``` -$ truffle exec ./scripts/request-relay-entry.js --network local - -Using network 'development'. - -Successfully requested relay entry with RequestId = 7 - ----Transaction Summary--- -From:0x23ba4cf58947d4eebd3b3aedcec28bec364b6727 -To:0x017a532a3bbb538753e84ae59d5131b0dfb7d2df -BlockNumber:42 -TotalGas:106480 -TransactionHash:0x50dccd40f7f3f67e79598edff614bc250568127a97c0dab1a8011bf3c9cb9776 --------------------------- - -``` - - -== Request relay entry with a callback - -If you want your contract to be called on a successful entry please use the script below in the following format: -``` -truffle exec ./scripts/request-relay-entry-with-callback.js yourContractAddress "callbackMethodName" payment -``` - -Example usage: - -``` -$ truffle exec ./scripts/request-relay-entry-with-callback.js 0x230cD94D6a4d3923da88d38b362337A5CC7136Dd "callback(uint256)" 100 --network local - -Using network 'development'. - -Successfully requested relay entry with a callback. RequestId = 8 - ----Transaction Summary--- -From:0x23ba4cf58947d4eebd3b3aedcec28bec364b6727 -To:0x017a532a3bbb538753e84ae59d5131b0dfb7d2df -BlockNumber:45 -TotalGas:139910 -TransactionHash:0xf345ef11c659157613c38366746a7053fd8aca59b854864629eab2b756c20196 --------------------------- - -``` - -== Internal Testnet - -Environment Name: `keep-dev` - -`keep-dev` is a cloud deployed instance of the keep-network complete -with ETH chain. This environment is usually deployed with the latest -`main` and is continuously deployed so uptime is variable. - -You do need a `keep-dev` VPN account to access the network and below -endpoints. Reach out in the https://www.flowdock.com/app/cardforcoin/ops[DevOps flow] if you do not have one. - -=== Connection Info - -==== Ethereum Network - -- *Dashboard:* http://eth-dashboard.internal.keep-dev.com:3000 -- *Transactions:* - ** _RPC:_ http://eth-tx-node.default.svc.cluster.local:8545 - ** _WebSocket:_ link:[ws://eth-tx-node.default.svc.cluster.local:8546] - -==== Keep Network - -- link:[keep-client-bootstrap-peer-0.default.svc.cluster.local:3919] diff --git a/docs-v1/glossary.adoc b/docs-v1/glossary.adoc deleted file mode 100644 index 7edec05cc9..0000000000 --- a/docs-v1/glossary.adoc +++ /dev/null @@ -1,62 +0,0 @@ -== Glossary - -Stake:: An amount of KEEP that is bonded in order to participate in the - threshold relay and, optionally, the Keep network. Part or all of this can be - removed from escrow as penalties for misbehavior, while part or all of it can - be refunded if and when a participant chooses to withdraw in orderly fashion - from the network and relay. - -Staker:: A staking client that has a stake, but may not yet be in a signing - group. - -Minimum Stake Amount:: The minimum stake amount that will make a staking client - a staker, as required by the staking smart contract. - -Stake Amount:: Total KEEP deposited for a single stake. - -Signing Member:: One member of one complete signing group in the threshold - relay. - -Signing Group:: One complete signing group in the threshold relay. - -Lead Signing Group:: The signing group that will produce the next relay entry - candidate (due to being the result of $E_i mod N$ with $E_i$ being the - current entry and $N$ being the number of groups). If this group fails to - respond to the request in time, the lead responsibility may shift to another - group. - -Relay Entry Candidate:: A random number generated by the threshold relay that - has not yet been finalized on the blockchain; may be invalid. - -Relay Entry:: A relay entry candidate that has been finalized on the blockchain; - may be invalid. - -Keep Client:: The entire application running on a user's system, which contains - multiple subclients for the various pieces of the Keep system. - -Staking Client:: The part of the Keep Client that stakes and participates in the - threshold relay. - -Verifying Client:: Verifies entries on-chain and reports invalid entries. - Optional, does not require a stake. Reward for identifying an invalid random - number on the chain. - -Provider Client:: The Keep Provider piece of the application, which can in turn - have workers for various Keep types. - -Keep Type:: The functionality that the given Keep relies on for providing - security. e.g. an SHM (Secure Hardware Module) Keep, SMPC (Secure Multi-Party - Computation) Keep, Proxy Reencryption Keep, etc. - -Provider Worker:: One worker that runs the code to allow a provider client to - participate in a given Keep Type. - -Keep Provider:: One economic entity in the Keep network; has a stake, must - participate in a signing group as a single member. - -Keep:: Up to 1MB of encrypted storage across one or more Keep Providers. - -KEEP:: Token used to stake. Can be represented as a K with a vertical bar - through it. - -Keep Owner, Delegate, Requester are described in the whitepaper. diff --git a/docs-v1/img-src/libp2p-join.tikz b/docs-v1/img-src/libp2p-join.tikz deleted file mode 100644 index 9b994c9046..0000000000 --- a/docs-v1/img-src/libp2p-join.tikz +++ /dev/null @@ -1,23 +0,0 @@ -% !TEX root = ../relay-states.tex -\tikz{ - \node[nested chain decision] (stake check) {\hyperref[fig:relay-group-initialization]{Staked?}}; - - \node[state] (connecting) [right=2cm of stake check] {Connecting to bootstrap host}; - - \node[state] (proving stake) [below=1cm of connecting] {Submitting stake proof}; - - \node[state] (receiving peers) [below=1cm of proving stake] {Receiving peerlist}; - - \node[nested chain decision] (state check) [left=2cm of receiving peers,text width=2cm] {\hyperref[fig:relay-group-initialization]{Checking\\current state}}; - - \path [->] (stake check) edge node {Yes} (connecting) - - (connecting) edge node [pos=0.6] {connected} (proving stake) - edge [bend right=30] node {failed to connect} (stake check) - - (proving stake) edge node [pos=0.7] {proof accepted} (receiving peers) - edge [bend left=45] node [right,pos=0.6,text width=1.5cm] {proof rejected} (stake check) - - (receiving peers) edge node [centered,text width=1.4cm,align=flush center] {peers received} (state check) - edge [bend left=30] node [left,pos=0.3] {failed to receive peers} (stake check) -} \ No newline at end of file diff --git a/docs-v1/img-src/relay-diagram.tikz b/docs-v1/img-src/relay-diagram.tikz deleted file mode 100644 index 849327cf45..0000000000 --- a/docs-v1/img-src/relay-diagram.tikz +++ /dev/null @@ -1,55 +0,0 @@ -% !TEX root = ../relay-states.tex -\usetikzlibrary{shapes.multipart} -\tikz[ - heading/.style={font=\bf}, - op/.style={draw,rectangle}, - plain/.style={minimum height=1cm}, - generic block/.style={draw,rectangle split,rectangle split parts=#1,minimum width=1cm,rectangle split empty part height=0.2mm}, - block/.style={draw,rectangle split,rectangle split parts=#1,minimum width=1cm,rectangle split empty part height=0.2mm}, -]{ - \node[heading] (chain) {Chain}; - \node[plain] (chain-elided) [below=0.1cm of chain.south] {...}; - \node[generic block] (pre-request) [below=of chain-elided.south] {}; - \node[block] (relay-request) [below=of pre-request.south] {\nodepart{two} Relay Request $r_i$}; - \node[generic block] (post-request) [below=of relay-request.south] {}; - \node[plain] (post-request-elided) [below=of post-request.south] {...}; - \node[block] (relay-entry-block) [below=of post-request-elided.south] {\nodepart{three} Relay Entry $v_i$}; - - \path [<-,dashed] (chain-elided) edge (pre-request) - (pre-request) edge (relay-request) - (relay-request) edge (post-request) - (post-request) edge (post-request-elided) - (post-request-elided) edge (relay-entry-block); - - \node[plain] (seed-entry) [right=7.5cm of relay-request.two east] {$v_s$ - seed entry}; - \node[heading] (relay) [above=0.25cm of seed-entry] {Relay}; - \node[plain] (relay-entry) [right=7.5cm of relay-entry-block.three east] {$v_i$ - relay entry}; - - \path [<-,dashed] (seed-entry) edge (relay-entry); - - \node[op] (relay-entry-seed-generation) [right=4cm of relay-request.two east] {$\times$}; - \node[plain] (relay-entry-seed) [below=of relay-entry-seed-generation] {$v_r$}; - \node[plain] (relay-entry-seed-label) [left=0 of relay-entry-seed] {``relay entry seed''}; - \node[op] (group-combiner) [below=of relay-entry-seed] {\texttt{fn}}; - \node[draw,rectangle split,rectangle split horizontal,rectangle split parts=2] - (group-signature-fn) [below right=1cm and -0.7cm of group-combiner] - {$G_i$ \nodepart{two} $S_{G_i}$}; - \node[plain] (signing-group-label) [left=0 of group-signature-fn] {``signing group"}; - \node[plain] (groupsig-function-label) [below right=-0.1cm and 0 of group-signature-fn.north east,text width=2.6cm,align=center] {``group signature\\function"}; - \node[plain] (group-signature) [right=4.75cm of relay-entry-block.three east] {$\sigma_{G_i}$}; - \node[plain] (groupsig-label) [below=-0.3cm and 0 of group-signature,minimum height=2ex] {``group signature''}; - - \node[draw,circle,minimum width=2cm,minimum height=2cm] (groups) [left=of group-combiner] {Groups}; - - \path [->] (relay-request.two east) edge (relay-entry-seed-generation) - (seed-entry) edge (relay-entry-seed-generation) - (relay-entry-seed-generation) edge (relay-entry-seed) - (relay-entry-seed) edge (group-combiner) - (groups) edge (group-combiner) - (group-combiner) edge (group-signature-fn.one north) - (group-signature-fn.two south) edge (group-signature); - \draw [->] (relay-entry-seed) .. controls +($([yscale=0]group-signature-fn.two north) - ([yscale=0]relay-entry-seed)$) .. (group-signature-fn.two north); - - \path [->] (group-signature) edge (relay-entry) - (group-signature) edge (relay-entry-block.three east) -} \ No newline at end of file diff --git a/docs-v1/img-src/relay-entry-request-processing.tikz b/docs-v1/img-src/relay-entry-request-processing.tikz deleted file mode 100644 index beff3ac194..0000000000 --- a/docs-v1/img-src/relay-entry-request-processing.tikz +++ /dev/null @@ -1,28 +0,0 @@ -% !TEX root = ../relay-states.tex -\tikz{ - \node[nested state] (initialization) [text width=1.7cm] {\hyperref[fig:relay-group-initialization]{Pending Activation}}; - - \node[chain state] (waiting) [right=of initialization,text width=1.5cm] {Waiting for request}; - - \node[decision] (determining) [right=3cm of waiting,text width=2cm] {Is group responsible?}; - - \node[state] (generating) [right=2cm of determining,text width=1.7cm] {Generating signature share}; - - % Brodcasting? Might just be part of generating. - \node[state] (verifying shares) [below=1cm of generating,text width=1.7cm] {Verifying shares}; - - \node[chain state] (submitting) [left=3cm of verifying shares,text width=1.7cm] {Submitting signature}; - - \path[->] (initialization) edge (waiting) - - (waiting) edge [chain transition] node {request received} (determining) - - (determining) edge [bend left=45] node [below] {no} (waiting) - (determining) edge node {yes} (generating) - - (generating) edge [bend left=45] node [right,pos=0.45,text width=2cm] {share\\generated} (verifying shares) - - (verifying shares) edge node {signature ready} (submitting) - - (submitting) edge [chain transition,to path={[rounded corners=1.5cm] -| (\tikztotarget) \tikztonodes}] node [centered,pos=0.15,text width=2cm] {signature submitted} (waiting); -} diff --git a/docs-v1/img-src/relay-entry-verification.tikz b/docs-v1/img-src/relay-entry-verification.tikz deleted file mode 100644 index 7f418b5413..0000000000 --- a/docs-v1/img-src/relay-entry-verification.tikz +++ /dev/null @@ -1,20 +0,0 @@ -% !TEX root = ../relay-states.tex -\tikz{ - \node [start state] (start) {}; - - \node [chain state] (waiting for entry) [right=of start,text width=1.8cm] {Waiting for relay entry}; - - \node [decision] (verifying) [right=4cm of waiting for entry] {Is entry valid?}; - - \node [chain state] (calling chain verification) [right=2cm of verifying,text width=1.8cm] {Calling on-chain verification}; - - \path[->] (start) edge (waiting for entry) - - (waiting for entry) edge [chain transition] node {relay entry published} (verifying) - - (verifying) edge node {no} (calling chain verification) - (verifying) edge [bend left=30] node [below,pos=0.55] {yes} (waiting for entry) - - % If on-chain verification fails do we back off? - (calling chain verification) edge [chain transition,bend right=30] node {on-chain verification complete} (waiting for entry); -} diff --git a/docs-v1/img-src/relay-group-assignment.tikz b/docs-v1/img-src/relay-group-assignment.tikz deleted file mode 100644 index 69bdaa4074..0000000000 --- a/docs-v1/img-src/relay-group-assignment.tikz +++ /dev/null @@ -1,17 +0,0 @@ -% !TEX root = ../relay-states.tex -\tikz{ - \node [nested decision] (state check) [text width=2cm] {\hyperref[fig:relay-group-initialization]{Checking\\current state}}; - - \node [state] (waiting for entry) [right=2cm of state check] {Waiting for relay entry}; - - \node [decision] (checking) [right=3cm of waiting for entry] {Checking eligibility*}; - - \node [nested state] (setting up group) [right=2cm of checking,text width=2cm] {\hyperref[fig:relay-group-setup]{Setting up group}}; - - \path[->] (state check) edge node {no group} (waiting for entry) - - (waiting for entry) edge node [centered,text width=2cm,align=center] {relay entry published} (checking) - - (checking) edge [bend right=45] node {not eligible} (waiting for entry) - edge node {eligible} (setting up group); -} diff --git a/docs-v1/img-src/relay-group-initialization.tikz b/docs-v1/img-src/relay-group-initialization.tikz deleted file mode 100644 index 9d20c9fe18..0000000000 --- a/docs-v1/img-src/relay-group-initialization.tikz +++ /dev/null @@ -1,36 +0,0 @@ -% !TEX root = ../relay-states.tex -\tikz{ - \node[start state] (start) {}; - - \node[chain decision] (stake check) [right=of start] {Staked?\footnote{Local check to avoid doing unnecessary work.}}; - - \node[nested state] (joining) [right=of stake check,text width=2cm] {\hyperref[fig:libp2p-join]{Joining\\\tt{libp2p}}}; - - \node[chain decision] (state check) [below=2cm of joining] {Checking\\current state}; - - \node[nested state] (waiting) [below left=3cm of state check,text width=2cm] {\hyperref[fig:relay-group-assignment]{Waiting\\for group}}; - \node[nested state] (setting up group) [below right=3cm of waiting,text width=2cm] {\hyperref[fig:relay-group-setup]{Setting up group}}; - - \node[nested state] (processing) [below right=3cm of state check,text width=1.7cm] {\hyperref[fig:relay-entry-request-processing]{Processing requests}}; - - \path [->] (start) edge (stake check) - - (stake check) edge [chain transition,bend right=45] node [above] {No} (start) - (stake check) edge [chain transition] node [above] {Yes} (joining) - - % NOTE We may not want to return to the stake check on failed join, - % NOTE we may just want to abort. - (joining) edge [bend right=45] node [above] {failed to join} (stake check) - (joining) edge node {joined} (state check) - - (state check) edge [chain transition,bend right=40] node [left] {no group} (waiting) - edge [chain transition] node [pos=0.6,text width=3cm,align=flush center] {in uninitialized group} (setting up group) - edge [chain transition,bend left=40] node [right] {in initialized group} (processing) - - (waiting) edge [bend left=40] node [left,pos=0.75,text width=2cm,align=flush center] {assigned to group} (setting up group) - - (setting up group) [bend left=40] edge node [left] {setup failed} (waiting) - (setting up group) [bend right=40] edge node [right] {group activated} (processing) - - (processing) [bend left=40] edge node [right,pos=0.75,text width=2cm,align=flush center] {group dissolved} (state check) -} \ No newline at end of file diff --git a/docs-v1/img-src/relay-group-setup.tikz b/docs-v1/img-src/relay-group-setup.tikz deleted file mode 100644 index ff01d3b2b3..0000000000 --- a/docs-v1/img-src/relay-group-setup.tikz +++ /dev/null @@ -1,54 +0,0 @@ -% !TEX root = ../relay-states.tex -\tikz{ - \node[nested state,text width=2cm] (waiting) {\hyperref[fig:relay-group-initialization]{Waiting for group}}; - - \node[chain state] (awaiting entry) [right=of waiting] {Awaiting\\relay entry}; - - \node[decision] (eligibility check) [right=2.5cm of awaiting entry] {Eligible for group?}; - - \node[state] (joining channel) [right=2cm of eligibility check] {Joining broadcast channel}; - - \node[state] (generating) [below left=1cm and 3cm of joining channel] {Generating secret key share and proofs}; - - \node[state] (announcing) [left=2cm of generating] {Announcing secret key proofs}; - - \node[decision] (verifying) [below=1cm of announcing] {Verifying other proofs}; - - % FIXME Accusation process is incomplete and might be its own sub-diagram. - \node[state] (accusing) [below right=-0.8cm and 2cm of verifying] {Publishing invalidity accusation}; - \node[state] (generating pubkey) [below left=2cm of verifying.south] {Generating public key}; - - \node[chain state] (submitting pubkey) [right=2cm of generating pubkey] {Submitting public key}; - - \node[chain state] (awaiting pubkey) [below=1cm of submitting pubkey] {Awaiting on-chain public key}; - - \node[state] (pending activation delay) [right=2cm of awaiting pubkey] {Waiting for activation delay}; - - \node[nested state] (processing) [below=4cm of joining channel,text width=2cm] {\hyperref[fig:relay-entry-request-processing]{Processing requests}}; - - \path [->] (waiting) edge (awaiting entry) - - (awaiting entry) edge [chain transition] node [above] {entry received} (eligibility check) - - (eligibility check) edge [bend right=45] node [above] {No} (awaiting entry) - edge [pos=0.6] node {Yes} (joining channel) - - (joining channel) edge [bend right=30] node {joining failed} (waiting) - edge node [sloped] {joined} (generating) - - (generating) edge node [centered,text width=1.5cm,align=flush center] {shares generated} (announcing) - - (announcing) edge [pos=0.65] node {shares announced} (verifying) - - (verifying) edge node [centered,text width=1.5cm,align=flush center] {invalid share} (accusing) - edge [pos=0.65] node {shares valid} (generating pubkey) - - (generating pubkey) edge node {generated} (submitting pubkey) - - (submitting pubkey) edge [chain transition,pos=0.65] node {submitted} (awaiting pubkey) - - (awaiting pubkey) edge [chain transition,to path={[rounded corners=3cm] -| (\tikztotarget) \tikztonodes}] node [pos=0.15,centered,text width=2cm] {relay entry received} (waiting) - edge [chain transition] node [centered,text width=1.5cm,align=flush center] {pubkey published} (pending activation delay) - - (pending activation delay) edge [bend right=15] node [right,text width=2cm] {activation delay elapsed} (processing) -} \ No newline at end of file diff --git a/docs-v1/img-src/startup-diagram.tikz b/docs-v1/img-src/startup-diagram.tikz deleted file mode 100644 index c472d8056f..0000000000 --- a/docs-v1/img-src/startup-diagram.tikz +++ /dev/null @@ -1,14 +0,0 @@ -% -*- root: relay-states-preview.tex -*- - -\tikz[every node/.style={node distance=2cm}, - fan out/.style={to path={-- ++(0.5,0) -| ($ (\tikztotarget) - (1,0) $) -- (\tikztotarget)}}]{ - \node[draw,circle] (start) {}; - - \node[thread] (group participation) [above right=2cm and 2cm of start] {\hyperref[fig:relay-group-initialization]{Relay group participation}}; - \node[thread] (verification) [right=of start] {\hyperref[fig:relay-entry-verification]{Relay entry verification}}; - \node[thread] (keep client) [below right=2cm and 2cm of start] {\hyperref[fig:keep-client-initialization]{Keep client}}; - - \path [->] (start) edge [fan out] (group participation.west) - (start) edge [fan out] (verification.west) - (start) edge [fan out] (keep client.west); -} diff --git a/docs-v1/monitoring-and-alerting.adoc b/docs-v1/monitoring-and-alerting.adoc deleted file mode 100644 index ba49bfcbda..0000000000 --- a/docs-v1/monitoring-and-alerting.adoc +++ /dev/null @@ -1,97 +0,0 @@ -:toc: macro - -= Monitoring and Alerting for Keep Nodes - -toc::[] - -Operators on the Keep network are typically running two client executables, -generally on separate nodes. These clients each join a separate libp2p network, -one for the Keep random beacon and one for the Keep ECDSA system used to back, -amongst other things, tBTC. - -Below are some important metrics and alerting guidelines that apply to both -clients. - -== Important Metrics - -Clients report information in two primary ways: a metrics endpoint accessible -via HTTP and the logs that are printed from the client. Logs have levels that -correspond to message severity. - -As such, the most important metrics to track for all Keep nodes are: - -* WARN log count over time -* ERROR log count over time -* CRITICAL log count over time -* Peer count over time (accessible at `/metrics` on the port configured in the - `Metrics` block of the configuration file.) -* ETH balance of the operator account - -The client can be configured to log ERROR-level logs when the ETH balance of the -operator account drops below a set level; look for `BalanceAlertThreshold` in -the sample configuration file for more. - -For ECDSA clients, in addition to these metrics, it’s recommended that you -track the keeps that a given node is participating in. You can track these by -looking for log messages in the format: - -``` -member [%s] is starting signer generation for keep [%s]... -``` - -These indicate keep opening, with the first `%s` being the operator address -and the second being the keep address. Keep closing or termination can be -spotted by looking for log messages in the format: - -``` -unsubscribing from events on keep terminated -unsubscribing from events on keep closed -``` - -These currently do not include the keep address, though they will be updated to do so. - -== Alerting and Notification Thresholds - -The guidelines below distinguish between **notifications**, which are -informational but not necessarily interruptive, and **alerts**, which should -trigger pages and lead to quick investigation. The guidelines also -distinguish between different likelihoods of fund loss. Recommended -thresholds are as follows: - -* More than 5 WARN logs over 5 minutes should result in a **notification** for - on-call personnel for closer monitoring. These are typically - connectivity-related, and can be precursors to larger issues if remediation - is not applied. Fund loss may or may not occur without intervention if - warnings do not stop. -* More than 10 WARN logs over 15 minutes should result in **alerts** that will - trigger pages for on-call personnel. As above, these can be precursors to - larger issues without remediation. Fund loss is possible without - intervention. -* ERROR and CRITICAL logs should result in escalated **alerts** that will - trigger pages for on-call personnel. CRITICAL logs are generally associated - with a node crash. Both are a high-signal indicator that the node is - experiencing issues that have already led to on-chain problems or will soon - do so. Fund loss is probable without intervention. -* Peer counts that drop by more than 5% in a 10-minute period should result in - a **notification** for on-call personnel for closer monitoring. These may - or may not be due to the node itself, but can be precursors to larger - issues if not investigated. Fund loss may or may not occur without - intervention if these counts do not recover. -* Peer counts that drop by more than 10% and remain dropped for a 20-minute - period should result in **alerts** that will trigger pages for on-call - personnel. These may or may not be due to the node itself, but can be - precursors to larger issues if not investigated. If the issues don’t seem - to be with the node but with one of its peers, it’s highly recommended to - engage with the community Discord to try and find the relevant operator. - Fund loss is possible without intervention if the problematic node is - participating in a keep with the node you are operating. -* Operator ETH balance below 0.5 ETH should result in a **notification** for - on-call personnel for closer monitoring. This is a high safety margin, but - should result in close monitoring of balance and start the process for - topping the operator account up. -* Operator ETH balance below 0.2 ETH should result in **alerts** that will - trigger pages for on-call personnel. ETH balance below 0.2 ETH can quickly - deplete in cases of high network activity, so replenishing it is high - priority. Fund loss is possible without intervention if the node in - question fails to participate in a critical operation (e.g. a redemption - signature or a signer setup). \ No newline at end of file diff --git a/docs-v1/random-beacon/README.adoc b/docs-v1/random-beacon/README.adoc deleted file mode 100644 index 66dc4a7f81..0000000000 --- a/docs-v1/random-beacon/README.adoc +++ /dev/null @@ -1,30 +0,0 @@ -= Keep Random Beacon Work-in-progress Yellowpaper - -This directory contains a yellowpaper/specification for the Keep random -beacon, which will initially be built out for Ethereum. The yellowpaper -is currently still a work-in-progress, and is being developed alongside -the core beacon code. - -The core beacon code will be shared at a later time, while the yellowpaper, and -its progress, are available now. Note that core yellowpaper progress is still -handled in the Keep monorepo; we are syncing the branch history to and from -this repository on an ongoing basis. - -The yellowpaper is written in AsciiDoc and built using -https://asciidoctor.org[Asciidoctor]. It renders directly in GitHub, so please -feel free to click through the files in GitHub to see the rendered content, -starting with <>. Notably, GitHub does not process -inter-file includes, so includes are rendered as links to the embedded files. - -You can also see a fully-built version of the yellowpaper at -http://docs.keep.network/random-beacon/, or, if you prefer a PDF version, at -http://docs.keep.network/random-beacon/index.pdf. - -== Building - -To build the yellowpaper yourself, you should -https://asciidoctor.org/#installation[install Asciidoctor]. Then you can enter -the root directory of this repository and run `asciidoctor index.adoc` to -produce an `index.html` file. Asciidoctor also supports several -https://asciidoctor.org/docs/user-manual/#selecting-an-output-format[other -output formats]. diff --git a/docs-v1/random-beacon/alt_bn128.adoc b/docs-v1/random-beacon/alt_bn128.adoc deleted file mode 100644 index 4fac5d1c86..0000000000 --- a/docs-v1/random-beacon/alt_bn128.adoc +++ /dev/null @@ -1,48 +0,0 @@ -==== Elliptic curve specifications - -The pairing operations of the random beacon are performed on the curve -`alt_bn128`, as specified below: - -[horizontal] -q:: -`21888242871839275222246405745257275088548364400416034343698204186575808495617` -+ -Order of the groups G1 and G2 - -p:: -`21888242871839275222246405745257275088696311157297823662689037894645226208583` -+ -The size of the field _F~p~_ used in `alt_bn128` - -G1:: -Cyclic group of order _q_ on the curve `Y^2 = X^3 + 3` over the field _F~p~_ -with generator _P1_ -+ -Any point on the curve is a member of _G1_ - -P1:: -`(1, 2)` -+ -Generator of _G1_ - -G2:: -Cyclic group of order _q_ on the curve `Y^2 = X^3 + 3/(i+9)` over the field -`F_p^2 = F_p[i] / (i^2 + 1)` with generator _P2_ -+ -Points on the curve that have order _q_ are members of _G2_ - -P2:: -{blank} -+ -.... -( - 11559732032986387107991004021392285783925812861821192530917403151452391805634 * i + - 10857046999023057135944570762232829481370756359578518086990519993285655852781, - 4082367875863433681332203403145435568316851327593401208105741076214120093531 * i + - 8495653923123431417604973247489272438418190587263600148770280649306958101930 -) -.... -+ -Generator of _G2_ - -These terms deviate from the standard naming conventions. diff --git a/docs-v1/random-beacon/authorizations.adoc b/docs-v1/random-beacon/authorizations.adoc deleted file mode 100644 index 36f731155e..0000000000 --- a/docs-v1/random-beacon/authorizations.adoc +++ /dev/null @@ -1,197 +0,0 @@ -:toc: macro -:toclevels: 4 - -= Roles and authorizations - -ifndef::yellowpaper[toc::[]] - -== Roles - -Governance:: - -Governance is the final arbiter of authority in the Keep Network. -The role of Governance is to enable recovery from key compromise -by rekeying other roles. -Governance has the authority to change the addresses of -the _Registry Keeper_, _Panic Button_, -and the service contracts' _Operator Contract Upgraders_ -The rekeying process is currently unspecified. - -Registry Keeper:: - -The Registry Keeper maintains the global _registry_ of approved contracts. -Each operator contract must be approved by the Registry Keeper -before it can be authorized to punish operators -or used by a service contract. -The Registry Keeper can be rekeyed by _Governance_. - -Panic Button:: - -The Panic Button can disable malicious or malfunctioning contracts -that have been previously approved by the Registry Keeper. -When a contract is disabled by the Panic Button, -its status on the _registry_ changes to reflect this, -and it becomes ineligible to penalize operators. -Contracts disabled by the Panic Button can not be reactivated. -The Panic Button can be rekeyed by _Governance_. - -Operator Contract Upgrader:: - -Each service contract has an Operator Contract Upgrader -whose purpose is to manage operator contracts for that service contract. -The Operator Contract Upgrader -can add new operator contracts to the service contract, -and deprecate old ones. -The Operator Contract Upgraders can be rekeyed by _Governance_. - -Authorizer:: - -Each operator has an Authorizer -whose purpose is to determine which operator contracts -may punish the operator for misbehavior. -The operator can only perform work for authorized operator contracts. -The Authorizer cannot be rekeyed except by undelegating and redelegating. - -== Authorizations - -=== The Registry and Panic Button - -The registry tracks all Keep Org -approved contracts. -Operator contracts have a special status on the registry, -reflecting the ability of the Panic Button to disable them. - -Each operator contract's status may be `NULL`, `APPROVED` or `DISABLED`. - -A status of `NULL` is the default -and means that the operator contract has not been approved -by the _Registry Keeper_. - -When the _Registry Keeper_ approves a operator contract, -its status switches to `APPROVED` in the registry. -Approved operator contracts can be authorized to punish operators, -and service contracts may utilize them. - -The _Panic Button_ can be used -to set the status of an `APPROVED` contract to `DISABLED`. -Operator Contracts disabled with the _Panic Button_ cannot be re-enabled, -and disabled contracts may not punish operators -nor be selected by service contracts to perform work. - -=== Staking contracts: authorized operator contracts - -Staking contracts hold staked tokens, -enforce staking rules, -and punish misbehaving operators -on behalf of authorized operator contracts. -For this purpose, -each staking contract tracks which operator contracts -have been authorized by which addresses. - -The _authorized operator contracts_ are a mapping -of `(address authorizer, address operator_contract) -> status`. - -The status of a contract may be either `NULL` or `AUTHORIZED`. -A status of `NULL` is the default -and means the operator contract is not authorized. -A status of `AUTHORIZED` means that the operator contract -may impose punishments on those operators -who have assigned that `authorizer` as their _Authorizer_. - -To authorize an operator contract on a staking contract, -the operator contract must have been `APPROVED` on the _registry_. -Once a operator contract has been authorized, -authorization cannot be withdrawn by the authorizer. -However, a operator contract that has been `DISABLED` by the _Panic Button_ -may not punish stakers. - -=== Service contracts: used operator contracts - -Service contracts use the basic functionality performed by operator contracts, -to provide useful services to the public. -Service contracts can use multiple different versions of operator contracts -to perform the operator contract functions. -To permit system upgrades, -the list of used operator contracts can be updated with proper authorization. - -A service contract is deployed with zero operator contracts, -rendering the service contract inactive -until at least one operator contract is activated. - -Each service contract has its own _Operator Contract Upgrader_ -who can add used operator contracts. -To add a used operator contract, -the operator contract must have been `APPROVED` on the _registry_, -and the interface it claims to implement -must match what the service contract expects. - -If an operator contract has been `DISABLED` by the _Panic Button_, -the service contract must not use its functionality. -This must be checked when the service contract selects an operator contract. - -== Impact of compromised keys - -=== Individual keys - -==== Registry Keeper - -A compromised Registry Keeper can approve arbitrary operator contracts. -However, using those operator contracts for a service contract -requires the service contract's Operator Contract Upgrader as well. -Thus, a compromised Registry Keeper cannot endanger customers alone. -Similarly, stakers' funds are safe from being slashed by malicious contracts -unless their Authorizers are also compromised. - -==== Panic Button - -A compromised Panic Button can disable arbitrary operator contracts -and halt all network services. -Recovery is impossible until Governance has rekeyed the Panic Button. - -This is inevitable due to the functionality of the Panic Button, -but the impact could be mitigated -by setting a cap on how many times the Panic Button can be invoked -within a particular timeframe. -However, if a compromised Registry Keeper -approves a large number of malicious contracts, -a rate-limited Panic Button would be overwhelmed -and unable to disable them all. -This could be further mitigated by rate-limiting the Registry Keeper similarly. - -==== Operator Contract Upgrader - -A compromised Operator Contract Upgrader -can activate operator contracts on the affected service contract -within the strict constraints of the upgrade process. -It is unlikely that an uncompromised Registry Keeper -would have approved an operator contract that would satisfy the constraints -yet cause a significant impact on the service contract. - -==== Authorizer - -If only the Authorizer of some staker is compromised, -the attacker can authorize operator contracts -that have been approved by the Registry Keeper, -and that use the same staking contract as the staker. - -This has a very limited negative impact -unless the Registry Keeper has approved -a faulty or malicious operator contract. - -=== Key combinations - -==== Registry Keeper + Operator Contract Upgrader - -If a malicious operator contract can get globally approved, -the impacted service contract can be completely subverted -by switching all work to the malicious operator contract. - -While already existing operations should finish normally, -the service contract can be rendered effectively useless for new requests. - -==== Registry Keeper + Authorizer - -If the Registry Keeper approves a malicious operator contract, -and a staker's Authorizer authorizes it, -the malicious contract can be used to steal staked funds -within the constraints of tattletale rewards: -seizing up to 5% to the attacker and burning the rest. diff --git a/docs-v1/random-beacon/beacon-pricing.py b/docs-v1/random-beacon/beacon-pricing.py deleted file mode 100644 index 867492ecd1..0000000000 --- a/docs-v1/random-beacon/beacon-pricing.py +++ /dev/null @@ -1,147 +0,0 @@ -class Bid(NamedTuple): - amount: Money - expiresAt: Blockheight - seedCommitment: Commitment[SeedValue] - - -class BidPool(NamedTuple): - bidTotal: Money - allBids: OrderedList[Bid] - - -def popBid( - pool: BidPool -) -> Option[Bid]: - if empty(pool.allBids): - return False - else: - topBid = pool.allBids.head - remainingBids = pool.allBids.tail - - pool.bidTotal -= topBid.amount - pool.allBids = remainingBids - - return topBid - - -def pushBid( - pool: BidPool, - bid: Bid -) -> BidPool: - pool.bidTotal += bid.amount - pool.allBids = addToOrderedList(pool.allBids, bid) - - return pool - - -def filterExpired( - pool: BidPool, - currentTime: Blockheight -) -> BidPool: - filteredPool = BidPool(0, []) - - # for conceptual simplicity, we create a new pool containing - # only unexpired bids, then overwrite the old pool with it - for bid in pool.allBids: - if bid.expiresAt > currentTime: - pushBid(filteredPool, bid) - - pool = filteredPool - return filteredPool - - -def tick( - pool: BidPool, - newBids: List[Bid] -) -> Option[BeaconOutput]: - - # add in new bids - for bid in newBids: - pushBid(pool, bid) - - # remove expired bids - filterExpired(pool, getCurrentBlockHeight()) - - # the heavy lifting function - # the current price should be determined by how many outputs the beacon - # has recently generated; a larger number of outputs means higher price - currentPrice = getCurrentOutputPrice() - - if pool.bidTotal >= currentPrice: - return generateOutput(pool, currentPrice) - else: - return False - - -def generateOutput( - pool: BidPool, - currentPrice: Money -) -> Option[BeaconOutput]: - usedBids = BidPool(0, []) - - while usedBids.bidTotal < currentPrice: - nextBid = popBid(pool) - pushBid(usedBids, nextBid) - - # determine the total stake for this output generation, - # and then individual stakers' stake - # - # higher bids -> higher stake - # - # note that the actual rewards for stakers will be proportionally higher - # when bids and stakes are higher, due to costs being constant - # - # thus highest stakes create the best risk:reward ratio - totalStake = usedBids.bidTotal * BID_STAKE_MULTIPLIER - memberStake = totalStake / N - - # an alternative algorithm, creating more variability in the stakes - # - # getCurrentGasPrice() is a simplification and should actually use - # a smoother estimate to correct for price fluctuations - totalProfit = usedBids.bidTotal - (getCurrentGasPrice() * OUTPUT_GAS_COST) - totalStake = totalProfit * BID_STAKE_MULTIPLIER - memberStake = totalStake / N - - # select the group to perform the beacon output - # based on the hash of the block containing the transaction - # triggering the output generation - generationGroup = selectGroup(getLatestBlockHash()) - - # use some defined function to determine the time we will - # wait for any single bidder to reveal their seed - requestTimeout = timeoutByBidN(len(usedBids.allBids)) - - startingTime = getCurrentBlockHeight() - timeoutBlock = startingTime + requestTimeout - - # initially, the top bid is eligible to reveal seed - eligibleBid = popBid(usedBids) - - revealedSeed = False - - while revealedSeed == False: - # reached timeout -> top bidder no longer eligible - # next highest bidder becomes eligible - if getCurrentBlockHeight() >= timeoutBlock: - timeoutBlock += requestTimeout - eligibleBid = popBid(usedBids) - - # nobody responds within timeout, no output produced - if not eligibleBid: - return False - - seedValue = receiveSeedRevealTx() - - if checkCommitment(seedValue, eligibleBid.seedCommitment): - revealedSeed = seedValue - - # we have a revealed seed, time to proceed with generation - output = generationGroup.sign(revealedSeed, v_previous) - if not empty(output.misbehavingMembers): - penalize(output.misbehavingMembers, memberStake) - - return output - - - diff --git a/docs-v1/random-beacon/contract-structure.adoc b/docs-v1/random-beacon/contract-structure.adoc deleted file mode 100644 index 89f1b23478..0000000000 --- a/docs-v1/random-beacon/contract-structure.adoc +++ /dev/null @@ -1,112 +0,0 @@ -:toc: macro -:toclevels: 4 - -= Contract structure - -ifndef::yellowpaper[toc::[]] - -== Overview - -Token contract:: - -KEEP is an ERC20 token defined by the _token contract_. -The token contract is hard-coded in the operator and staking contracts, -but the design of the overall system makes it possible -to later migrate to a new version of the token contract -without disrupting customer experience. - -Staking contract:: - -Owners of KEEP tokens can use a _staking contract_ -to _stake_ them and use them as collateral for _operators_ -who perform useful work in the Keep Network. -Staked tokens are transferred to the staking contract -and _delegated_ to an operator address. -The staking contract makes the tokens available to _operator contracts_ -that have been _authorized_ to punish the operator in case of misbehavior, -while protecting them from unauthorized operator contracts. - -Operator contracts:: - -Operators interact with _operator contracts_ -to perform useful work for customers. -Operator contracts handle operations -that are critical for the proper incentives of individual operators. -They reward operators for correct behavior, -and are authorized to punish misbehavior. - -Service contracts:: - -_Service contracts_ provide higher-level services to the public -using work performed by one or more operator contracts. -Service contracts do not interact directly with operators -nor do they need to be aware of the KEEP tokens or the staking contract. -Operator contracts can be upgraded without disrupting customer experience -by deploying a new version and adding it to the service contract. - -Registry:: - -The addresses of contracts approved by Keep Org are kept in the _registry_. -Token contracts, staking contracts, operator contracts and service contracts -are all tracked separately in the registry. -The addresses and statuses of various contracts -can be queried from the registry. - -== Operator contracts - -Operator contracts coordinate the work performed by network operators, -and provide services to other "customer" contracts. -Operator contracts handle all operations -that may have an impact on staked tokens. -Conversely, operators performing work for the network -only need to interact with operator contracts. - -The customer contract is treated as untrusted -and the operator contract must maintain correctness -and the safety of the operators' stakes -regardless of the customer contract's input. -Each operator contract is an independent "microservice", -keeping its own state on security-critical data. - -When a customer contract requests an operator contract to perform a service, -it must pay the operator contract for the service provided. -The payment is distributed to contributing operators -according to the operator contract's own rules. -An operator contract can either provide services -to any contract that makes a valid request and pays the correct fee, -or it can be owned by a specific contract and only serve its owner. -In the random beacon -the service contract is the only "customer" of the operator contracts, -and operator contracts only provide services to the random beacon. -Future operator contracts may provide services directly to the public. - -If one or more participant operators misbehave -or fail to perform promised work, -the operator contract tells the staking contract to punish the guilty parties -and optionally reward a tattletale that proved the misbehavior. -To punish misbehaving operators, -an operator contract must be authorized by the operator's authorizer. -Once an operator contract has been authorized by some address, -it can never be deauthorized by that address. - -== Service contracts - -Service contracts use the basic functionality -performed by operator contracts, -to provide useful services to the public. -In contrast to operator contracts, -service contracts don't interact directly with operators -and a failure in a service contract cannot risk operators' stakes. - -Service contracts receive requests for their services from customers, -and provide the requested services. -Elements that are critical for operators' security and incentives -are delegated to an operator contract, -while other parts of the work are performed in the service contract. -The service contract keeps shared state which is not security-critical. - -Service contracts can use -multiple different versions of operator contracts -to perform the operator contract functions. -To permit system upgrades, -the list of used operator contracts can be updated with proper authorization. diff --git a/docs-v1/random-beacon/delegation-notes.adoc b/docs-v1/random-beacon/delegation-notes.adoc deleted file mode 100644 index 0571a6428f..0000000000 --- a/docs-v1/random-beacon/delegation-notes.adoc +++ /dev/null @@ -1,544 +0,0 @@ -= Stake delegation - notes - -Based on RFC 3 - -Network throughput only depends on atomic stakes vs multioperation, ie whether -you lock the stake (which means every operation locks MINIMUM_STAKE as holders -will simply divide their stakes over the largest possible number of addresses if -the full stake is locked) or permit "fractional reserve staking" where the same -MINIMUM_STAKE may back up multiple different operations at the cost of being -able to pull off an "exit scam" style misbehaviour where someone who is going to -get their stake slashed away entirely misbehaves on all their other operations -as well. - -Since the average level of stake leveraging this way is going to be the same for -both honest and malicious participants, the effect of this on network integrity -is ultimately probabilistically constrained and anomalously high leverages (eg. -someone with 2 * MINIMUM_STAKE participating in 20 operations when typically -someone with MINIMUM_STAKE participates in 3) would be correspondingly rare. - -Thus the real outcome is: - -With atomic staking, the network throughput is hard-capped at TOTAL_SUPPLY / -MINIMUM_STAKE operations simultaneously. This necessitates adjusting -MINIMUM_STAKE downwards if there is significant growth in the network usage. -However, if the value of the tokens scales linearly with usage, the amounts at -stake remain constant in external money. - -The need to adjust MINIMUM_STAKE down over time also means that barriers to -entry to staking should remain constant, and ownership of tokens would be free -to get distributed more widely. - -With unrestricted multioperation the network throughput is not limited by the -supply/stake ratio, and increased demand just means the same stakes get used for -multiple different operations if MINIMUM_STAKE remains constant. If the value of -the tokens increases with network usage, this means that the price of "random" -misbehaviour also increases, and acts as a serious incentive to ensure -reliability on a more mature network, but when failures happen there is less -incentive to not misbehave further. However, the total amount of misbehaviour -one can afford with a constant external money amount is limited to a small -multiplier of the amount under atomic staking. - -If MINIMUM_STAKE stays constant, it increases the barriers to entry to staking -and encourages concentration of tokens in fewer, richer hands. However, if -multioperation is combined with downwards adjustment in minimum stake (and -penalties, which both of these imply should be defined as fractions of the -minimum stake), its behaviour ends up being a hybrid of unadjusted -multioperation and fully adjusted atomic staking (or, if the minimum stake is -completely adjusted for network demand, similar to that with atomic staking -except with a small chance of stakes being leveraged), but all forms of -unrestricted multioperation offer unlimited throughput. - -''' - -Because all forms of atomic staking are isomorphic due to the incentive -structure created by positive expected value from network participation, it -seems that these proposals actually break down into the following: - -- atomic staking vs. multioperation -- dynamic vs. constant MINIMUM_STAKE -- instant undelegation with penalties vs. delayed undelegation with stake -locking - -''' - -If the above are condensed into letters denoting particular combinations: - -A : M + -D : C + -P : L - -I think anything from xxP is not very viable because of the -problems with instant undelegation, and thus xxL is the design space I'd -recommend. ACL has inherently limited throughput and is not a long-term viable -option. This leaves ADL, MDL and MCL . - -MCL is the simplest to implement because it avoids the need to adjust the -minimum stake (This scheme is not present in this RFC; options 1 and 3 -correspond to AxL of which ADL is a viable option, while 2 is MxP and 4 is AxP, -not recommended because of instant undelegating). MDL is more complex but also -more flexible if changes in the token staking patterns are desired. ADL is -slightly more intuitive in its characteristics in resistance to misbehaviour, -but it's also inflexible in how the minimum stake has to be adjusted to keep up -with demand, and it may present problems with accommodating possible future -services with especially high per-member stake requirements. - -''' - -There is also the option of keeping MINIMUM_STAKE constant but adjusting -penalties to match increase in demand and effective leveraging of multioperated -stakes. This would also enable particularly high-assurance services as the -maximum money at stake effectively grows with network demand. - -''' - -N~max_stakers~:: -Tokens~total~ / Stake~min~ -+ -The maximum count of stakers if all tokens were distributed in exact integer -multiples of _Stake~min~_ - -N~stakers~:: -sum(map(Stake~i~ -> floor(Stake~i~/Stake~min~), Stakers)) -+ -The actual number of virtual stakers available in the network - -c:: -N~stakers~ / N~max_stakers~ -+ -The staking efficiency factor of the network; what fraction of the tokens is -"actually performing work" - -Ops:: -min(Ops~max~, Demand) -+ -The amount of simultaneous operations being performed - -o:: -Ops / N~stakers~ -+ -The overcapacity factor; how many simultaneous operations the average virtual -staker is performing - -Ops~max~:: -o~max~ * N~stakers~ + -f~ops~ * Demand - -The maximum amount of simultaneous operations the network can perform - -o~max~:: -The maximum overcapacity factor - -Price:: -f~price~ * Demand -+ -Token price assuming it follows network demand linearly; argument for this: -+ -Expected value from operating is _EV = R * o - OpCost = (R - f~op_cost~) * o_ -+ -Let _CapCost_ be cost of capital and ignore some constant factors. -+ -Operating a node is profitable when _EV > Stake~min~ * Price * CapCost_. -+ -_R * o > Stake~min~ * Price * CapCost_ + -_R * Ops / N~stakers~ > Stake~min~ * Price * CapCost_ + -_R * Demand / (Tokens~total~ / Stake~min~) > Stake~min~ * Price * CapCost_ + -_R * Demand / Tokens~total~ > Price * CapCost_ + -_(R / Tokens~total~) * Demand > Price * CapCost_ -+ -Thus equilibrium at _Price = Demand * R / (Tokens~total~ * CapCost)_ -(and the ignored constant factors). - -OpCost:: -f~op_cost~ * o -+ -The cost of operating a node (assuming cost follows network demand linearly) - -Stake~actual~:: -Stake~min~ * Price -+ -The actual amount of money at stake with network operations - -''' - -Proposal 1: - -- 1:1 owner address/operator address -- atomic stake -- delayed undelegation - -o~max~ = 1 -Ops~max~ = N~stakers~ - -Because of the 1:1 nature and atomicity, stakes will be blitzpantsed. Thus there -will be _N~stakers~_ capacity in the network. This requires -_N~stakers~ = Demand_ and further _c * (Tokens~total~ / Stake~min~) = Demand_ -or _Stake~min~ = c * (Tokens~total~ / Demand)_ - -Name _c' = c * Tokens~total~_; now _Stake~min~ = c' / Demand_ - -''' - -Proposal 2: - -- 1:1 owner/operator -- multioperation -- instant/penalized undelegation - -o~max~ = unlimited -Ops~max~ = unlimited - -No specific incentive to blitzpants. No specific need to adjust _Stake~min~_. - -_Stake~actual~ = Stake~min~ * f~price~ * Demand_; -with _p = Stake~min~ * f~price~_: _Stake~actual~ = p * Demand_ - -The risk of "free" misbehavior when _D~sum~ > Stake~min~_ is mostly illusory. -The maximum penalty _S~i~_ could earn is _D~max_i~ = o~i~ * Stake~min~_. -_D~max_i~ > Stake~min~_ when _o~i~ > 1_. - -_Demand = Ops_ so -_Demand = o * N~stakers~_ + -_Demand = o * c * (Tokens~total~ / Stake~min~)_. - -Let constant factor _f' = c * f~price~_. - -Now, _Price = o * f' * N~max_stakers~_. - -Also _Stake~actual~ = Stake~min~ * f' * o * Tokens~total~ / Stake~min~_ -simplifying to _o * f' * Tokens~total~_. - -Let _f'' = 1 / (f' * Tokens~total~)_. - -The ratio _D~max_i~ / Stake~actual~ = o~i~ * Stake~min~ / (o * Stake~min~) * f''_. - -We get _(o~i~ / o) * f''_. - -Thus the overleveraging of stakes only actually happens, compared to a constant -value stake, when _o~i~ > o_ which is constrained by the random distribution of -_o~i~_ around _o_. This would be expected to follow roughly a poisson -distribution and thus the probability of _o~i~ / o_ being large is quite small -with large _o_. - -Further add to this that the opportunity cost for _S~i~_ is _R * o~i~_. - -''' - -== Delegation - -=== Option 5: Multioperated delegation - -==== General requirements: -1. _owner_ can only have one operator. -2. _owner_ can stake any amount of tokens between _Stake~min~_ and their stake. -3. _operator_ can only be _operating_ on behalf of one _owner_. -4. If an _owner_ tries to delegate to more than one operator, the tx must -fail. -5. If an _owner_ tries to delegate a stake to an _operator_ who already has a -stake, the tx must fail. - -==== Basic design - -With this scheme, tokens are staked by signing and publishing a staking contract -("agreement" to distinguish it from on-chain smart contracts) which specifies -the various details of any individual staking arrangement. This creates a new -staker identity in respect to those tokens, which can then be used to -participate in the network. - -To improve security, separate roles are created for each aspect of staking. The -addresses behind these roles can be the same or different, depending on the -specific arrangement. This lets token-holders utilize cold storage effectively, -or delegate different aspects to different parties. - -owner:: -The address actually holding the tokens - -operator:: -An address authorized to use the tokens as stakes for participating in the -network - -beneficiary:: -An address designated to receive any rewards from participation - -overseer:: -An address with the authority to audit and authorize contract upgrades - -==== Roles - -===== Owner - -The owner is the ultimate holder of the tokens. Before staking, the owner has -full control over the tokens, and the tokens are returned to the owner after -staking has finished. The owner's participation is not required in the -day-to-day operations of the staker, so cold storage can be accommodated to the -maximum extent. - -The owner address is used to initiate staking and create the staker, and to -finish staking and reclaim the staked tokens. - -===== Operator - -The operator handles the everyday operations of the staker without actually -owning the staked tokens. While this enables third-party delegation without eg. -making it possible for the operator to simply transfer away tokens, it should be -noted that a malicious operator can exploit stake slashing to steal or destroy -tokens and thus the entire staked amount is indeed at stake. - -The operator address is used to provide network functionality by participating -in various protocols. A signature from the operator is also required to initiate -staking, and the operator can unilaterally finish staking and return the tokens -to the owner. - -===== Beneficiary - -The beneficiary collects rewards earned from staking and participating in the -network. The beneficiary doesn't sign or publish any protocol-relevant transactions, -but any currency or tokens earned by the staker will be transferred to the -beneficiary. - -===== Overseer - - - -==== Stake multioperation -The stake multioperation feature enables performing several operations on the -same stake at the same time. As the stake is not locked for any particular -operation then it is possible for the _operator_ to participate in more than one -parallel operation using the same stake. - -==== Basic structure: - -* _delegating contract_ - ** _tokens[owner] -> amount_ table - ** _staking[owner] -> delegation_id_ table - ** _operating[operator] -> delegation_id_ table - ** _op_agreement[delegation_id] -> agreement_ table with: - *** _amount_ of staked tokens - *** (if atomic alternative is desired:) - **** _free_tokens_ unallocated to any contract - **** _locked_tokens[contract_address] -> amount_ table of allocated tokens - *** _state_ of the staking agreement - *** _since_ last change - *** _owner_ of the tokens - *** _operator_ performing actions - *** _beneficiary_ receiving rewards - *** _authorizer_ auditing upgrades - ** `delegate` method for delegating - ** `undelegate` method for initiating undelegation - ** `reclaim` method for finishing undelegation and freeing tokens - ** `penalize` method for slashing stakes and rewarding tattletales with tokens - ** `reward` method for paying out currency rewards - ** (if atomic alternative is desired: `lock` method for assigning tokens to - contracts) - -* _authorization contract_ - ** _authorized[authorizer] -> [contract_address]_ table - ** _blocked[contract] -> bool_ table of contracts `panic` has been called on - ** `authorize` method for adding a contract to the caller's authorization list - ** `panic` method for aborting all operations on a specific contract and - revoking authorizations - -* _functionality contracts_ provide network functions, and may call methods of -the _delegating contract_ for rewards and punishments (if atomicity is desired, -these contracts can also call `lock` with the proper authorization) - -==== Functionality - -===== Delegating a stake: - -1. The _owner_ chooses the _staked amount_, and the _operator_, _beneficiary_ and -_upgrade authorizer_ addresses and creates a _delegation order_ containing this -information - -2. Both the _owner_ and _operator_ sign the _delegation order_ - -3. The _delegation order_ is published on-chain - -4. The contract receives the _delegation order_ and verifies the following (if -any condition is unfulfilled, processing aborts): - * `staking[owner] == nil` - * `operating[operator] == nil` - * `tokens[owner] >= staked_amount >= minimum_stake` - -5. If all conditions are satisfied the contract processes the _delegation order_ -and sets the following: - - * `staking_time := current_time` - * `delegation_id := hash(owner, operator)` - * `tokens[owner] -= staked_amount` - * `staking[owner] := delegation_id` - * `operating[operator] := delegation_id` - * {blank} -+ -.... -op_agreement[delegation_id] := { - amount = staked_amount, - state = Active, - since = staking_time, - owner = owner, - operator = operator, - beneficiary = beneficiary, - authorizer = upgrade_authorizer -} -.... - -6. The _operator_ can now use this stake for operating - -(A _n-to-n_ variant can be designed where owners and operators are not tied to a -single delegation, but an owner can delegate to unlimited operators, an operator -can operate for unlimited owners, and each _owner, operator_ pair can have -unlimited delegation agreements between each other. - -This would be done by eliminating the `staking[owner]` and `operating[operator]` -tables, and by setting `delegation_id := hash(owner, operator, staking_time)`. -With this change, the only limit is that the owner and operator can only -establish a single delegation agreement in a single block.) - -===== Undelegating a stake: - -1. The _owner_ or _operator_ chooses to unstake, and creates a -_undelegation order_ containing the _delegation ID_ - -2. Either the _owner_ or _operator_ signs the _undelegation order_ and publishes -it on-chain - -3. The contract receives the _undelegation order_ and verifies the following -(`d_agreement := op_agreements[delegation_id]`): - - * `d_agreement != nil` - * The _undelegation order_ is signed by either `d_agreement.owner` or - `d_agreement.operator` - -4. If the conditions are satisfied, the contract processes the -_undelegation order_ and sets the following: - - * `unstaking_time := current_time` - - * `d_agreement.state := Unstaking` - - * `d_agreement.since := unstaking_time` - -5. The _operator_ can not enter new operations until the undelegated stake is -reclaimed - -===== Claiming undelegated stake - -1. After _T~unstake~_ has passed since the _undelegation order_ has been -processed, the _owner_ or _operator_ creates, signs and publishes a -_stake reclaiming order_ containing the _delegation ID_ - -2. The contract receives the _stake reclaiming order_ and verifies the -following (`d_agreement := op_agreements[delegation_id]`): - - * `d_agreement != nil` - * The _stake reclaiming order_ is signed by either `d_agreement.owner` or - `d_agreement.operator` - * `d_agreement.state == Unstaking` - * `d_agreement.since + unstake_delay =< current_time` - -3. The contract processes the _stake reclaiming order_ and sets the following: - - * `tokens_unlocked := d_agreement.amount - new_penalties` (`new_penalties` - applies if eg. an operation is still underway and it has been decided to set - penalties for reclaiming stakes in such a situation) - * `staking[owner] := nil` - * `operating[operator] := nil` - * `op_agreements[delegation_id] := nil` - * `tokens[owner] += tokens_unlocked` - -4. The _operator_ is now free to start operating for a new _owner_ - -(In the _n-to-n_ variant the `staking[owner]` and `operating[operator]` tables -are absent) - -===== Operating on a stake - -1. When the _operator_ tries to join an operation (eg. present a ticket for beacon -group selection) they should create a _operation initialization order_ including -the _delegation ID_ and the _contract address_, signed by the _operator_. - -2. The _operation initialization order_ is published along with any other data -required to join the operation, after which the following should be checked -(`d_agreement := op_agreements[delegation_id]`: - - * `d_agreement != nil` - * `d_agreement.state == Active` - * If there is a requirement that the operator be staked before _deadline_, then -`d_agreement.since =< deadline` - * The request is signed by `d_agreement.operator` - * `d_agreement.amount >= minimum_stake` - * The current contract has been authorized by `d_agreement.authorizer` - * The current contract has not been blocked with the panic button: -`blocked[contract_address] == nil` - -3. If the checks pass, the operator may join the operations. - -===== Rewards - -1. If the operator is awarded a _reward_ of currency, the reward should be paid -to `d_agreement.beneficiary` - -===== Penalties - -1. If the operator is to be punished by stake slashing, the -_penalizing contract_ should call the _delegation contract_ with the _penalty_. -The _penalty_ should contain the following: - - * The _penalty amount_ - * The _delegation ID_ to be slashed - * Optionally the _tattletale reward amount_ and the _tattletale delegation ID_ - -2. The _delegation contract_ should then check the following -(`d_agreement := op_agreements[delegation_id]`): - - * The _penalizing contract_ is authorized by `d_agreement.authorizer` and has -not been blocked with the panic button - * `penalty_amount =< minimum_stake` - -3. If the penalty is valid, the _delegation contract_ will then perform the -following: - - * `actual_penalty := min(penalty_amount, d_agreement.amount)` - * If there is a tattletale reward: - ** `actual_tattletale_reward := min(tattletale_reward_amount, actual_penalty)` - ** `tattletale_beneficiary := op_agreements[tattletale_id].beneficiary` - ** `tokens[tattletale_beneficiary] += actual_tattletale_reward` - * `d_agreement.amount -= actual_penalty` - * If `d_agreement.amount < minimum_stake`, then the operator is blocked from -joining any new operations and the tokens are automatically unstaked: - ** `d_agreement.state := Unstaking` - ** `d_agreement.since := current_time` - -The _actual penalty_ is set to be at most the amount of tokens remaining in the -stake, and the _actual tattletale reward_ is set to be at most the -_actual penalty_ to ensure no new tokens can be created by exploiting -overstaking. However, this means that it becomes possible to deny the tattletale -a reward by processing other penalties (where the misbehaving party also -controls the tattletale, to reduce their losses) first so that there is no stake -remaining when the real tattletale's turn comes. The only way to avoid this is -by stake atomicity so each operation is backed by hard tokens. - -===== Upgrading a contract - -1. The _upgrade authorizer_ audits and authorizes the new contract - -2. The _upgrade authorization contract_ checks that the _contract address_ is -present on the canonical version list, and adds it to the authorizer's list of -authorized contracts: `upgrade_authorizer.contracts += contract_address` - -The rationale for this is that the authorizations can be outsourced to a third -party, and thus it is useful to have the authorizations stored separately to -reduce costs compared to including them in each delegation agreement. - -If the new contract is found compromised, the recourse is for the _owner_ or -_operator_ to unstake or for the _panic button_ to be used to halt all -operations on the compromised contract. Once authorized, a contract is -technically capable of completely burning or transfering any staked tokens, even -if unstaking has been ordered. If this were not the case it would be possible to -avoid legitimate penalties. - -Stake atomicity could be used to reduce exposure to compromised contracts, by -limiting the amount subject to the contract. Stake atomicity can be combined -with contract-specific stakes while keeping global minimum stake constant, so -that network throughput can be improved by upgrading contracts to new versions -with lower stakes required to participate. diff --git a/docs-v1/random-beacon/dkg/alternative.adoc b/docs-v1/random-beacon/dkg/alternative.adoc deleted file mode 100644 index b9ad6451be..0000000000 --- a/docs-v1/random-beacon/dkg/alternative.adoc +++ /dev/null @@ -1,428 +0,0 @@ -= DKG alternative result submission - -_Escalating votes_ was originally chosen as the protocol -for DKG result submission -due to its favorable gas costs. -By reducing the frequency of group creation, -it is feasible to use _full verification_ instead. -_Full verification_ costs significantly more gas -in the expected typical scenario, -but is also more robust. - -With the _full verification_ alternative, -competing submissions are not presented. -Instead, the participants agree on a result off-chain, sign it, -and the first available participant submits the result on-chain -as soon as eligible. - -== Basic description -Each participant _P~i~_ calculates the result they believe to be correct; -this is called the _preferred result_ of _P~i~_. -The participants sign broadcast their _preferred results_. -Each participant should sign and broadcast one _preferred result_; -signing more than one _preferred result_ can be proven on-chain -and will be heavily penalized. - -After receiving the _preferred results_ of other participants, -_P~i~_ counts the signatures on each result. -The result with at least _H_ signatures is the _quorum result_. -The _quorum result_ is published on-chain along with its signatures. - -The contract checks that the result is correct -and has at least _H_ valid signatures. -If the checks pass, -a new group is successfully created. - -== Multiple quorum results -It is possible that there is more than one _quorum result_. -This always requires that at least one participant -has signed two different results. -Additionally, either the honest majority assumption has been violated -or the honest participants are split over different results. - -There are multiple different ways to deal with this. - -[upperalpha] -. Accept either result -because under honest majority both must have at least one honest signer -. Discard signatures from disqualified participants -and reject all results because no honest quorum was achieved -. Discard signatures from disqualified participants -and attempt to reconstruct a valid result, -aborting only if the results are incompatible - -== Option A: accept either -Option A has a very simple on-chain implementation. -It is sufficient to accept the first submission -with at least _H_ signatures -and reject any further submissions. -Members who provably sign multiple submissions -can be removed from the group on the fly. - -However, because signing two different results is forbidden, -neither result has the support of _H_ not-provably-misbehaving participants. -This would permit an adversary to force the creation of -a group where the adversary has a linchpin position. - -Let the results be _a_ and _b_. -Let the number of honest participants -signing each result be _h~a~_ and _h~b~_ respectively. -Let the malicious participants be _m~a~_ and _m~b~_, -and _m~ab~_ for those who sign both results. -Let _ia_ and _dq_ be the number -of inactive and disqualified participants. - -==== No honest majority -If this attack happens because the honest majority assumption has failed, -it is dubious whether it matters -because the adversary has better attacks available. -If the honest participants number less than _H_, -the adversary could outnumber them -by simply not signing the honest participants' preferred result. -Signing multiple results can be proven on-chain -and thus heavily penalized. -In this scenario option A does not seem to meaningfully reduce security. - -_h~a~ < H_ - -_h~b~ = 0_ - -_h~a~ + m~a~ + m~ab~ >= H_ - -_m~b~ + m~ab~ >= H_ - -_ia + dq + m~ab~ =< M~nofail~_ - -If _m~ab~_ were to instead sign only _b_, -the adversary could avoid the punishment -and guarantee that result _b_ is selected. - -The adversary can completely control the group formed by _b_, -while in _a_ the adversary is only guaranteed a linchpin position -(the ability to prevent entries from being created -and to deny submitter rewards to other participants) -unless _m~a~ + m~ab~ >= H_ -(requiring _m~a~, m~b~ > M~nofail~_ thus _h~a~ < M~nofail~_; -a rather hopeless situation under any option). - -==== Split honest majority -The other alternative is -that the honest majority is split over different results, -and the adversary signs results selectively to manipulate the outcome. - -_h~a~ + h~b~ >= H_ - -_m~a~ + m~ab~ + m~b~ =< M_ - -_h~a~ + m~a~ + m~ab~ >= H_ - -_h~b~ + m~b~ + m~ab~ >= H_ - -_ia~a~ + dq~a~ + m~ab~ =< M~nofail~_ - -_ia~b~ + dq~b~ + m~ab~ =< M~nofail~_ - -_h~a~ + m~a~ < H_ - -_h~b~ + m~b~ < H_ - -If the honest majority is irreconcilably split -and the results _a_ and _b_ have different _QUAL_ -and thus different group public keys, -the adversary is able to guarantee itself a linchpin position -regardless of the winning result. - -If the honest majority agrees on _QUAL_ and _Y_, -the adversary can obtain a linchpin position -if _a_ sets many participants from _h~b~_ as inactive, -and vice versa. -Otherwise the resulting group will be capable of -producing signatures without contribution from the adversary. - -By having _m~ab~_ sign only one of the two results, -the adversary could choose the more favorable outcome -and avoid the penalties for signing conflicting results. - -=== Option B: reject both -Option B provides the most robust guarantees -but is complex to implement on-chain. - -It is not enough to accept -the first result to be signed by at least _H_ members -because some of those signatures could be invalidated later. -The first result that appears to meet quorum -would have to be set as the _tentative result_, -as it could become invalid as proofs of misbehavior are submitted. - -Signatures by each member need to be tracked, -and members disqualified for multiple signatures -must be recorded in a special blacklist. - -Because an adversary could submit a result with exactly _H_ signatures, -and afterwards invalidate some of them, -it is necessary that signatures can be added to the _tentative result_. - -A separate finalization after submission time has run out -would remove disqualified signatures -and determine whether the _tentative result_ remains valid. -(No other result could become valid; -if the _tentative result_ is invalidated -it is impossible for any result to gain _H_ valid signatures.) - -=== Option C: try to reconstruct a valid result -In option C, -conflicting results can be reconciled -to obtain one acceptable outcome. -Results are not treated as immutable units, -but rather as sets of votes for each component. - -Two or more conflicting results can be reconciled -if they agree on _Y_ (and implicitly _QUAL_). -If multiple results with the same _Y~a~_ -have at least _H_ valid signatures across them, -_Y~a~_ can be considered the true group public key. - -_IA_ and _DQ_ could be reconciled thus: - -. _P~i~_ is disqualified if at least _H_ valid signatures -support results where _P~i~_ is disqualified. -. _P~i~_ is inactive if at least _H_ valid signatures -support results where _P~i~_ is either inactive or disqualified, -and _P~i~_ is not disqualified due to the previous clause. - -If neither of the above apply, -_P~i~_ is deemed to be neither disqualified nor inactive. -(Other solutions could also be just as viable.) - -Reconciling conflicting but compatible results -could reduce the impact -of honest members splitting across multiple results; -a disagreement on a single participant's inactivity -could cause divergence and DKG failure without reconciliation. - -However, reconciling results is only useful if the broadcast channel fails, -and on-chain reconciliation is unnecessarily complex and expensive. -Reconciling conflicting results would be best performed -by the participants first broadcasting their _preferred results_, -then applying reconciliation, -and finally broadcasting their signatures for the reconciled result. - -== Phase 13': Result determination -In the result determination phase, -each participant _P~i~_ constructs the canonical representation -of the result they believe to be correct, -and prepares to store it: - -_P~i~_ calculates the group public key share _Y~j~_ -of each member, including inactive and disqualified ones. - -(_This section is not strictly required for early implementations:_ - -_P~i~_ proceeds to construct a merkle tree of these public key shares; -the merkle root of this tree is _MerkleRoot~Y~_. - -_End section_) - -The on-chain representation of the result is formed of: - -* a unique identifier of this particular run of the DKG protocol _DkgID_ -* the group public key _Y_ -* the set of inactive members _IA_ -* the set of disqualified members _DQ_ -* (_MerkleRoot~Y~_ if used) - -The _inner hash_ of the result is `sha3(Y, MerkleRoot_Y, IA, DQ)`. -The _outer hash_ is `sha3(DkgID, inner_hash)`. - -_P~i~_ then signs the _outer hash_ of this _preferred result_, -and broadcasts the hash and the signature to other participants. -Agreement on this hash is sufficient to ensure agreement on the result, -including each good participant's public key shares. - -== Phase 14': Result submission -_P~i~_ receives the result signature messages from other participants, -and proceeds to determine the ultimate outcome of the DKG. - -The result supported by at least _H_ participants -is called the _quorum result_. -If the honest majority assumption holds, -a _quorum result_ must have been signed by at least one honest participant. - -How _P~i~_ should proceed depends on whether a _quorum result_ exists, -and whether it matches _P~i~_'s _preferred result_: - -* If there is no _quorum result_, -quorum has not been achieved and the DKG ends inconclusively. - -* If there is a single _quorum result_ -and it matches the _preferred result_, -a new group is formed correctly and _P~i~_ is able to participate in it. -_P~i~_ stores the public key shares _Y~j~_ until the group expires, -and prepares to submit the result on-chain if needed. - -* If there is a single _quorum result_ -that does not match the _preferred result_, -a new group is formed correctly but _P~i~_ may not be able to participate. -If the _quorum result_ is _reconcilable_ with the _preferred result_; -meaning it has the same _Y_ (and _MerkleRoot~Y~_), -and _P~i~_ is among the ultimately qualified participants; -_P~i~_ can replace their _preferred result_ with the _quorum result_. -Otherwise _P~i~_ could not participate without more complex reconciliation. - -At this point, -different solutions for handling multiple quorum results diverge. - -=== Option A -* If there are multiple _quorum results_, -and one of them matches the _preferred result_, -_P~i~_ should attempt to submit the _preferred result_. - -* If there are multiple _quorum results_, -none of which matches the _preferred result_, -but one or more results are _reconcilable_, -_P~i~_ should wait to see which result is submitted first. - -* If there are multiple _quorum results_, -all _non-reconcilable_, -_P~i~_ cannot participate further. - -If the DKG ends inconclusively, -no result is submitted on-chain. - -If a group is formed correctly and _P~i~_ is able to participate, -the result is submitted on-chain -by the first eligible participant able to do so. -Eligibility to submit the result is calculated as in _Phase 13_. -The on-chain submission consists of the result -along with its signatures, -each accompanied by the member index of the signer. - -==== Processing submissions on-chain -When a result is submitted, -the contract checks that -the _DkgID_ of the result matches the DKG execution, -each signature on the result is valid, -and at least _H_ signatures are present. - -If the checks pass: - -* Each inactive (included in the set _IA_ of the _tentative result_), -disqualified (included in the set _DQ_ of the _tentative result_), -and _blacklisted_ member -is removed from the group -* _Y_ is stored as the group public key -* (If used, _MerkleRoot~Y~_ is stored -as the merkle root of the group public key shares) -* The submitter is rewarded -* The group is formed successfully -and can now be selected for producing beacon entries - -==== Misbehavior proofs -If any participant _P~m~_ has signed two or more different results, -any participant may publish a _misbehavior proof_ on-chain. -This _misbehavior proof_ contains -the unique _DkgID_, -the member index _m_ of the accused _P~m~_, -two different _signatures_ and the corresponding _inner hashes_. -The contract reconstructs the _outer hashes_ using the provided _DkgID_ -(to prevent replay attacks), -and checks the signatures. -If both signatures are valid, -_P~m~_ is heavily penalized and removed from the group. -The submitter of a valid proof -leading to a removal from the group -is rewarded _R~dkg_tattletale~_. - -_Misbehavior proofs_ can be published at any time -regardless of eligibility to submit DKG results. -A valid _misbehavior proof_ on a past DKG -can be used if the DKG produced a group which is still active, -and the misbehaving member is still in the group. - -=== Option B -* If there are multiple _quorum results_, -quorum cannot be reached after invalidating the members -who signed multiple results, -so the DKG will end inconclusively -once the _misbehavior proofs_ are published. - -If a group is formed correctly and _P~i~_ is able to participate, -the result is submitted on-chain -by the first eligible participant able to do so. -Eligibility to submit the result is calculated as in _Phase 13_. -The on-chain submission consists of the result, -along with its signatures by non-disqualified participants, -each accompanied by the member index of the signer. - -==== Misbehavior proofs -Misbehavior proofs are created and checked -as in option A. -If the proof is valid, -_P~m~_ is added to the _blacklist_, -but not penalized or removed from the group immediately. -The submitter of a valid proof -leading to a new _blacklist_ entry -is rewarded _R~dkg_tattletale~_. - -==== Processing submissions on-chain -When a result candidate is submitted, -the contract checks that -the _DkgID_ of the result matches the DKG execution, -each signature on the result is valid, -and at least _H_ signatures are present. -If the checks pass, -the result candidate is designated as the _tentative result_ -and stored along with indices of the signers -(signatures themselves can be discarded); -the submitter is recorded as the _result submitter_ -along with the number of signers. - -After the _tentative result_ has been determined, -any participant can add signatures to it -by submitting one or more signatures -with the signers' member indices. -If all submitted signatures are valid, -the signers' indices are added to the _tentative result_; -the submitter is recorded as a _result supporter_ -along with the number of new signers -whose indices were not already included -in the signers of the _tentative result_. - -After a specified time period has elapsed, -any participant can _finalize_ the DKG. -Upon finalization: - -1. Each member on the _blacklist_ is penalized heavily. - -2. If there is no _tentative result_: -the DKG aborts and the group is not formed. -The _finalizer_ (the participant making the finalization transaction) -is paid _R~dkg_inconclusive~_ to cover gas costs. - -3. Each member on the _blacklist_ is removed -from the signers of the _tentative result_, if present. - -4. If the number of remaining signers on the _tentative result_ -is less than _H_: -the DKG aborts and the group is not formed. -The _finalizer_ is paid _R~dkg_inconclusive~_. - -5. If at least _H_ signers are remaining on the _tentative result_: -** Each inactive (included in the set _IA_ of the _tentative result_), -disqualified (included in the set _DQ_ of the _tentative result_), -and _blacklisted_ member -is removed from the group -** _Y_ is stored as the group public key -** (If used, _MerkleRoot~Y~_ is stored -as the merkle root of the group public key shares) -** Contributors are rewarded: -*** The _result submitter_ is paid a constant amount _R~dkg_submit_base~_ -plus _R~dkg_submit_signer~_ per each signer in the original submission -*** Each _result supporter_ is paid _R~dkg_support_signer~_ -per each new signer they added to the result -*** The _finalizer_ is paid _R~dkg_finalized~_ -** The group is formed successfully -and can now be selected for producing beacon entries - -=== Option C -TBD diff --git a/docs-v1/random-beacon/dkg/concepts.adoc b/docs-v1/random-beacon/dkg/concepts.adoc deleted file mode 100644 index f3ddf1a1a1..0000000000 --- a/docs-v1/random-beacon/dkg/concepts.adoc +++ /dev/null @@ -1,50 +0,0 @@ -= Details+Rationale - -== Message delivery - -=== Broadcast channel - -Every group member in phase _p_ can safely assume -every non-inactive group member has seen -all messages broadcast within _T~p~_ after the beginning of phase _p_. - -All messages broadcast by _P~i~_ are assumed to be signed with _X~i~_. - -A message is malformed if it cannot be parsed and validated -as the message required in a particular phase of the protocol. - -The implementation details of the broadcast channel -are currently out of scope for this document. - -==== Assumptions and implications - -The broadcast channel is assumed to give all participants -the same view of the world, -and deliver all messages from non-inactive participants -within a time that is less than the applicable time limit for each phase. - -If these assumptions don't hold, certain attacks become possible. -For example, if a message from _P~i~_ -reaches honest participant _P~j~_ but not _P~k~_, -their sets of inactive participants _IA~Pj~_ and _IA~Pk~_ will differ. -This will make them vote for different results, -which will prevent quorum from being reached on _full signing_, -while on _escalating votes_ a coordinating adversary -could make its preferred incorrect result win the vote. -To protect against the latter, -_escalating votes_ assumes a null result when any single result is opposed -by _f~max~ + 1_ participants as it means that the honest votes are split. - -== Result format - -The result of the DKG protocol can be either a success or a failure. - -Success means the DKG protocol finished with at most _M~fail~_ participants -misbehaving or dropping offline during the execution of the protocol, -and the group of the remaining honest participants _G_ -should be added to the signing groups for the threshold relay. - -Failure means that the group creation could not finish, due to either -the number of (inactive + disqualified) participants exceeding _M~fail~_, -or the presented results being disputed -in a way where the correct outcome cannot be ascertained. diff --git a/docs-v1/random-beacon/dkg/dkg.py b/docs-v1/random-beacon/dkg/dkg.py deleted file mode 100644 index f59be4ee64..0000000000 --- a/docs-v1/random-beacon/dkg/dkg.py +++ /dev/null @@ -1,397 +0,0 @@ -# i = always the player whose perspective we're in - - -# tag::phase-1[] -# Because G1 and G2 in alt_bn128 are cyclic groups of prime order, this number -# can also be used as the size of the secret sharing finite field -q = G1.curveOrder - -# Receive the DKG parameters from on-chain -dkgSetup = getDkgSetup() - -# Presented from the perspective of P_i -i = dkgSetup.members.index(self.pubkey) - -# Keep track of other qualified participants -# -# `goodParticipants[P]` denotes the qualified participants in phase `P` -# -goodParticipants[1] = [1..N] - -# Record the blockheight at the start of the DKG -# -# Used later for calculating timeouts -# -T_dkgInit = getCurrentBlockHeight() - -ephemeralPubkeys = [] - -for j in goodParticipants[1], j != i: - x_ij = genEcdhKeypair() - - self.ephemeralKey[j] = x_ij - - y_ij = x_ij.pubkey - - ephemeralPubkeys[j] = y_ij - -broadcast(messagePhase1(ephemeralPubkeys)) -# end::phase-1[] - - -# tag::phase-2[] -# Receive messages from phase 1: -# - ephemeral public keys of other participants -# IA if message not received -# -# Validate: -# - message from P_j must contain a public key for all P_k, k != j -# DQ if public key absent -# - all public keys must be valid curve points of the ECDH curve -# DQ if invalid -# -messages.receive(1) - -for j in goodParticipants[2], j != i: - privkey_ij = self.ephemeralKey[j] - pubkey_ji = ephemeralPubkey(j, i) - - k_ij = ecdh(privkey_ij, pubkey_ji) - self.symkey[j] = k_ij -# end::phase-2[] - - -# tag::phase-3[] -# GJKR 1.(a): -# f_i(z) = a_i0 + a_i1 * z + ... + a_it * z^t -# f'_i(z) = b_i0 + b_i1 * z + ... + b_it * z^t -# -# a_ij = sharePolyCoeffs[j] -# b_ij = blindingFactors[j] -# -# G1.randomScalar = integer from range(0, q) -# -self.sharePolyCoeffs = [0..M].map(G1.randomScalar) -self.blindingFactors = [0..M].map(G1.randomScalar) - - -def f_i(z): - return evaluateAt(z, self.sharePolyCoeffs) % q - - -def g_i(z): - return evaluateAt(z, self.blindingFactors) % q - - -z_i = self.sharePolyCoeffs[0] -# assert(z_i == f_i(0)) - - -self.commitments = map(ecCommit, self.sharePolyCoeffs, self.blindingFactors) - -encryptedShares = [] - -for j in goodParticipants[3]: - s_ij = f_i(j) - t_ij = g_i(j) - - if i != j: - pointsBytes = marshalPoints(s_ij, t_ij) - payload_ij = encrypt(self.symkey[j], pointsBytes) - - encryptedShares[j] = payload_ij - else: - self.shares[i] = (s_ij, t_ij) - -broadcast(messagePhase3(encryptedShares, self.commitments)) -# end::phase-3[] - - -# tag::phase-4[] -# Receive messages from phase 3: -# - commitments to the secret sharing polynomials -# - encrypted share payloads -# IA if message not present -# -# Validate: -# - the expected number of commitments (M + 1) is present -# DQ if n of commitments incorrect -# - commitments must be valid curve points of G1 -# DQ if a commitment is not valid curve point -# - message from P_j must contain encrypted payloads for all other participants -# DQ if payload absent -# - the length of each payload must be: 2 * G1_SCALAR_LENGTH + MAC_LENGTH -# DQ if a payload has incorrect length -# -messages.receive(3) - -shareComplaints = [] - -for j in goodParticipants[4], j != i: - k_ij = self.symkey[j] - - validShares = decryptAndValidateShares( - senderIndex = j, - recipientIndex = i, - symkey = k_ij - ) - - if not validShares: - X_ij = self.ephemeralKey[j] - shareComplaints.append(shareComplaint(j, X_ij)) - else: - (s_ji, t_ji) = validShares - self.shares[j] = (s_ji, t_ji) - -broadcast(messagePhase4(shareComplaints)) -# end::phase-4[] - - -# tag::phase-5[] -# Receive messages from phase 4: -# - complaints about inconsistent shares, or "no complaints" -# IA if not present -# -# Validate: -# - each revealed private key must be a valid scalar for ECDH -# DQ if invalid -# - each revealed private key must correspond to the public key -# DQ if does not match -# (explicit in pseudocode) -# -messages.receive(4) - -for complaint in messages[4]: - j = complaint.senderIndex - m = complaint.accusedIndex - privkey_jm = complaint.privkey - - # Presented private key does not correspond to the published public key - # - # Disqualify accuser - # - if not validatePrivkey( - senderIndex = j, - recipientIndex = m, - privkey = privkey_jm - ): - disqualify(5, j) - else: - pubkey_mj = ephemeralPubkey(m, j) - - k_jm = ecdh(privkey_jm, pubkey_mj) - - # Check whether the shares are consistent with the accused's commitments - sharesValid = decryptAndValidateShares( - senderIndex = m, - recipientIndex = j, - symkey = k_jm - ) - - # Shares inconsistent, disqualify accused - if not sharesValid: - disqualify(5, m) - # Shares consistent, disqualify accuser - else: - disqualify(5, j) -# end::phase-5[] - - -# tag::phase-6[] -# GJKR 2: -# -QUAL = goodParticipants[6] - -# GJKR 3: -# -# x_i = sum([ s_ji for j in QUAL ]) % q -# x'_i = sum([ t_ji for j in QUAL ]) % q -# -# This is safe to calculate here as the consistency of the shares has been -# ascertained. If a participant gets disqualified later their public key piece -# will be reconstructed to match the honest participants' shares. -# -x_i = sum( - [ self.shares[j].share_S for j in QUAL ] -) % q - -xprime_i = sum( - [ self.shares[j].share_T for j in QUAL ] -) % q -# end::phase-6[] - - -# tag::phase-7[] -# GJKR 4.(a): -# -# A_ik = g^a_ik % p -# -self.pubkeyCoeffs = [ - P1.scalarMult(A_ik) for A_ik in self.sharePolyCoeffs -] - -broadcast(messagePhase7(self.pubkeyCoeffs)) -# end::phase-7[] - - -# tag::phase-8[] -# Receive messages from phase 7: -# - public key coefficients -# IA if message not present -# -# Validate: -# - the expected number (M + 1) of pubkey coefficients must be present -# DQ if incorrect number of coeffs -# - public key coefficients must be valid curve points for G1 -# DQ if a coefficient is not a valid curve point -# -messages.receive(7) - -pubkeyComplaints = [] - -for j in goodParticipants[8]: - pubkeyShareValid = validatePubkeyCoeffs( - senderIndex = j, - recipientIndex = i, - share_S = self.shares[j].share_S - ) - - if not pubkeyShareValid: - pubkeyComplaints.append(pubkeyComplaint(j)) - -broadcast(messagePhase8(pubkeyComplaints)) -# end::phase-8[] - - -# tag::phase-9[] -# Receive messages from phase 8: -# - complaints about invalid public key coefficients, or "no complaints" -# IA if no message sent -# -# Validate: -# - each revealed private key must be a valid scalar for ECDH -# DQ if invalid -# - each revealed private key must correspond to the public key -# DQ if does not match pubkey from phase 1 -# (explicit in pseudocode) -# -messages.receive(8) - -for complaint in messages[8]: - j = complaint.senderIndex - m = complaint.accusedIndex - privkey_jm = complaint.privkey - - if not validatePrivkey( - senderIndex = j, - recipientIndex = m, - privkey = privkey_jm - ): - disqualify(9, j) - else: - pubkey_mj = ephemeralPubkey(m, j) - - symkey = ecdh(privkey_jm, pubkey_mj) - - badActor = resolvePubkeyComplaint( - senderIndex = m, - recipientIndex = j, - symkey = symkey - ) - - if badActor == "accused" or badActor == "both": - disqualify(9, m) - if badActor == "complainer" or badActor == "both": - disqualify(9, j) -# end::phase-9[] - - -# tag::phase-10[] -disqualifiedKeys = [] - -for m in disqualifiedInPhase[9]: - keyPackage = (m, self.ephemeralKey[m]) - disqualifiedKeys.append(keyPackage) - -broadcast(messagePhase10(disqualifiedKeys)) -# end::phase-10[] - - -# tag::phase-11[] -# Receive messages from phase 10: -# - good participants' ephemeral private keys for each disqualified participant -# IA if no message sent -# -# Validate: -# - all expected private keys are revealed -# DQ if number of keys is incorrect -# - each revealed private key must be a valid scalar for ECDH -# DQ if a private key is invalid -# - each revealed private key must correspond to the public key -# DQ if private key does not match public key from phase 1 -# (explicit in pseudocode) -# -messages.receive(10) - -for keys_j in messages[10]: - j = keys_j.sender - for keyPackage in keys_j.keyPackages: - m = keyPackage.index - privkey_jm = keyPackage.ephemeralKey - - if not disqualifiedInPhase[9].contains(m): - # P_j broadcast the wrong keys - disqualify(11, j) - - if not validatePrivkey( - senderIndex = j, - recipientIndex = m, - privkey = privkey_jm - ): - # P_j broadcast invalid keys - disqualify(11, j) - else: - pubkey_mj = ephemeralPubkey(m, j) - symkey_jm = ecdh(privkey_jm, pubkey_mj) - - validShares = decryptAndValidateShares( - senderIndex = m, - recipientIndex = j, - symkey = symkey_jm - ) - - if not validShares: - # P_j failed to complain earlier - disqualify(11, j) - else: - (s_mj, t_mj) = validShares - self.revealedShares[m][j] = (s_mj, t_mj) - -for m in disqualifiedInPhase[9]: - shares_m = self.revealedShares[m].values - indices_m = self.revealedShares[m].indices - - z_m = reconstruct(shares_m, indices_m) - y_m = P1.scalarMult(z_m) - self.reconstructed_Y_[m] = y_m -# end::phase-11[] - - -# tag::phase-12[] -# GJKR 4.(c): -# -# Y = product([ A_i0 for i in QUAL ]) % p -# -def A_(i): - if not disqualifiedInPhase[9].contains(i): - return pubkeyCoeffs(i) - else: - return [self.reconstructed_Y_[i]] - -Y = ecSum( - [ A_(i)[0] for i in QUAL ] -) - -for j in goodParticipants[12]: - self.peerPublicKeys[j] = individualPublicKey(j, QUAL) -# end::phase-12[] diff --git a/docs-v1/random-beacon/dkg/dkg_bls.py b/docs-v1/random-beacon/dkg/dkg_bls.py deleted file mode 100644 index bbc7a4d562..0000000000 --- a/docs-v1/random-beacon/dkg/dkg_bls.py +++ /dev/null @@ -1,240 +0,0 @@ -BitArray = List[bool] -StakerSignature = Tuple[Staker, BlsSignature] - -BlockHeight = NewType('BlockHeight', int) - -class CandidateGroup(NamedTuple): - members: List[Staker] - createdAt: Blockheight - minH: int # minimum number of honest parties required - maxM: int # maximum number of misbehaving parties before failure - - -class Staker(NamedTuple): - ecdsaPubkey: EcdsaPubkey - blsPubkey: BlsPubkey - stakedTokens: TokenAmount - - -class Result(NamedTuple): - groupPubkey: Optional[BeaconPubkey] - disqualified: Optional[BitArray] - inactive: Optional[BitArray] - - -class SignedResult(NamedTuple): - result: Result - signature: BlsSignature - - -class ResultSubmission(NamedTuple): - result: Result - signature: BlsSignature - signers: BitArray - - -def Failure(disqualified = None): - return Result(False, disqualified, None) - - -def Success(pubkey, disqualified, inactive): - return Result(pubkey, disqualified, inactive) - - -def isFailure(result): - return result.pubkey == False - - -def isSuccess(result): - return result.pubkey != False - - -# Bn256 interface: - -# -- functions applying to each of G1 and G2: -# class CurvePoint gx where -# generator :: gx -# asPoint :: Bytes -> gx -# ecmul :: gx -> Scalar -> gx -# ecadd :: gx -> gx -> gx -# instance CurvePoint G1 -# instance CurvePoint G2 - -# -- calculate the pairing of two curve points -# pairing :: G1 -> G2 -> GT - - -BlsPrivkey = Bn256.Scalar -BlsPubkey = Bn256.G2 -BlsSignature = Bn256.G1 - - -def blsPubkey( - privkey: BlsPrivkey -) -> BlsPubkey: - return Bn256.ecmul(Bn256.generator, privkey) - - -def blsSign( - message: Bytes, - privkey: BlsPrivkey -) -> BlsSignature: - h = Bn256.asPoint(sha3(message)) - return Bn256.ecmul(h, privkey) - - -def blsVerify( - signature: BlsSignature, - message: Bytes, - pubkey: BlsPubkey -) -> bool: - h = Bn256.asPoint(sha3(message)) - sigPairing = Bn256.pairing(signature, Bn256.generator) - keyPairing = Bn256.pairing(h, pubkey) - return sigPairing == keyPairing - - -def blsCombinePubkeys( - pubkeys: List[BlsPubkey] -) -> BlsPubkey: - return reduce(Bn256.ecadd, pubkeys) - - -def getResult( - signedResults: Dict[Staker, SignedResult], - groupInfo: CandidateGroup -) -> Optional[ResultSubmission]: - - # for each result, list its supporters and their signatures - preferredResults: Dict[Result, StakerSignature] = {} - - for (staker, signedResult) in signedResults: - result = signedResult.result - signature = signedResult.signature - - if result in preferredResults: - preferredResults[result].append((staker, signature)) - else: - preferredResults[result] = [(staker, signature)] - - # for each result, counts how many members support it - orderedResults: Dict[Result int] = {} - - for (result, supporters) in preferredResults: - orderedResults[result] = len(supporters) - - leadingResult = keyByMaxValue(orderedResults) - - participantPlurality = preferredResults[leadingResult] - - if len(participantPlurality) < groupInfo.minH: - return None - else: - participants = groupInfo.members - - # set up the bit array showing who signed the result - submissionSigners = [False] * len(participants) - - submissionSignatures = [] - - # for each supporter of the plurality resul, set their index in the - # signers array to True and add their signature to the group signature - for (signer, signature) in participantPlurality: - submissionSigners[participants.index(signer)] = True - submissionSignatures.append(signature) - - groupSignature = reduce(Bn256.ecadd, submissionSignatures) - - return ResultSubmission( - leadingResult, - groupSignature, - submissionSigners - ) - - -def validate( - submission: ResultSubmission, - candidateGroup: CandidateGroup -) -> bool: - - # a group signature for the result - signature = submission.signature - - # A one-indexed array whose length is N, - # signers[i] = does the group signature include - # the signature of the i-th member - signers = submission.signers - - result = submission.result - - # require at least the honest majority number of signers - signersRequired = candidateGroup.minH - participants = candidateGroup.members - - # too few signatures? - if signers.count(True) < signersRequired: - return False - else: - # roll together the pubkeys of those who have signed the result - signerPubkeys = [] - for s in signers, p in participants: - if s == True: - signerPubkeys.append(p.blsPubkey) - creationPubkey = reduce(Bn256.ecadd, signerPubkeys) - - return blsVerify( - signature, - result, - creationPubkey - ) - - -def isEligible( - sender: Staker, - t_diff: BlockHeight, - participants: List[Staker] -) -> bool: - i = participants.index(sender) - maxEligible = 1 + max(0, (t_diff - t_dkg) / t_step) - - return i <= maxEligible - - -def receiveResult( - candidateGroup: CandidateGroup -) -> Result: - finalized = False - validResult = False - - t_init = candidateGroup.createdAt - - while not finalized: - t_now = currentBlockHeight() - t_diff = BlockHeight(t_now - t_init) - - # has the timeout been reached? - if t_diff > t_timeout: - finalized = True - else: - # get latest submission - (submission, sender) = latestSubmission() - - eligible = isEligible(sender, t_diff, candidateGroup.members) - - valid = validate(submission, candidateGroup) - - if eligible and valid: - validResult = submission.result - - # rewardSubmitter :: Staker -> CandidateGroup -> IO () - # -- give the submitter a reward and penalize everyone whose - # -- index is smaller than the submitter's for being late - rewardSubmitter(sender, candidateGroup) - - finalized = True - - # if no valid result received -> no fault failure - if not validResult: - return Failure() - else: - return validResult diff --git a/docs-v1/random-beacon/dkg/dkg_util.py b/docs-v1/random-beacon/dkg/dkg_util.py deleted file mode 100644 index 03df0ff7ed..0000000000 --- a/docs-v1/random-beacon/dkg/dkg_util.py +++ /dev/null @@ -1,235 +0,0 @@ -# i is generic and doesn't relate to perspective - - -# tag::phase-2[] -# Fetch the correct ephemeral pubkey from messages broadcast in phase 1 -# -# The format for the message of `P_j` in phase `P` is: `messages[P][j]` -# -def ephemeralPubkey(senderIndex, recipientIndex): - return messages[1][senderIndex].pubkey[recipientIndex] -# end::phase-2[] - - -# tag::phase-3[] -# Evaluate a polynomial given by `coeffs` at point `z` -# -# `coeffs` is little-endian; `ax^2 + bx + c` is expressed as `[c, b, a]` -# -# `evaluateAt(2, [6, 3, 4]) = 6 + (3 * 2^1) + (4 * 2^2) = 28` -# -def evaluateAt(z, coeffs): - return sum( - [ coeffs[k] * z^k for k in [0..M] ] - ) - - -# Pedersen commitment to secret value `s` and blinding factor `t` -# `G = P1` is the standard generator of the elliptic curve -# `H = G*a` is a custom generator where `a` is unknown -# -# C(s, t) = G*s + H*t -# -def ecCommit(s, t): - Gs = P1.scalarMult(s) - Ht = H.scalarMult(t) - return ecAdd(Gs, Ht) -# end::phase-3[] - - -# tag::phase-4[] -# Calculate the sum of a list of elliptic curve points -def ecSum(points): - return reduce(ecAdd, points) - - -# Fetch the correct encrypted shares from messages broadcast in phase 3 -def encryptedShares(senderIndex, recipientIndex): - return messages[3][senderIndex].encryptedShares[recipientIndex] - - -# Fetch a specific participant's commitments from messages broadcast in phase 3 -def commitments(senderIndex): - return messages[3][senderIndex].commitments - - -# Fetch the correct shares and try to decrypt them with the provided key -def decryptShares( - senderIndex, - recipientIndex, - symkey -): - payload = encryptedShares(senderIndex, recipientIndex) - - return decrypt(payload, symkey) - - -# Fetch the shares and validate them -# -# Check that shares decrypt correctly and are consistent with the sender's -# published commitments -# -def decryptAndValidateShares( - senderIndex, - recipientIndex, - symkey -): - plaintext = decryptShares( - senderIndex, - recipientIndex, - symkey - ) - - if not plaintext: - return False - else: - (share_S, share_T) = unmarshalPoints(plaintext) - - sharesValid = checkShareConsistency( - senderIndex, - recipientIndex, - share_S, - share_T - ) - - if sharesValid: - return (share_S, share_T) - else: - return False - - -# Check that equation 2 from GJKR holds for `share_S, share_T` -# -# P_i is the player whose shares are validated -# P_j is the perspective player performing the validation -# -# GJKR 1.(b): -# -# g^s_ij * h^t_ij == product([ C_ik ^ (j^k) for k in [0..T] ]) % p -# -def checkShareConsistency( - recipientIndex, - senderIndex, - share_S, - share_T -): - i = senderIndex - j = recipientIndex - - C_i = commitments(i) - - C_ecSum = ecSum( - [ C_i[k].scalarMult(j^k) for k in [0..M] ] - ) - - sharesValid = ecCommit(share_S, share_T) == C_ecSum - return sharesValid -# end::phase-4[] - - -# tag::phase-5[] -# Check that a revealed private key matches previously broadcast public key -def validatePrivkey(senderIndex, recipientIndex, privkey): - expectedPubkey = ephemeralPubkey(senderIndex, recipientIndex) - return derivePubkey(privkey) == expectedPubkey -# end::phase-5[] - - -# tag::phase-8[] -# Fetch the sender's public key coeffs `A_ik` from messages broadcast in phase 7 -def pubkeyCoeffs(senderIndex): - return messages[7][senderIndex].pubkeyCoeffs - - -# P_i is the player whose public key share is calculated -# P_j is the perspective player -# -def pubkeyShare(senderIndex, recipientIndex): - i = senderIndex - j = recipientIndex - - A_i = pubkeyCoeffs(i) - - pubkeyShare = ecSum( - [ A_i[k].scalarMult(j^k) for k in [0..M] ] - ) - return pubkeyShare - - -# Check that equation 3 holds for `share_S` -# -# GJKR 4.(b): -# -# g^s_ij == product([ A_ik ^ (j^k) for k in [0..T] ]) % p -# -def validatePubkeyCoeffs( - senderIndex, - recipientIndex, - share_S -): - return P1.scalarMult(share_S) == pubkeyShare(senderIndex, recipientIndex) -# end::phase-8[] - - -# tag::phase-9[] -# Check which party is at fault when a complaint is presented in phase 8 -# -# Decrypt the shares the accused sent to the complainer in phase 3 and check -# the validity of the accused's `A_ik` values -# -def resolvePubkeyComplaint( - senderIndex, - recipientIndex, - symkey -): - plaintext = decryptShares( - senderIndex, - recipientIndex, - symkey - ) - - if not plaintext: - # only happens if the complainer failed to complain earlier - # and thus both violated protocol - return "both" - else: - (share_S, _) = unmarshalPoints(plaintext) - - pubkeyValid = validatePubkeyCoeffs( - senderIndex, - recipientIndex, - share_S - ) - - if pubkeyValid: - return "complainer" - else: - return "accused" -# end::phase-9[] - - -# tag::phase-11[] -def reconstruct(shares, indices): - secret = sum( - [ share_k * lagrange(k, indices) for share_k in shares, k in indices ] - ) - return secret % q -# end::phase-11[] - - -# tag::phase-12[] -# Calculate the individual public key of a specific participant -# -# P_i is each qualified participant in turn -# -# GJKR (C1'): -# -# g^x_j -# = g^( sum([ s_ij for i in QUAL ]) ) % p -# = product([ g^s_ij for i in QUAL ]) % p -# = product([ product([ A_ik ^ (j^k) for k in [0..T] ]) for i in QUAL ]) % p -# -def individualPublicKey(memberIndex, QUAL): - pubkeyShares = [ pubkeyShare(i, memberIndex) for i in QUAL ] - return ecSum(pubkeyShares) -# end::phase-12[] diff --git a/docs-v1/random-beacon/dkg/index.adoc b/docs-v1/random-beacon/dkg/index.adoc deleted file mode 100644 index ba3bdc0dd4..0000000000 --- a/docs-v1/random-beacon/dkg/index.adoc +++ /dev/null @@ -1,428 +0,0 @@ -:toc: macro - -= Random Beacon Distributed Key Generation - -:toclevels: 4 - -This proposal for Distributed Key Generation for the threshold relay -is based on a protocol by Gennaro, Jarecki, Krawczyk and Rabin <>. -GJKR is further based on Pedersen-VSS (verifiable secret sharing) <>. -For this implementation, GJKR has been modified -to make protocol violations objectively attributable -and remove the need for one-to-one messaging channels. - -The protocol uses ephemeral ECDH keys -to encrypt one-to-one communication on the broadcast channel. -This ensures that participants can neither -make baseless complaints nor -cause a minor nuisance with subtle misbehavior. - -Additionally, the threshold relay public key submission protocol -is defined. - -ifndef::yellowpaper[toc::[]] - -:leveloffset: +1 - -include::terms.adoc[] - -include::concepts.adoc[] - -:leveloffset: -1 - - -== Overview - -Input: _V~i~, S_ - -Output: one of - -* Successfully generated group _P_ including -** public key _Y_ of _P_ -** lists of absent and disqualified nodes _IA_ and _DQ_ -* Failure to generate a valid group including -** list of disqualified nodes _DQ_ - -The group generation protocol selects a new candidate group _P_ from _S_ -and runs a distributed key generation (DKG) protocol -to create a threshold signature public key _Y_ for the group, -to be used in the random beacon. - -After a successful execution of the protocol, -_P_ will be the group of nodes -that may participate in the random beacon signing, -having been neither inactive or misbehaving during the DKG. - -Inactive nodes will be removed from _P_ -and not be eligible for the rewards -from participating in the random beacon -by contributing to the signature _V~j~_ -should _P_ be chosen as the group to produce -the __j__th random number from the beacon. - -Disqualified nodes will be removed from _P_ -and their stake will be slashed in punishment -for provably and attributably acting in breach of the DKG protocol. - -== Protocol - -Phases are seen from the perspective of _P~i~_ - -After phase _p_, the nodes that failed to broadcast a required message -will be added to _IA~p~_. -Nodes that broadcast a malformed message may be added to _IA~p~_ or _DQ~p~_. - -[#phase-1,reftext="Phase 1"] -=== Phase 1. Ephemeral key generation - -To ensure integrity in later parts of the DKG protocol, -we will require every _P~i~_ to generate -an ephemeral ECDH keypair _(x~ij~, y~ij~)_ for every other member _P~j~_ in _P_. -These will be broadcast in phase 1. - -Registering the ephemeral keys on-chain is not required -if the broadcast channel assumption holds, -and all honest participants agree on the keys -published by each participant in phase 1. - -.Phase 1 -[source, python] ----- -include::dkg.py[tags=phase-1] ----- - -[#phase-2,reftext="Phase 2"] -=== Phase 2. Ephemeral ECDH - -Every node in _P_ has now published a valid list of ephemeral ECDH pubkeys. -_P~i~_ will perform ECDH with every _P~j~_ in _P_ to create _k~ij~_. - -.Phase 2 -[source, python] ----- -include::dkg.py[tags=phase-2] ----- - -.Utility functions -[source, python] ----- -include::dkg_util.py[tags=phase-2] ----- - -[#phase-3,reftext="Phase 3"] -=== Phase 3. Polynomial generation - -Every node in _G~3~_ has, for every other node in _G~3~_, a symmetric key that -can be used for encrypted and attributable communications over the broadcast -channel. The Pedersen-VSS phase of the GJKR DKG algorithm can commence. - -Create two polynomials _f~i~(z)_ and _g~i~(z)_ of degree _M_ and calculate -other players' shares as points on these polynomials. Additionally, calculate -Pedersen commitments to the coefficients of _f~i~(z)_ using the coefficients -of _g~i~(z)_. - -Shares to _P~j~_ are encrypted with the symmetric key _K~ij~ = K~ji~_ -shared by _P~i~_ and _P~j~_. -Commitments and encrypted shares are broadcast to other players. - -.Phase 3 -[source, python] ----- -include::dkg.py[tags=phase-3] ----- - -.Utility functions -[source, python] ----- -include::dkg_util.py[tags=phase-3] ----- - -[#phase-4,reftext="Phase 4"] -=== Phase 4: Share verification - - -Receive, decrypt and validate shares from other participants. If any share -proves inconsistent with the sender's published commitments, broadcast a -complaint by publishing the identity of the misbehaving party along with the -corresponding ephemeral private key so others can check the result. - -.Phase 4 -[source, python] ----- -include::dkg.py[tags=phase-4] ----- - -.Utility functions -[source, python] ----- -include::dkg_util.py[tags=phase-4] ----- - -[#phase-5,reftext="Phase 5"] -=== Phase 5: Share complaint resolution - -If anyone has complaints about another player, use the published private keys -to decrypt transmitted messages and determine fault. - -As every message in the broadcast channel is signed, decrypting previous -messages makes misbehavior attributable. For every complaint, one party will be -disqualified: either the accused sent invalid shares, or the accuser made a -false complaint. - -.Phase 5 -[source, python] ----- -include::dkg.py[tags=phase-5] ----- - -.Utility functions -[source, python] ----- -include::dkg_util.py[tags=phase-5] ----- - -[#phase-6,reftext="Phase 6"] -=== Phase 6: Share calculation - -Each player sets their share _x~i~_ of the secret _X_ to equal the sum of all -shares _s~ji~_ as per GJKR. _X_ equals the sum of shares _s~j0~_. - -.Phase 6 -[source, python] ----- -include::dkg.py[tags=phase-6] ----- - -[#phase-7,reftext="Phase 7"] -=== Phase 7: Public key share points - -Each player broadcasts their _A~ik~_ values. - -.Phase 7 -[source, python] ----- -include::dkg.py[tags=phase-7] ----- - -[#phase-8,reftext="Phase 8"] -=== Phase 8: Public key share validation - -Each player validates the values received in <>. - -.Phase 8 -[source, python] ----- -include::dkg.py[tags=phase-8] ----- - -.Utility functions -[source, python] ----- -include::dkg_util.py[tags=phase-8] ----- - -[#phase-9,reftext="Phase 9"] -=== Phase 9: Second complaint resolution - -As in <>, but with the validation formula from <>. - -It should be noted that the symmetric nature of the encryption allows the -parties to also decrypt _E~jm~_ and not just _E~mj~_. However, this is not very -significant as even the publication of only the misbehaving participants' shares -would reduce the security margin excessively if a large fraction of _P_ were to -misbehave. - -By aborting group creation if the number of inactive and disqualified -participants exceeds _M~nofail~ = M/2_ the impact of this is reduced to a -manageable level. - -.Phase 9 -[source, python] ----- -include::dkg.py[tags=phase-9] ----- - -.Utility functions -[source, python] ----- -include::dkg_util.py[tags=phase-9] ----- - -[#phase-10,reftext="Phase 10"] -=== Phase 10: Disqualified share opening - -All active players in _G~10~_ broadcast the keys they share with -players in _DQ~9~_, so the reconstruction of Pedersen-VSS can be done -offline. - -.Phase 10 -[source, python] ----- -include::dkg.py[tags=phase-10] ----- - -[#phase-11,reftext="Phase 11"] -=== Phase 11: Disqualified share reconstruction - -Decrypt and reconstruct _z~m~_ for every participant _P~m~_ that presented -valid shares in <> but whose public key shares in <> were invalid. -Calculate _y~m~ = z~m~ * P1_ for each reconstructed _z~m~_. - -.Phase 11 -[source, python] ----- -include::dkg.py[tags=phase-11] ----- - -.Utility functions -[source, python] ----- -include::dkg_util.py[tags=phase-11] ----- - -[#phase-12,reftext="Phase 12"] -=== Phase 12: Public key reconstruction - -Let _G~12~ = G~11~_ - -Combine _y~j~_ for all participants in _G~6~_ to reconstruct the public key for -the group. Additionally, calculate and store each qualified participant's -individual public key for validating signature shares. - -.Phase 12 -[source, python] ----- -include::dkg.py[tags=phase-12] ----- - -.Utility functions -[source, python] ----- -include::dkg_util.py[tags=phase-12] ----- - -[#phase-13,reftext="Phase 13"] -=== Phase 13: Result establishment - -Let _IA = IA~1~ + IA~2~ + ... + IA~10~_ - -Let _DQ = DQ~1~ + DQ~2~ + ... + DQ~10~_ - -[source, python] ----- -if nPlayers(IA + DQ) {lt}= M_nofail: - correctResult = Result.success(pubkey = Y, inactive = IA, disqualified = DQ) - -resultHash = hash(correctResult) ----- - -Once the result has been determined, -all participants evaluate the hash of their preferred result, -sign the hash and broadcast the hash and a signature over it -in the group broadcast channel. -Each participant collects the signatures matching their preferred result, -stores them along with the signers' member indices. - -- If the signature of hash broadcasted off-chain is invalid, -it will be rejected and not published to the chain in the next phase. - -- If multiple signatures from the same member on the same result are found, -they will all be filtered-out -so that none of them is published to the chain in the next phase. - -If multiple signatures from the same member on different results are found, -they should all be filtered-out -so that none of them is published to the chain in the next phase. - -If the result for the DKG is a failure -due to too many members being inactive or disqualified, -no result is submitted on-chain; -instead, the DKG is allowed to simply time out. - -[#phase-14,reftext="Phase 14"] -=== Phase 14: Result submission - -==== Off-chain -When a participant becomes eligible to submit the result -(with supporting signatures) on-chain -they submit if they have at least the honest majority -(marked as `H` - constant for the given group size) -of signatures for that result (including their own). - -_First player_ is always eligible to submit the result. - -_Second player_ becomes eligible after initial timeout -(time necessary to perform DKG protocol plus step time `T_dkg + T_step`) -and remains eligible until the result is accepted by the chain. - -In other words, _Nth player_ becomes eligible to submit the result -after `T_dkg + (N-1) * T_step` -and remains eligible until the result is accepted by the chain. - -If _first player_ is late and _second player_ tries to submit, -whichever gets mined first wins -and subsequent submissions are disregarded immediately -to avoid burdening the loser with excess gas fees. - -[source, python] ----- -alreadySubmitted = False -resultPublished = False -finished = False - -while not resultPublished: - T_now = getCurrentBlockHeight() - - # using T_init from phase 1 - T_elapsed = T_now - T_init - - # determine highest index j eligible to submit - if T_elapsed <= T_dkg: - j = 1 - else: - T_over = T_elapsed - T_dkg - j = 1 + ceiling(T_over / T_step) - - if j >= i: - broadcast(correctResult) - resultPublished = True - alreadySubmitted = True - else: - resultPublished = checkChainForResult() ----- - -==== On-chain -When the result is submitted on-chain along with the signatures, -the contract checks that there are at least `H` signatures or more, -and that each signature is valid for the submitted result -and the corresponding member ID. -Submissions containing multiple signatures -on the same result from the same member are rejected. - -If the above checks pass, -the result is considered canonical for the group. -All other group members should abort publishing their results -and no new result submissions will be accepted by the chain. - -If the above checks do not pass, the result is rejected. - -If no canonical result has been published until `T_dkg + N * T_step`, -where `N` is the group size, -DKG operation is marked as failed. - -[bibliography] -== References - -- [[[GJKR]]] Gennaro R., Jarecki S., Krawczyk H., Rabin T. (1999) -Secure Distributed Key Generation for Discrete-Log Based Cryptosystems. -In: Stern J. (eds) Advances in Cryptology — EUROCRYPT ’99. EUROCRYPT 1999. -Lecture Notes in Computer Science, vol 1592. Springer, Berlin, Heidelberg - -- [[[Ped]]] Pedersen T.P. (1992) -Non-Interactive and Information-Theoretic Secure Verifiable Secret Sharing. -In: Feigenbaum J. (eds) Advances in Cryptology — CRYPTO ’91. CRYPTO 1991. -Lecture Notes in Computer Science, vol 576. Springer, Berlin, Heidelberg - -- [[[EIP-197]]] -EIP 197: Precompiled contracts for optimal ate pairing check on the elliptic -curve alt_bn128 diff --git a/docs-v1/random-beacon/dkg/notes.adoc b/docs-v1/random-beacon/dkg/notes.adoc deleted file mode 100644 index b75d241fb5..0000000000 --- a/docs-v1/random-beacon/dkg/notes.adoc +++ /dev/null @@ -1,257 +0,0 @@ -= DKG: notes - -== Result format - -data Result = NoFaultFailure - | FailureDQ { disqualified :: Array Bool } - | PerfectSuccess { pubkey :: BeaconPubkey } - | SuccessIA { pubkey :: BeaconPubkey - , inactive :: Array Bool } - | SuccessDQ { pubkey :: BeaconPubkey - , disqualified :: Array Bool } - | MixedSuccess { pubkey :: BeaconPubkey - , inactive :: Array Bool - , disqualified :: Array Bool } ----- - -For a reasonably compact representation, -we can use the first byte of the result to encode not only success/failure, -but also whether there were inactive or disqualified participants. - -The inactive and disqualified participants are listed -in one-indexed bit arrays where the __i__th bit being set means -_P~i~_ is in the corresponding set. - -WARNING: One-indexing is a risk factor for off-by-one errors in the code. -Using zero-indexed arrays with the first bit unset -would instead move the risk into the length calculations. - -If the __i__th bit is set in both `inactive` and `disqualified`, -the result message can either be deemed invalid -or have disqualification take precedence. - -The maximum length of a result message is _1 + |BeaconPubkey| + n/4_ bytes. - -(For an unreasonably compact representation we could use ternary in trees -to represent only the indexes of participants who were in _IA_ or _DQ_. -In theory this would save space almost every time, -as the longest message (_MixedSuccess_) may only contain -1/4 of participants in either of them. -A less ridiculous ternary encoding would be squeezing 5 trits into 1 byte -between 0-242, using 8 bytes where binary encoding would use 10. -These trytes could be further compressed by prefixing them with bytes -encoding which trytes of the entire array contain any nonzero values, -saving a small amount of space in most cases. -In practice there is no way it would be worth it, -especially given the reputation of ternary in this industry.) - -== Dispute resolution - -Given that the protocol is performed off-chain, -participants may submit incorrect results -in an attempt to gain advantage. -By relying on the honest majority assumption, -this can be mitigated by having participants vote on results. - -Voting on results means that only votes need to be counted on-chain; -validating everything else can be offloaded onto the honest majority. -This has significant cost advantages as _O(n^2^)_ blockchain operations, -including _O(n)_ transactions and up to _O(n^2^)_ elliptic curve operations, -can be replaced with simply _O(n)_ transactions of mostly constant size, -or a single transaction with _O(n)_ elliptic curve operations. - -There are two main ways this voting can be performed: -either by members signing valid results, which are then verified on-chain, -or by designated members being eligible to submit a result -which may be challenged by others if they consider it incorrect. - -=== Full signing w/ ECDSA (FE) - -The _full signing_ technique of voting is simple. -The designated eligible submitter _P~sub~_ publishes the correct result -which is then checked by the contract to contain at least _M~max~ + 1_ -valid signatures from unique members of _P_. - -This technique requires fewer transactions and is less complex to implement, -but bears a constant cost as _O(n)_ signatures must be validated on-chain -upon every group creation. -Assuming for the sake of example _N = 201_ and _M~max~ = 100_, -and that `ecrecover = 3000 gas` dominates the transaction fees, -the cost of full signing would be constant on the order of 325,000 gas. - -If every participant in the group signs a result, -the unnecessary signatures can be pruned to ensure constant -size and cost of the result submission transaction. - -This also sets a hard limit on the group size of _N < gasLimit / 3000_, -but in practice this would only happen with impractically large groups -(currently more than 2,000 participants). - -It is easy to see why _full signing_ would be correct: -if _M~max~_ is the largest number of malicious participants, -requiring _M~max~ + 1_ signatures means that any result accepted by the system -must have at least one honest participant supporting it. - -.costs -|=== -|Operation |Cost - -|`EcrecoverGas` -|3,000 - -|Verification with _H = 101_ -|324,000 - -|Verification with _H = 201_ -|624,000 - -|Verification with _H = 500_ -|1,021,000 -|=== - -=== Full signing w/ BLS (FB) - -By using a BLS group signature instead of individual ECDSA signatures, -the on-chain size of the result can be significantly reduced. -However, pairing checks are extremely expensive, -even if EIP-1108 gets passed. - -Given that the length of the BLS signature would be 256 bits, -`k = 2` and the gas price of one pairing operation is currently `260,000`; -with EIP-1108 the price would fall to `91,000`; -with Vitalik's version `120,000`. - -The full cost of validating a BLS group signature -by at least _H_ members of _P_ is approximately -_21000 + 2 * (GPAIRINGBASE + 2 * GPAIRINGPERPOINT) + ECADD * (H - 1)_ -from the necessary `Bn256Add` operations. -Without cost reductions, this is `570,000` for _H = 101_ - -.costs -|=== -|Operation |Cost at status quo |Cost with EIP-1108 |Cost with Vitalik's proposal - -|`GPAIRINGBASE` -|100,000 -|80,000 -|40,000 - -|`GPAIRINGPERPOINT` -|80,000 -|5,500 -|40,000 - -|`ECADD` -|500 -|50 -|500 - -|Base cost of BLS verification - -|520,000 -|182,000 -|240,000 - -|Verification with _H = 101_ -|591,000 -|208,000 -|311,000 - -|Verification with _H = 201_ -|641,000 -|303,000 -|361,000 - -|Verification with _H = 500_ -|790,500 -|452,500 -|510,500 -|=== - -=== Escalating votes - -As an alternative to the above, -_escalating votes (EV)_ is a protocol where a result is submitted, -and accepted if it is not challenged within a specified time limit. -If multiple results are presented, -the participants will proceed to submit votes on the results -iff their preferred result is not in the lead, -or their vote would break a tie. -After a certain time limit has elapsed since the last vote, -a confirmation request transaction may be presented by anybody, -and the result with the highest number of supporting votes is accepted. - -The security of this scheme is less obvious, -but follows from the honest majority assumption: -since at least _M~max~ + 1_ honest players are online at the voting stage, -for any amount of adversary votes _0 < v~m~<= M~max~_ -there will be _v~m~ + 1_ honest participants -who will outvote the malicious players -(proof by induction). - -This scheme is only suitable for situations where _N >= 2 * M~max~ + 1_, -due to the reliance on the honest majority assumption. -If the majority of participants is dishonest, -the plurality result may be incorrect. - -In the worst-case scenario escalating votes will cost -_(M~max~ + 2) * 21000_ gas to the honest participants, -or around 2.15 million gas. -However, the practical cost of using escalating votes would be variable -and would be expected to be significantly lower most of the time. - -Given that a rational adversary who cannot break the honest majority assumption -will expect to inevitably lose the escalating vote, -and the cost of the voting is symmetrical -(submitting one vote costs approximately 21,000 gas, -so the malicious players will pay _v~m~ * 21000_ gas -while honest players will pay _(v~m~ + 2) * 21000_ gas in total; -this means the honest players will always pay exactly -42,000 gas more than the malicious players regardless of the value of _v~m~_), -one would expect the escalating votes to usually go unchallenged. - -In the example scenario, _EV_ is cheaper than _FE_ -if the average number of votes supporting the highest-voted incorrect result -is less than 13 out of 200 participants, -or alternatively if the worst-case scenario occurs at most 1/8 the time. - -== Incentives - -After performing the group creation correctly, -participants will be members of _G_ -and eligible for rewards from producing signatures for the random beacon. - -The protocol requires some parties to publish transactions on-chain. -Honest parties publishing correct transactions should be compensated for -the gas required for these transactions. - -Malicious parties who violate the protocol should be penalized. - -=== Required transactions - -Group selection will be performed as part of a previous transaction. - -If using _FS_ for voting on results, -the protocol will require one particularly expensive transaction. -If _EV_ is used, a larger number of transactions may be required, -up to a limit of one transaction from each honest participant, -but each transaction has a lower cost. - - -Types of possible misbehavior in the execution include: - -* sending malformed messages -** malicious only -* presenting inconsistent shares -** malicious only -* voting for incorrect outcome -** can be done by honest participant -if the broadcast channel assumption fails - -Ways a participant may be inactive during execution: - -* inactivity in the beginning -* inactivity during the execution -* inactivity at result stage -** not signing correct result if using FV -** with EV it gets super complex and don't want to think about it diff --git a/docs-v1/random-beacon/dkg/terms.adoc b/docs-v1/random-beacon/dkg/terms.adoc deleted file mode 100644 index 25e6e49b34..0000000000 --- a/docs-v1/random-beacon/dkg/terms.adoc +++ /dev/null @@ -1,148 +0,0 @@ -= Terms used in distributed key generation (DKG) - -== Time limits - -[horizontal] -T~p~:: - -Time limit for phase _p_ of the key generation; after _T~p~_ has elapsed every -non-inactive participant is assumed to have broadcast its own message for phase -_p_ and received others' messages - -T~DKG~:: - -Time limit for the distributed key generation to finish and _P~1~_ to submit the -result - -T~STEP~:: - -Time limit after which the next participant in queue becomes eligible to submit -the result - -T~VOTING~:: - -Time limit after which any disputes over the correct result are assumed to be -resolved, with the plurality being honest - -T~RESPONSE~:: - -Extension to the time limit after a new vote has been submitted, to ensure -honest members are able to react to last-minute votes. - -== Rewards and punishments - -[horizontal] -R~DKG_SUBMIT~:: -Reward for the member submitting the finally accepted result - -D~DKG_MISSED_SUBMISSION~:: -Penalty for all members _P~1~ .. P~i-1~_ who failed to submit the result -before _P~i~_, if _i > 1_ - -D~DKG_DQ~:: -Penalty for members on the disqualified list - - -== Values at the time of group creation - -[horizontal] -V~i~:: -**_i_**th output of the random beacon - -S:: -The set of all stakers at the time of _V~i~_ - -P:: -The candidate group of players selected from _S_ with _V~i~_, -who will try to perform the key generation to create signing group _G_ - -P~j~:: -__j__-th node in _P_ based on the group candidate selection algorithm - -== Values in the DKG protocol - -[horizontal] -IA~p~:: -The set of nodes in _P_ that first failed to broadcast a required message within -a specified time limit in phase _p_ and were thus added to the set of inactive -nodes after that phase - -IA:: -IA~1~ + IA~2~ + ... -+ -The set of inactive nodes in _P_ (nodes that failed to broadcast a required -message within a specified time limit during the DKG) - -DQ~p~:: -The set of nodes in _P_ that were disqualified in phase _p_ for provably and -attributably violating the protocol - -DQ:: -DQ~1~ + DQ~2~ + ... -+ -The set of all disqualified nodes in _P_ - -G~p~:: -G~p-1~ - IA~p-1~ - DQ~p-1~ -+ -The set of nodes in _P_ that were active and well-behaved at the -beginning of phase _p_ (_G~1~= P_) - -G:: -P - IA - DQ -+ -The successfully created group after removal of inactive -and misbehaving nodes - -== Keys - -[horizontal] -X~i~:: -Long-term ECDSA private key of _P~i~_ - -Y~i~:: -Long-term ECDSA public key of _P~i~_ - -x~ij~:: -Ephemeral ECDH private key of _P~i~_ for the purpose of encrypted communication -with _P~j~_ - -y~ij~:: -Ephemeral ECDH public key of _P~i~_ for the purpose of encrypted communication -with _P~j~_ - -k~ij~ = k~ji~:: -ECDH(x~ij~, y~ij~) -+ -Symmetric key generated by _P~i~_ for encrypting and decrypting communications -with _P~j~_ - -X:: -X = Σ z~i~ -+ -The (virtual) private key corresponding to the group _G'_ - -Y:: -Y = X * P1 -+ -The public key corresponding to the group _G'_ - -z~i~:: -z~i~ = a~i0~ -+ -Piece of the group private key _X_ generated by _P~i~_ - -y~i~:: -y~i~ = z~i~ * P1 = A~i0~ -+ -Piece of _P~i~_ of the group public key _Y_ - -x~i~:: -x~i~ = Σ s~ji~ -+ -The individual private key of _P~i~_ corresponding to a share of _X_ at _i_ - -gx~i~:: -gx~i~ = x~i~ * P1 = Σ (s~ji~ * P1) -+ -The individual public key of _P~i~_ corresponding to a share of _Y_ at _i_ diff --git a/docs-v1/random-beacon/glossary.adoc b/docs-v1/random-beacon/glossary.adoc deleted file mode 100644 index 7edec05cc9..0000000000 --- a/docs-v1/random-beacon/glossary.adoc +++ /dev/null @@ -1,62 +0,0 @@ -== Glossary - -Stake:: An amount of KEEP that is bonded in order to participate in the - threshold relay and, optionally, the Keep network. Part or all of this can be - removed from escrow as penalties for misbehavior, while part or all of it can - be refunded if and when a participant chooses to withdraw in orderly fashion - from the network and relay. - -Staker:: A staking client that has a stake, but may not yet be in a signing - group. - -Minimum Stake Amount:: The minimum stake amount that will make a staking client - a staker, as required by the staking smart contract. - -Stake Amount:: Total KEEP deposited for a single stake. - -Signing Member:: One member of one complete signing group in the threshold - relay. - -Signing Group:: One complete signing group in the threshold relay. - -Lead Signing Group:: The signing group that will produce the next relay entry - candidate (due to being the result of $E_i mod N$ with $E_i$ being the - current entry and $N$ being the number of groups). If this group fails to - respond to the request in time, the lead responsibility may shift to another - group. - -Relay Entry Candidate:: A random number generated by the threshold relay that - has not yet been finalized on the blockchain; may be invalid. - -Relay Entry:: A relay entry candidate that has been finalized on the blockchain; - may be invalid. - -Keep Client:: The entire application running on a user's system, which contains - multiple subclients for the various pieces of the Keep system. - -Staking Client:: The part of the Keep Client that stakes and participates in the - threshold relay. - -Verifying Client:: Verifies entries on-chain and reports invalid entries. - Optional, does not require a stake. Reward for identifying an invalid random - number on the chain. - -Provider Client:: The Keep Provider piece of the application, which can in turn - have workers for various Keep types. - -Keep Type:: The functionality that the given Keep relies on for providing - security. e.g. an SHM (Secure Hardware Module) Keep, SMPC (Secure Multi-Party - Computation) Keep, Proxy Reencryption Keep, etc. - -Provider Worker:: One worker that runs the code to allow a provider client to - participate in a given Keep Type. - -Keep Provider:: One economic entity in the Keep network; has a stake, must - participate in a signing group as a single member. - -Keep:: Up to 1MB of encrypted storage across one or more Keep Providers. - -KEEP:: Token used to stake. Can be represented as a K with a vertical bar - through it. - -Keep Owner, Delegate, Requester are described in the whitepaper. diff --git a/docs-v1/random-beacon/group-expiration/index.adoc b/docs-v1/random-beacon/group-expiration/index.adoc deleted file mode 100644 index 45d26ae9e4..0000000000 --- a/docs-v1/random-beacon/group-expiration/index.adoc +++ /dev/null @@ -1,532 +0,0 @@ -= Group expiration - -Desired qualities: - -- larger pool of groups when demand is high -- pool doesn't grow _O(n)_ with output demand -- stakeless members are minimized -- the expiry cannot be manipulated - - any function where stakers can impact which groups expire first is - vulnerable to manipulation -- any group expires eventually -- groups churn reliably and the system doesn't get stuck in a state favoring any -particular staker(s) -- number of available groups never hits zero - -Thus: - -- the number of outputs within a certain time period determines how fast groups -expire -> to cater for DKG failures, calculate by number of groups instead? -- small number of outputs -> long expiry -- large number of outputs -> short expiry - -Represent the group expiration function by _Expire(GG, E) -> GG'_ where _GG_ is -the pool of currently active groups, _E_ is some value representing all other -inputs to the function, and _GG'_ is the new pool after removing expired groups. - -== Expiry manipulation - -If the actions of stakers can impact which groups expire first, it enables -manipulation. - -==== Unstake manipulation - -Consider a scenario where groups with unstaking members expire faster. Mallory -blitzpantses their stake _Stake~m~_ to allotments of _Stake~minimum~_ and is -represented in groups with an average fraction of -_Rep~m_average~ = Stake~m~ / Stake~total~_. - -Then, Mallory proceeds to unstake all of their identities that are only present -in groups _G~i~_ where _Rep~m_i~ < Rep~m_average~_. Those groups will be removed -from the group pool faster, and replaced with groups where the expected fraction -of Mallory's nodes is _Rep~m_average~_. - -==== Selection seed manipulation - -Consider a scenario where Mallory can influence the value _E_ which determines -which groups expire with the function _Expire(GG, E)_. - -Now Mallory can calculate what values of _E~m~_ within their control would yield -favorable outputs from _Expire(GG, E~m~)_. - -=== Preventing manipulation - -To avoid issues of this general nature, _Expire(GG, E)_ should use values of _E_ -that cannot be manipulated. Some suitable values may be: - -- The actual outputs of the random beacon (_V~i~_) -- Current blockheight (_T~j~_) when used in a linear fashion: if _G~i~_ would -expire with input _T~j~_, it should expire with all inputs _T~j+k~_ where _k > 0_ -- Historical, statistical data about the beacon usage (_BeaconData_) when used to -eg. tune expiration sensitivity so that more groups remain in the pool if the -beacon is busy -- The state of the group pool (_GG_) is also suitable but is already accounted for -separately - -Some values that are definitely unsuitable, unless mixed with good inputs in a -suitable way: - -- Block hashes: miners can influence block hashes to select different groups for -expiry -- Details of requests: requesters can influence these inputs -- The state of the staker pool: stakers, especially blitzpantsing ones, can -manipulate these values -- Blockheight as a seed to a pseudorandom function: miner censorship can delay -processing of transactions to force the use of new seeds that produce a -different outcome for expiration -- Seeding a pseudorandom function with statistical data seems risky and is not -recommended - -To summarize: - -- Data under adversary control should not be used without effective sanitization -- Data the adversary can affect in very limited ways is usable as input to -functions that don't exhibit the avalanche effect -- Data that is out of anyone's effective control should be safe - -==== Rationale - -===== Why you shouldn't prf on the blockheight - -What happens if we do the unsafe thing and avalanche the blockheight as a seed -for pseudorandom expiration? - -If the size of the group pool is _n~GG~_, the delay window is _T~m~_, and the -average delay between group expirations is _T~e~_, Mallory has _T~m~_ attempts -to produce the most favorable/least unfavourable outcome. Since in a stable -group pool (and one where every DKG succeeds) each group has a _1 / n~GG~_ -chance of expiring, Mallory's favourite group can only expire if all outcomes -would lead to its expiration, the probability of which is _1 / n~GG~^T~m~^_. - -If we assume every expiration trigger event expires exactly one group (for -simplicity), and Mallory controls _m_ groups, the probability of that expiring -group being Mallory's is is normally _m / n~GG~_. If Mallory gets _T~m~_ -expiration rerolls, this goes to _m^T~m~^ / n~GG~^T~m~^_. This means that -Mallory can stabilise a new equilibrium where Mallory's number of controlled -groups _m'_ is such that -_m'^T~m~^ / n~GG~^T~m~^ = m / n~GG~_ - -_m'^T~m~^ / n~GG~^(T~m~ - 1)^ = m_ + -_m'^T~m~^ = m * n~GG~^(T~m~ - 1)^_ - -_m' = nthRoot(T~m~, (m * n~GG~^(T~m~ - 1)^))_ - -or as an example, with _n~GG~ = 300 , T~m~ = 3, n~m~ = 10_, we get: - -_m'^3^ = 10 * 300^2^ = 900,000_ + -_m' = 96.5_ - -Thus an enemy who normally could only control 3.3% of the groups in network can -stabilise a 32% control fraction. With _T~m~ = 4_ it goes to 43%, and _T~m~ = 5_ -means 51% control. - -===== Can we prf on statistics? - -While manipulating blockheight requires only miner censorship, manipulating -beacon history and statistical data is much more involved and requires -requesting and paying for new outputs. - -Superficially it would appear that the cost of manipulating group expiration in -such a way would exceed the benefits, but a thorough calculation would need to -address complex aspects of marginal pricing and external incentives. - -There isn't really a good reason to feed statistics as input to pseudorandom -functions, and thus the effort is better spent elsewhere. - -== Possible schemes - -Due to the previous, we are left with essentially two classes of expiry -functions. - -=== Limited Lifespan - -Timed expiration takes the current blockheight _T~now~_ as input and outputs which -group(s) should expire. - -The groups need to be in an unchanging order. If the groups' expiration order -can change (eg. by re-shuffling groups whenever a new one is added), it enables -manipulation by Mallory forcing a re-shuffle just before _G~j~_, where -_Rep~m_j~> Rep~m_average~_, would expire. - -Timed expiration should not exhibit "evaporative cooling" either; a group should -not get lucky with a seed value that makes it enduringly less likely to expire -than others. - -Because of the above requirements, it seems that expiration with blockheight as -input is effectively limited to ordering groups by -_ExpirySeed~j~ = T~j_creation~ + e~j~_ -where _e~j~_ is a non-manipulateable value specific to _G~j~_, and expiring -groups where -_T~now~ > ExpirySeed~j~ + c_ -where _c_ is a non-manipulateable value common to all groups. - -There seems to be no particular advantage in _e~j~ != 0_ and thus the formula -can be simplified to -_T~now~ > T~j_creation~ + c_ -where _c_ acts as the maximum age of a group. Let this form of timed expiration -be called _limited lifespan_. - -==== Limited lifespan manipulation - -Timed expiration has a slight manipulation opportunity if a group is on the -verge of expiry and the transaction that would trigger group expiration can be -delayed by eg. miner censorship. - -This is possible to mitigate by having such a transaction include a reference -blockheight that must be higher than the blockheight of the previous such -transaction but the same or lower than the current blockheight when the -transaction is mined. However, the impact is limited and specific mitigation -may not be necessary or useful when counterbalanced by the additional complexity -required. - -===== Why it is unavoidable - -If the trigger transaction happens at time _T_, group _G~i~_ will not expire. If -the transaction happens at _T' > T_, group _G~i~_ will expire. Mallory dislikes -group _G~i~_ and is able to delay the trigger transaction to block _T'_. - -If the trigger transaction is a different transaction than the one that selects -the next signing group for output _V~j~_: - -- If the transaction arrives at _T_, group _G~i~_ does not expire, and is -present in the pool from which the group to output _V~j~_ is selected -- If the transaction arrives at _T'_, group _G~i~_ expires, and is absent from -the pool for _V~j~_. Mallory's goal is achieved. - -If the trigger transaction is the same one which selects group to produce output -_V~j~_, we get two different scenarios based on whether expiration is applied -before selection (so any groups that expire are removed from the pool for -_V~j~_), or after (so even expiring groups are eligible for _V~j~_ but will be -removed from the pool for any later outputs). - -If expiration is applied before selection: - -- At _T_, _G~i~_ doesn't expire, and is thus eligible for _V~j~_ -- At _T'_, _G~i~_ has expired and is not eligible for _V~j~_. Mallory's goal is achived. - -If expiration is applied after selection: - -- At _T_, _G~i~_ is eligible for _V~j~_, and is also not removed and thus stays in -the pool for _V~j+1~_ as well -- At _T'_, _G~i~_ is eligible for _V~j~_ despite being marked for expiration, -but it will not be in the pool for _V~j+1~_. Mallory's goal is achieved on the -next output. - -===== Is it worth it? - -If the size of the group pool is _n~GG~_, the delay window is _T~m~_, and the -average delay between group expirations is _T~e~_, Mallory has: - -- _1 / n~GG~_ chance of denying _G~i~_ the signing position on a successful attack -- on any given trigger event there is an expected probability of _T~m~ / T~e~_ -of there being a group whose expiry can be manipulated (if Mallory can delay a -transaction by 3 blocks, and a group expires on every 100th block on average, it -gives a 3% chance that a group expiration would occur within that window) -- a _R~m~ - R~i~_ return, where _R~m~_ is the average reward Mallory would get -if any group except _G~i~_, and _R~i~_ is the reward Mallory would (expect to) -get if _G~i~_ produces an output - -(assuming we only need to consider one group at a time) - -for a total return on the attack of _(R~m~ - R~i~) * T~m~ / T~e~ * n~GG~_. - -To put some numbers on this, let's assume the active group pool _n~GG~ = 300_, -_T~m~ = 3, T~e~ = 100_ as above, and Mallory has an average of 5 members in a -group but only 1 in _G~i~_, we get: - -_(5R~signer~ - 1) * 3 / 100 * 300 = 12R~signer~ / 30,000 = 0.0004 * R~signer~_ -of expected value per trigger event of doing this attack, or -_0.0133 * R~signer~_ value per actual attack with a 0.03 chance of being able to -attack on any given trigger event. - -=== Random Expiration - -With random expiration, each group is assigned a pseudorandom expiration seed -value upon the expiration trigger transaction, and groups whose seed values fall -below a specific threshold are removed from the pool. Thus each group has an -equal chance of being removed. - -== Expiration thresholds - -Both timed and random expiration can be tuned to exhibit desirable -characteristics. The maximum age and expiration seed value threshold will be -referred to as simply "expiry threshold". - -==== Absolute expiration - -At each expiration trigger transaction, calculate the desired number of groups -_n_. If _|GG| > n_, expire _|GG| - n_ groups by setting the threshold accordingly. - -==== Probabilistic expiration - -Choose parameters for the functions that calculate the expiry threshold so that -the expected value of _|GG'|_ is _n_. - -=== Group churn - -It is desirable to have adequate turnover in beacon signing groups. Because a -group selection is triggered by every beacon output, new groups will be reliably -added to the pool if the DKG finishes most of the time. Assuming a group pool of -constant size and a DKG that never fails, each group would produce one output -before expiring, on average. If the DKG has a failure rate of _f_, a group would -be expected to sign _1 / (1 - f)_ outputs. - -It seems desirable to decouple group expiration from DKG success to reduce the -effectiveness of manipulating the group pool by deliberately inducing DKG -failure. This has two implications: - -1. DKG success should not be the group expiration trigger -2. The group expiration should be probabilistic, not absolute - -=== Group pool size - -TODO: check the math, does pool bias compound the variability in staker profits? -Taking a small sample of (small sample of large pool) vs. small sample of (large -sample of large pool); reconcile w/ churn and individual staker's perspective. - -When the group pool is small, group lifespan is relatively short and the -probability of an active group being selected for any given output is relatively -high. Smaller pools are less representative of the pool of stakers, and may be -more susceptible to pool composition manipulation. - -With a large pool, each group's (expected) lifespan is relatively long, while -each group's chance of being selected for any specific output is low. A large -pool is more representative of the stakers, but also more expensive to operate -due to on-chain processing costs. - -=== Stakeless members - -To unstake, a staker needs to wait _T~unstake~_ before the tokens are freed. An -unstaking holder will not be selected for new groups, but they will not be -removed from groups created earlier. Thus _G~i~_ is guaranteed not to have -members who have finished unstaking if _T~now~< T~i_creation~ + T~unstake~_. - -With older groups there is a possibility that some members may have nothing at -stake and thus cannot be penalized for misbehavior. This can be prevented by -either extending the unstaking waiting period until the staker is no longer -a member of any active group, or by removing those members from the group and -possibly expiring the group if the number of remaining members falls below -_N - M~nofail~_. - -With limited lifespan, these issues can be prevented entirely by setting a cap -on the maximum lifespan at _T~unstake~_ as long as at least 1 DKG can be relied -on to finish successfully within any period of _T~unstake~_. - -==== Extended unstaking delay - -===== Under random expiration - -With random expiration, the probability of a group expiring within the unstaking -period _P~expire~(T~unstake~)_ determines the likelihood of this becoming a -severe issue. Call the probability that a group is still active when a member -finishes unstaking -_P~leftover~ = 1 - P~expire~(T~unstake~)_. - -Because the age of a group doesn't impact the expiry probability under random -expiration, each unstake event has a _P~leftover~_ chance of leaving the member -in the group. After _2T~unstake~_ the probability is _P~leftover~^2^_, and so -on for -_1 - P~expire~(x * T~unstake~) = P~leftover~^x^_. -If _P~leftover~_ is low enough, for example _0.001_, this should be reasonably -uncommon. However, the non-deterministic unstaking period creates a severe tail -risk for stakers, which may have a larger-than-expected impact on the value of -the token. - -===== Under limited lifespan - -If group lifespans have a systemwide hard cap at _T~maxlife~_, blocking -unstaking until a staker's groups have expired means that the real unstaking -period _T'~unstake~_ is -_T~unstake~ <= T'~unstake~<= T~maxlife~_. - -The actual value of _T'~unstake~_ for _S~i~_ can be estimated in advance with -some accuracy, using knowledge of the ages of the groups _S~i~_ is represented -in, and the formula for calculating group lifespans: -_c = F~maxlife~(GG, BeaconData)_. -This works even if no systemwide constants are used, although varying beacon -conditions will create some unpredictability. - -==== Removing stakeless members - -If _S~i~_ is represented as _P~i~_ in _G~j~_, but finishes unstaking while -_G~j~_ is still active, _P~i~_ could be removed from _G~j~_ so they will not be -able to collect rewards for contributing to future outputs. The probability of -this occurring for any given unstaking under random expiration is _P~leftover~_. - -If _n_, the number of members remaining in _G~j~_ after DKG is closer to _N_ -than _N - M~nofail~_, single members unstaking should not pose a significant -problem. - -If a large number of members unstake, _n~remaining~ = n - n~unstaked~_ may fall -below _N - M~nofail~_ and residual security may be compromised. It may be -desirable to terminate a group if -_n~unstaked~ + n~dkg_inactive~ + n~dkg_disqualified~ > M~nofail~_. - -If groups terminate when too many members unstake, it opens up a group pool -manipulation attack where _S~m~_ blitzpantses and then unstakes groups where -they control -_m >= M~nofail~ - (n~dkg_inactive~ + n~dkg_disqualified~)_ -members. - -This ties down _m * Stake~min~_ KEEP for _T~unstake~_ and has _P~leftover~_ -probability of success. Assuming the blitzpantsing divides _S~m~_'s tokens in -such a way that any blitzpantsed staker identity is represented in at most one -group in _GG_ (expected number of representations per an identity with -_Stake~min~_ being -_Stake~min~ * N * |GG| / Stake~total~_), -the opportunity cost is as follows: - -TODO: actually calculate this - -== Terminating groups - -In some situations a group may need to be terminated before it would expire -normally. - -=== Member attrition - -If enough members are removed from the group so that _n~remaining~ < H_, -termination is the only option to preserve beacon reliability. - -Termination may be desirable if the group loses enough members to push it below -the threshold of _n~remaining~ < N - M~nofail~_, to preserve residual security. - -===== Technical requirements - -As qualified members of each group are tracked, no additional capabilities are -required to be able to terminate groups incapable of reaching quorum. - -===== Punishment - -In the case of termination due to member attrition, the remaining participants -should not be penalized, especially if member attrition below _N - M~nofail~_ is -used as the termination threshold. - -If the punishment for each remaining member is _D~terminate_attrition~_ and the -lowest punishment for misbehavior that leads to _P~m~_ being removed from the -group is _D~dropout~_, punishing remaining members enables control bootstrapping -attacks if -_D~terminate_attrition~ * (N - M~terminate~) > D~dropout~ * (M~terminate~ - n~dkg_removed~)_ + -_= D~terminate_attrition~ > D~dropout~ * (M~terminate~ - n~dkg_removed~) / (N - M~terminate~)_ + -_= D~terminate_attrition~ / D~dropout~ > (M~terminate~ - n~dkg_removed~) / (N - M~terminate~)_ + -where + -_n~dkg_removed~ = n~dkg_inactive~ + n~dkg_disqualified~_ + -and _M~terminate~_ is the threshold at which number of removed members the group -is terminated, with probability equal to the adversary controlling -_M~terminate~ - n~dkg_removed~_ -members in the group. - -If punishing the subquorum group is desired, it will be safe if: - ----- -D_ta / D_d < (M_t - n_dr) / (N - M_t) -D_d / D_ta > (N - M_t) / (M_t - n_dr) ----- - -at _n~dkg_removed~ = M~nofail~_: + -_D~dropout~ / D~terminate_attrition~ > (N - M~terminate~) / (M~terminate~ - M~nofail~)_ - - - -If _M~terminate~ = M~nofail~ + 1 = (N - 1) / 4 + 1_, + -the above becomes + -*_D~dropout~ / D~terminate_attrition~ > (3N - 3) / 4_* - ----- -D_d / D_ta > (N - M_nf - 1) / (M_nf + 1 - M_nf) -D_d / D_ta > N - M_nf - 1 -D_d / D_ta > N - (N - 1) / 4 - 1 -D_d / D_ta > (4N - N + 1) / 4 - 4/4 -D_d / D_ta > (3N - 3) / 4 ----- - -Thus a safe punishment for a group falling under quorum would need to be -extremely small. - -If _M~terminate~ = M + 1 = (N - 1) / 2 + 1_, + -we get the requirement + -*_D~dropout~ / D~terminate_attrition~ > 2 - 8 / (N + 3)_* - ----- -D_d / D_ta > (N - M - 1) / (M + 1 - M_nf) -D_d / D_ta > (N - (N - 1) / 2 - 1) / ((N - 1) / 2 - (N - 1) / 4 + 1) -D_d / D_ta > ((2N - N + 1) / 2 - 1) / ((N - 1) / 4 + 1) -D_d / D_ta > ((N + 1) / 2 - 1) / ((N - 1) / 4 + 1) -D_d / D_ta > (N/2 - 1/2) / (N/4 + 3/4) -D_d / D_ta > (2N - 2) / (N + 3) -D_d / D_ta > (2N + 6 - 8) / (N + 3) -D_d / D_ta > (2(N + 3) - 8) / (N + 3) -D_d / D_ta > 2 - 8 / (N + 3) ----- - -In this case, as long as the punishment for each remaining group member is less -than half of the smallest dropout punishment, the punishments can be given -without enabling arbitrary power bootstrapping attacks. Nonetheless, punishing a -disproportionately honest group of stakers for something caused by the actions -of the other members is not recommended. - -Punishing the removed members in the case of failure to stay in quorum is -possible if removed members are flagged as disqualified for rewards while -remaining on the list of the original group members. - -=== Compromised private key - -If the group private key has been exposed or the group is proven to collude in -signing invalid values, the group should be terminated to preserve beacon -security. - -===== Technical requirements - -This can be achieved by tracking the values _Input~i~_ signed by the group to -generate outputs _V~i~_. Because each group signs on average -_1 + Prob~dkg_failure~ / Prob~dkg_success~_ inputs before expiring, this would -not lead to excessively expensive record-keeping. - -If a valid signature on value _Input~m~_ is made using the public key of _G~j~_, -and _Input~m~_ is not present in the list of values _G~j~_ has signed in the -beacon operation, _G~j~_ should be terminated. - -===== Punishment - -Because signing such an invalid value requires at least _H_ members to misbehave -or have their individual private keys compromised, punishing the entire group -may seem safe and appropriate even if the specific guilty parties cannot be -identified. - -However, control bootstrapping attacks are possible if + -_D~terminate_compromise~ * M > D~min_compromise~ * (H - n~dkg_dq_late~ - 1) + D~terminate_compromise~ - R~tattletale_compromise~_ + -where + -_D~min_compromise~= min(D~terminate_compromise~, D~dropout~)_, + -_n~dkg_dq_late~_ members are disqualified in phase 9 of the DKG, and + -_R~tattletale_compromise~_ is the reward for the actor presenting proof of the -violation. - -Thus no amount of punishment is entirely safe if _n~dkg_dq_late~ > 1_. - -The probability of success equals the probability of the adversary controlling -_m = H - n~dkg_dq_late~_ members in the group, with the minimum being -_m = M~nofail~ + 1_ with _n~dkg_dq_late~ = M~nofail~_. - -The control bootstrap multiplier for this attack in the most favorable case is: -_(D~tc~ * M) / (D~mc~ * M~nf~ + D~tc~ - R~tc~)_. -Defining _R~tc~ = a * D~tc~_ where _a < m~mc~_ gets: -_(D~tc~ * M) / (D~mc~ * M~nf~ - (a - 1) * D~tc~)_ -Define _r = D~tc~ / D~mc~_: - ----- -_(r * M) / (M~nf~ - (a - 1) * r)_ -_(r * M) / (M/2 - (a - 1) * r)_ -_2(r * M) / (M - (2a - 2) * r)_ -_2r * M / (M - 2ar + 2r)_ ----- - -simplifying to: - -_2r + 4r^2^ * (a - 1) / (M - 2ar + 2r)_ - -Because _a_ should be larger than 1 to incentivize burning a compromised group -even if you have a node in it, and lower than _M/2_ to disincentivize actively -seeking to collude and loot other stakers, the _2r_ factor is the most relevant. -Consequently the required economic power for this attack is roughly -_50% * min(1, D~dropout~ / D~terminate_compromise~)_ of the honest participants' -power. diff --git a/docs-v1/random-beacon/group-expiration/terms.adoc b/docs-v1/random-beacon/group-expiration/terms.adoc deleted file mode 100644 index 4374262749..0000000000 --- a/docs-v1/random-beacon/group-expiration/terms.adoc +++ /dev/null @@ -1 +0,0 @@ -= Terms used in group expiration diff --git a/docs-v1/random-beacon/group-selection/general.adoc b/docs-v1/random-beacon/group-selection/general.adoc deleted file mode 100644 index fa04b78273..0000000000 --- a/docs-v1/random-beacon/group-selection/general.adoc +++ /dev/null @@ -1,207 +0,0 @@ -= General group selection - -Functionality contracts in the Keep network require groups of stakers -to perform operations. - -== Basic description - -The _group selection contract_ provides a mechanism -for selecting a group of stakers in a representative way. -Each staker has a chance of being selected -that is proportional to their _staker weight_. - -When a _functionality contract_ needs a new group, -it calls the `initiateGroupSelection` method on the _group selection contract_. -The _functionality contract_ is required to provide -a _selection seed_, and the _group size_ of the desired group (_n_). - -When the `initiateGroupSelection` method is called, -_stakers_ may begin submitting _tickets_ -to show their eligibility for the new group. - -Each ticket contains the _staker ID_ of its _creator_, -the _selection seed_ of the group it is for, -and a _ticket index_ used to distinguish the _creator's_ different tickets. -With these, a pseudorandom _ticket value_ -and a unique _ticket identifier_ can be calculated. - -Tickets with the lowest _ticket values_ are the most favorable. -Each staker can create a number of tickets equal to its _staker weight_. -Stakers with promising tickets of a low _ticket value_ -can submit them on-chain until _ticket submission timeout_ is reached. - -Once _ticket submission timeout_ is reached, -the new group can be created by calling `finishGroupSelection` -which returns the best _n_ tickets. - -In the future, alternative group selection contracts can be created -to provide different features, -such as staker indistinguishability. - -== Details - -=== Tickets - -A ticket consists of the triplet `(selection_seed, staker_ID, ticket_index)`. - -Ticket values are calculated as -`sha3(selection_seed, staker_ID, ticket_index)`. -The _ticket index_ is a value between 1 -and the _staker weight_ of the ticket's creator, inclusive. -Each staker can submit a number of tickets equal to their staker weight. - -Because `sha3` is pseudorandom, -each ticket has an independent chance of being in the _n_ best tickets. -This means a given staker may be included multiple times in the same group. -This independence of tickets is considered desirable -to simplify the group selection protocol -while also ensuring that it cannot be manipulated -by distributing stakes in any particular way. -The _staker weight_ of staker _Alice_ -is equal to the number of separate stakers Alice could form with their stake. -Thus Alice cannot gain more tickets by distributing their stake -over more than one staker identity. - -=== Threshold - -The _threshold_ is the value of the _n_-th best ticket; -after the _ticket submission deadline_, -there are _n_ tickets with values at or below the _threshold_. - -=== Ticket submission - -The contract is agnostic to how tickets are submitted -as long as the transactions are processed before the ticket submission deadline. -To avoid unnecessary transactions, -it is recommended that clients submit their best tickets first as follows: - -When instructed to submit more than one ticket at once -the staker should submit the most favorable one, -wait a block, submit the next most favorable one, -and so on. - -Calculate the values of each ticket the staker is eligible to submit. -Order the tickets by favorability; -with tickets of the lowest value first. - -==== Natural threshold and initial submission - -Calculate the _natural threshold_. -The _natural threshold_ is the value the _threshold_ would take -if all tokens in existence were staked with maximum efficiency -and the ticket values were evenly distributed in the domain of `sha3`. ----- -max_stakers = token_supply / minimum_stake -natural_threshold = (group_size / max_stakers) * (2^256 - 1) ----- - -If the staker has any tickets below the _natural threshold_, -those tickets should be submitted immediately. - -Most of the time there are less than _n_ tickets below the natural threshold, -because the tokens are not staked in the most efficient possible way -and some stakers may be inactive or unable to submit their tickets. - -==== Continued submission - -If less than _n_ tickets are submitted immediately, -the remaining tickets should be scheduled: - -For each ticket, calculate the scheduled submission delay -by calculating how many multiples of the natural threshold the ticket value is, -and multiplying the _submission delay increment_ by that number. ----- -submission_delay(t) = ((t.value / natural_threshold) - 1) * delay_increment ----- -Add the submission delays to the _group selection initiation time_ -to get the time each ticket is scheduled to be submitted. ----- -submission_time(t) = initiation_time + submission_delay(t) ----- - -Submit each remaining ticket at the indicated time, -until at least _n_ tickets with lower values than the next ticket -have been submitted. - -[NOTE] -.Submission delay -==== -The protocol isn't particularly sensitive -to the exact value of the _submission delay increment_. -If the increment is too small, -it may lead to the premature submission of ultimately ineligible tickets. -If the increment is too large, -it may lead to others submitting ultimately ineligible tickets. - -Major problems would occur only where the submission delay increment -is set to such a high value that an ultimately eligible ticket -fails to get processed before the deadline. -This can be avoided by calculating and using -a worst-case delay increment: ----- -natural_threshold_fraction = group_size / max_stakers -delay_increment_count = (1 / natural_threshold_fraction) - 1 -delay_increment = submission_period / delay_increment_count ----- - -With the worst-case delay increment -every possible ticket value gets scheduled within the submission window. - -To illustrate: ----- -group_size = 50 -max_stakers = 10,000 -natural_threshold = 0.005 * (2^256 - 1) - -natural_threshold_fraction = 1/200 -delay_increment_count = 199 -delay_increment = submission_period / 199 ----- -Because the natural threshold is 1/200-th of the domain, -on average 1 in 200 tickets would fall below it. -The remaining 199 out of 200 tickets are scheduled -so that the worst possible ticket `2^256 - 1` -would get submitted just at the end of the submission window. - -For practical applications, -this worst-case delay increment is extremely pessimistic -and would cause unnecessary transaction fees to its user. -==== - -=== Processing tickets - -Tickets are submitted by calling the method -`submitTicket(selection_seed, staker_ID, ticket_index)`. - -The _selection seed_ is used -to identify which group selection each ticket belongs to, -as there may be multiple group selections running in parallel. -Submitting a ticket whose selection seed is invalid, -or where the corresponding group selection not accepting new tickets, -should lead to the ticket being *discarded*. - -The _staker ID_ is used to identify the staker that created the ticket. -The staker must exist, -its status must be _Active_ (it may not be in the process of unstaking), -and it must have _authorized_ the contract corresponding to the selection seed. -Tickets failing these criteria should be *discarded*. - -The _ticket index_ is used to distinguish different tickets -when a staker whose weight is more than 1 -is eligible to submit multiple tickets, -and to act as a nonce for the pseudorandom function -to ensure different tickets get independent values. -The ticket index should be between 1 and the _staker weight_ -of the staker corresponding to the _staker ID_, inclusive. -Tickets with a ticket index outside these bounds should be *discarded*. - -Ticket values of valid tickets are calculated as -`sha3(selection_seed, staker_ID, ticket_index)`. - -=== Finishing - -Once the _ticket submission deadline_ has been reached, -the method `finishGroupSelection(selection_seed)` can be called. -It returns the best _n_ tickets in ascending order of ticket value. -These tickets are assigned the numbers from _1_ to _n_ inclusive, -and these numbers are used as _member indices_ for the resulting group. diff --git a/docs-v1/random-beacon/group-selection/index.adoc b/docs-v1/random-beacon/group-selection/index.adoc deleted file mode 100644 index 7455314ba6..0000000000 --- a/docs-v1/random-beacon/group-selection/index.adoc +++ /dev/null @@ -1,311 +0,0 @@ -:toc: macro - -= Random Beacon Group Selection - -ifndef::yellowpaper[toc::[]] - -The group selection protocol is intended to be -an interactive method of selecting candidate group _P_ -from the set of all stakers _S_ -given a pseudorandom seed value _V~i~_. - -Functional interface: - -inputs: _S, V~i~_ - -output: _P_ - -The protocol should: - -. [[req-1]]produce a representative result, -where each staker's profit is proportional -to the number of tokens they have staked -. [[req-2]]produce a group _P_ of constant size _N_ -. [[req-3]]not require an excessive amount of on-chain operations to perform -. [[req-4]]not be feasible for an adversary to manipulate - -.Some terms -|=== -|Term |Meaning - -|Trenchcoating -|Several actors pooling up their stakes under one staker identity -to take advantage of rich-get-richer effects. -Thus what seems to be a large staker is actually -"a hundred small stakers in a trenchcoat". - -|Blitzpantsing -|The inverse of trenchcoating; a single token holder dividing their stake -under multiple identities to avoid rich-get-poorer effects or to increase their -representation in groups. -This can increase profits above what is designed, or make certain attacks easier -to perform by making one actor more likely to control a group. -Thus what seems to be a large number of small stakers is actually a single -whale in an "inverse trenchcoat", or "blitzpants". - -|Non-interactive -|A protocol is non-interactive if it can be performed without stakers -providing additional information. -Specifically, _S~i~_ can determine whether they are in _P_ -without input from other stakers in _S_. - -|Interactive -|An interactive protocol requires stakers to provide additional information -over what is available on-chain, -and then performs a deterministic algorithm to select a group -based on the information provided by the stakers. -In an interactive protocol _S~i~_ cannot know for sure -whether they are in _P_ before they receive the other stakers' input. - -|Actual staker -|An actor holding and staking at least _MINIMUM_STAKE_ tokens, -represented as _S~i~_. -Each actual staker corresponds to one or more virtual stakers. -An actual staker can be represented multiple times in a candidate group, -through multiple virtual stakers. -The surplus tokens above _n * MINIMUM_STAKE_ (for an integer _n_) -do not impact the actual staker's ability to create virtual stakers. - -|Virtual staker -|A construct used to simplify -the mathematical requirements of the group selection protocol -and ensure blitzpantsing provides no advantage. - -Each virtual staker represents exactly _MINIMUM_STAKE_ tokens -staked by some actual staker who may or may not be anonymous. -A virtual staker may only ever be included once in a candidate group, -and _N_ properly denotes the number of virtual stakers in _P_. - -|Ticket -|A message containing a pseudorandomly generated value _W~k~_ which is used to - determine whether a given _virtual staker_ is eligible for the group _P_ (the - lowest _N_ tickets will be chosen) and a proof of the validity of the value - -|Threshold -|The value of the highest-valued ticket in _P_ - -|_Space~tickets~_ -|Is a space consisting of all possible tickets. It is strongly related -with a pseudorandom function that is used for ticket generation. -Currently the _Space~tickets~_ is equal to _2^64^- 1_, which is due -to selection of the first 8 bytes of keccak256 -as our pseudorandom function. - -|_Supply~tokens~_ -|Is the total number of tokens which are going to be supplied during the project -lifetime and is set to 10^9. - -|Natural threshold -|_Threshold~nat~ = floor(N * Space~tickets~ / (Supply~tokens~ / MINIMUM_STAKE))_ - -In other words, the natural threshold is the value _N_ virtual stakers' tickets -would be expected to fall below if the tokens were optimally staked, and the -tickets' values were evenly distributed in the domain of the pseudorandom -function. - -Usually _Threshold~P~ > Threshold~nat~_ as not all tokens will be staked and the -distribution of stakes will not be optimal. -|=== - -== Setup - -When a staker _S~j~_ is created, the following values are determined: - -- _Stake~j~_: the amount of tokens staked by _S~j~_ and thus locked up until the - staker is destroyed -- _Weight~j~= floor(Stake~j~ / MINIMUM_STAKE)_: the staking weight of _S~j~_; - how many virtual stakers can represent _S~j~_ -- _Address~j~_: the operator address of _S~j~_ - -== Protocol - -A new output _V~i~_ is generated by the random beacon. This triggers the -selection of a new candidate group. - -=== Phase 1: ticket calculation - -_S~j~_ calculates _Ticket~k~ = (value~k~, vs, Address~j~)_ where: - -- the ticket value is calculated as _value~k~ = prf(V~i~, Address~j~, vs)_ -- the virtual staker number _vs_ is within the range _1 <= vs <= Weight~j~_ -- the staker weight _Weight~j~_ is correct for the operator address _Address~j~_ - -=== Phase 2: ticket submission - -==== Phase 2a: initial ticket submission - -Each staker whose _value~k~ < Threshold~nat~_ on one or more _Ticket~k~_ publishes -the ticket/s. - -The operator contract checks the validity of each submitted ticket -by querying the staking contract -for the stake available to the operator in the ticket, -calculating the corresponding staker weight, -checking that the virtual staker index _vs_ is within the allowed bounds, -and verifying that _value~k~_ is correct. -Invalid tickets are rejected. - -Phase 2a ends when _TICKET_INITIAL_TIMEOUT_ is reached. - -==== Phase 2b: reactive ticket submission - -If the number of tickets received in phase 2a is less than _N_, the stakers -whose tickets did not fall below the natural threshold will publish theirs. - -Tickets should ideally be published in order, to reduce the costs of ticket -submission on the stakers. For this, it is recommended that tickets where -_W~k~ = x * Threshold~nat~_ be submitted at time _x * TICKET_INITIAL_TIMEOUT_, -IFF the number of tickets below _W~k~_ is less than _N_. - -When tickets are published in order, the number of unnecessary transactions can -be minimized, which benefits the stakers. Thus it would be in each staker's -interests to follow the regular order. This, however, is only a recommendation -and tickets submitted at different times should not be rejected. - -Phase 2b ends when _TICKET_SUBMISSION_TIMEOUT_ is reached. - -=== Phase 3: threshold determination - -After all potentially eligible tickets have been submitted, -the _N_ tickets with the lowest values for _value~k~_ -will be selected into the group _P_. -The corresponding virtual stakers -will be automatically assigned to form the group -and no further interaction is necessary. -DKG will be performed. - -== Notes and rationale: - -=== Virtual stakers - -Due to the use of virtual stakers, the stakers will be expected to be -represented in _P_ with a probability proportional to their _Weight~j~_; a -staker staking at least _2 * MINIMUM_STAKE_ may also be selected multiple times -for the same group. - -This makes the result representative and ensures that neither blitzpantsing nor -trenchcoating will provide the staker greater profits than they could acquire -otherwise (<>), with the exception that pooling token -amounts below _MINIMUM_STAKE_ and sharing the risk and profits would enable the -utilization of smaller holders' tokens or surplus tokens from regular stakers. -This form of trenchcoating is arguably either neutral or beneficial, and in any -case it does not violate proportionality of rewards. - -=== Interactive protocol - -There would be two simple non-interactive options but neither is able to -satisfy all of the requirements: - -1. One method would be to have each _S~j~_ calculate a pseudorandom value -_Seed~j~_, and then everybody whose _Seed~j~ < Threshold~i~_ is in _P_. -_Threshold~i~_ would be calculated using public information, -eg. by _Threshold~i~ = floor(N * Space~tickets~ / |S|)_ for a 256-bit _Seed~j~_. -However, this means that due to random chance, most of the time _|P| != N_. -This violates <>. -2. Alternatively each staker could present some kind of a hashed value -_Hash~j~_ so that whether _S~j~_ is in _P_ can be determined publicly -by _f(V~i~, Hash~j~, S, N) -> Bool_. -This cannot work, because then anybody could -calculate _f(V~m~, Hash~j~, S, N)_ for a large number of different values _V~m~_ -and see how often _S~j~_ ends up eligible for the candidate group. -Due to <> this necessarily reveals how much _S~j~_ has staked -to an arbitrary degree of precision, violating <>. - -These constraints seem inherent in the problem, and thus an interactive protocol -appears necessary. The aforementioned issues can be avoided by having _S~j~_ -calculate a value _W~j~_, so that _S~j~_ will be in _P_ if _Threshold~P~ > W~j~_. - -[source, python] ----- -all_tickets = [] -for S_j in S: - for vs in [1..Weight_j]: - W_k = prf(V_i, Q_j, vs) - all_tickets.append(Ticket(W_k, proof(W_k)) - -Threshold_P = max(all_tickets.map(fn(t): t.W_k).sort().take(N) ----- - -Assuming once again 256-bit values for _W~k~_ and _Threshold~P~_, -_S~j~_ can predict their expected probability of being in _P_ -by calculating how likely it would be that _Threshold~P~ > W~k~_. -Then _S~j~_ can broadcast their input only if there seems to be -a realistic chance that they could be selected. -If it seems likely that _Threshold~P~ < W~k~_, -_S~j~_ can refrain from broadcasting _W~k~_ and only monitor the situation, -reacting if it seems that few stakers' ticket values are falling under -the estimated threshold. - -== Alternative off-chain protocol - -This protocol was not chosen but is included in the yellowpaper to illustrate -reasoning and what alternatives were considered - -=== Protocol - -Each staker calculates their tickets - -Each staker who has one or more ticket/s that may be eligible for the group -broadcasts the ticket, including proof of its validity - -Other stakers check broadcasted tickets for validity; if an invalid ticket is -broadcast, the ticket is rejected - -After _T~selection~_ has elapsed, stakers following the broadcast channel -select _N_ tickets with the lowest value to form the candidate group - -Each member of the candidate group BLS-signs a message -containing all the tickets of the group and the threshold - -This is the _Group Formation Message_, signed by _[P~1~..P~N~]_ to ensure the -integrity of the group selection process. Because all participants are required -to sign the _Group Formation Message_, the group composition cannot be -manipulated later. - -The members of _P_ perform DKG; at the end of DKG the final message contains: - -- DKG output, similarly BLS signed -- group formation message -- aggregate BLS signature of the above - -On-chain receives DKG conclusion message, and: - -- checks that all stakers in the group formation message are valid -- checks the proofs supplied in the tickets -- checks that all tickets are below the threshold -- checks that the group formation message is signed by everyone in _P_ -and that the DKG output is signed by at least _H_ members of _P_ - -If two or more valid group formations are presented, -the one with the lowest threshold wins - -Any virtual staker is only permitted to sign a group formation message for one -group (any given ticket may only be used for one group); if a ticket is used for -two or more different groups, the staker should be penalized - -Submitting only a group formation message without DKG conclusion is also valid -and signifies that the group was formed, but DKG did not reach quorum (_H_ -participants would not agree on any given result) - -However, if a group formation message is published it may be superseded by a -valid DKG conclusion message for the same group - -If a member of group _P_ with _Threshold~P~_ publishes a valid group formation -message, and a member of group _P'_ with _Threshold~P'~_ publishes a valid group -formation and DKG conclusion message: - -- if _P ∩ P' != {}_, the stakers who signed both group formation messages should - be penalized, but the groups _P_ and _P'_ may still be valid (this is to - prevent an attack where one member of an unfavorable group prevents the group - creation by signing and publishing a different, unrelated group creation message) -- if _Threshold~P~ > Threshold~P'~_, group _P'_ is to be considered the correct - group and the group selection is to be deemed a success. -- if _Threshold~P~ < Threshold~P'~_, group _P_ is to be considered the correct - group and the group selection is to be deemed a failure. -- if _Threshold~P~ = Threshold~P'~_, group _P'_ is to be considered the correct group - - -=== Notes - -The off-chain protocol is much more complex to secure effectively, and a variety -of attacks on the group composition need to be addressed. diff --git a/docs-v1/random-beacon/group-selection/terms.adoc b/docs-v1/random-beacon/group-selection/terms.adoc deleted file mode 100644 index 50bccecdd9..0000000000 --- a/docs-v1/random-beacon/group-selection/terms.adoc +++ /dev/null @@ -1 +0,0 @@ -= Terms used in group selection diff --git a/docs-v1/random-beacon/group_selection.py b/docs-v1/random-beacon/group_selection.py deleted file mode 100644 index c770a789f7..0000000000 --- a/docs-v1/random-beacon/group_selection.py +++ /dev/null @@ -1,242 +0,0 @@ -class GroupSelectionContext: - stakers: Map[StakerID, Staker] - tickets: TicketDataStructure - V_i: BlsSignature - T_init: BlockHeight - - - def T_elapsed(T_amount: BlockHeight) -> bool: - """ - Determine if a given amount of time has elapsed (in blocks) - """ - T_now = getCurrentBlockHeight() - return T_now - T_init >= T_amount - - - def receiveTicket(t: Ticket): - if t in tickets: - ignore(t) - elif cheapCheck(t): - tickets.add(t) - else: - punish(t.sender, INVALID_TICKET_PENALTY) - - - def cheapCheck(t: Ticket) -> bool: - """ - Cheap check to perform on-chain on every ticket reception - """ - t_staker = stakers[t.sender] - - valid_Q_j = t.proof.Q_j == t_staker.address - valid_vs = t_staker.weight() > t.proof.vs >= 1 - - return valid_Q_j && valid_vs - - - def receiveChallenge(challenge: Challenge): - if not challenge.ticket in tickets: - # Challenged ticket not found - # eg. it has already been successfully challenged and removed - ignore(challenge) - - elif costlyCheck(challenge): - punish(challenge.sender, INVALID_CHALLENGE_PENALTY) - - else: - tickets.remove(challenge.ticket) - - punish(challenge.ticket.sender, INVALID_TICKET_PENALTY) - - reward(challenge.sender, TICKET_TATTLETALE_REWARD) - - - def costlyCheck(challenge: Challenge) -> bool: - """ - Costly check to perform on-chain when a ticket is challenged; - assumes the ticket passes cheapCheck() - - Not very costly in current version (only sha3) but enables forward - compatibility with future ZKP implementations - """ - t = challenge.ticket - p = t.proof - - ticket_valid = getTicketValue(V_i, p.Q_j, p.vs) == t.value - return ticket_valid - - - def runGroupSelection() -> List[StakerID]: - """ - Run the entire group selection protocol: - - Start by receiving tickets or challenges, - perform a cheapCheck on each received ticket - - After timeout for tickets is over, wait a bit for challenges - - For each received challenge, perform costlyCheck - and punish the misbehaving party - """ - T_init = getCurrentBlockHeight() - - while not T_elapsed(TICKET_SUBMISSION_TIMEOUT): - t = receive() - - if isTicket(t): - receiveTicket(t) - elif isChallenge(t): - receiveChallenge(t) - else: - ignore(t) - - while not T_elapsed(TICKET_CHALLENGE_TIMEOUT): - c = receive() - - if isChallenge(c): - receiveChallenge(c) - else: - ignore(c) - - # Now we have received the tickets and challenges - # Time to select the group candidate - - # Get the N tickets with the lowest values - bestTickets = tickets.query(N) - # P is the virtual stakers corresponding to those tickets - P = bestTickets.map(sender) - - # Staker S_i may be represented multiple times in P if they have many - # tokens and get lucky. In this case we simply proceed normally, with - # multiple participants P_j, P_k etc. corresponding to the same actual - # staker S_i. - return P - - -class TicketDataStructure: - """ - TicketDataStructure is an abstraction which takes in tickets - and keeps them sorted in order: lowest ticket value first - """ - def add(t: Ticket): - def remove(t: Ticket): - def query(n: int) -> List[Ticket]: - - -class Ticket: - """ - A Ticket contains a pseudorandom value which is used to determine whether - a given virtual staker is in the candidate group P - """ - value: Sha3Digest # corresponds to W_k - proof: TicketProof - sender: StakerID - - -class TicketProof: - """ - A TicketProof is an abstraction for the information necessary to determine - whether a ticket is valid - """ - vs: int - Q_j: Address - - -class Challenge: - """ - A Challenge is a signed claim that a given ticket is invalid - """ - ticket: Ticket - sender: StakerID - - -def getTicketValue( - V_i: BlsSignature, - Q_j: Address, - vs: int -) -> Sha3Digest: - """ - Utility function to clarify how ticket values are determined with sha3 - """ - return sha3(asBytes(V_i) ++ asBytes(Q_j) ++ asBytes(vs)) - - -class Staker: - address: Address - ecdsaPubkey: EcdsaPubkey - blsPubkey: BlsPubkey - stakedTokens: TokenAmount - - - def weight() -> int: - """ - A staker's weight is how many minimum-stake stakers a given actual staker - could form if they were to blitzpants their stake - - By creating a number of virtual stakers corresponding to the weight of each - actual staker, we remove the incentive to blitzpants - """ - return floor(stakedTokens / MINIMUM_STAKE) - - - def tickets(V_i: BlsSignature) -> List[Ticket]: - """ - Generate all the tickets of a given staker, in sorted order - - The leading tickets in the resulting list can be queried for promising ones - """ - virtualStakers = range(1, weight()) - Q_j = s.address - - createdTickets = [] - for vs in virtualStakers: - W_k = getTicketValue(V_i, Q_j, vs) - newTicket = Ticket(W_k, TicketProof(vs, Q_j)) - createdTickets.append(newTicket) - - return createdTickets.sort_ascending(value) - - - def runGroupSelection(): - unpublished = tickets() - tNat = naturalThreshold() - - # Publish all tickets that fall under the natural threshold - while unpublished.first().value < tNat: - promisingTicket = unpublished.pop() - publish(promisingTicket) - - while not T_elapsed(TICKET_INITIAL_TIMEOUT): - wait() - - while not T_elapsed(TICKET_SUBMISSION_TIMEOUT): - t = getLatestSubmission() - - if isTicket(t) and not isValid(t): - c = Challenge(t, self) - publish(c) - - # If it seems like we would have another ticket eligible for P, - # publish the most promising ones. This prevents dumping all tickets - # at once before others have had time to publish theirs, but should - # be decently responsive anyway. - currentBestTickets = getContract().tickets.query(N) - currentBestThreshold = max(currentBestTickets.map(value)) - - bestTicket = unpublished.first() - bestTicketEligible = bestTicket.value < currentBestThreshold - timeToPublish = bestTicket.value * TICKET_INITIAL_TIMEOUT / tNat - - if bestTicketEligible and T_elapsed(timeToPublish): - unpublished.pop() - publish(bestTicket) - - # Group selection done, see if we are in P - P = getContract().tickets.query(N).map(sender) - - if P.contains(self): - runDKG() - else: - obvserveDKG() - - diff --git a/docs-v1/random-beacon/incentives.adoc b/docs-v1/random-beacon/incentives.adoc deleted file mode 100644 index e1547a91bb..0000000000 --- a/docs-v1/random-beacon/incentives.adoc +++ /dev/null @@ -1,394 +0,0 @@ -= Incentives - -When an operator misbehaves attributably, the corresponding stake should be -slashed. Punishments should be appropriate for the severity of the misbehavior -and its impact on the network, and can be between _0_ and _Stake~MIN~_. - -== Rewards and punishments - -All rewards and punishments are incurred by a specific virtual staker. - -STATUS: proposal - -Currency and token rewards are paid to the beneficiary address specified in the stake -delegation transaction. - -Punishments are performed by removing the designated amount of tokens from the -stakes of the _owner_. - -If the operator has enough free stake to cover a minor penalty, the virtual -staker may continue performing operations and the penalty is subtracted from the -free stake, possibly impacting the operator's eligibility for subsequent group -selections. - -If the operator cannot pay a minor penalty from free stake, the virtual staker -is terminated to avoid a stake deficit. When a virtual staker is terminated it -is removed from any groups it is in, rendering it ineligible for further rewards -from participating in those groups, and locking the remaining stake -_Stake~remaining~ = Stake~MIN~ - D_ for _T~UNSTAKE~_, after which -_Stake~remaining~_ is added to the operator's free stake. - -TODO: do we want to lock the stake like this if terminated? - -Major penalties always include termination of the virtual staker, regardless of -the free stake available. A major penalty may be smaller in absolute amount than -a minor penalty (but probably not); the distinction reflects the nature of the -misbehavior. - -=== Group selection - -==== Rewards - -Group selection has no intrinsic rewards. However, presenting a valid challenge -to an invalid ticket should be amply rewarded to preserve the integrity of the -interactive protocol. - -R~TICKET_TATTLETALE~:: - -Token reward for operator that presents a valid challenge to an invalid ticket. -+ -_R~TICKET_TATTLETALE~ < D~INVALID_TICKET~_ -+ -It may be desirable for _R~TICKET_TATTLETALE~_ to include both tokens and -currency. `CostlyCheck` is expected to be expensive to perform in the future, -and submitting a valid ticket challenge should always be profitable. If the -ticket tattletale reward consists of both tokens and currency: -+ -_R~TICKET_TATTLETALE~ = R~TICKET_TATTLETALE_TOKENS~ + R~TICKET_TATTLETALE_CURRENCY~_ + -_R~TICKET_TATTLETALE_TOKENS~ < D~INVALID_TICKET~_ + -_R~TICKET_TATTLETALE_CURRENCY~ >= GasEstimate(CostlyCheck)_ -+ -However, group selection provides no source of such currency, and thus it would -need to be taken from a general pool. It may be prohibitively difficult to -protect such a pool from getting emptied by attackers. -+ -If the tattletale reward consists of only tokens, it would be profitable if -_R~TICKET_TATTLETALE~ * TokenPrice > GasEstimate(CostlyCheck)_. - -==== Punishments - -D~INVALID_TICKET~:: - -Major -+ -Penalty for any operator that presents an invalid ticket. The invalid ticket may -fail either `CheapCheck`, or `CostlyCheck` after being challenged. -+ -The requirements on _R~TICKET_TATTLETALE~_ constrain the value of -_D~INVALID_TICKET~_: -+ -_D~INVALID_TICKET~ > GasEstimate(CostlyCheck) / TokenPrice_ -+ -This is necessary to ensure that the incentives of challenging invalid tickets -are in place. - -D~INVALID_CHALLENGE~:: - -Major -+ -Penalty for operator that presents an invalid challenge, and the accused ticket -passes `CostlyCheck`. Because the gas costs of `CostlyCheck` are incurred by the -accuser, _D~INVALID_CHALLENGE~_ can be set relatively freely without significant -impact on the incentives of the group selection protocol. - -=== DKG - -==== Rewards - -R~DKG_SUBMITTER~:: - -The member submitting the finally accepted result is paid a submission reward. -The distributed key generation has no rewards for non-submitting members. The -prospect of future rewards from signing beacon outputs provides the incentive to -participate in the DKG. - -==== Punishments - -D~DKG_MISSED_SUBMISSION~:: - -Minor -+ -The DKG expects the first member _P~1~_ of the candidate group _P_ to submit -the result. If the finally accepted result is submitted by _P~i~, i > 1_, each -_P~1~ .. P~i-1~_ are penalized by D~DKG_MISSED_SUBMISSION~. - -D~DKG_DQ~:: - -Minor -+ -As the DKG is performed off-chain, only a list of disqualified participants is -produced. Thus all actual misbehavior necessarily has the same penalty. A member -on the list of disqualified members will be penalized by D~DKG_DQ~. -+ -*TODO: minor penalty?* -+ -The penalty is minor despite reflecting potentially severe protocol violations -because the misbehavior was not proven on-chain. A colluding cartel that -controls the created group can forcibly disqualify even well-behaved members. - -=== Signing - -When publishing beacon outputs on-chain, there are two possible outcomes for an -output: - -- if the output fails the BLS signature check, punish the submitter -- if the output passes the check, reward submitter and other members - -==== Variable stakes and rewards - -To incentivize paying more for the beacon outputs, siging rewards and penalties -are adjusted by _RequestMultiplier~i~_ whose value depends on how much has been -paid for _V~i~_. - -_RequestMultiplier~MAX~_ is the highest value _RequestMultiplier_ can take. - -Penalties are limited by the value + -_Stake~REQUEST_BASE~ = Stake~MIN~ / RequestMultiplier~MAX~_ + -so that the highest penalty at the highest request value multiplier is equal to -the maximum penalty of _Stake~MIN~_. - -==== Rewards - -R~submitter~(T), R~group~(T):: - -The submitter and group reward will vary over time, where _T_ is the time it -takes to publish the valid output on-chain (_T' > T_): -+ -_R~submitter~(T) > R~group~(T)_ -+ -The submitter is always rewarded more than the other members. This is partially -to cover the gas fees of submitting the beacon output (expensive BLS -verification), and partially to incentivize submissions. -+ -_R~submitter~(T) <= R~submitter~(T')_ + -_R~group~(T) >= R~group~(T')_ -+ -Over time, the submitter reward grows while the group reward declines. If the -group takes long enough to submit the output, the group reward can go negative. -+ -_R~total~(T) = R~submitter~(T) + (N - 1) * R~group~(T)_ + -_R~total~(T) >= R~total~(T')_ -+ -The total reward for the entire group (submitter + other members) declines over -time. -+ -When _T <= T' <= T~output_expected~_: + -_R~submitter~(T) = R~submitter~(T')_ + -_R~group~(T) = R~group~(T')_ + -_R~total~(T) = R~total~(T')_ -+ -The maximum possible reward is given out when the output is submitted within -_1 <= T <= T~output_expected~_ from the reveal of the value to be signed. Within -this window there is no difference in rewards between different submission -times. -+ -When _T' > T > T~output_expected~_: + -_R~submitter~(T) < R~submitter~(T')_ + -_R~group~(T) > R~group~(T')_ + -_R~total~(T) > R~total~(T')_ -+ -If _T > T~output_expected~_, the total reward is lower, the submitter reward -grows every block, and the group reward declines every block. -+ -The value of _T~output_expected~_ may be set by the output request, or it may be -a global constant. If _T~output_expected~ = 1_ there is no constant-reward -window. -+ -_R~selfish~(T, m) = R~submitter~(T) + (m - 1) * R~group~(T)_ + -_R~selfish~(T, M~nofail~) > R~selfish~(T', M~nofail~)_ -+ -Because of the selfish signing attack, the submitter reward should not grow -faster than a moderate multiple of the group reward declines, to avoid creating -an incentive to delay output publication. -+ -A hard limit for this is when _m = M~nofail~_. This is because it takes _H_ -honest participants to produce an output, and the minimum number of active -participants in a group is _H + M~nofail~_ if _M~nofail~_ members have been lost -in DKG. If an actor controls less than _M~nofail~_ members in a group, there -should be enough other members that the output can be completed without the -adversary's input. This cannot be guaranteed when _m > M~nofail~_, and thus -selfish signing should always be unprofitable in such a case. -+ -_R~group~(T~late~) = D~late_output~(T~late~)_ when _T~late~ > T~MAX_OUTPUT_DELAY~_ -+ -If the group takes particularly long to submit the output, the group reward can -go negative. In this case instead of rewarding the group members in _$CURRENCY_, -their stakes are slashed. - -==== Punishments - -D~INVALID_SIGNATURE~:: - -Major -+ -If an invalid signature is submitted, its submitter is to be penalized by -_D~INVALID_SIGNATURE~ * RequestMultiplier_. -+ -_D~INVALID_SIGNATURE~ <= Stake~REQUEST_BASE~_ -+ -The invalid signature penalty is limited by the base stake. - -D~late_output~(T):: - -Minor -+ -_R~group~(T~late~) = D~late_output~(T~late~)_ when _T~late~ > T~MAX_OUTPUT_DELAY~_ -+ -If the group takes particularly long to submit the output, the group reward can -go negative. In this case instead of rewarding the group members in _$CURRENCY_, -their stakes are slashed. Additionally, the unreliable group is terminated. -+ -_D~late_output~(T) < D~late_output~(T')_ -+ -To ensure an incentive to submit a late output remains, the penalty should grow -over time. -+ -_D~late_output~(T~OUTPUT_FAILURE~) = Stake~REQUEST_BASE~_ -+ -If the output is not submitted within _T~OUTPUT_FAILURE~_, every member in the -group is penalized by _Stake~REQUEST_BASE~ * RequestMultiplier_. - -==== Anchored rewards - -It may be desirable to let members prove that a late submission is not their -fault. A member wishing to anchor their reward would publish the beacon input -signed by their individual private key, which can be verified by providing the -corresponding individual public key and the merkle path to the merkle root of -all individual public keys. - -If the signature share submitted at _T_ is valid, the member _P~j~_ would be -rewarded _R~group~(T) * RequestMultiplier_. _P~j~_ would effectively pay the -price of the BLS verification to gain immunity from late submission penalties. - -If the signature share is invalid, _P~j~_ would be penalized -_D~INVALID_SIGNATURE~ * RequestMultiplier_. - -If a reward has been anchored at _T_ and the full output is submitted at _T'_, -the submitter reward should be adjusted by the anchoring: - -_R~submitter~(T') = (R~submitter~(T) * (1 / N)) + (R~submitter~(T') * (N - 1) / N)_ - -If multiple rewards have been anchored at _T~1~, T~2~..._ the submitter reward -should be correspondingly: - -_R~submitter~(T') = (R~submitter~(T~1~) / N) + (R~submitter~(T~2~) / N) + (R~submitter~(T') * (N - 2) / N)_ - -If the submitter reward is not adjusted, it would be possible to extract more -than the amount available for the rewards. - -Anchoring rewards requires publishing and storing the merkle root of individual -public keys from DKG. - -==== Leftover rewards - -Because the beacon operation rewards decline over time, the maximum total reward -may not be paid out. In this case there will be leftovers. - -_R~max~ = R~total~(T~output_expected~)_ + -_R~leftover~(T) = R~max~ - R~total~(T)_ - -If _R~leftover~(T) > 0_, the surplus needs to be allocated somehow. - -Leftover pool:: - -One possibility is to establish a _leftover pool_ and use the pool to subsidize -later outputs by an amount determined by the currency balance in the pool: - -_Bid'~i~ = Bid~i~ + R~leftover_subsidy~(PoolBalance~i~, Bid~i~)_ + -_PoolBalance~i+1~ = PoolBalance~i~ - R~leftover_subsidy~(PoolBalance~i~, Bid~i~)_ - -Leftover refund:: - -Another possibility is to refund the leftovers to the requester. This could be -desirable as compensation for slowness of output, but if a large number of -customers contributed to the request payment it may be inconvenient to refund -them all proportionally. - -=== General - -Some rewards and punishments don't fit into a specific category. - -==== Individual private key compromise - -If a private key is exposed or used inappropriately, the consequences to the -network could be serious. If the owner of a compromised key is punished for the -failure to secure it adequately, it can improve the incentives and weed out -insecure participants. - -D~KEY_COMPROMISED~:: - -Major punishment -+ -If the individual private key of _P~i~_ is compromised or used to sign an -inappropriate value _v_, _P~i~_ should be given the major punishment of -_D~KEY_COMPROMISED~_. -+ -Compromise of an individual private key can be proven by submitting a message -signed with the key, along with the corresponding public key and its merkle path -to the root of the individual public key merkle tree, published in DKG result. - -R~KEY_COMPROMISE_TATTLETALE~:: - -Reward -+ -An operator who submits proof of an individual private key compromise should be -rewarded by _R~KEY_COMPROMISE_TATTLETALE~_ tokens. -+ -_R~KEY_COMPROMISE_TATTLETALE~ < D~KEY_COMPROMISED~_ - -==== Group private key compromise - -If the private group key of any group is compromised, beacon security can be -violated for outputs assigned to that group. Detection and termination of such -groups should be incentivized. - -D~GROUP_KEY_COMPROMISED~:: - -Minor punishment -+ -If the group private key of _G~i~_ is used to sign an inappropriate value _v_, -every member in _G~i~_ can be punished by _D~GROUP_KEY_COMPROMISED~_. A group -whose key has been compromised must be terminated. -+ -Because signing an invalid value requires contribution from at least _H_ -members, the existence of such a signature proves that the honest majority -assumption has not held. However, because participants disqualified in DKG -phase 9 have their secret information exposed, it is possible for an adversary -controlling _M~nofail~ + 1_ members in the group to create such a signature if -_M~nofail~_ members were disqualified in phase 9. This should be a rare -occurrence but provides a slight control bootstrapping attack for a sufficiently -powerful adversary. - -R~GROUP_KEY_COMPROMISE_TATTLETALE~:: - -Reward -+ -An operator who submits proof of an individual private key compromise should be -rewarded by _R~GROUP_KEY_COMPROMISE_TATTLETALE~_ tokens. -+ -_R~GROUP_KEY_COMPROMISE_TATTLETALE~ << M~nofail~ * D~GROUP_KEY_COMPROMISED~_ -+ -The magnitude of the group key compromise tattletale reward has a significant -impact on the viability of the control bootstrapping attack for deliberately -compromising the group key. - -== Extra notes - -=== Tattletale ratio - -The operator can still transfer tokens by abusing the tattletale mechanisms. -However, the efficiency of this is limited by the -`tattletale_fraction = tattletale_reward / misbehavior_penalty` -ratio of the best available exploit. - -This seems impossible to mitigate because if the operator is paid -`operator_reward = operator_fraction * expected_value_multiplier * total_stake` -and thus the opportunity cost of stealing -`tattletale_fraction * total_stake` -is negative only when -`operator_fraction * expected_value_multiplier > tattletale_fraction`. -However, in this case it becomes profitable to bribe a potential tattletale -simply with the earnings one will get in the future from the tokens that would -be slashed if the tattletale would do their job, and only the presence of a -sufficient number of non-coordinating potential tattletales keeps this from -being an easy way out. diff --git a/docs-v1/random-beacon/index.adoc b/docs-v1/random-beacon/index.adoc deleted file mode 100644 index 9b4bf736ca..0000000000 --- a/docs-v1/random-beacon/index.adoc +++ /dev/null @@ -1,172 +0,0 @@ -:toc: macro -:toclevels: 4 -:yellowpaper: - -= The Keep Random Beacon: An Implementation of a Threshold Relay - -toc::[] - -[abstract] -.Abstract --- -The Keep Network requires a trusted source of randomness for the process of -trustless group election. While the network requires that randomness to function -correctly, the source of randomness is itself broadly applicable. This trusted -source of randomness takes the form of a BLS Threshold Relay. We discuss -implementation of this random beacon, including assumptions and mitigations for -bad actors and poor network connectivity. --- - -== Overview - -The threshold relay described herein is a way of generating verifiable -randomness that is resistant to bad actors both in the relay network and on the -anchoring blockchain, assumed here to be Ethereum. The basic functioning of the -relay (further details are in the section on <>) is: - -* Some number of groups exist in the relay. -* An arbitrary seed value _v~s~_ counts as the first entry in the relay.footnote:[The - importance, from a security perspective, of the seed value goes away almost - immediately in a functioning network.] -* A request _r~i~_ is dispatched to the chain for a new entry. -* The previous entry _v~s~_ is used -to choose a group to produce the response to the request. -* _v~s~_ is signed by at least a subset of the chosen group members, and the - resulting signature is the entry generated in response to the request. It is - published to the anchoring blockchain as the entry _v~i~_. -* The new entry _v~i~_ may trigger the formation of a new group from the set of - all members in the relay. -* A group expires after a certain amount of time. - -The following sections will detail how this basic function is implemented in -practice, including notes on <> that motivated this design, -the <> used to economically incentivize good behavior by -network participants, <> used in the network, and finally the -<> that outline the implementation itself. <> -is also discussed. - -== Prior Work - -Dfinity has described their implementation of a random beacon backed by a -threshold relay in their consensus whitepaper -footnote:[https://dfinity.org/pdf-viewer/library/dfinity-consensus.pdf]. The -relay described in this paper is heavily based on the one devised by the Dfinity -team, with certain adjustments for implementation on an existing blockchain. The -key distinction between the Dfinity implementation and the Keep implementation -is that Keep has to contend with blockchains that do not implement the same -primitives as the in-house Dfinity chain targeted in their paper. Concerns such -as transaction costs and payment for beacon entries are therefore a core part of -the incentive system built around the Keep random beacon. - -As described in the above paper, at the heart of the relay beacon is the -signature scheme described by Dan Boneh, Ben Lynn, and Hovav Shacham in -footnote:[D. Boneh, B. Lynn and H. Shacham, “Short signatures from the Weil -pairing”, Advances in Cryptology – ASIACRYPT 2001, Lecture Notes in Computer -Science, 2248 (2001), 514–532. Full version: Journal of Cryptology, 17 (2004), -297–319.], termed BLS. Three properties of the scheme are of particular use in -this case: BLS signatures can be used in _threshold_ mode, where _k_ of _n_ -participants are sufficient to produce a combined signature; BLS threshold -signatures produce the same final signature irrespective of the participants; -and BLS signatures are typically shorter than those of many other threshold -signature schemes. - -Finally, underpinning the process of generating new groups for BLS threshold -signatures in the system is a distributed key generation algorithm based on work -by Gennaro, Jarecki, Krawczyk, and Rabin footnote:[R. Gennaro, S. Jarecki, H. -Krawczyk, and T. Rabin. Advances in Cryptology — EUROCRYPT ’99: International -Conference on the Theory and Application of Cryptographic Techniques Prague, -Czech Republic, May 2–6, 1999 Proceedings, chapter Secure Distributed Key -Generation for Discrete-Log Based Cryptosystems, pages 295–310. Springer Berlin -Heidelberg, Berlin, Heidelberg, 1999 ; -http://groups.csail.mit.edu/cis/pubs/stasio/vss.ps.gz], as also described in the -Dfinity paper above. The Keep Random Beacon publishes group public keys to the -anchoring blockchain and does member selection on-chain, but key generation -occurs between nodes with only the final result vote occurring on-chain. - -== Incentive Structure - -The system generates verifiable random numbers using threshold signatures. -BLS threshold signatures are deterministic, -so a given signing group can only produce one valid signature -for any given input. -A party that knows the private key of a signing group -can calculate signatures in advance, -and generated entries can be influenced -by preventing the selected group from producing a signature -and thus forcing the beacon to select a different group. - -To incentivize participants, -every member of a group that produces a valid entry is rewarded. -Participants that perform costly but necessary actions -are reimbursed for the costs and further rewarded. - -Each participant is required to _stake_ a number of tokens -that are held as collateral against misbehavior. -Participants staking a greater number of tokens -have a correspondingly greater opportunity to earn rewards. -In the event that a group fails to produce a signature when requested -or its private key is provably abused, -each member of the group is punished by _slashing_ their stake; -taking away some or all of their staked tokens. - -In some cases, -misbehavior is proven with the help of a third party _"tattletale"_ -who notifies the beacon of the misbehavior, -and if necessary, provides the required proof. -If the misbehavior occurred as claimed, -the tattletale is rewarded with a fraction of the slashed tokens. - -== System Details - -The system has two high-level modes of operation, discussed in detail in their -individual sections: - -* Group formation, consisting of group member selection and distributed key - generation. -* Threshold signing, triggered by a beacon request and producing a new entry in - the relay (which in turn also triggers the formation of a new group). signing - also involves selecting the appropriate price for a new relay entry. - -Additionally, the beacon makes money by charging for _beacon requests_. An early -draft of the pricing mechanism is described in its own section. - -=== Group formation - -include::group-selection/index.adoc[leveloffset=+3] - -include::dkg/index.adoc[leveloffset=+3] - -include::signing/index.adoc[leveloffset=+2] - -include::pricing.adoc[leveloffset=+2] - -include::staking/index.adoc[leveloffset=+2] - -include::slashing.adoc[leveloffset=+2] - -== Upgrade management - -The system has been designed to facilitate upgrades -without exposing stakers to vulnerabilities -commonly found in upgradeable smart contracts. -For this purpose, -smart contracts in the system are divided into different categories -based on their purpose and functionality, -and strict security boundaries are maintained in the design. - -Furthermore, the authority to take various actions in the system -has been divided into a number of roles -where each role has a specific purpose and domain. -The roles and their authorizations are designed -to limit the impact of single key compromise. -Severely harmful actions such as stealing participants' stakes -should require the compromise of multiple independent actors -wherever feasible. - -include::contract-structure.adoc[leveloffset=+2] - -include::authorizations.adoc[leveloffset=+2] - -include::upgrades.adoc[leveloffset=+2] - -include::glossary.adoc[] diff --git a/docs-v1/random-beacon/misbehavior.adoc b/docs-v1/random-beacon/misbehavior.adoc deleted file mode 100644 index c3f08a8406..0000000000 --- a/docs-v1/random-beacon/misbehavior.adoc +++ /dev/null @@ -1,332 +0,0 @@ -= Attacks and misbehavior - -== Types of participants - -=== Honest - -A honest actor will always follow the protocol. - -If the return for participating honestly _R~h~_ is below the required rate of -return (eg. cost of capital, operating expenses), a honest participant will -abstain from participating, even if a misbehaving course of action is available -that would yield greater returns. - -The protocol should avoid relying on any participants being honest. - -=== Greedy - -A greedy actor will want to maximize its return. - -A greedy actor is willing to violate protocol and misbehave in arbitrary ways if -doing so has a positive expected value, but will not take action which reduces -their returns. A greedy actor does not care about the impact on other -participants unless they have entered a binding contract to share the profits. - -A greedy participant will misbehave if and only if the return from doing so -_R~m~_ is equal or greater than the return from honest participation _R~h~_. - -The protocol should be designed to be viable if most participants are greedy. It -is also to be expected that some greedy participants will have external -incentives; for example, manipulating a lottery to greatly increase the chance -of winning may be worth taking a punishment for. - -=== Malicious - -A malicious actor will seek to subvert or inflict damage on the network. - -A malicious actor is willing to misbehave even at an immediate cost to itself, -at the pursuit of some ulterior motive in opposition to the intended functioning -of the network. - -==== Adversary power - -The main constraint on the malicious actor is the amount of resources it has -available _res~m~_, especially in relation to the resources of the well-behaved -participants _res~h~_. The ratio _power~m~ = res~m~ / res~h~_ determines the -_adversary power_ of the malicious actor. Because money can be used to buy -various forms of influence, it does not seem sensible to assume a malicious -actor would be limited to any particular type of influence (a fraction of -stakers only, with no miners, or a fraction of miners but no stakers). Instead, -a safer assumption is that the adversary can control a fraction of each specific -type of participant, determined by _power~m~ / (1 + power~m~)_. For example, -with _power~m~ = 0.5_ the adversary can control 33% of all miners, stakers, etc. - -The protocol should be resistant to malicious participants, especially those of -low adversary power. Any protocol relying on a honest majority is vulnerable to -adversaries of _power~m~ >= 1_ (a 51% attack). - -==== Control bootstrapping - -_Control bootstrapping_ is the class of attacks a malicious actor can use to -increase its share of control over the network, and thus one of the most -significant. Preventing and limiting control bootstrapping attacks is extremely -important for protecting against malicious participants. - -If an adversary with _power~m~_ power can cause _D~h~_ damage to the -well-behaved participants at a cost of _D~m~_ to itself, so that -_D~m~ / D~h~ < power~m~_, the attack would increase the attacker's adversary -power relative to the well-behaved participants: -_power'~m~ = (res~m~ - D~m~) / (res~h~ - D~h~) > power~m~_. -The effectiveness of attack _A_ can be expressed as its _damage multiplier_: -_mult~A~ = D~h~ / D~m~_. Attack _A_ is useful to adversary _m_ if -_mult~A~ * power~m~ > 1_. - -Such attacks can be used to "smoke out" honest and greedy participants by -rendering staking unprofitable without the external budget provided by the -malicious actor's ulterior motives. If an attack can be iterated enough times, -the well-behaved participants would run out of resources before the adversary. -Thus over time the adversary would be able to bootstrap a smaller degree of -control over the network into a larger one. - -== Participant status - -=== Well-behaved - -A well-behaved participant is correctly following the protocol and sending the -expected messages at expected times. - -=== Inactive - -An inactive participant is one that has stopped sending the messages expected by -the protocol, but is otherwise well-behaved. An inactive participant does not -send invalid messages or otherwise actively undermine the protocol execution. - -A participant can be rendered inactive due to internal, such as node -misconfiguration or downtime, or external factors, such as network problems or -DoS attacks. - -Transient inactivity is expected to be the most common form of protocol -violation. Care should be taken not to punish such cases excessively harshly, -especially because, unlike other forms of misbehavior, an attacker can force -a participant to be inactive. - -=== Misbehaving - -A misbehaving participant has engaged in active protocol violations by sending -messages (broadcasting to other nodes, or publishing transactions on-chain) that -are invalid in either format or content. - -Wherever feasible, misbehavior should be attributable and punishable. A third -party cannot force a non-compromised participant to misbehave attributably, and -thus any such misbehavior can be blamed on the participant who signed the bad -message. - -==== Compromised participants - -An otherwise well-behaved participant whose private key has leaked to a third -party can be made to misbehave by using the compromised key. This is impossible -to distinguish from straightforward misbehavior, as an attacker could just as -well set up a scheme that makes them appear legitimately compromised, but such -distinction is neither necessary nor desirable. Penalizing the stakers whose -operators have been compromised acts as an incentive to protect against such -compromise, and helps remove vulnerable operators from the network. - -== Types of misbehavior - -=== Incorrect signature share - -Instead of broadcasting _Sig~m~_, _P~m~_ broadcasts a different, incorrect -value _Sig'~m~_ to other members of the signing group. - -==== Attributability - -*Full* - -==== Viability - -*Low* - -Signature shares can be validated against the individual public key known from -DKG, and invalid shares ignored. - -==== Mitigation - -*None* (initially) to *full* (potentially) - -Relies on DKG individual public key attributability - -Relies on tracking beacon outputs signed by each group - -Signing an incorrect value can be proven with the signature that doesn't -correspond to any previous beacon input, the member's public key, and its merkle -path to the DKG merkle root. - - -=== Selfish signing - greedy - -Instead of revealing their signature share the operator waits to receive shares -from others, trying to delay others' signature reconstruction and to gain -the submitter reward. - -==== Attributability - -*Low* - -A signature submission by a node that hasn't broadcast its own signature share -is evidence of selfish signing, but this can be circumvented by having the -submitter node broadcast its share normally while the adversary's other nodes -withhold theirs. - -As the signature is reconstructed from shares it is not possible to tell which -nodes provided the shares for a given submission, and if the adversary -participates normally on one node its other nodes are indistinguishable from -offline nodes. - -==== Viability - -*Moderate* to *high* - -The relationship of the derivative of the submitter's reward (grows over time) -vs the group rewards (declines over time) influences the viability of this -attack. - -If the attack is successful at _T~submit~_, the adversary benefits by -_R~submitter~(T~submit~) - R~group~(T~submit~)_. -Because selfish signing results in the signature being submitted later than -it otherwise would at _T'~submit~_, the full viability of the greedy variant for -an adversary with _m_ nodes is governed by -__R~submitter~(T~submit~) + (m - 1) * R~group~(T~submit~) - m * R~group~(T'~submit~)_. - -If _R~submitter~(T) > R~group~(T')_ for all _T, T'_, successful selfish signing -is always profitable when _m = 1_ and will remain profitable for larger _m_ if -_T_ and _T'_ are close enough. - -If the selfish signing is unsuccessful, the operator will lose out on -_m * (R~group~(T'~submit~) - R~group~(T~submit~))_ -which is small if _T_ is close to _T'_. - -Additionally, delaying the submission deliberately can be profitable when -_dR~submitter~ / dT + (m - 1) * dR~group~ / dT > 0_ (always for _m = 1_). - -If the system is modeled as a theoretical broadcast channel and the adversary -as rushing, the attack will always succeed. In a real system the probability of -success increases with _m_; a true linchpin adversary with -_m + n~inactive~ + n~disqualified~ > M_ -will always succeed at selfish signing. Variability in message transmission -time reduces success chances as a different member may have their signature -reconstructed by the time _P~m~_ has received _H - m_ shares. Miner censorship -and DoS attacks on the other participants can improve chances of success. - -==== Mitigation - -*None* (initially) to *high to full* (potentially) - -A fair exchange protocol or similar could be used to force operators to share -their signature shares such that any individual node only learns enough shares -to reconstruct the signature if all participants learn enough shares. In the -greedy form of the attack the adversary only cares about maximizing its own -profit, and thus it will prefer to reveal its signature share to others if not -doing so would result in an indefinite stalemate. - -The cost of such a fair exchange as opposed to simple broadcast is lower group -rewards for all participants due to slower submission of results, but -participating in a suitable fair exchange protocol would be a dominant strategy. -TODO: Whether fair exchange protocols that are resistant to a rushing adversary -without a trusted third party are possible needs further investigation. - - -=== Selfish signing - malicious - -A linchpin operator who can block others from completing the threshold -signature selfishly submits the signature at such time _T~submit~_ that their -own net reward -_R~submitter~(T~submit~) + (m - 1) * R~group~(T~submit~)_ -is positive while everyone else suffers a late submission penalty: -_R~group~(T~submit~) < 0_. - -This attack can be used to bootstrap dominance in the network. - -==== Attributability - -*Low* - -A signature submission by a node that hasn't broadcast its own signature share -is evidence of selfish signing, but this can be circumvented by having the -submitter node broadcast its share normally while the adversary's other nodes -withhold theirs. - -As the signature is reconstructed from shares it is not possible to tell which -nodes provided the shares for a given submission, and if the linchpin operator -participates normally on one node its other nodes are indistinguishable from -offline nodes. - -==== Viability - -*High* with sufficient adversary power; -can be augmented by DoS capabilities - -The relationship of the derivative of the submitter's reward (grows over time) -vs the group rewards (declines over time) influences the viability of this -attack: an adversary with _m_ nodes can benefit absolutely when -_dR~submitter~ / dT + (m - 1) * dR~group~ / dT > 0_ -; an adversary with 1 node will always benefit but is highly unlikely to become -linchpin, while an adversary with a large number of controlled nodes is less -likely to benefit but more likely to have linchpin status. - -In relative terms this attack is always profitable, and regardless of _m_ there -always exists a _T~submit~_ such that -_R~group~(T~submit~) < 0_ -but -_R~submitter~(T~submit~) + (m - 1) * R~group~(T~submit~) > 0_ -and thus a sufficiently powerful and motivated adversary can use this attack to -bleed out honest participants - -==== Mitigation - -*None* (initially) to *limited* (potentially) - -A malicious adversary may be willing to pay the opportunity costs of this attack -and thus mitigations are more difficult to come by than with a greedy adversary. - -A fair exchange protocol does not work as well against a true linchpin -adversary, as the adversary could still behave extortionately and deny everybody -the beacon rewards unless it is allowed to become the submitter. - -In such a case the honest nodes could attempt to extort in return, but due to -_m < h_ the marginal damage inflicted on the honest participants always exceeds -the damage on the malicious party in the case of an indefinite stalemate. - -Additionally, identifying the presence of such an adversary is unlikely to be -possible except via circumstantial evidence. - - -=== Private key reveal - -The opposite of selfish signing; the misbehaving staker reveals their individual -private key for the group's threshold signature with the intent to increase -their reward as a non-submitter by letting other stakers calculate their -signature share locally, and to let the staker be offline. - -==== Attributability - -*Full* - -The corresponding public key is known by all members in the same group. - -==== Viability - -*Low*, requires extremely specific conditions to be profitable - -If the cost of broadcast is high, -the cost of operating a well-functioning node high, -the reduction in group member rewards by increased time _dR~group~ / dT_ steep, -the number of nodes _m_ controlled by _P~m~_ high, -the probability of _P~m~_ otherwise getting submitter position low, -the difference in submitter and group rewards _R~submitter~(T) - R~group~(T)_ low, -the marginal improvement in submission time _T~submit~ - T'~submit~_ high, -and the (probability of being caught) times the (impact on token price) low, -it can be profitable to reveal one's individual signing key to other stakers so -that _Sig~m~_ can be calculated locally without need for _P~m~_'s participation. - -==== Mitigation - -*None* (initially) to *full* (potentially) - -Relies on DKG individual public key attributability - -Any member in the group can prove this happened by publishing a tattletale -message signed by the private key, containing the corresponding public key and -its merkle path generated from the DKG results. On-chain would then verify the -signature, and use the merkle path of the public key to verify that it belongs -to the accused group member. If a valid accusation is published, the accuser -would be rewarded and the misbehaving staker penalized. diff --git a/docs-v1/random-beacon/pricing.adoc b/docs-v1/random-beacon/pricing.adoc deleted file mode 100644 index 253be311bb..0000000000 --- a/docs-v1/random-beacon/pricing.adoc +++ /dev/null @@ -1,341 +0,0 @@ -:toc: macro - -= Pricing - -== Background - -The beacon needs to capture enough value to make it self-sufficient. -It uses a simple method for pricing beacon entries -that doesn't present easy exploitation opportunities. -The pricing method avoids -the known downfalls of previously considered, more complex, schemes, -such as price discrimination being defeated by callback pooling. - -== Implementation - -=== Making requests - -A request begins with the query -`entry_fee_estimate = estimate_fee(callback_gas_amount)` -, which provides the customer with an estimated fee to use in the request. -The fee estimate is only valid for the transaction it is called in, -so the customer must make the request immediately after obtaining the estimate. -Insufficient payment will lead to the request being rejected -and the transaction reverted. - -To make a request after determining the applicable fee -the customer must call the request method on the beacon, -transferring enough currency to cover the fee: -`request_entry.value(entry_fee_estimate)()`. - -If the customer wishes to receive the generated random number in a callback, -they should also specify the _callback address_, -_callback function_, and _callback gas amount_: -`request_entry.value(entry_fee_estimate)(callback_address, callback_function, callback_gas)`. - -No new requests should be made -while the beacon is already processing another request. -Requests made while the beacon is busy will be rejected -and the transaction reverted. - -=== Receiving a request - -A request sent to a non-busy beacon is checked for -_request fee_ >= _entry fee estimate_ + _callback gas amount_ from the request. -If the beacon is already serving an earlier request, -it rejects any new requests and refunds the fee. - -A sufficiently funded request triggers the beacon -to select the new signing group. -The selected group is tasked with producing the new entry. - -The request is then set as the _pending request_ -with the following information: - -- the _requester address_ - -- the _callback address_, _callback function_, -and _callback gas amount_, if applicable - -- the _assigned signing group_{blank}footnote:[This is needed -if changes to the active groups can be made -while waiting for an entry. -] - -- the _submission delay base time_ which equals -the number of the block the request was received in, -plus 1{blank}footnote:[The way of calculating rewards -is inevitably prone to off-by-one errors _somewhere_ -and doing the incrementing at request time seems the simplest. -] - -- the _request fee_ paid - -=== Serving a request - -==== Receiving submissions - -A valid entry created by a signing group is submitted by a -member of the group called the _submitter_, -before the _Submission deadline_. -Submissions that fail verification are ignored. -Repeat submissions for a request that has already been served -are dropped immediately to minimize gas expenditure. - -If no valid entry has been received by the _submission deadline_ -a submission timeout can be called by anyone, as a result of which: - -- the failing group is terminated and its members slashed - -- a new signing group is assigned from the remaining active groups - -- the submission delay calculation is reset -by setting the _submission delay base time_ -to the previous _submission deadline_. - -When a valid entry submission is received on-chain: - -- it is emitted in an event - -- the requester's callback is called if applicable - -- and fees, rewards and refunds are paid out - -==== Callback processing - -A callback is called using the callback gas amount as the maximum gas. -If the callback gas amount is insufficient, -callback execution is skipped -and the rest of the relay entry submission code is processed as usual. - -_callback expenditure_ is calculated as, -gas spent on call * minimum(gas price ceiling, actual gas price during transaction). - -The minimum of the gas price is included -to protect the beacon and requester against malicious miner-submitters. - -Malicious miner-submitter attacks: - -- a miner-submitter can steal the surplus pool subsidy -by placing an arbitrary gas price on the transaction -that is higher than quoted. -This will cause the requester refund to go negative. -If the negative requester refund is added to the 1% surplus pool subsidy -it can permit the miner-submitter to steal the subsidy. - -- a miner-submitter can steal the requesters refund -by setting the gas price to the provided maximum. -The requester is billed for the entire gas budget -even if they really only spent a small fraction of it. - -A callback execution that uses more gas than specified in the request -will run out of gas. -A callback execution can cost more than was quoted and paid for -only when the gas cost of the transaction exceeds the gas price ceiling. -The submitter is intended to take the hit -for submitting with a gas price that exceeds the gas price ceiling. - -=== Requester refund - -_requester refund = actual entry price - requester fee + 1% of request subsidy pool_ - -_actual entry price = callback expenditure + entry base price_ - -_entry base price = estimated gas price + profit margin + DKG contribution amortized over multiple entries + entry verification fee_ - -_Group & Submitter reward = F (submission delay, submission delay base time)_ - -If the sum of rewards paid out -is < _profit margin + entry verification fee_, -the difference is added to the _request subsidy pool_. - -The _DKG contribution_ is added to the _DKG fee pool_, -and the state of the pool is checked. - -If the amount in the DKG fee pool equals or exceeds the _DKG cost estimate_, -group creation and a new DKG may be triggered. - -=== Rewards - -A _base reward_ for each member of a signing group that produces an entry -is specified in the system constants in the service contract and: - -_profit margin = base reward * group size_ - -The exact rewards paid out to operators are based on the base reward -but vary according to _submission delay_ and submitter position. - -To incentivize customers to request entries, -any amount in excess of the _profit margin_ -is added to the beacons _request subsidy pool_ - -==== Submitter reward -_Submitter reward = F (submission delay, submission delay base time)_ - -If the sum of rewards paid out -is < _profit margin + entry verification fee_, -the difference is added to the _request subsidy pool_. - -==== Group reward - -The group reward is paid to every member of the signing group, -including the submitter, upon submission of a valid entry. - -The group reward equals the _base reward_ -multiplied by a _delay factor_ -equaling the fraction of time left by the submission deadline, squared: -_group reward = base reward * delay factor_; -_delay factor = (T~remaining~ / (T~deadline~ - T~begin~))^2^_; -_T~remaining~ = T~deadline~ - T~received~_. - -The delay factor is counted -from 1 in the first block a submission could be published in, -to 0 in the deadline block which doesn't accept any more submissions. - -For example, assume the maximum time to submit is 20 blocks, -the off-chain entry generation protocol takes 5 blocks -and a request is made on block 1000. - -Block 1005 is the earliest block the submission could be published in: -if published in this block the delay factor is 1. -Block 1025 is the deadline block: -no submissions are accepted and the delay factor is 0. - -If the entry is submitted in block 1009, -the delay factor is: -``` -((1025 - 1009) / (1025 - 1005))^2 = 0.8^2 = 0.64 -``` -Thus the _group reward = base reward * 0.64_, -with the difference being the _delay penalty = base reward * (1 - 0.64)_. - -If the submission deadline is reached and the delay factor reaches 0, -the entry submission fails and all group members are penalized. - -==== Submitter reward - -In addition to the _group reward_, -the submitter is reimbursed for gas fees -and receives an extra reward. - -The _submitter reward_ consists of: -- _callback expenditure_ to cover the exact cost of the callback - -- the _entry verification fee_ to cover the cost of verifying the submission - -- 5% of the _delay penalties_ of the entire group - -Unlike the _callback allowance_, -the entire _entry verification fee_ is paid to the submitter -regardless of their gas expenditure. -The submitter is free to spend less or more, -keeping the surplus or paying the difference. -This is to incentivize optimizing gas fees. - -To incentivize a race for the submitter position, -the submitter receives: - - _delay penalty * group size * 0.05_ as an extra reward - -With realistic group sizes this is significant, -but not high enough to render certain attacks profitable. -If the group size is 100 and the delay factor is 0.64, -the submitter receives an extra reward of: - -_base reward * 0.36 * 100 * 0.05 = base reward * 1.8_ - -In this scenario the full submitter reward would be: - -_base reward * (1.8 + 0.64) + callback expenditure + entry verification fee_ - -==== DKG submitter reimbursement -How is the DKG submitter compensated? - -Getting to participate in a formed group is already valuable so there is no -additional reward for a DKG result submitter. The only thing necessary is a gas -cost reimbursement for the submitter. - -After the DKG result is submitted: - -_DKG result submission expenditure = minimum(gas price ceiling, actual gas price during transaction) * gas spent on call_ - -The entire DKG result submission expenditure is returned to the submitter -from the _DKG fee pool_ of the operator contract. - -The minimum of the gas price protects the beacon against malicious -miner-submitters. If the submitter is also a miner, they can place any -arbitrary gas price on the transaction. Without taking the minimum, -miner-submitter would be able to steal from _DKG fee pool_ of the operator -contract. - -Any surplus between the _DKG fee pool_ of the operator contract and -the actual cost of DKG result submission is returned back to the service -contract. In the case when the entire DKG fails, the unspent fee will be -transferred back to the service contract upon the next DKG triggered by the -service contract. - -The on-chain DKG result submission code needs to have all deterministic -and time-bounded run paths that are independent of miner-controlled inputs. -If the miner-submitter pays the gas price as set in the gas price ceiling, but -tricks the contract into consuming twice the gas as normal, they will be able -to get twice the reimbursement as well. - -=== Cost estimates - -==== Gas price ceiling - -A gas price ceiling is required -to estimate the gas cost components. - -The critical feature of the gas price ceiling is -that the ceiling price -should be sufficient for getting beacon entries processed -within the deadline under all circumstances. - -If actual gas prices rise to a level -where gas price ceiling is insufficient -for getting a transaction to be mined, -and stays there for the duration of the entry submission window, -the basic profit margin for the operators cannot be guaranteed. - -However, this does not imply that high gas prices -would render the beacon inoperable. -The submitter's extra reward incentivizes submitting -even when the entry verification fee cannot cover the gas costs. -In the extreme, -avoiding the severe penalty for failure to produce an entry -will incentivize group members to pay the gas prices -up to the (theoretical) limit -where gas for the entry submission transaction -costs as much as the KEEP tokens at stake. - -==== DKG cost estimate - -The gas required for DKG should be calculated. -DKG gas cost should include only DKG result submission. -Ticket submission costs are covered -by the expected return from getting into a signing group. -Multiply DKG gas by gas price ceiling to get DKG cost estimate. -Use a DKG frequency divider _d_ to set the group creation rate; -once every _d_ entries on average. -Divide DKG cost estimate by _d_ to get DKG contribution for each entry. - -The maximum DKG gas cost should be hardcoded in the operator contract. -The service contract takes the highest applicable gas cost -from all operator contracts being used -and multiplies it by the gas price ceiling. - -As long as the gas price ceiling is sufficient -to cover the immediate rise in gas fees during DKG execution -the beacon is capable of generating new groups without requiring -DKG result submitter to take a hit for submitting the result with -a higher gas price. - -==== Entry verification fee - -Calculate gas required for verifying entry and associated support operations. -The maximum entry verification gas cost -are hardcoded in the operator contract. -The service contract takes the highest applicable gas cost -from all operator contracts being used -and multiplies it by the gas price ceiling to get entry verification fee. diff --git a/docs-v1/random-beacon/signing/index.adoc b/docs-v1/random-beacon/signing/index.adoc deleted file mode 100644 index 6d44605197..0000000000 --- a/docs-v1/random-beacon/signing/index.adoc +++ /dev/null @@ -1,114 +0,0 @@ -= Random Beacon Signing - -== Terminology - -`P1`:: The generator point for the BLS elliptic curve - -`X_k`:: The group private key of `Group_k` - -`Y_k`:: The group public key: `Y_k = P1 * X_k` - -`Entry_e`:: The entry matching the entry identifier `e` - -`Input_e`:: The input for generating the new entry: -`Entry_e = Input_e * X` - -`x_i`:: The individual private key of `P_i` - -`y_i`:: The individual public key of `P_i`: `y_i = P1 * x_i` - -`Share_i`:: The signature share by `P_i`: `Share_i = Input_e * x_i` - -`N`:: The number of members in a group - -`H`:: The number of members required for a honest majority - -== Signing group selection - -When a valid request has been received, -the beacon begins the relay entry generation. - -The current block is recorded as the start block of the entry generation: - -`currentRequestStartBlock = block.number` - -The previous entry is hashed to produce the signing group selection seed. - -`seed = keccak256(previousEntry)` - -The signing group is selected by taking the value of the seed -modulo the number of currently active groups, -and selecting the corresponding active group: - -`selectedGroup = seed % numberOfGroups()` - -== Signature generation - -The selected group now has `relayEntryTimeout` blocks to submit the -signature to `previousEntry`. - -=== Generating signature shares - -Each member `P_i` in `selectedGroup` calculates -their signature share: -`Share_i = previousEntry * x_i`. - -The generated shares are broadcast to the other members. -The broadcast message contains -the `Share_i` and the member index `i` of the sender `P_i`. - -`Message = (Share_i, i)` - -=== Verifying signature shares - -When `P_i` receives a signature share `Share_j` broadcast by `P_j`, -the share can be verified by `blsVerify(Share_j, y_j, previousEntry)`. -If `Share_j` is valid, -`P_i` can use it for reconstructing the threshold signature. -If `Share_j` is invalid, `P_i` must not use it for reconstructing the entry. - -=== Reconstructing the signature - -Once `P_i` has received at least `blsThreshold` valid shares, -the entry can be reconstructed using Lagrange interpolation. - ----- -shares = validMessages.map(share) - -indices = validMessages.map(index) - -newEntry = lagrangeInterpolate(0, indices, shares) ----- - -== Output submission - -Member _P~submitter~_ of _Group~i~_ submits -`newEntry = blsSign(previousEntry, X_i)` - -The beacon verifies that the submitted entry -is a valid signature of the previous entry -for the selected group's public key: - -`blsVerify(newEntry, previousEntry, Y_i)` - -If the submitted entry is valid, -it is accepted as the current beacon entry _Entry~i~ = newEntry_. -Reward _P~submitter~_ and other members of _Group~i~_ -according to the reward formula. - -If the submitted entry is invalid, it is rejected. - -== Entry timeout - -If a valid output is not submitted before block -`timeoutBlock = currentRequestStartBlock + relayEntryTimeout + 1`, -the entry generation for the selected group times out. -From `timeoutBlock` onwards, -no submissions by _Group~i~_ are accepted, -and anyone can report the timeout by calling `reportRelayEntryTimeout()`. - -When the beacon receives a valid timeout report -the previously selected group is terminated, -with each member penalized for their (lack of) contribution to the failure. -The beacon returns to the signing group selection -with the failed group being removed from the group pool. diff --git a/docs-v1/random-beacon/signing/sign.py b/docs-v1/random-beacon/signing/sign.py deleted file mode 100644 index c39c585fa3..0000000000 --- a/docs-v1/random-beacon/signing/sign.py +++ /dev/null @@ -1,72 +0,0 @@ -class Request(NamedTuple): - seedCommitment: Commitment[SeedValue] - requesterPubkey: EcdsaPubkey - stakeMultiplier: Float - placedAt: Blockheight - openTimeout: Blockheight - previousOutput: BlsSignature - -def openCommitment(signingId, seed_i): - request_i = Requests[signingId] # abort if no such request - senderPubkey = getSenderPubkey() - T_open = getCurrentBlockheight() - - # ignore commitment openings that arrive too late - if T_open > request_i.openTimeout: - abort() - - # ignore commitment openings by parties other than original requester - if not request_i.requesterPubkey == senderPubkey: - abort() - - # ignore invalid commitment openings - if not request_i.seedCommitment == sha3(seed_i, senderPubkey): - abort() - - Block_kPlus1 = getBlockByHeight(request_i.placedAt + 1) - rseed_i = Block_kPlus1.blockhash - - Group_i = select(AllGroups, rseed_i) - v_iMinus1 = request_i.previousOutput - beaconInput = sha3(seed_i, rseed_i, v_iMinus1) - - outputWaiting = OpenOutput( - startedAt = T_open, - signingGroup = Group_i, - signingInput = beaconInput - ) - - OutputInProgress[signingId] = outputWaiting - - -def receiveOutput(signingId, outputSignature): - outputWaiting = OutputInProgress[signingId] # abort if not found - request_i = Requests[signingId] - - pubkey_Group_i = outputWaiting.signingGroup.groupPubkey - input_i = outputWaiting.signingInput - - submitter = getSenderPubkey() - - signatureValid = blsVerify( - outputSignature, - input_i, - pubkey_Group_i - ) - - if signatureValid: - T_output = getCurrentBlockHeight() - outputWaiting.startedAt - - rewardGroup( - submitter, - group_i, - T_output, - request_i.stakeMultiplier - ) - - else: - punish( - submitter, - INVALID_SIGNATURE_PENALTY * request_i.stakeMultiplier - ) - diff --git a/docs-v1/random-beacon/signing/terms.adoc b/docs-v1/random-beacon/signing/terms.adoc deleted file mode 100644 index bf5700e91b..0000000000 --- a/docs-v1/random-beacon/signing/terms.adoc +++ /dev/null @@ -1 +0,0 @@ -= Terms used in beacon output generation diff --git a/docs-v1/random-beacon/slashing.adoc b/docs-v1/random-beacon/slashing.adoc deleted file mode 100644 index ca0e08000f..0000000000 --- a/docs-v1/random-beacon/slashing.adoc +++ /dev/null @@ -1,206 +0,0 @@ -:toc: macro -:toclevels: 4 - -= Misbehavior and punishments - -ifndef::yellowpaper[toc::[]] - -To incentivize correct behavior in the Keep network, -misbehaving participants will be punished. -In some situations, -proving misbehavior requires cooperation from another participant, -a _tattletale_. -This coordination is incentivized by rewarding the _tattletale_ -by granting them a fraction of the tokens -taken from the misbehaving participant. - -== Authorization - -_Operator contracts_ are authorized to impose penalties -by stakers' _authorizers_. -All stakers using the same _authorizer_ -share the set of authorized operator contracts. -Once given, this authorization cannot be revoked by the authorizer. - -When an operator wishes to join a signing group -the operator contract creating the group -must be authorized by the operator's authorizer. -Authorization is checked when an operator submits a ticket for validation. -The operator contract queries the staking contract -for the amount of stake available for it. -If the operator contract is not authorized -or the operator is otherwise ineligible for work selection, -the staking contract will return that the operator has no available stake, -leading to any submitted tickets being rejected. - -== Penalties - -When an operator's misbehavior is proven on-chain -the operator contract calls the staking contract to punish the operator, -specifying the type and magnitude of the punishment. -The staking contract checks -that the operator contract is authorized to punish the operator, -and if true, applies the penalty according to its own rules. - -A penalty can be applied to one or more operators simultaneously. -Each affected operator is penalized in the same way by the same amount. -If the same address is listed multiple times -among the operators to be punished, -the punishment will be applied multiple times. - -=== Pure slashing - -When misbehavior is detected without third-party input, -a _pure slashing_ penalty is applied. -Pure slashing means that the staking contract -subtracts the applicable penalty from the operator's stake -and burns tokens equal to the penalty amount. -If the operator doesn't have enough stake for the punishment -(e.g. because it has been punished earlier), -the punishment is equal to the remaining stake. - -=== Seizing - -When a tattletale proves another operator's misbehavior, -a fraction of the penalty amount is _seized_ and transferred to the tattletale, -while the rest is burned. - -If the full amount is transferred to the tattletale, -it can be exploited to transfer staked tokens -without the normal constraints. -To reduce the effectiveness of this "tattletale transfer", -the seized amount is limited to a maximum of 5% of the entire penalty. -The tattletale reward can be set to any value -between 0 and the maximum of 5% of the penalty. - -To apply a seizing penalty, -the operator contract includes the tattletale operator's address in the call. -The staking contract subtracts the applicable penalty from the operator's stake -and transfers the reward to the tattletale's _beneficiary_ address. -The remainder is burned. - -=== Penalty amounts - -In later versions, -penalties for misbehavior can be adjusted -to match the severity of the misbehavior. -However, initially the penalty for misbehaving in the random beacon -will equal the minimum stake required to join a signing group. - -== Interfaces - -=== Staking contract: slashing - -`slash(tokens amount, address[] misbehavers)`:: - -Slash each operator in the list `misbehavers` -by the specified amount -(or their remaining stake, whichever is lower). -+ -For each `misbehaver` in `misbehavers`, -perform the following: -+ -. Check that the caller is authorized to slash the operator: -`isAuthorized(msg.sender, misbehaver.authorizer) == true`. -. Determine the applicable punishment for the operator: -`thisPenalty = min(amount, misbehaver.stake)`. -. Subtract the punishment from the operator's stake -and add it to the total to be burned: -`misbehaver.stake -= thisPenalty; totalPenalty += thisPenalty`. -+ -Finally, burn an amount of tokens equal to the slashed total: -`tokenContract.burn(totalPenalty)`. - -`seize(tokens amount, float rewardMultiplier, address tattletale, address[] misbehavers)`:: - -Punish each operator in the list `misbehavers` -by the specified amount or their remaining stake. -Reward the `tattletale` by an amount between 0 and the maximum reward, -determined by the `rewardMultiplier` argument: -if `rewardMultiplier` is greater than `0` and at most `1`, -multiply the highest allowed tattletale reward by `rewardMultiplier`. -Otherwise reject the call for an invalid reward multiplier. -+ -For each `misbehaver` in `misbehavers`, -calculate and apply the appropriate penalty -and track the total as in `slash()`. -+ -Finally, determine the tattletale reward: -`reward = totalPenalty * 0.05 * rewardMultiplier`. -Transfer the reward to the tattletale's _Beneficiary_ -and burn the rest of the penalty: -`tokenContract.burn(totalPenalty - reward)`. - -=== Staking contract: authorizations - -`authorize(address op_contract)`:: - -Authorize `op_contract`. -Operators using `msg.sender` as their authorizer -may now join operations on `op_contract` -and `op_contract` may slash their stakes. - -`isAuthorized(address op_contract, address authorizer) -> bool`:: - -Check if the authorizer `authorizer` has authorized `op_contract` -to apply punishments on operators using `authorizer` as their authorizer. - -`eligibleStake(address operator) -> uint`:: - -Return the number of staked tokens available for the calling contract. -Includes an authorization check `isAuthorized(msg.sender, operator.authorizer)` -and other checks on the operator's eligibility for work selection. - -=== Token contract - -`burn(amount sum)`:: - -Any address that holds tokens can call `burn(amount sum)` -to burn `sum` tokens, limited by tokens held by the address. - -== Punishable misbehavior - -=== Failure to sign an entry - -If a signing group is tasked with producing a beacon entry, -but fails to submit a valid entry within the allotted deadline, -each member in the group is punished by _seizing_ -and the group itself will be terminated. - -The punishment is triggered by calling `reportRelayEntryTimeout()` -once the deadline has been reached. -The submitter of the trigger transaction will be treated as the _tattletale_, -but the tattletale reward will be limited -to `min(1, 20 / group_size)` of the maximum, -or effectively the minimum stake of a single member. -This is to prevent actors in a lynchpin position -from profitably stealing other stakers' funds. - -=== Unauthorized use of group signing key - -If the group signing key of a signing group has been leaked, -it can be proven by using the key to sign the address of the group -and calling `reportUnauthorizedSigning()`. - -If the signature is valid for the public key of the signing group, -it proves that the key has been used without authorization. -Each member of the signing group is punished by _seizing_ -and the group is terminated. -The submitter of the trigger transaction -receives the maximum tattletale reward. - -//// -=== Disqualification in DKG - -If an operator misbehaves during DKG, -and is included among the disqualified operators -when a valid DKG result is submitted, -the misbehaving operator is punished by _seizing_ -and removed from the created group. -The submitter of the DKG result -receives the maximum tattletale reward. - -It should be noted that a dishonest majority could punish honest operators. -However, such behavior can be proven off-chain -by presenting a DKG transcript conflicting with the accepted result. -//// diff --git a/docs-v1/random-beacon/staking/index.adoc b/docs-v1/random-beacon/staking/index.adoc deleted file mode 100644 index e0f2fa43ef..0000000000 --- a/docs-v1/random-beacon/staking/index.adoc +++ /dev/null @@ -1,529 +0,0 @@ -= Staking - -The Keep network uses staking of tokens to enforce correct behavior. - -== Basic description - -Anyone with tokens can stake them, -setting them aside as collateral for network operations. -Staked tokens are delegated to an _operator_ address -who performs work for _operator contracts_. -_Operators_ can earn rewards from contributing to the network, -but if they misbehave their collateral can be taken away -(_stake slashing_) as punishment. - -=== Stakers and roles - -A token owner may wish to stake in a variety of different ways, -for security or efficiency reasons. -To support different ways of staking, -the network uses a single abstraction of a _staker_ -comprised of multiple separate _roles_: - -owner:: -Provides the tokens for the staker - -operator:: -Handles the day-to-day participation in the network operations - -beneficiary:: -Collects any rewards earned by the staker - -authorizer:: -Authorizes contracts to protect against buggy or compromised upgrades - -The different roles can all be performed by the same address; -they may be divided between different addresses controlled by the same person; -or they may be different parties entirely, -executing a sophisticated scheme of cold storage and third-party delegation. -As far as the network is concerned, -any of these arrangements simply forms a _staker_. - -staker:: -An abstraction representing the _owner_, _operator_, _beneficiary_ and _authorizer_ -each performing their respective roles. - -Stakers are identified by their operator address. - -=== Initiating staking - -Staking is initiated by the _owner_ choosing the amount of tokens to stake, -and the _operator_, _beneficiary_ and _authorizer_ addresses. -The owner then authorizes the _staking contract_ to claim a number of tokens, -and calls the staking contract to stake the tokens. -The _staking contract_ processes the call, -claims the tokens to itself, -and records the information. -The addresses of the roles cannot be changed after delegation. - -=== Contract authorization - -Before the staker can participate in the network, -the _authorizer_ must _authorize_ each _operator contract_ -the staker wishes to use. -It is necessary to introduce new functionality and to upgrade old contracts, -but buggy or malicious _operator contracts_ could be used -to steal or destroy tokens by _slashing_ well-behaved stakers. -The requirement for _authorization_ ensures that the owner's tokens are safe -even if a contract upgrade is compromised, -as long as the _authorizer_ denies authorization to such contracts. - -Once a contract has been authorized, -the authorization cannot be revoked. - -=== Operation - -The _operator_ provides _services_ in the network -by following the protocols of authorized _operator contracts_. - -Any number of operations may be active at once -regardless of the _staked amount_. - -==== Rewards - -Stakers that provide services in the network -will be rewarded at certain points. -Rewards may be either tokens or the currency used to pay for network services. -Rewards earned by a staker will be sent to the staker's _beneficiary_ address. - -=== Slashing - -If a staker violates the protocol of an operation -in a way which can be proven on-chain, -they will be penalized by having their stakes _slashed_. - -If a staker has joined multiple operations at once, -they may accrue more punishments than their stake can cover. -If a staker's remaining stake falls to zero, -the staker is terminated and may not continue any operations. -Any remaining penalties are nullified. - -==== Tattletales - -Some misbehavior cannot be caught by a contract alone -and requires the cooperation of a third party _tattletale_. -If a _tattletale_ presents proof of misbehavior by a staker, -a part of the penalty will be awarded to the tattletale -as a _tattletale reward_. - -=== Unstaking - -When staking, the tokens used as collateral are locked -until the staker announces their intention to stop staking, -and for a period of time afterwards. -The purpose of this _unstaking period_ is to give operations time to finish -before the collateral can be moved away. -No new operations can be started or joined within the _unstaking period_ -but the staker is required to continue participating -in any unfinished operations. - -== Details - -=== Roles - -The staker is an abstraction comprising of four different roles, -each with a clear scope of responsibility. -The initial design included only the roles of the owner, operator and beneficiary; -the authorizer was added to take full advantage of the upgrade security plan. - -==== Owner - -The owner makes the decision to stake, -provides the tokens for the staker, -and chooses the addresses for the other roles. -The owner can initiate unstaking and reclaim tokens, -but these can also be performed by the operator. - -The role of the owner is designed to facilitate cold storage -by minimizing the interaction necessary for staking. -Initiating staking is the only operation -where the owner's keys are absolutely required. - -==== Operator - -The operator address is tasked with participation in network operations, -and represents the staker in most circumstances. - -Rewards and punishments are based solely on the operator's actions, -and the operator can not only cause opportunity costs -but can also lose the entire stake and possibly steal a fraction of it -using only contracts functioning as intended. -If the operator is a different party from the owner, -a high level of trust is necessary. - -In addition to participating in the network -via the authorized operator contracts, -the operator can also initiate undelegation. - -==== Beneficiary - -The beneficiary is an entirely passive role. -Rewards of tokens or currency are simply sent to the beneficiary address -by the staking contract. - -The beneficiary role is separate from the owner and operator -to provide flexibility in how to receive and use rewards -without interfering with the owner's cold storage -or the possible contractual relationship between the owner and operator. - -==== Authorizer - -Because slashing stakes requires arbitrary access to stakers' accounts, -explicit authorization is required -for each operator contract before it may penalize stakers. - -The upgrade security plan is designed -to limit the impact of upgrade key compromise -and to provide a graceful recovery route -while minimizing the impact to the rest of the network. -The explicit authorization requirement prevents a compromised contract -from stealing stakers' funds by exploiting the punishment interface. -Instead, compromise of both the authorizer and the contract is required. - -As a further security measure, -the authorizer can only authorize pre-approved contracts -from a list maintained by the governance structure of the network. -This ensures that the authorizer cannot do damage -in the absence of further compromise, -except by withholding desired authorizations. - -The authorizer role is separated from the owner and operator -to facilitate cold storage for the former -and to reduce the necessary privileges of the latter. - -If the owner were required to authorize each new contract and upgrade, -it would present an unnecessary hindrance to effective cold storage schemes. -Due to the two-factor nature of the authorizer keys, -the same level of protection is not necessarily required. - -On the other hand, separating the authorizer from the operator -reduces the latter's ability to profit from damaging the owner's interests. -While even the operator has the ability -to lose or steal the owner's tokens, -it is restricted by the opportunities provided by the authorized contracts. -Using the tattletale mechanism to transfer tokens is inefficient, -but a compromised contract would not be subject to the same restrictions -and could be used to transfer all of the staker's tokens to the attacker. - -===== Third party delegation - -The role of the authorizer can be delegated to a third party, -and it is expected that many would do so. - -Most owners and operators are unlikely to scrutinize each contract, -or even to have the ability to do so effectively. -Providing a convenient way to express one's choice to trust a third party -would make centralization of such trust visible. - -A downside of convenient delegation is that requiring individual authorizations -provides another source of friction and human judgment -between compromise of single points of failure and actual loss of staker funds. -An owner can avoid this fate -by not assigning a third party as the authorizer address. - -=== Staking contract - -The staking contract records two time (blockheight) fields for each operator: -the block the operator was created, -and the block undelegating began. - -Operators can be: - -- _non-existent_ -- _not ready_ for work selection because they were created too recently -- _active_ and eligible for work selection -- _winding down_ and ineligible for work selection but finishing earlier work -- _finished_ undelegation so the owner can recover their tokens - -Using the systemwide constant _undelegation period_, -the operator's _status_ can be determined -from the creation and undelegation blocks. - -Operators are uniquely identified by their address -and operator addresses cannot be reused, -even after returning the tokens to the owner. - -To reduce the impact of transaction reordering, -both delegating and undelegating take effect on the next block -after the block the transaction is processed in. - -==== Parameters - -===== Operator initialization period - -E.g. 50,000 (roughly 6 days) - -To avoid certain attacks on work selection, -recently created operators must wait for a specific period of time -before being eligible for work selection. -This waiting period must be greater than the highest permissible time -between the making of a beacon entry request -and the request being served. -In the ideal case, multiple entries would be requested and generated -within the initialization period. - -If the initialization period is insufficiently long, -the pseudorandom work selection process can be subverted -by creating operators whose identifiers (addresses) -are calculated to yield advantageous outputs in the selection function. -This can let the adversary control the majority in the new signing group. - -If the new group is in line to sign the next entry, -the adversary could choose the group's private key -so that the following entry also gets signed -by a group controlled by the same adversary. -With sufficient calculation capability, -this can be repeated _n_ times at the cost of roughly _O(k^n^)_ calculations -where _k_ equals the number of active groups -divided by the number of active adversary-controlled groups. -If another signing group is created within this time, -it can be similarly controlled. -This can eventually lead to the adversary controlling the entire network. - -With the initialization period, -the adversary has to create the operators in advance -long before they become eligible for work selection. -Thus the adversary has to be able to predict each entry -generated during the initialization period. -With an unreasonably powerful adversary -that can arbitrarily frontrun 50% of all entries, -generating _n_ entries within the initialization period -provides _2^n^_ security against this attack. - -===== Undelegation period - -E.g. 200,000 ~ 800,000 (roughly 1 to 3 months) - -The staking contract guarantees that an undelegated operator's stakes -will stay locked for a number of blocks after undelegation, -and thus available as collateral for any work the operator is engaged in. - -==== Operator data - ----- -mapping(address => Operator) operators; - -struct Operator { - uint128 stakedAmount; - uint64 createdAt; - uint64 undelegatedAt; - address owner; - address beneficiary; - address authorizer; -} ----- - -Each operator stores the addresses of its owner, beneficiary and authorizer, -the amount of tokens delegated to the operator, -the block it was created at, -and the block it was undelegated at if applicable. - -==== Operator status - ----- -enum Status { NonExistent, NotReady, Active, WindingDown, Finished } - -operatorStatus(address operator) -> Status ----- - -An operator's status determines what actions are available -for the operator and the owner the delegated tokens. - -===== Non-existent - -The operator doesn't exist. - -`operators[operator] == nil` - -===== Not ready - -The operator has been created in the same block the query was performed in. -The operator is ineligible for work selection. - -An operator is `NotReady` -if the current block is equal or less than -the creation block plus the initialization period. - -`block.number =< operator.createdAt + initializationPeriod` - -===== Active - -The owner has delegated staked tokens to the operator, -and the operator is eligible for work selection. - -An operator is `Active` -if the current block is greater than -the creation block plus initialization period, -and the undelegation block is either 0 or equal or greater than the current block. - -`block.number > operator.createdAt + initializationPeriod && (block.number =< operator.undelegatedAt || operator.undelegatedAt == 0)` - -===== Winding down - -The operator has been undelegated and is not eligible for work selection, -and the operator is finishing any work they were selected for earlier. -The operator's backing tokens continue to be locked as collateral. - -An operator is `WindingDown` -if the current block is greater than the undelegation block, -but at most the undelegation block plus the undelegation period. - -`operator.undelegatedAt < block.number =< (operator.undelegatedAt + undelegationPeriod)` - -===== Finished - -Undelegating the operator has finished. -The backing tokens are unlocked and can be returned to the owner. - -An operator is `Finished` if the current block is greater than -the undelegation block plus the undelegation period. - -`block.number > operator.undelegatedAt + undelegationPeriod` - -==== Work selection eligibility - -`eligibleStake(address operator, uint block) -> uint` - -Operators are eligible for work selection -based on their status in the block the work selection started in. -In some situations an operator's status may have changed -after work selection started, -but before the operator contract queries it. -For these cases the staking contract must provide a way to determine -the operator's eligibility for work selection that started in an earlier block. - -It is the responsibility of each operator contract -to query operator eligibility with the correct block number. -Failure to use the correct block leads to minor manipulation opportunities. -For example, querying an operator's eligibility -on the current block when they submit a ticket -means that an ineligible operator whose initialization period is almost over -could wait to submit their ticket -until they become eligible for work selection. - -To make determining an operator's eligibility for work selection -simpler and cheaper, -the staking contract must provide the `eligibleStake()` function -which returns the number of KEEP tokens available for use as collateral. - -When calling `eligibleStake()`, -the staking contract assumes `msg.sender` is an operator contract. -`eligibleStake()` does not return meaningful results -when called by an address that doesn't correspond to an operator contract. -If the `operator` is ineligible for work selection on `msg.sender`, -`eligibleStake()` returns `0`. -Otherwise `eligibleStake()` returns `operator.stakedAmount`. - ----- -operatorExists = operators[operator] != nil - -senderAuthorized = authorized[operator.authorizer][msg.sender] == True - -operatorReady = block > operator.createdAt + initializationPeriod - -notUndelegated = block =< operator.undelegatedAt || operator.undelegatedAt == 0 - -if operatorExists && senderAuthorized && operatorReady && notUndelegated: - return operator.stakedAmount -else: - return 0 ----- - -==== Actions - -===== Staking - -`stake(uint amount, address operator, address beneficiary, address authorizer)` - -Staking tokens delegates them to the operator, -who can then use them as collateral for performing work. -Staking is performed by the owner of the tokens, -who must have authorized the staking contract -to transfer `amount` KEEP to itself -(e.g. via `approveAndCall()`). - -`token.allowance(msg.sender, stakingContract) >= amount` - -The nominated operator must not already exist. - -`operators[operator] == nil` - -The staking contract transfers `amount` KEEP from `msg.sender` to itself, -and creates a stake delegation relationship, -with the operator becoming `Active` in the next block. - ----- -operators[operator] = Operator { - stakedAmount = amount; - createdAt = block.number; - undelegatedAt = 0; - owner = msg.sender; - beneficiary = beneficiary; - authorizer = authorizer; -} ----- - -===== Cancelling staking - -`cancelStake(address operator)` - -The owner can cancel staking within the operator initialization period -without being subjected to the token lockup for the undelegation period. -This can be used to undo mistaken delegation to the wrong operator address. - -`msg.sender == operator.owner` - -`block.number =< operator.createdAt + initializationPeriod` - -If staking is cancelled, -the staked tokens are immediately returned to the owner, -and the undelegation time is set to the present. - -`operator.stakedAmount = 0` - -`operator.undelegatedAt = block.number` - -===== Undelegating - -`undelegate(address operator)` - -Undelegating sets the operator to `WindingDown` status -so that the backing tokens can later be recovered by the owner. -Undelegating can be performed by either the owner or the operator. - -`msg.sender == (operator || operator.owner)` - -Undelegating can only be performed on a currently active operator. - -`operatorStatus(operator) == Active` - -The staking contract sets the undelegation block of the operator -to equal the current block, -making the operator ineligible for any work selection in the future. -Work selection performed earlier in the same block shall proceed as normal. - -`operator.undelegatedAt = block.number` - -===== Recovering tokens - -`recoverStake(address operator) -> uint` - -Recovering staked tokens transfers them back to the owner. -Recovering tokens can only be performed by the owner, -when the operator is finished undelegating. - -`msg.sender == operator.owner` - -`operatorStatus(operator) == Finished` - -The staking contract sets the staked amount of the operator to zero, -and transfers the previously delegated tokens (or however much was remaining) -back to the owner. - -`operator.stakedAmount = 0` - -The staking contract may additionally clean up -the owner, beneficiary and authorizer addresses for the gas refund. -However, the staking contract must not delete -the creation and undelegation times, -as this would enable reuse of the same operator address. diff --git a/docs-v1/random-beacon/staking/notes.adoc b/docs-v1/random-beacon/staking/notes.adoc deleted file mode 100644 index b29793c4ca..0000000000 --- a/docs-v1/random-beacon/staking/notes.adoc +++ /dev/null @@ -1,350 +0,0 @@ -= Staking - -Notes and speculation - -== Minimum stake - -From the Ethereum rich list at etherscan.io: - -7,000 accounts have at least 1/100,000 of the total supply each -1,000 accounts have at least 1/10,000 -150 accounts have at least 1/1,000 -5 accounts have at least 1/100 - -From btc.com rich list: - -100 accounts with 10,000+ (1/1,750) -2,000 accounts with 1,000+ (1/17,500) -15,000 accounts with 100+ (1/175,000) -150,000 accounts with 10+ (1/1,750,000) - -Non-trivial stake requirements in other projects: - -Ethereum (Casper docs): 1,000 ETH deposit (1/100,000) -Ethereum (speculation of eventual minimum): 32 ETH (1/3,000,000) -Dash: 1,000 Dash (1/8,500) -Cardano: 10,000 ADA (1/4,500,000) -Tezos (masternode): 10,000 XTZ (1/80,000) -Decred: ~110 (1/80,000) - -Initial suggestion: 10,000 KEEP or 1/100,000 of the total supply - -.Market cap vs. minimum stake -|=== -|Market cap |Minimum stake - -|$10M |$100 -|$100M |$1,000 -|$1,000M |$10,000 -|$10,000M |$100,000 -|=== -== Authorizations - -Can't revoke authorizations: -naively implemented, this functionality would enable evading penalties. -It could be made to work -by keeping track of when a staker actually is active in a contract, -but this would impose significant storage burdens. - -== Token grants - -* a specific amount of tokens -* for a specific address -* locked up for a specific time period -* vesting over time, unlocking parts of the grant -* may have a cliff, so tokens only start to unlock after a certain point -* may be revocable - -Most of the issues with token grants concern conflicts of interest -between the _grant creator_ and the _grant recipient_, -and the _recipient's_ ability to subvert the goals of the _creator_. -If the creator and recipient are considered to be a single actor -as far as the rest of the network is concerned, -any such conflicts would simply manifest -as seemingly irrational behavior from the actor as whole. - -However, given that the Keep org is the most significant grant creator -and all initial tokens would be given out as grants, -the practical effects of the grant mechanism are significant. - -=== Grant features - -Currently planned for 2 years or roughly 100 weeks - -If minimum stake is set at 10,000 and stake-ahead at 2 weeks, -the minimum to begin staking right away would be 500,000 -or 1/2,000 of the supply - -=== Tattletale transfer - -(T-transfer for convenience) - -Misbehave deliberately in a way which entitles a tattletale to large rewards, -collect rewards on another account you control. - -_transfer_efficiency = tattletale_reward / misbehavior_penalty_ - -When you know your grant would be revoked, -t-transfer may act as a way to secure a fraction -_grant * transfer_efficiency_ of the grant. - -When you expect the future value of _grant_ to be less than -_transfer_efficiency * grant_ right now, -t-transfer may enable premature seizing of the value. - -The practicality of t-transfer depends on the efficiency, -dictated by how contracts use slashed stakes. -If the seized collateral or a significant fraction -is transferred to an address the adversary can control, -t-transfer is highly viable. -If the seized collateral is distributed widely -in a way that is difficult to bias, -eg. in proportion to stakers' legitimate earnings from the contract, -the efficiency plummets. - -biased distribution:: -An algorithm for distributing slashed stakes is _biased_ -if adversary _A_ with _adversary stake_ tokens -can give it some input _i_ that is not publicly available to all stakers, -and thus change the expected distribution so that _A_ receives more than -_(adversary stake / total staked) * slashed amount_. - -unbiased distribution:: -An algorithm for distributing slashed stakes has an _unbiased distribution_ -when the expected amount of tokens received by any adversary -with _adversary stake_ tokens staked -is equal to _slashed amount * (adversary stake / total staked)_ -regardless of the adversary's input. - -[NOTE] -.T-transfer efficiency conjecture -==== -The minimum t-transfer efficiency -for an adversary controlling _adversary_fraction_ of stakers -is conjectured equal to _adversary_fraction_. - -This _unbiased distribution_ may be achieved in different ways: -by eg. simply transferring the tokens -to a random address weighted by stakes; -or by increasing all future rewards from the contract -by a small amount. - -Any method that attempts to change this distribution -is subject to manipulation by the adversary "playing both sides". - -For example, gifting the tokens to a random staker, non-weighted, -disproportionately rewards blitzpantsing. -The adversary, knowing in advance that they would be penalized, -can then prepare for this. -Similarly, the tattletale reward itself is such a bias, -subject to advance preparation on the basis of privileged information. - -Such a biasing method is conjenctured to be possible -for every biased distribution of slashed tokens. -==== - -=== Slashing methods - -==== Simple slashing - -The simplest method for slashing -simply transfers the impacted tokens to the slashing contract. -This gives the contract full freedom -to distribute the tokens immediately -or keep them for future rewards. - -The simple method of slashing does not enable -the enforcement of any relevant invariants -in the staking contract itself, -and thus all staked tokens are potentially subject to t-transfer. - -==== Simple variant - -A variant of the simple method would use two different slashing functions: -`slash` and `slashAndReward`. -`slash` would be a straightforward seizure of collateral -followed by distributing the tokens in an unbiased way, -while `slashAndReward` would nominate a tattletale staker -to receive a specified fraction of the seized tokens -and keep the rest in the functionality contract for unbiased distribution. - -The simple variant allows more sophisticated discrimination -between stakes that may be subject to efficient t-transfer -and stakes that are distributed evenly. -Even in this case, it is both necessary -and impossible within the staking contract -to ensure that the contract actually implements the unbiased distribution. - -==== Limited-bias slashing - -A more sophisticated variant could be constructed -using a separate contract for the desired unbiased distribution scheme. -In this case it would be possible -to determine the characteristics of the reward scheme, -and use unbiased distributions safely -where biased distributions pose t-transfer threats. - -The functionality contract would use the functions -`slashAndSeize` and `slashAndDistribute` for the collateral. -With `slashAndSeize` the tokens would be subject to arbitrary distribution, -while `slashAndDistribute` would grant them in an approved unbiased way. -Thus `slashAndDistribute` could be called without limits -on tokens subject to grants, -and the problem would be limited to `slashAndSeize`. - -If the creator of the grant approves in advance -the contracts `slashAndDistribute` may be used with, -determining the unbiasedness of any particular reward distribution scheme -is externalized onto an off-chain party -whose incentives obviously maximally align with those of the grant creator. - -It may be recommendable to always call `slashAndSeize` with `slashAndDistribute` -to provide a ceiling on the maximum achievable t-transfer efficiency. -If _t_ tokens are slashed, -with _t * B_ going to `slashAndSeize` -and _t * (1 - B)_ going to `slashAndDistribute`, -the distribution may be called a _partially biased distribution_ -with a bias ceiling of _B_, -or a _B-biased distribution_ (eg. "50% biased distribution"). - -If a cap on reward distribution bias is enforced by the grant creator, -so that only _partially biased distributions_ are allowed, -requiring that _0 =< B =< maximum allowed bias < 1_, -a known minimum resistance to t-transfer can be ensured. -The grant amount could be staked with _B * minimum stake_ being vested tokens -and _(1 - B) * minimum stake_ being unvested tokens. - -=== False stake - -If Mallory has a grant and is expecting the grant to be revoked, -tokens that would be unvested at the time of revocation are not efficient stake; -Mallory has nothing to lose from expending such tokens -as stakes for misbehavior that gives any personal advantage otherwise. - -If Mallory is not expecting the grant to be revoked, -the time value of money and future expectations on token value -can still reduce the effective value of the locked-up tokens. - -In the case of non-revocable grants, -it would be possible to reduce the effect of future discounting -by requiring more tokens if the tokens vest at a time far in the future. - -=== Staking ahead - -Withdrawing staked tokens requires waiting the _unstaking period_. -If staker _S_ is choosing between unstaking and continuing at time _T_, -the amount of unlocked tokens they could withdraw at the earliest possible time -is _UnlockedTokensAt(T + T~unstake~)_. -Thus it may be safe to use tokens -that are locked at the present time but would vest within the unstaking period -as collateral. - -If minimum stake is 10,000 KEEP or 1/100,000 of the total supply, -and grants last 2 years, -the de facto minimum stake to begin staking immediately -is determined by _minimum stake * (100 weeks / unstaking period)_ - -.Unstaking period vs. de facto minimum stake at various market caps -|=== -|Waiting period |$10M |$100M |$1,000M - -|1 week |$10k |$100k |$1M -|2 weeks |$5k |$50k |$500k -|4 weeks |$2,500 |$25k |$250k -|10 weeks |$1,000 |$10k |$100k -|25 weeks |$400 |$4k |$40k -|=== - -=== Grant-compatible staking - -Instead of staking contract, split the responsibilities: - -==== Staking proxy - -The staking proxy is not called directly; -instead an entry is created -when one of the staking contracts has a staking event. - -staker[staker_id] -> backend:: -The contract addresses of the rules each staker operates under - -initialize(staker_id):: - - -remove(staker_id):: -Remove the backend address entry of the specified staker - -==== Staking backend - -A contract that can provide the required interface to the staking proxy: - -weight(staker_id) -> int:: -Returns the staker weight of the specified staker. - -operator(staker_id) -> address:: -Returns the address which has _operator_ authority for the specified staker. - -beneficiary(staker_id) -> address:: -Returns the address which has _beneficiary_ authority for the specified staker. - -overseer(staker_id) -> address:: -Returns the address which has _overseer_ authority for the specified staker. - -reward(staker_id, amount):: -Rewards the staker with tokens or currency. - -slash(staker_id, amount):: -Seizes _amount_ tokens from the staker and gives them to the calling contract. -If the staker state is `Active` -this method is required to transfer the tokens to the calling contract. -Calling `slash` on an `Unstaking` staker is backend-specific. - -===== Backend: free stakes - - -* `amount` of staked tokens -* `state` of the staker (`Active` or `Unstaking`) -* `since` time of last change (staking or unstaking) -* `owner` of the tokens -* `operator` address performing operations -* `beneficiary` address to send rewards to -* `overseer` address to determine authorized contracts - -stake(amount, operator, beneficiary, overseer):: -Initiate staking by specifying the addresses of the other roles -and transferring at least _minimum stake_ tokens to the contract -+ -The caller is designated as the owner -+ -May be called by any address with at least _minimum stake_ tokens - -unstake(staker_id):: -Initiate unstaking, start the unstaking period -and stop the staker from joining any new operations -+ -May be called by either the owner or the operator of the staker - -return_tokens(staker_id):: -Terminate a staker that has finished unstaking -and return the staked tokens to the owner -+ -May be called by either the owner or the operator of the staker - -reward(staker_id, amount):: -Reward a staker for correct operation -and transfer currency or tokens to its beneficiary address -+ -May be called by a functionality contract - -slash(staker_id, amount):: -Punish a staker for misbehavior and seize some of its tokens -+ -The seized tokens may be used in whathever way is specified by the contract -+ -May be called by a functionality contract authorized by the staker's overseer -and not blocked by the panic button - - -==== Free token staking - -==== Limited token staking diff --git a/docs-v1/random-beacon/terms.adoc b/docs-v1/random-beacon/terms.adoc deleted file mode 100644 index a3fdb4bdaa..0000000000 --- a/docs-v1/random-beacon/terms.adoc +++ /dev/null @@ -1,153 +0,0 @@ -:toc: macro - -= Terms - -ifndef::yellowpaper[toc::[]] - -== Conventions - -=== Basic conventions - -[horizontal] -Term~context~:: -Globally meaningful terms are capitalized, and usually include subscripts. -_Term_ specifies the broader type, such as _Stake_, and the subscript _context_ -is used to specify the particular purpose and/or usage of this value. -+ -Terms are formatted as _CamelCase~snake_case~_. - -T~context~:: -Shorthand symbol for commonly used terms. The meaning can be memorized or -looked up from the shorthand symbol table, as a specific letter always -corresponds to a specific term. - -Term~GLOBAL_CONSTANT~:: -Hardcoded global constants have their subscript in capitals following the -common programming convention. - -C:: -A particularly significant global constant can be expressed as a single capital -letter. Where this letter corresponds to a shorthand symbol, the constant _C_ is -of the same type as terms _C~context~_, and could alternatively be expressed as -_C~IMPORTANT_CONSTANT~_. - -Function~context~(input):: -The value depends on _input_. _Function_ can be (and usually is) a term that is -normally used as a plain value: eg. _R~submitter~(T)_ means that the submitter -reward varies depending on time - -variable~context~:: -A local value that is only used briefly, or may even be altogether unknown to -uninvolved participants. - -=== Shorthand symbols - -Some meanings are used so often that it is useful to have single-letter terms -for them. Each shorthand symbol maps to a specific longhand term. - -TODO: Shorthands and terms have been matched to ensure each term maps to its -initial wherever possible. The exception is _Penalty_ and _D_ (with -_disciplinary action_ as a mnemonic); alternatives or abolishing this shorthand -should be considered. - -[horizontal] -V~i~:: -Value~i~ -+ -The __i__-th output of the random beacon - -N~ctx~:: -Number~ctx~ -+ -A number of operators or group members - -M~ctx~:: -Malicious~ctx~ -+ -A number of malicious operators or group members - -G~ctx~:: -Group~ctx~ -+ -Some specific group - -S~ctx~:: -Staker~ctx~ -+ -Some specific staker - -P~ctx~:: -Participant~ctx~ -+ -A participant in some group - -T~ctx~:: -Time~ctx~ -+ -A block number used as an unambiguous measure of time - -R~ctx~:: -Reward~ctx~ -+ -A reward for correct operation; tokens or currency - -D~ctx~:: -Penalty~ctx~ -+ -A punishment for misbehavior (mnemonic: _disciplinary_ action); always tokens - -=== Common long-form terms - -Longhand terms should be self-explanatory wherever possible, and are explained -locally where they are used. The meanings of some term types that are used -regularly but don't have a specific shorthand are listed below. - -[horizontal] -Stake~ctx~:: -Some amount of tokens used for staking - -Prob~ctx~:: -The probability of some event - -== Specific terms - -=== Globally significant values - -==== Global security parameters - -[horizontal] -N:: -H + M = 2M + 1 = 4M~nofail~ + 1 -+ -Number of participants in a group - -H:: -M + 1 = (N - 1)/2 + 1 -+ -Minimum number of honest participants in a group - -M:: -H - 1 = (N - 1)/2 -+ -Maximum number of malicious participants in a group beyond which security -guarantees don't hold - -M~nofail~:: -M/2 = (N - 1)/4 -+ -Maximum number of disqualified participants in a group beyond which DKG will -abort to preserve security - -:leveloffset: +1 - -include::alt_bn128.adoc[] - -:leveloffset: +1 - -include::group-selection/terms.adoc[] - -include::dkg/terms.adoc[] - -include::signing/terms.adoc[] - -include::group-expiration/terms.adoc[] diff --git a/docs-v1/random-beacon/upgrades.adoc b/docs-v1/random-beacon/upgrades.adoc deleted file mode 100644 index bb8950186a..0000000000 --- a/docs-v1/random-beacon/upgrades.adoc +++ /dev/null @@ -1,81 +0,0 @@ -= Upgrade processes - -== Operator contract upgrade - -Operator contracts are immutable, -and are upgraded by deploying a new version in a separate contract. -The _Registry Keeper_ then approves the new contract on the _registry_, -and operators are able to authorize it. -Once authorized by a sufficient number of stakers, -the contract can be added into the used operator contracts -of a service contract. - -Operator contracts can be upgraded without losing service contract state, -but critical state is held within the operator contract and cannot be migrated. - -. Deploy the new operator contract -. Approve the operator contract on the registry -. Wait for stakers to authorize the operator contract -. Activate the operator contract on the relevant service contract/s - -== Service contract upgrade - -Because service contracts don't impact the security of staked tokens, -they can be upgraded in-place without migrating to a new address. - -== New service contract - -A new service contract is deployed on-chain and listed on the _registry_. - -If the service contract doesn't rely on -an operator contract exclusive to itself, -it can be deployed after the operator contracts it uses are in place. - -Otherwise the service contract must be deployed first, -inactive because it has no operator contracts it uses. -Once the address of the service contract is determined, -the operator contract is deployed, -approved on the registry, -and authorized by stakers. -The operator contract can now be activated on the service contract, -making it ready to provide services. - -. Deploy the new service contract -. Deploy a new operator contract serving the new service contract -. Approve the operator contract on the registry -. Wait for stakers to authorize the operator contract -. Activate the operator contract on the service contract - -== Staking contract upgrades - -Staking contracts can be upgraded by deploying a new version, -and waiting for stakers to migrate -by withdrawing their stakes on the old contract -and staking them again on the new contract. -While stakers are migrating, -new operator contracts using the new staking contract should be deployed. -Once stakers have migrated and approved the new operator contracts, -the contracts can be activated on service contracts. - -. Deploy the new staking contract -. Deploy new operator contracts recognizing the new staking contract -. Approve the operator contracts on the registry -. Wait for stakers to migrate to the new staking contract -. Wait for stakers to authorize the new operator contracts -. Activate the operator contracts on the service contracts - -== Token upgrade - -The upgrade process makes it possible to even hard-fork the token -without disrupting service contract user experience: - -. Deploy the new token contract -. Deploy a migration contract -that lets holders convert old tokens to new tokens -. Deploy a new staking contract for the new tokens -. Deploy new operator contracts recognizing the new token and staking contract -. Approve the operator contracts on the registry -. Wait for stakers to convert their tokens, -stake on the new contract -and authorize the new operator contracts -. Activate the operator contracts on the service contracts diff --git a/docs-v1/relay-states.tex b/docs-v1/relay-states.tex deleted file mode 100644 index cd904257ce..0000000000 --- a/docs-v1/relay-states.tex +++ /dev/null @@ -1,134 +0,0 @@ -\documentclass{article} -\usepackage[utf8]{inputenc} - -\usepackage[margin=1in]{geometry} -\usepackage{tikz} -\usepackage[colorlinks=true]{hyperref} -\usepackage{varwidth} - -\usetikzlibrary{positioning} -\usetikzlibrary{arrows.meta} -\usetikzlibrary{shapes.symbols} -\usetikzlibrary{calc} - -\tikzset{ - every node/.style={above}, - start state/.style={draw,circle,text width=0}, - state/.style={draw,circle,align=flush center,text width=2cm}, - decision/.style={draw,rectangle,align=flush center}, - thread/.style={draw,signal,signal to=east,fill=white}, - % Nested states and decisions use doubled borders to indicate - % that you have to reference a different diagram. - nested state/.style={draw,circle,double,align=flush center}, - nested decision/.style={draw,rectangle,double,align=flush center}, - % Chain states and decisions use dashed borders to indicate - % that you have to interact with the chain. - chain state/.style={draw,circle,dashed,align=flush center,text width=2cm}, - chain decision/.style={draw,rectangle,dashed,align=flush center}, - chain transition/.style={draw,dashed}, - % Nested chain decisions combine nested and chain styles to - % indicate a reference to a different diagram for a state that - % depends on chain interaction. - nested chain decision/.style={draw,rectangle,double,dashed,align=flush center}, - % Set default arrow style to stealth. - >=Stealth -} - -\begin{document} - -Below are state diagrams elaborating on the various pieces of a Keep node. Note -that Keep nodes actually run multiple processes in parallel, for participation -in the random beacon threshold relay as well as for participating in the Keep -network. The startup diagram indicates this and links to the subprocess state -diagrams. - -First, however, a legend: - -\vspace{0.5cm} - -\begin{center} - \tikz{ - \node[thread] (thread) {A thread}; - - \node[nested state] (nested state) [below=1cm of thread] {A nested state}; - \node[state] [left=1cm of nested state](state) {A regular state}; - \node[chain state] (chain state) [right=1cm of nested state] {A state dependent on the chain}; - - \node[nested decision] (nested decision) [below=1cm of nested state] {A nested decision}; - \node[decision] (decision) [left=1cm of nested decision] {A decision}; - \node[chain decision,text width=2cm] (chain decision) [right=1cm of nested decision] {A decision dependent on the chain}; - - \draw [<-] (-4.5,0.25) -- node [centered,text width=2cm,align=center] {state\\transition} (-2.5,0.25); - \draw [->,dashed] (2,0.25) -- node [centered,text width=4cm,align=center] {chain-dependent\\state transition} (5.25,0.25) - } -\end{center} - -\vspace{0.5cm} - -Nested states and decisions should link to the nested diagrams that indicate -what is going on within these states or decisions. - -\vspace{0.5cm} - -\begin{center} - \input{img-src/startup-diagram.tikz} - - \vspace{0.5cm} - Keep node startup process: processes run in parallel -\end{center} - - - -\clearpage - -\begin{figure} - \centering - \input{img-src/relay-group-initialization.tikz} - - \caption{\label{fig:relay-group-initialization}Relay Group Initialization} -\end{figure} - -\begin{figure} - \centering - \input{img-src/relay-group-assignment.tikz} - - \caption{\label{fig:relay-group-assignment}Relay Group Assignment} - - \vspace{0.5cm} - % Mildly abusing the itemize env... - \begin{itemize} - \item[*] Note that eligibility checking is done by combining the latest relay - entry with the latest participant registry in a way specified outside - this document. - \end{itemize} -\end{figure} - -\begin{figure} - \centering - \input{img-src/relay-group-setup.tikz} - - \caption{\label{fig:relay-group-setup}Relay Group Setup} -\end{figure} - -\begin{figure} - \centering - \input{img-src/relay-entry-request-processing.tikz} - - \caption{\label{fig:relay-entry-request-processing}Relay Entry Request Processing} -\end{figure} - -\begin{figure} - \centering - \input{img-src/libp2p-join.tikz} - - \caption{\label{fig:libp2p-join}{\tt libp2p} Join Process} -\end{figure} - -\begin{figure} - \centering - \input{img-src/relay-entry-verification.tikz} - - \caption{\label{fig:relay-entry-verification}Relay Entry Verification} -\end{figure} - -\end{document} diff --git a/docs-v1/rfc/rfc-1-network-security-requirements.adoc b/docs-v1/rfc/rfc-1-network-security-requirements.adoc deleted file mode 100644 index 4b6bd47930..0000000000 --- a/docs-v1/rfc/rfc-1-network-security-requirements.adoc +++ /dev/null @@ -1,217 +0,0 @@ -:toc: macro - -= RFC 1: Network Security Requirements - -:icons: font -:numbered: -toc::[] - - -== Background - -Keep is a decentralized network that is anchored to one or more host chains via -on-chain smart contracts, allowing interactions both on- and off-chain depending -on the use case. To ensure the safety, security, and integrity of the network, -the network needs to implement authorization, encryption, and authentication. The -decentralized nature of the network brings about the unique challenge where -off-the-shelf protocols (such as TLS) aren't suitable. Specifically, these -protocols can't be used as-is due to their requirement of trusted central -authorities and intermediaries. That being said, with some modifications, -we can make these options more secure and work for our use case. - -This document specifies the desired behaviors and properties of a protocol that -will secure the network layer of Keep. - -A successful protocol involves verifying identities (to prevent Sybil attacks), -ensuring message integrity (to avoid malicious tampering), and allows for the -encrypting of messages (to ensure that only intended recipients receive a -message). Furthermore, the protocol should be versioned for easy upgrades. - -=== Terminology - -peer:: A member of a network that can initiate, accept, and handle secure - connections. -network:: A set of peers who are connected to each other, not necessarily p2p. -chain:: A decentralized, consensus driven store with identities and economic - incentives. -stake:: The amount of value a given participant has locked up for participation - in the network. This value is held on the host chain, and always - associated with an identity. -minimum stake:: The minimum amount of value that is required to be a participant - in the network. -bootstrap peer:: An authenticated peer that handles requests for joining - the network from unauthenticated peers. This involves verifying an - on-chain stake among many other responsibilities. - -=== Goal - -We aim to authenticate peers, control access to a network where Keep’s protocols -execute, and provide verifiable private channels between communicating peers. - -First and foremost, the protocol should be secure. - -==== What is a Secure Protocol? - -<> introduces us to the definition of a secure protocol; summarized: - -1. If two peers, _P~1~_ and _P~2~_, share a secret key, it is computationally - infeasible for anyone other than _P~1~_ and _P~2~_ to recover that secret - key. Both peers can unlock the whole communication, but no other peers can - understand the communication unless one of the peers chooses to unlock the - communication. - -2. The record of messages shared between _P~1~_ and _P~2~_ to establish the - authentication of identity must be identical, within a given session, - regardless of perspective and logically linked (from one message to the - next). - -These constraints prevent replay attacks (re-use of previous messages) and -interleaving attacks (injecting a message used in previous runs). - -==== Capabilities - -In addition to being a secure protocol, the protocol must also provide the -following capabilities: - -===== Authentication - -The goal of authentication is to provide the communicating parties with some -assurance that they know each others' identities. - -An authenticated peer is a known identity in the network such that all messages -from the authenticated peer, _P~i~_, can be provably linked to _P~i~_. - -Given an authenticated peer and an unauthenticated peer, the unauthenticated peer -must provide the authenticated peer proof of ownership of an on-chain identity -with an associated stake. If an authenticated peer's stake falls below the -minimum stake for any reason, then an authenticated peer becomes unauthenticated. - -===== Authorization - -The goal of authorization is to ensure that capabilities within the system are -restricted to authenticated identities. - -The only capabilities unauthenticated peers have are sending an initialization -message to bootstrap peers. - -Bootstrap peers are authenticated peers that accept connections from -unauthenticated peers and attempt to authenticate those peers. - -Authenticated peers can send and accept all kinds of messages. - -Further access and capabilities are restricted by the individual protocols. - - -==== Required Properties - -A secure protocol that is capable of authenticating and authorizing peers should -also guarantee **integrity**, **attributability**, and (optionally) -**confidentiality**. - -A protocol that enforces **integrity** is one in which data sent over the network -by authenticated peers cannot be modified by adversaries without detection. - -**Attributability** enforces that a message from a given peer is known to be from -that peer. - -Furthermore, successful attributability requires replay protection (which implies -message ordering enforcement). Consider the following case: an insecure scheme -would allow an adversary to intercept the communications between two peers, -modify the contents of a message (particularly of a message that has already been -received and processed by the receiving peer), and continue forwarding the -communication off to the receiving end. A receiver with an improper -implementation would process this message like any other, believing it was from -the intended sender. This would allow the adversary to forge communications with -a unsuspecting recipient as if they were the sender! - -Our protocol optionally provides **confidentiality**, where a message sent -from an authenticated peer is only intelligible to the communicating, -authenticated peers. - - -=== Scenarios - -The protocol should be able to satisfy some known scenarios, described below, -though this should not be considered a comprehensive list. - -==== Joining the network - -An unauthenticated peer wants to become an authenticated peer in the Keep -Network. This peer must be, first and foremost, successfully staked (otherwise -dishonest participants can't be punished). Furthermore, the peer must prove their -stake to the members of the network. - -The _authentication_ and _authorization_ capabilities cover the requirements of -this example. Specifically, _authentication_ allows a peer to validate the -identity of the unknown peer. _Authorization_ enables the following: - -1. The restriction of the unknown, untrusted peer to only send the initial - request to be authenticated. -2. The capability of an authenticated peer to respond to on-chain events or to - network-specific events. -3. The disconnection from the network for members who fall below the minimum - stake. - -==== Point-to-Point communications - -A peer wishes to send a point-to-point message such that only the intended -recipient can inspect and verify the contents of the message. - -This example presumes that the identity is verified and accepted in the network, -which means that _authentication_ and _authorization_ are satisfied. -_Confidentiality_ is needed to ensure that the communicating peers can -communicate in secret. _Integrity_ ensures that the message hasn't been tampered -with in transit over the wire. _Attributability_ ensures that if either peer -sends a message which contains a payload that would result in punishment, the -correct peer will be punished. - - -== Summary - -Given the above, we are primarily concerned with authentication and key exchange. -The literature overwhelmingly recommends a solution which provides authentication -and key-exchange considered jointly. Per <>: - -> A protocol providing authentication without key exchange is susceptible to an -> enemy who waits until the authentication is complete and then takes over one -> end of the communications line. Such an attack is not precluded by a key -> exchange that is independent of authentication. Key exchange should be linked -> to authentication so that a party has assurances that an exchanged key (which -> might be used to facilitate privacy or integrity and thus keep authenticity -> alive) is in fact shared with the authenticated party, and not an impostor. For -> these reasons, it is essential to keep key exchange in mind in the design and -> analysis of authentication protocols. - -Our system has two levels of key exchange: - -1. An out-of-band process for confirming an on-chain identity (is the peer - attempting to join the network staked). -2. Ephemeral key exchange for the purposes of authenticating in-network - identities and sending confidential messages (is the peer sending this - message really who they say they are). - -== Open Questions - -* Is a requirement for communicating participants that they be online? - -* Should all communications between Keep nodes be encrypted in order to provide -confidentiality for all transcripts between nodes? - -[bibliography] -== Related Links - -* [[[AAKE]]] Diffie W. (1992) - Authentication and Authenticated Key Exchanges - In: Designs, Codes and Cryptography, 2, 107-125 (1992), Kluwer Academic Publishers - http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.216.6107&rep=rep1&type=pdf - -* Discussions on writing this document: -** https://www.flowdock.com/app/cardforcoin/tech/messages/152290 -** https://www.flowdock.com/app/cardforcoin/tech/messages/153124 -** https://www.flowdock.com/app/cardforcoin/tech/messages/153592 - -* t-ECDSA performance with some thoughts on network performance optimizations: - https://www.flowdock.com/app/cardforcoin/tech/messages/154946 - -* Desired properties of confidentiality in Keep's network: - https://www.flowdock.com/app/cardforcoin/tech/messages/156769 diff --git a/docs-v1/rfc/rfc-11-upgrade-authorizations.adoc b/docs-v1/rfc/rfc-11-upgrade-authorizations.adoc deleted file mode 100644 index a3ccb46508..0000000000 --- a/docs-v1/rfc/rfc-11-upgrade-authorizations.adoc +++ /dev/null @@ -1,461 +0,0 @@ -:toc: macro - -= RFC 11: Authorizations in the upgrade scheme - -:icons: font -:numbered: -toc::[] - -== Background - -Securely upgradeable work contracts -are important for protecting stakers' tokens. -The current design for dividing work contracts -into operator contract and service contract components -permits secure upgrades of operator contracts -without interfering with service functionality. -To gain the theoretical benefits from this scheme, -it is necessary to specify how contract upgrades should be authorized, -and by whom. - -=== Current Functionality - -In link:rfc-9-upgradeable-contract-components.adoc[RFC 9: Upgrading contracts by separate components], -the division between operator and service contracts is established. -Apart from the existing consensus -that stakers should authorize each operator contract individually, -there is no overarching design for secure contract upgrades yet. - -== Proposal - -To achieve secure upgrades, this RFC proposes a scheme -where the upgrade process is centered on operator contracts, -which tie all components of the network together. - -Operator contracts are subject to approval -globally on a _registry_, -in their respective _service contracts_, -and individually from each staker in the _staking contract_. -This provides multilayered protection -against a variety of different risks. - -Other contracts such as service contracts and staking contracts -are hard-coded in operator contracts, -so attackers are prevented from inserting arbitrary contracts of any type -without needing to have separate approval processes -for different contract types. - -Different keys are used in different parts of the upgrade process. -The roles of global _Registry Keeper_ and _Panic Button_, -service contract-specific _Operator Contract Upgraders_, -and staker-specific _Authorizers_, -are used to divide the responsibilities -and to provide resiliency against compromise of individual keys. -A _Governance_ scheme can be used to rekey the roles -to recover from non-catastrophic compromise. - -The multilayered approach permits upgrading staking contracts, -or even the token itself, -without disrupting user experience on the service contract. - -=== Goal - -The main goals are to provide a smooth upgrade path for future functionality, -limiting the impact of single-key compromise, -and protecting stakers' funds from ever being subject -to code they haven't individually authorized. - -=== Roles - -==== Governance - -Governance is the final arbiter of authority in the Keep Network. -While exact details of the implementation of Governance -are out of scope for this RFC, -the role of Governance in the upgrade process -is to enable recovery from key compromise by rekeying other roles. - -Governance has the authority to change the addresses of -the _Registry Keeper_, _Panic Button_, -and the service contracts' _Operator Contract Upgraders_. - -The rekeying process should prioritize security over convenience -to the greatest feasible extent, -being unsuitable for ordinary upgrades -but permitting recovery from partial system compromise -under extraordinary circumstances. - -==== Registry Keeper - -The Registry Keeper maintains the global _registry_ -of approved operator contracts. -Each operator contract must be approved by the Registry Keeper -before it can be authorized by a staker -or used by a service contract. - -The Registry Keeper can be rekeyed by _Governance_. - -==== Panic Button - -The Panic Button can disable malicious or malfunctioning contracts -that have been previously approved by the Registry Keeper. -When a contract is disabled by the Panic Button, -its status on the _registry_ changes to reflect this, -and it becomes ineligible to penalize stakers. -Contracts disabled by the Panic Button can not be reactivated. - -The Panic Button can be rekeyed by _Governance_. - -==== Operator Contract Upgrader - -Each service contract has a Operator Contract Upgrader -whose purpose is to manage operator contracts for that specific service contract. -The Operator Contract Upgrader can add new operator contracts -to the service contract's operator contract list, -and deprecate old ones. - -The Operator Contract Upgraders can be rekeyed by _Governance_. - -==== Authorizer - -Each staker has an Authorizer -whose purpose is to authorize operator contracts the staker wishes to operate on. -Authorized operator contracts are permitted to impact the staker's staked tokens -via punishments or rewards. - -The Authorizer cannot be rekeyed except by undelegating and redelegating. - -=== Types of contracts - -==== Registry - -A global registry is used to keep track of all operator contracts, -ensuring that only Keep Org-approved operator contracts are used, -and enabling the panic button to disable operator contracts in an emergency. - -The registry contains all operator contracts of the Keep network. -Each contract's status may be `NULL`, `APPROVED` or `DISABLED`. - -A status of `NULL` is the default -and means that the operator contract has not been approved by the _Registry Keeper_. - -When the _Registry Keeper_ approves a operator contract, -its status switches to `APPROVED` in the registry. -Approved operator contracts can be authorized by stakers to impact their stakes, -and service contracts may utilize them. - -The _Panic Button_ can be used -to set the status of an `APPROVED` contract to `DISABLED`. -Operator Contracts disabled with the _Panic Button_ cannot be re-enabled. - -==== Operator Contracts - -Operator contracts serve other contracts, -and are responsible for all operations involving staked tokens. - -The requirement for stakers' funds to never be subject to -code they haven't approved individually -has certain implications on operator contracts: -the contracts must be immutable; -and any external sources of truth, -e.g. token contract and staking contract/s, -must be hard-coded. - -In the current design, -operator contracts authorized to punish the staker -can never be deauthorized. -Even if authorization was revokable, -the stakers should not be expected to react promptly -to malicious changes to operator contracts. - -An operator contract can either provide services -to any contract that makes a valid request and pays the correct fee, -or it can be owned is owned by a specific contract and only serve its owner. - -Recognized staking contracts:: -Each operator contract specifies one or more _staking contracts_ it recognizes. -Every operator contract that handles stakes -must recognize at least one staking contract. -Recognized staking contracts are hard-coded and unchangeable. - -==== Service Contracts - -Service contracts provide services without directly interacting with operators, -but using a set of operator contracts in some way. -Service Contracts don't need to be aware of tokens or staking in any way; -these functions are entirely intermediated by the operator contracts. -A service contract only needs a list of which operator contracts it uses. -To permit system upgrades, -the list of used operator contracts can be updated with proper authorization. - -Used operator contracts:: -A mutable list of operator contracts used by the service contract. - -Each service contract has a list -of zero or more operator contracts it may use. - -A service contract is deployed with zero operator contracts, -rendering the service contract inactive -until at least one operator contract is activated. - -Each service contract has a _Operator Contract Upgrader_ -who can add used operator contracts. -To add a used operator contract, -the operator contract must have been `APPROVED` on the _registry_. - -If a operator contract has been `DISABLED` by the _Panic Button_, -it is ineligible for work selection. -This must be checked when the service contract selects an operator contract. - -==== Staking contracts - -Staking contracts hold staked tokens and enforce staking rules. -They must permit authorized operator contracts -to slash the stakes of misbehaving operators, -but stakers must be protected from code they haven't authorized individually. - -For this purpose, each staking contract maintains a list -of operator contracts that have been authorized by each staker's _Authorizer_. -The list of operator contracts could also be maintained globally, -removing the need for entry duplication -when stakers on different staking contracts -have the same Authorizer and operate on the same operator contract. -However, maintaining the authorizations locally -may be cheaper than cross-contract calls, -and the scenario where gas would be saved is likely to be rare. - -(If _fully backed operation_ is used, -it may not be necessary to have separate authorizations -as stakes are explicitly allocated for each operator contract.) - -Staking contracts are also aware of the token contract by necessity. - -===== Authorized operator contracts - -The _authorized operator contracts_ are a mapping -of `(address authorizer, address operator_contract) -> status`. - -The status of a contract may be either `NULL` or `AUTHORIZED`. -A status of `NULL` is the default -and means the operator contract is not authorized. -A status of `AUTHORIZED` means that the operator contract -may affect the stakes of those stakers -who have assigned that `authorizer` as their _Authorizer_. - -To authorize a operator contract on a staking contract, -the following conditions must apply: - -- the operator contract has been `APPROVED` on the _registry_ -- the operator contract recognizes the staking contract - -Once a operator contract has been authorized, -authorization cannot be withdrawn by the staker. -However, a operator contract that has been `DISABLED` by the _Panic Button_ -may not punish stakers. - -=== Upgrade processes - -==== Operator Contract upgrade - -. Deploy the new operator contract -. Approve the operator contract on the registry -. Wait for stakers to authorize the operator contract -. Activate the operator contract on the relevant service contract/s - -==== New service contract - -. Deploy the new service contract -. Deploy a new operator contract serving the new service contract - . Approve the operator contract on the registry - . Wait for stakers to authorize the operator contract - . Activate the operator contract on the service contract - -==== Staking contract upgrade - -. Deploy the new staking contract -. Deploy new operator contracts recognizing the new staking contract - . Approve the operator contracts on the registry - . Wait for stakers to migrate to the new staking contract - . Wait for stakers to authorize the new operator contracts -. Activate the operator contracts on the service contracts - -==== Token upgrade - -The upgrade process makes it possible to even hard-fork the token -without disrupting service contract user experience: - -. Deploy the new token contract -. Deploy a migration contract -that lets holders convert old tokens to new tokens -. Deploy a new staking contract for the new tokens - . Deploy new operator contracts recognizing the new token and staking contract - . Approve the operator contracts on the registry -. Wait for stakers to convert their tokens, -stake on the new contract -and authorize the new operator contracts -. Activate the operator contracts on the service contracts - -=== Impact of compromise - -==== Individual keys - -===== Registry Keeper - -A compromised Registry Keeper can approve arbitrary operator contracts. -Because using those operator contracts for a service contract -requires the service contract's Operator Contract Upgrader as well, -the impact is limited to stakers being able to instantly unstake -by authorizing a malicious operator contract -which slashes their stakes -and sends the tokens to an address controlled by the staker. - -===== Panic Button - -A compromised Panic Button can disable all operator contracts -and halt all network services. -Recovery is impossible until Governance has rekeyed the Panic Button. - -This is inevitable due to the functionality of the Panic Button, -but the impact could be mitigated -by setting a cap on how many times the Panic Button can be invoked -within a particular timeframe. -However, such a cap would be overwhelmed -by a mass approval of malicious contracts by the other roles. - -===== Operator Contract Upgrader - -A compromised Operator Contract Upgrader -can activate arbitrary operator contracts -within the strict constraints of the upgrade process. -Without compromise of the Registry Keeper -to approve new malicious operator contracts, -it is unlikely that a compromised Operator Contract Upgrader alone -would have significant impact on the network. - -===== Authorizer - -If only the Authorizer of some staker is compromised, -the attacker can authorize operator contracts -that have been approved by the Registry Keeper, -and that recognize the contract that staker stakes on. - -This has a very limited negative impact -unless the Registry Keeper has approved -a faulty or malicious operator contract. - -==== Key combinations - -===== Registry Keeper + Operator Contract Upgrader - -If a malicious operator contract can get globally approved, -the impacted service contract can be completely subverted -by deprecating all other operator contracts -and returning malicious values. -While already existing operations should finish normally, -the service contract can be rendered effectively useless for new requests. - -===== Registry Keeper + Authorizer - -Approving and authorizing a malicious operator contract -permits theft of staked funds. - -=== Limitations - -Each operator contract upgrade requires participation -from both the _Registry Keeper_ and the _Operator Contract Upgrader_. -This increases the exposure of these keys, -leading to a higher risk of simultaneous compromise. - -== Future Work - -Service contracts could have upgradeable components -for performing various sub-tasks. -These components could be upgraded -with a process similar to that of operator contracts -except without staker involvement. - -=== Keeps, factories and vendors - -==== Operator contracts - -===== Keep factories - -Keep factories are operator contracts -that create keeps for customer applications. - -Like all operator contracts, -each Keep factory recognizes one or more staking contracts -for the purpose of determining operators' eligibility to join keeps. - -Each keep factory implements one or more keep interfaces. -The factory records its interfaces -and the addresses of the corresponding keep vendors. - -===== Keeps - -Keeps are operator contracts created by keep factories. -When a contract requests a keep from a factory, -the factory creates a new contract owned by the customer contract, the keep, -and hands it off to the customer contract. - -Keeps aren't individually authorized to slash stakers. -Instead, they have to use the authorization of their creator factory. - -Once created, a keep cannot be upgraded in any way, -except by closing the keep and opening another one. - -==== Service contracts - -===== Keep vendors - -Keep vendors are service contracts -which perform version management of keep factories. -Keep vendors provide customers -a single unified interface to request up-to-date keeps. - -The upgrade process of the Keep Network -is designed to eliminate the security threat -posed by unilateral smart contract upgrades. -However, the consent-centered upgrade process -is inherently more complex to accommodate -than a simple switchover to a new version. -Stakers will authorize a new contract -and operators will upgrade their client software -on their own schedule, -so the initial capacity of a new keep version will be seriously limited. - -Instead of updating the factory address when a type of keep is upgraded, -and explicitly accommodating for the friction in the migration, -a customer application can go through the vendor of the corresponding keep type -to receive a recent version of the keep. -For most applications, -the convenience of having the version migration -managed automatically by the keep vendor -is likely to be more significant than the slight security impact. - -== Open Questions - -Some threats may be mitigated by allowing or requiring -routine rekeying of the upgrade roles -using the upgrade roles' own keys instead of relying on governance. -This has not been investigated yet. -Alternatively, each role could have a backup key in cold storage, -usable as the first-line rekeying option. - -The governance process for recovery from key compromise is left open. -Involving a significant fraction of stakers (e.g. 33-50%) -has the attractive property that -an adversary capable of subverting the governance process -would necessarily be powerful enough -to subvert the honest majority assumption in individual Keeps. -This means that rekeying is robust against attacks -unless the network as a whole is compromised. - -It is not immediately clear whether service contracts should -completely block operator contracts disabled with the panic button, -or only deprecate them without regard for the normal limitations. - -Rate-limiting the Panic Button can help prevent total DoS -if the panic button is ever compromised, -but also permits flooding the system with malicious operator contracts -unless the Registry Keeper is similarly rate-limited. diff --git a/docs-v1/rfc/rfc-12-keep-network-interface.adoc b/docs-v1/rfc/rfc-12-keep-network-interface.adoc deleted file mode 100644 index adf0ed035a..0000000000 --- a/docs-v1/rfc/rfc-12-keep-network-interface.adoc +++ /dev/null @@ -1,194 +0,0 @@ -:toc: macro - -= RFC 12: Keep Network application interface - -:icons: font -:numbered: -toc::[] - - -== Proposal - -This document specifies how applications interact with Keep Network. - -=== Terminology - -Application:: Application is an external smart contract or a set of smart - contracts utilizing functionalities offered by Keep Network. - -a keep:: A keep is a smart contract used by an application to perform some work. - It is a privacy primitive enabling secure storage and usage of secrets. - -sMPC cluster:: A keep can have off-chain clients executing work for a keep. - Off-chain clients serving a keep together form an sMPC cluster. - An sMPC cluster observes state of a keep and reacts appropriately. - -Keep Network:: The Keep network consists of all stakers, all keeps and - associated sMPC clusters, and the random beacon. - -KEEP:: KEEP is an ERC-20 work token used to stake in the Keep network. - A minimum staked value is required for operator to join sMPC cluster. - -Keep Core:: Keep Core consist of a set of on-chain contracts and off-chain - sMPC cluster providing the functionality of random beacon - and KEEP token along with all stake management interfaces. - -tECDSA:: Threshold Elliptic Curve Digital Signature Algorithm. - -Bond:: A bond is collateral provided by a keep operator that disincentivizes - collusion and misbehavior. Bond may get slashed or seized in case of - malicious behaviour of the operator. - -=== Goal -The goal of this proposal is to specify the interface between an application and -the keeps atop which the application is built. This proposal specifies the -mechanism of creating and registering keeps. This proposal introduces two types -of keeps: tECDSA keep and Bonded tECDSA keep. Those keeps are just the first -two types of keeps which are going to be offered by Keep Network. -All components described in this proposal meet the requirements described in -the <> addressing -upgradeability mechanics. - -==== sMPC cluster requirements - -Each off-chain client of sMPC cluster should be a separate process. Keep Core -client should be a separate client than Keep tECDSA client: -``` -./keep-core -./keep-tecdsa -``` - -(The above snippet is just an example for the first keep type) - -Each staker is required to run Keep Core client. Running Keep tECDSA client is -optional. Eventually, we hope other developers will build their own clients. - -==== Bonding requirement - -Some applications requires a bond to be provided by stakers. Stakers who want to -participate in the given protocol need to opt-in and provide the required bond. -A bond can be provided in ETH or ERC-20 token specific to the application. - -=== Types of keeps - -There are two first types of keeps that are going to be offered by Keep Network: -tECDSA keep and bonded tECDSA keep. - -tECDSA keep:: tECDSA keep is a type of a keep allowing to sign data with - a uniquely generated private key for each new keep instance. Key - generation and signing are based on trustless, threshold protocols - executed by groups of signers forming an sMPC cluster for this - type of a keep. - -bonded tECDSA keep:: bonded tECDSA keep is a tECDSA keep with an extra bonding - logic over a vanilla tECDSA keep. Each staker being a part - of sMPC cluster for this type of keep needs to provide an - extra bond required for each new instance of bonded tECDSA - keep. The bond can be slashed as a result of inactivity or - misbehaviour during tECDSA key generation or signing. - -=== Implementation - -==== Keep factory - -Keep factory is a smart contract used to create instances of a keep of a certain -type. Each type of keep has a separate keep factory. Each keep factory is an -operator contract and has to be sanctioned by stakers as such. Application -developers may interact with factory directly if they decide to. The network -can not guarantee that old factories will be still backed up by enough stakers, -though. - -==== Vendor - -A vendor is a smart contract with which the application interacts to obtain the -new instance of a keep of the given type backed by enough stakers so that all -operations on the created keep can go smoothly. Vendor interacts with keep -factories choosing the one most recent if it is backed by enough stakers. Each -vendor is a service contract and does not have to be sanctioned by stakers. Each -vendor can operate on several versions of keep factory to allow for a smooth -upgrade process. - -==== Keep registry - -The keep registry serves the role of the master list (see RFC 11 for more details) -and tracks sanctioned staking contracts, operator contracts (including keep -factories) and vendors. It ensures that only approved contracts are used. -A new type of keep can be added without upgradeable registry. - -=== Pseudocode - -==== ECDSA keep vendor -``` -contract ECDSAKeepVendor { - address[] internal _factories; - - function openKeep( - uint256 threshold, - uint256 groupSize, - address owner - ) returns (address) { - address factory = selectFactory() - return ECDSAKeepFactory(factory).openKeep( - threshold, groupSize, owner - ) - } -} -``` - -==== ECDSA keep factory -``` -contract ECDSAKeepFactory { - function openKeep( - uint256 threshold, - uint256 groupSize, - address owner - ) returns (address) { - address keep = new ECDSAKeep( - selectGroup(threshold, groupSize), - owner - ); - - return keep; - } -} -``` - -==== ECDSA keep -``` -contract ECDSAKeep { - - function sign() { - require(msg.sender == _owner, "Only keep owner can ask to sign"); - // (...) - } -} -``` - -==== Keep registry -``` -contract KeepRegistry { - - function getKeepVendor(string keepType) address { - // (...) - } -} -``` - -==== Application -``` -contract Application { - address internal _keepRegistry; - - function openDeposit() { - address vendor = KeepRegistry(_keepRegistry).getKeepVendor("ECDSA") - vendor.openKeep( - threshold, - groupSize, - bond - ); - - // (...) - } -} -``` - diff --git a/docs-v1/rfc/rfc-13-continuous-delivery.adoc b/docs-v1/rfc/rfc-13-continuous-delivery.adoc deleted file mode 100644 index 551a037d2c..0000000000 --- a/docs-v1/rfc/rfc-13-continuous-delivery.adoc +++ /dev/null @@ -1,299 +0,0 @@ -:toc: macro - -= RFC 13: Continuous Delivery - -:icons: font -:numbered: -toc::[] - -[abstract] -.Abstract - -Here we present a continuous delivery method for a service or services running -in a Kubernetes cluster. It is expected that one or more of these services -has Ethereum contracts developed alongside the service. It is expected that -there is a relationship between service and contract to a degree that we must -ensure both service and contract are deployed continuously. The entirety of the -solution is targeted at development and test environments. The requirements for -utilizing the outlined approach in production will not be covered here. Our one -and only service at this time is the keep-client. The RFC will focus on the -keep-client as a result, however the solution is applicable outside the -keep-client. This RFC requires a basic understanding of Kubernetes objects. - - -== Background - -There are *three* parts to deployments with keep-clients: - -*Service Code and Service Configuration:* - -Deploying manually is a pain in the ass, even at a few client deployments (5) the -manual process is untenable. It's possible to manage this manually at such a low -number of clients though you run a non-trivial risk of human error and deployment -step repetition as as result. This has an adverse effect on both the engineering -experience and time efficiency. - -When scaling the solution beyond 5 clients manual configuration becomes untenable -regardless of due-diligence. - -*Contract Code:* - -The keep-client service leans on a collection of Ethereum contracts that are in -development alongside the service. When contracts are changed they have to be -deployed to the Ethereum network that the keep-clients are connecting to. - -This arrangement creates a dependency between the service configuration and -contract code on a couple levels: - -1. keep-client configuration files require contract addresses. These addresses -change when contracts are updated. This means we need to be aware of contract -changes on the keep-client configuration side and make sure keep-client -configuration files get updated contract addresses. - -2. We can assume keep-client code will be updated to utilize the latest contract -functionality. We can assume that this may or may not break keep-client -behavior if the service is deployed against old contracts. This can potentially -happen the other way around as well, where an updated contract is deployed and -removes/changes functionality an old keep-client can't deal with. Therefore -we must ensure both keep-clients and Keep contracts get deployed together, -contracts before clients due to client startup behavior. - -=== Sample keep-client Service Configuration File - -*Bootstrap Peer* -``` -# This is a TOML configuration file for DKG, P2P networking and connection to Ethereum - -# Provider Initialization Example - -[ethereum] - URL = "ws://eth-host:ws-port" - URLRPC = "http://eth-host:rpc-port" - -[ethereum.account] - Address = "0x6299496199d99941193fdd2d717ef585f431ea05" - KeyFile = "path/to/in-use/keyfile" - -[ethereum.ContractAddresses] - # Hex-encoded address of KeepRandomBeaconOperator contract - KeepRandomBeaconOperator = "0x6299496449d11141193fdd2d717ef585f431er02" - # TokenStaking - Staking = "0x6297776199d99942293fdd2d717ef585f431er03" - -# Bootstrap node creating a new network. - [LibP2P] - Seed = seed-number-for-id-generation - Port = keep-client-port - -``` - -*Standard Peer* -``` -# This is a TOML configuration file for DKG, P2P networking and connection to Ethereum - -# Provider Initialization Example - -[ethereum] - URL = "ws://eth-host:ws-port" - URLRPC = "http://eth-host:rpc-port" - -[ethereum.account] - Address = "0x6299496199d99941193fdd2d717ef585f431ea05" - KeyFile = "path/to/in-use/keyfile" - -[ethereum.ContractAddresses] - # Hex-encoded address of KeepRandomBeaconOperator contract - KeepRandomBeaconOperator = "0x6299496449d11141193fdd2d717ef585f431er02" - # Hex-encoded address of TokenStaking contract - Staking = "0x6297776199d99942293fdd2d717ef585f431er03" - -[LibP2P] - Peers = ["comma separated list of bootstrap peers"] - Port = keep-client-port - -``` - - -=== Current Functionality - -We currently have a single cloud environment (`keep-dev`) that is in a mixed state of -continuous delivery and manual configuration. Current functionality will be -outlined as the "three parts" described in Background. - -*keep-client Service Deployment:* - -keep-client service deployment is done automatically whenever code is merged to -master. This is facilitated by a lightweight tool called https://keel.sh/[Keel] that runs -in the Kubernetes cluster. This is a pull based deployment mechanism where Keel -is subscribed to our container registry and listens for publish events. On image -publish Keel checks Kubernetes deployments for annotations and matches labels set -there for what should be deployed. On match Keel pulls the image and does a -deployment. - -- Keel Infrastructure: https://github.com/thesis/infrastructure/tree/master/terraform/modules/gcp_pull_deploy[Keel Terraform Module] -`keep-dev` -- Keel Implementation: https://github.com/keep-network/keep-core/blob/master/infrastructure/terraform/keep-dev/main.tf#L186-L201[keep-dev Terraform main.tf] - - -*keep-client Configuration:* - -Our first goal was to separate service configuration from the service image. -This exists in the form of each deployed keep-client having its own Kubernetes -ConfigMap. This allows for the use of a "standard" keep-client service image -across all deployed keep-clients. There are two pieces of data that make up a -keep-client ConfigMap: - -1. keep-client-config.toml -2. Ethereum keyfile - -Configuration of the data that populates the ConfigMaps and ConfigMaps themselves -are updated *manually*. - -- Maintenance log and Kubernetes CRUD commands: https://github.com/keep-network/keep-core/blob/master/infrastructure/kube/keep-dev/kube-setup.org[kube-setup] -- keep-client config files: https://github.com/keep-network/keep-core/tree/master/infrastructure/kube/keep-dev/keep-client/config[keep-client.toml] - -*Ethereum Contract Deployment:* - -Ethereum contracts and subsequent steps are managed against `keep-dev` *manually*. -This is done from a local machine on the `keep-dev` VPN using Truffle. - -It's worth noting that when contracts are deployed we need to do the following: - -1. Ensure Ethereum accounts are unlocked. -2. Stake Ethereum accounts with KEEP tokens. -3. Update the keep-client configuration files and ConfigMaps with new contract - address. (see previous section) -4. re-deploy keep-clients. - -Sample Commands: - -```shell -# migrate contracts -truffle migrate --reset --network keep_dev - -# unlock ETH accounts -KEEP_ACCOUNT_PASSWORD=eth-account-passphrase \ - truffle exec ./unlock-eth-accounts.js --network keep_dev - -# stake ETH accounts -truffle exec ./delegate-tokens.js --network keep_dev -``` - - -== Proposal - -To bring parts `Ethereum Contract Deployment` and `keep-client Configuration` -into automated configuration such that they can be continuously deployed with -the already automated `keep-client service` deployment. - -=== Goal - -To automatically provision the `keep-dev` environment on master merge with all -appropriate configurations and app code without human intervention. - -=== Implementation - -To reiterate: The implementation will aim to automate -`Ethereum Contract Deployment` and `keep-client Configuration`. -`keep-client service deployment` is already automated via Keel. - -==== Part 1: Contract Migration - -Either a new workflow or new jobs to existing workflow will be added to the -`keep-core` circle config. Before image publish on master merge Circle -will run this workflow/job to trigger a script that will: - -- migrate all contracts - -- Copy compiled contract JSON to Circle and store in a Workspace for persistence - in the `InitContainer` image. - -- Here we must implement an access point for Circle into the private Kubernetes - cluster. We can do this with the `gcp_push_deploy` Terraform module. - -==== Part 2: keep-client Preparation - -On each keep-client Kubernetes deployment we'll run an `InitContainer` that does -the following: - -- create ETH account -- unlock ETH account -- stake ETH account -- write contract addresses, ETH host/port, bootstrap peer addresses to config - template -- write configuration file and ETH account keyfile to a persistent volume -- mount configuration file / keyfile persistent volume to keep-client deployment - -The `InitContainer` will operate exclusively on the ETH account and assigned to the -`keep-client` being deployed. If there are 100 `keep-client` Kubernetes -deployments, there would be 100 `InitContainer` instances unlocking and staking -for each of the assigned ETH accounts. This is infinitely scalable (system -resources aside) and reduces `unlock + stake` time to a ceiling of the time it -takes to operate on a single account. - -The `InitContainer` will have a copy of each Keep contracts compiled JSON. The -files will be used to fetch contract ABI's for account staking and contract -addresses for configuration file setup. The updated configuration values will be -fed into a complete `keep-client` configuration template and stored in a Kubernetes -persistent volume. This volume will be mounted to the `keep-client` deployment -where the config can be passed via command line argument on service start. - -For now we're going to bake a custom image for the `InitContainer` with the script -for doing ETH account creation, unlock and stake, and keep-client configuration. -This will be checked into the `keep-core/infrastructure/kube` directory. - -==== A Note On Configuration Value Scope - -We provide configuration values via environment variables at two points in this -process: Circle contexts and Kube deployment configuration files. - -We have *environment* and *client* properties. Where some N configuration values -are of context/properties environment and some are of context/properties client. -Environment properties - -An example: - -Using the *environment*/*client* context to organize configurations we can draw a -line at where config values get populated. - -`ETH_HOSTNAME` is a property of the environment, where `KEEP_CLIENT_ETH_ACCOUNT` -is a property of a client (because we’ve assigned it so). - -Environment context property `ETH_HOSTNAME` gets configured at the Circle context -level and baked into the `InitCointainer` and `KEEP_CLIENT_ETH_ACCOUNT` -gets configured on the Kube deployment. - - -=== Limitations - -- It requires Kubernetes -- It requires Keel -- It require CircleCI -- It requires Truffle -- All contracts are migrated, can't be selective -- No rollback mechanism if things go sideways -- No order to which type of keep-client gets deployed first (bootstrap vs standard) - -=== Proof of Concept - -`keep-dev` is running Keel. Code is already referenced. - - -== Future Work - -Open - -== Open Questions - -Open - -[bibliography] -== Related Links - -- https://www.flowdock.com/app/cardforcoin/tech/threads/oa1X0y9kQqUBwxd4gwgdu7Rs5O2[Consul discussion] -- https://www.flowdock.com/app/cardforcoin/keep/threads/zzxutnh8USazp5U8cC6lNIDu7gI[Contract Migration discussion] -- https://www.flowdock.com/app/cardforcoin/tech/threads/LFkufyZX1RBawClTZp6kO0raeq0[Testing discussion] -- Various Github Issues discussing one or more of the 3 deployment parts outlined here: - - https://github.com/keep-network/keep-core/issues/721[CircleCI Config Work] - - https://github.com/keep-network/keep-core/issues/618[keep-client Configs to ConfigMap] - - https://github.com/keep-network/keep-core/issues/667[Keel implementation via Terraform] diff --git a/docs-v1/rfc/rfc-14-token-grants.adoc b/docs-v1/rfc/rfc-14-token-grants.adoc deleted file mode 100644 index dbc8991dd6..0000000000 --- a/docs-v1/rfc/rfc-14-token-grants.adoc +++ /dev/null @@ -1,739 +0,0 @@ -:toc: macro - -= RFC 14: Token grants - -:icons: font -:numbered: -toc::[] - -== Background - -A token grant represents a gradual transfer of KEEP tokens -from the grant creator to the _grantee_. -The difference between these _grant tokens_ and ordinary _liquid tokens_ is -that grant tokens cannot be transferred away from the grant -before their ownership is fully transferred to the grantee -according to a _vesting schedule_. - -In addition, some grants will be _revocable_ -so that the grant manager can _revoke_ the remaining grant -and the remaining unvested tokens -will return to an address specified by the grant manager. - -=== Use-cases and expected characteristics - -Keep Org uses token grants widely, -to distribute tokens to investors and to reward employees. - -Investors' token grants limit the amount of liquid tokens -that could be dumped on exchanges to make a quick profit, -and incentivize holders to stake instead. -A typical investor's grant vests in two years, -but six-month and one-year grants are also used. -Investor grants are non-revocable. - -Employees' token grants replace traditional startup equity, -and need to support vesting cliffs and revocability. -Employees' opportunities to stake early are less important -and may even be contractually restricted -to prevent various conflicts of interest. - -=== Staking token grants - -The grantee should be able to use their grant tokens for staking, -but they should not be able to withdraw them prematurely. -This presents various problems in practice. - -==== Tattletale transfer - -In the Keep network, -staked tokens are used as collateral to enforce correct behavior. -When staker _Alice's_ misbehavior is proven on-chain, -some of her staked tokens will be _slashed_ as a punishment. -Slashing can mean either _burning_ the tokens, -effectively returning their value to all other token-holders; -or _seizing_ the tokens to the contract imposing the punishment -so they can be redistributed according to the contract's rules. - -In some cases, detecting and penalizing Alice's misbehavior -will require collaboration from another staker, _Bob_. -To incentivize Bob to prove Alice's misbehavior, -the network entitles him to a _tattletale reward_, -a fraction of Alice's slashed tokens. - -However, if this _tattletale fraction_ is sufficiently high, -a new type of attack emerges: -if Alice and Bob are secretly the same party, -they can reclaim the tattletale reward by tattling on themselves. -In this situation, -a _tattletale transfer_ from Alice to Bob happens. - -Tattletale transfers (or _t-transfers_ for short) -can bypass many limits ordinarily in place. -Tokens can be transferred between stakers -without waiting for the normal unstaking time-lock to release, -and deterrent to misbehavior can be significantly reduced. -With token grants, the most relevant consideration is that -tattletale transfers could be used to extract unvested tokens from a grant. -Any scheme for staking grant tokens -must be able to prevent such _premature withdrawals_ -from significantly undermining the integrity of the grant. - -===== Limiting tattletale transfer: minimum burn fraction - -By burning most (e.g. 95%) of slashed tokens, -the efficiency of tattletale transfer can be significantly constrained. -If Alice proves Bob's misbehavior and Bob is penalized by 100 KEEP, -at least 95 KEEP would be destroyed and at most 5 KEEP transferred to Alice. - -This serves two goals. -First, Bob cannot efficiently withdraw unvested tokens -through tattletale transfer. -With a 95% minimum burn, -only 1/20 of the slashed tokens can be t-transferred. -On a 24-month grant this represents an amount -that would vest in 1.2 months or roughly 37 days, -at the cost of the entire rest of the grant. -As the remaining vesting time grows shorter, -this "advance withdrawal window" also grows narrower. - -Second, limiting tattletale transfer efficiency -makes certain types of misbehavior more costly or less profitable. -Burning tokens benefits all token-holders -equally in proportion to how many tokens they own, -while an adversary who expects to be caught -can always collect the tattletale rewards -from proving their own misbehavior. - -With a high tattletale transfer efficiency -(80% for the sake of illustration) -Alice and Bob could collaborate to misbehave and collect the tattletale reward, -reducing the effective deterrent very significantly. -If Alice and Bob together own 30% of the token supply, -they would only suffer 14% of the nominal punishment: -Alice would collect 80 KEEP as her tattletale reward -and their remaining holdings would indirectly accrue -30% of the value of the burned 20 KEEP (6 KEEP). -With a 95% minimum burn Alice and Bob could only recoup 33.5%: -5 KEEP as tattletale reward and 28.5 KEEP indirectly (95 KEEP * 0.30). - -Similarly, if Alice has compromised Bob's operator keys -she could use tattletale transfer to steal Bob's stakes. -It is desirable that compromised operators' stakes can be stolen, -but it is also desirable to limit the fraction of the token supply -owned by proven malicious parties. -Some have estimated that 5% of all BTC have been stolen. -If a similar amount of KEEP were to be stolen from compromised operators, -with a 95% minimum burn -the thieves would only represent 0.25% of stakeable tokens. - -===== Limiting tattletale transfer: locking tattletale rewards - -As a further obstacle to "advance withdrawals" via tattletale transfer, -all tattletale rewards could be locked for a time -equal to the unstaking time (e.g. 3 months). -With a 95% minimum burn and 3 month lock on tattletale rewards, -the amount that can be "advance withdrawn" with tattletale transfer -is less than the amount that would vest by the time the tokens are freed -for grants vesting in less than 60 months. - -==== Revocable grants and illusory stake - -If Alice is expecting her grant to be revoked in the near future, -the value of her unvested tokens at that time is effectively zero. -This _illusory stake_ significantly weakens the effective deterrent -when staking with revocable grant tokens. - -==== Trusted staking contracts and upgrading them - -If unvested grant tokens can be staked, -staking contracts are privileged towards grants; -the grant contract trusts the staking contract not to behave in certain ways -without being able to enforce it. -If a grantee could stake their grants on arbitrary contracts, -they could make up their own "staking contracts" -that exploit grant staking to the maximum possible extent. - -This presents a problem with upgrades. -The RFC 11 upgrade process consists of Keep Org deploying a new staking contract -and stakers migrating their stakes by unstaking and re-staking. -The token grant scheme must not prevent staking upgrades -while grants are active, -but the addresses of future staking contracts are unknown. - -=== Previously considered schemes - -==== Unlimited stake-ahead - -In the unlimited stake-ahead model, -grantees can instruct the grant contract -to stake all of their grant tokens -by transferring an equal amount of liquid tokens to the staking contract. -The grant contract acts as the _owner_ of the tokens; -grantees nominate the _operator_, _beneficiary_, and _authorizer_, -and can acquire rewards from operating with the stake as collateral. -Upon unstaking the tokens are returned to the grant. - -The grant contract can be unprivileged, -affecting only the security of tokens involved in grants, -and no special considerations are required in the staking contract. -However, unlimited stake-ahead provides no protection from t-transfer abuse -or illusory stake. - -==== Limited stake-ahead - -In the limited stake-ahead model, -grantees can only stake tokens that would vest within the unstaking time. -The grantee can be assigned as the owner, -as the amount of tokens that become liquid upon unstaking -equals or is less than the amount -they would have otherwise been able to withdraw from the grant. - -Limited stake-ahead preserves normal incentives with non-revocable grants -but doesn't protect against illusory stake. -It also places short grants in a significantly more favorable position -as they can stake their tokens earlier. - -==== Grant tokens as a separate type of collateral - -If the special status of grant tokens is maintained when staking, -any tattletale rewards would simply consist of another grant, vesting over time. -This prevents premature withdrawals with t-transfer, -but doesn't address illusory stake. - -Recognizing grants as valid collateral -makes the grant contract a part of the security-critical core; -if someone could arbitrarily manipulate the grant contract -they would be able to create unlimited amounts of forged collateral. -Additionally, calculating correct vesting times is complex -as grants are split by slashing and tattletale transfers. - -==== Enforcing invariants with a staking proxy - -If a separate staking proxy is established -between the grant contract and staking contracts, -the grant contract could transfer liquid tokens to the proxy -which then enforces the desired _staking invariants_ -on arbitrary staking contracts. -This protects the integrity of grants -by making staking contracts unprivileged, -and the effectiveness of t-transfer could be limited by the right invariants. - -If the majority of slashed tokens are burned -and only a small fraction can be seized -and possibly used as a tattletale reward, -t-transfer becomes dramatically less abusable. - -However, a staking proxy has to -duplicate large parts of staking contract functionality, -and cross-contract calls make staking operations more expensive. -Behavior defined in the proxy is permanently immutable -unless the proxy itself is upgradeable. - -== Proposal - -Non-revocable token grants are staked with unlimited stake-ahead, -by transferring liquid tokens from the grant contract -to a staking contract authorized by the grant's manager, -appointed by the grant creator upon grant creation. -Revocable grants can't be staked through the grant contract; -instead, vested liquid tokens can be withdrawn and staked normally. - -_Authorized staking contracts_ are assumed to enforce the invariants -a particular grant's manager wants enforced. -For the use of Keep Org's grants, -this consists of a _minimum burn fraction_ of 95%: -when a staker is slashed, -at least 95% of the tokens are burned and at most 5% are seized. - -Authorized staking contracts are identified -using a two-role authorization from RFC 11: -the grant manager can authorize contracts from a global master list -of staking contracts sanctioned by the governance structure. - -Upgrades to staking contracts are accommodated -by providing a way for the grant contract -to pass arbitrary instructions from the grantee to the staking contract. - -=== Goal - -Unprivileged grant contract:: -The security of the Keep network as a whole should be unaffected -even if the grant contract were to execute arbitrary malicious code. - -Upgradeable staking contract:: -The grant scheme should not prevent future improvements to the staking scheme -as defined in RFC 11. - -Fair grant staking:: -The recipient of a non-revocable grant -should be able to stake with the full grant. -A grant's vesting schedule should only determine -the amount of liquid tokens the grantee could withdraw at a given time. - -Limited tattletale transfer:: -Abusing tattletale transfer to violate the rules of a token grant -should provide little benefit at a significant cost. - -No illusory stake:: -The need for a reliable deterrent to misbehavior is prioritized -over revocable grantees' opportunity to obtain staking rewards. - -=== Implementation - -A token grant represents a gradual transfer of KEEP tokens -from the creator of the grant to the _grantee_ (grant recipient). - -A token grant is characterized by its _basic parameters_ -and its _vesting schedule_. - -==== Basic parameters - -The basic parameters of a token grant -include the _grant manager_, -the _grant recipient_, -the _grant amount_ -and the _revocability_ of the grant. - -Grant manager:: -The address appointed to manage the grant. -If the grant is irrevocable, -the grant manager may determine the _authorized staking contracts_ -the grant can be staked on. -If the grant is revocable, -the grant manager may revoke the grant. - -Grant recipient:: -The address of the party receiving the grant. -The recipient may withdraw vested tokens from the grant, -or stake non-revocable grant tokens. - -Grant amount:: -The number of tokens involved in the grant. - -Revocability:: -Whether the grant is revocable (_True_) or non-revocable (_False_). - -===== Revocability - -Token grants may be _revocable_ or _non-revocable_. -A non-revocable grant represents an irreversible transfer of tokens -that, once initiated, cannot be stopped or altered. -A revocable grant represents a conditional transfer, -subject to continuing consent of the grant manager. -The grant manager can revoke a revocable grant at any time. -If a grant is revoked, -all unvested tokens are returned to an address specified by the grant manager. -Vested tokens remain in the grant -and are available for the grantee to withdraw. - -==== Vesting schedule - -Tokens in a grant are locked until _vested_ -according to a linear schedule defined by -the _starting time_, -_grant duration_ -and the _vesting cliff_. - -Tokens in the grant start vesting at the starting time, -becoming available for withdrawal gradually over the grant duration. -The vesting cliff denotes the earliest time -tokens can be withdrawn from the grant. - -Vested tokens that aren't otherwise in use -can be withdrawn at the grantee's discretion. - -Starting time:: -The time the grant begins vesting. -The starting time of a grant -may differ from the exact time the grant creation transaction is processed. - -Grant duration:: -Time after starting until the grant is fully vested -and all tokens may be withdrawn. - -Vesting cliff:: -The earliest time after starting tokens can be withdrawn from the grant. - -==== Creating a token grant - -A token grant is created by submitting a transaction -defining the _basic parameters_ and the _vesting schedule_, -and transferring the _grant amount_ of tokens to the grant contract. - -===== Example - -Alice wants to transfer 1,000 KEEP to Bob and Carol each. -Bob should receive his tokens over 12 months, -and be able to start withdrawing tokens after 1 month. -Carol's grant should be revocable, -lasting 24 months with a 6 month vesting cliff. - ----- -Grant 1 -Manager: Alice -Recipient: Bob -Amount: 1,000 KEEP -Starting time: T_0 -Duration: 12 months -Vesting cliff: 1 month -Revocable: False - -Grant 2 -Manager: Alice -Recipient: Carol -Amount: 1,000 KEEP -Starting time: T_0 -Duration: 24 months -Vesting cliff: 6 months -Revocable: True ----- - -==== Grant status - -When a grant is created, -all grant tokens start unvested and unstaked. - -Over time, grant tokens will vest -and become available for withdrawal as liquid tokens. -_Vesting status_ is calculated implicitly -from the vesting schedule and the current time. - -Grant tokens can be withdrawn once vested. -Non-revocable grant tokens can also be staked, -and staked tokens can be lost as punishment. -The _usage status_ of a grant's tokens tracks these developments. - -===== Vesting status - -All grant tokens are either _vested_ or _unvested_. -The vested amount at some time -represents the maximum number of tokens that may be withdrawn at that time. -Grant tokens vest linearly over the grant duration; -when half of the grant duration has elapsed -50% of the grant tokens will have vested, and so on. -However, until the vesting cliff is reached, -the number of vested tokens is fixed at zero. - -The amount of vested tokens at time `time_now` is calculated as follows: - -[source, python] ----- -time_elapsed = time_now - time_starting -cliff_reached = time_now >= vesting_cliff - -if cliff_reached: - vested_fraction = time_elapsed / grant_duration -else: - vested_fraction = 0 - -vested_tokens = grant_amount * vested_fraction ----- - -3 months in, Bob's vesting cliff has been reached, -so the amount of vested tokens in Bob's grant equals -`1000 KEEP * (3 months / 12 months) = 250 KEEP`. -Carol's 6-month vesting cliff has not been reached; -if it had, her grant would have -`1000 KEEP * (3 months / 24 months) = 125 KEEP` -available for withdrawal. - -===== Usage status - -The _usage status_ of a grant's tokens consists of -_available_, _withdrawn_, _staked_, and _slashed_; -all grant tokens fall within one of these categories. - -_Withdrawn_ means tokens that have vested -and been withdrawn from the grant as liquid tokens. -The number of withdrawn tokens is tracked in its own entry, -which is updated whenever a successful withdrawal is performed. - -_Staked_ grant tokens are actively being used -as collateral for staking. -The number of staked tokens is calculated -by summing the _staked amount_ in each individual _grant stake_ of the grant. - -_Slashed_ grant tokens were staked and have been lost in a penalty. -The grant tracks the number of slashed tokens explicitly. -When a grant stake has finished unstaking and its tokens are returned, -the difference between the returned amount and the original stake -is added into the slashed tokens. -With revocable tokens, the _slashed_ status is used for revocation. - -Tokens in the grant that aren't _withdrawn_, _staked_, or _slashed_ -are _available_ by default. -Available grant tokens can be withdrawn if the vesting schedule permits, -or staked if the grant is non-revocable. -The number of available grant tokens is calculated -by subtracting _withdrawn_, _staked_ and _slashed_ tokens -from the grant amount. - -===== Grant stakes - -When non-revocable grant tokens are staked, -some relevant information is stored in a _grant stake_ entry. -Each non-revocable grant maintains a list of its grant stakes. - -A grant stake entry includes -the _staking contract_ used for the stake, -the _operator address_ of the stake, -and the _staked amount_ originally transferred to the staking contract. -Grant stakes can be uniquely addressed by the pair -`(staking_contract, operator_address)`. - -A grant stake entry is erased -when its corresponding stake has finished unstaking -and its tokens are successfully returned to the owner. - -==== Grant records - -Each token grant is stored in the _grant contract_ as a _grant record_. -The grant record consists of the following: - -* Basic parameters: - * _grant manager_ - * _grant recipient_ - * _grant amount_ - * _revocability_ -* Vesting schedule: - * _creation time_ - * _grant duration_ - * _vesting cliff_ -* Grant status records: - * _withdrawn tokens_ - * _slashed tokens_ - * _grant stakes_ - -==== Staking token grants - -Non-revocable token grants are staked -by instructing the grant contract to stake them -with an _operator_, _beneficiary_ and _authorizer_ appointed by the _grantee_. -The grant contract acts as the _owner_ of the stake. - -Both vested and unvested tokens can be staked -and the rewards collected by the grantee. - -==== Authorized staking contracts - -In the _authorized staking contracts_ model, -grants can be staked in any staking contract -that has been approved by the _grant authorizer_. -The _grant authorizer_ is expected to audit new staking contracts -and verify that they enforce the desired invariants adequately, -before approving them for staking grants. - -When a staking contract has been approved, -the grant contract will trust it to enforce the staking invariants -and any grantee can direct the grant contract -to stake some or all of their _available tokens_ -(not already staked or withdrawn) in the grant. -The grant contract will then transfer the specified amount of tokens -to the staking contract, -along with all other necessary information. -The stake is recorded in the grant contract, -and the staked amount subtracted from the _available tokens_ in the grant. - -The grant contract takes the role of the _owner_ in the staking contract, -while the _operator_, _beneficiary_ and _authorizer_ -are defined by the _grantee_. -Any rewards or punishments to the staker are applied in the staking contract, -without involving the grant contract in any way. - -When the grantee wishes to unstake, -they direct the grant contract -to unstake and reclaim the remaining tokens. -Unstaking and reclaiming tokens -terminates the staker relationship between the _owner_ and _operator_, -and all remaining stake is returned to the _owner_. -Therefore, if the _returned amount_ is less than the original _staked amount_, -the difference has been slashed in punishment -and is recorded in the grant contract as such. -Redelegating grant stakes is not supported. - -===== Option A: registry master as grant authorizer - -In option A, -any staking contract listed on the _registry_ -as a _sanctioned staking contract_ -is automatically authorized for grant staking. - -If the role of the _registry master_ is compromised, -arbitrary "staking contracts" can be authorized. -Existing stakes on legitimate staking contracts are unaffected, -but unstaked irrevocable grants can be emptied. - -===== Option B: global grant authorizer - -In option B, -the grant contract has its own _grant authorizer_ role, -approving staking contracts for all grantees. -All grants share the same authorized staking contracts, -ensuring that the disappearance of the grant manager -does not prevent grantees from staking on new contracts. - -A staking contract can be approved by the grant authorizer -only if it has been _sanctioned_ on the registry. -The authorizations in Option B are similar to -how _service contracts/gateways_ are managed in RFC 11. -As in RFC 11, the compromise of neither the _registry master_ -nor _grant authorizer_ alone can compromise token grants; -both must be compromised simultaneously. - -===== Option C: grant manager as grant authorizer - -In option C, -_grant managers_ authorize staking contracts -for all grants they manage. -Grants with the same _grant manager_ -share the same authorized staking contracts. - -Like in option B, -staking contracts must be _sanctioned_ to be authorized. - -==== Operations on grants - -===== Withdrawing tokens - -_Vested_ tokens that haven't already been _withdrawn_ -can be withdrawn at the discretion of the grantee, if tokens are available. -The amount of tokens that can be withdrawn at a point in time -equals `min(available, (vested - withdrawn))`. - -To withdraw, the _grantee_ requests a withdrawal -and specifies a _withdrawal amount_. - -If the _withdrawal amount_ is equal or less than -the _maximum withdrawal_ at the time, -the grant contract will add _withdrawal amount_ to the _withdrawn_ tokens -and send the grantee _withdrawal amount_ tokens. - -If the _withdrawal amount_ exceeds the _maximum withdrawal_, -the withdrawal will fail. - -===== Staking tokens - -_Available_ tokens can be staked regardless of vesting status. - -To stake, the _grantee_ specifies a _staking amount_, -the _staking contract_ to stake in, -and the _operator_, _beneficiary_ and _authorizer_. -The grantee must also provide a signature from the _operator_ -to operate for the _grant contract_ as the _owner_. - -The _staking amount_ must be -equal or less than the number of _available_ tokens. -The _staking contract_ must be approved by the applicable _grant authorizer_. -If either condition is not satisfied, the staking request will be rejected. -If both conditions are satisfied, -the grant contract will attempt to stake _staking amount_ tokens -at the _staking contract_, -using the supplied _operator_, _beneficiary_ and _authorizer_ addresses. - -The _grant stake_, -consisting of the triplet `(staking_contract, operator, staking_amount)`, -is recorded in the grantee's _grant stakes_. -The _staking amount_ is added to _staked_ tokens of the grant, -reducing the _available_ tokens by the same amount. - -===== Unstaking a grant stake - -At any time, the grantee can request any _grant stake_ to be unstaked. -To unstake, the grantee specifies the _staking contract_ and _operator_ -of the _grant stake_ they wish to initiate unstaking on. - -If the combination of _staking contract_ and _operator_ -matches an active _grant stake_ of the grantee, -the grant contract will request the _staking contract_ to initiate unstaking. -Otherwise, the grant contract will ignore the request. - -===== Reclaiming tokens from an unstaked grant stake - -At any time, the grantee can request any _grant stake_ to be reclaimed. -The grantee specifies the _staking contract_ and _operator_ -of the relevant _grant stake_. - -If the grantee has a matching _grant stake_, -the grant contract will request the _staking contract_ -to return unstaked tokens. -Otherwise, the grant contract will ignore the request. - -If reclaiming the tokens fails, -the grant contract will assume the stake had not finished unstaking -and will not modify the _grant stake_ information. - -If reclaiming the tokens succeeds, -the grant contract will note the _returned amount_. -If the _returned amount_ matches the original _staking amount_, -the _returned amount_ is subtracted from _staked_ grant tokens -and added to _available_ grant tokens. -If the _returned amount_ is less than the original _staking amount_, -the _difference_ is added to _slashed_ grant tokens, -the _staking amount_ is subtracted from _staked_ grant tokens, -and the _returned amount_ is added to _available_ grant tokens. -In either case, the _grant stake_ is removed. - -===== Revoking the grant - -A revocable grant can be revoked at any time by the grant manager. -Revoking a grant slashes its unvested tokens, -transferring them to an address specified by the manager. - -Grants are revoked by submitting a transaction -specifying the grant to be revoked -and the recipient address. - -The grant contract checks that the grant exists, -is revocable, -and the transaction was sent by the grant manager. - -A revocable grant cannot be staked, -so the slashed amount on a revocable grant shows whether it has been revoked. -If the grant already has slashed tokens, -it has been revoked earlier and the repeat revocation is ignored. - -If the checks pass, -the amount of unvested tokens in the grant is calculated. -The _unvested amount_ is added to the _slashed_ grant tokens -and transferred to the recipient address. - -=== Limitations - -Without TATTLETALE_LOCK, -grantees can abuse t-transfers to withdraw more than the vested amount -although at the expense of the remaining grant - -Even with TATTLETALE_LOCK, revocable grants can still be overwithdrawn -if any level of stakeahead is permitted - -=== Proof of Concept - -If you have PoC code, refer to the relevant branch and give a brief summary. - -== Future Work (optional) - -If applicable, what future evolutions could you see this approach leading to? -Particularly if these possibilities influenced your thinking about the main -proposal, this is important. - -== Open Questions (optional) - -Should TATTLETALE_LOCK be implemented, -or is the loss of MINIMUM_BURN_FRACTION sufficient -to disincentivize tattletale transfer - -How to deal with revocable grants: -unlimited stakeahead as with non-revocables, -limited stakeahead, -or no staking of unvested tokens at all - -[bibliography] -== Related Links - -- Flowdock Links -- Other links -- If you have publications, you can include them in bibliography style. If you - start your bullet with an id in _triple_ square brackets (e.g. `+[[[AAKE]]]+`), - you can reference it in the content body using regular cross-reference syntax - (e.g. `+<>+`). diff --git a/docs-v1/rfc/rfc-15-slashing.adoc b/docs-v1/rfc/rfc-15-slashing.adoc deleted file mode 100644 index f6f99a10ff..0000000000 --- a/docs-v1/rfc/rfc-15-slashing.adoc +++ /dev/null @@ -1,447 +0,0 @@ -:toc: macro - -= RFC 15: Slashing - -:icons: font -:numbered: -toc::[] - -== Background - -To incentivize correct behavior in the Keep network, -misbehaving participants need to be punished. -In some situations, -proving misbehavior requires cooperation from another participant, -a _tattletale_. -This coordination is incentivized by rewarding the _tattletale_ -by granting them a fraction of the tokens -taken from the misbehaving participant. - -== Proposal - -=== Goal - -Slashing should be simple to implement and reason about. -The slashing method should implement the tattletale transfer mitigations -defined in the link:rfc-14-token-grants.adoc[token grant RFC], -always burning at least 95% of the penalty amount. - -To protect staker funds, -only authorized operator contracts should be able to punish an operator. - -=== Implementation - -Tokens are staked by transferring them to the staking contract. -The staking contract tracks the stake allocated to each _staker_. -Stakes can be _slashed_ to punish misbehavior. -Tokens backing slashed stakes are burned; -if a tattletale proves another operator's misbehavior -they will receive 5% of the slashed tokens, -the remainder being burned. - -When an operator is punished for misbehavior, -they should generally be removed -from the group/keep the misbehavior occurred in. - -==== Authorization - -_Operator contracts_ are authorized to impose penalties -by stakers' _authorizers_. -All stakers using the same _authorizer_ -share the set of authorized operator contracts. -Once given, this authorization cannot be revoked by the authorizer. - -When a staker wishes to join a group -the contract responsible for creating the group -must be authorized by the staker's authorizer. -The operator contract must check its authorization status -when determining a staker's eligibility. - -In the random beacon a staker's eligibility is checked -when tickets are submitted; -this means that authorization must be checked -when validating a ticket. -If an operator submits a ticket to an unauthorized operator contract, -the ticket must be rejected as invalid. - -==== Penalties - -When an operator misbehaves on-chain, -the operator contract calls the staking contract to punish the operator. -The staking contract checks -that the operator contract is authorized to punish the staker, -and if true, applies the penalty. - -A penalty can be applied to one or more stakers simultaneously. -Each affected staker is penalized by the same amount. - -===== Pure slashing - -When misbehavior is detected without third-party input, -a _pure slashing_ penalty is applied. -Pure slashing means that the staking contract -subtracts the applicable penalty from the operator's stake -and burns tokens equal to the penalty amount. - -===== Seizing - -When a tattletale proves another operator's misbehavior, -a fraction of the penalty amount is _seized_ and transferred to the tattletale, -while the rest is burned. -The tattletale reward can be set to any value -between 0 and the maximum of 5% of the penalty. - -To apply a seizing penalty, -the operator contract includes the tattletale operator's address in the call. -The staking contract subtracts the applicable penalty from the operator's stake -and transfers the reward to the tattletale's _beneficiary_ address. -The remainder is burned. - -===== Penalty amounts - -Penalties for misbehavior could be adjusted -to match the severity of the misbehavior. -However, initially a simple rule should be sufficient: -when `op_contract` imposes a punishment, -the amount slashed should equal -the minimum stake required to participate in operations on `op_contract`. -If contract _Foo_ requires 10,000 KEEP to participate with one virtual staker, -_Foo_ should slash a misbehaving virtual staker by 10,000 KEEP. - -==== Interface requirements - -===== Staking contract: slashing - -`slash(tokens sum, address[] misbehavers)`:: - -Check that `msg.sender` is authorized -to slash each `misbehaver` in `misbehavers`: -`isAuthorized(msg.sender, misbehaver.authorizer) == true`. -+ -Subtract `sum` tokens from the stake of each `misbehaver` -and burn `sum * length(misbehavers)` tokens. - -`seize(tokens sum, float pay, address tattletale, address[] misbehavers)`:: - -Check that `msg.sender` is authorized -to slash each `misbehaver` in `misbehavers`: -`isAuthorized(msg.sender, misbehaver.authorizer) == true`. - -Check that `0 < pay <= 1`. - -Subtract `sum` tokens from the stake of each `misbehaver`; -set `total = sum * length(misbehavers)` and `reward = total * 0.05 * pay`; -burn `total - reward`; transfer `reward` to beneficiary of staker `tattletale`. - -===== Staking contract: authorizations - -`authorize(address op_contract)`:: - -Authorize `op_contract`. -Operators using `msg.sender` as their authorizer -may now join operations on `op_contract` -and `op_contract` may slash their stakes. - -`isAuthorized(address op_contract, address by) -> bool`:: - -Check if the authorizer `by` has authorized `op_contract`. - -===== Token contract - -`burn(amount sum)`:: - -Any address that holds tokens can call `burn(amount sum)` -to burn `sum` tokens, limited by tokens held by the address. - -=== Misbehavior and penalties in the Random Beacon - -==== DKG - -===== Invalid ticket - -An operator might submit an invalid ticket in the DKG. - -Invalid tickets are detected automatically -without the need for a tattletale. - -Proof of invalid tickets is _objective_, -as all information required to verify tickets is available on-chain. - -Because the cost of ticket submission is paid by the submitter, -the ticket can be simply rejected and the transaction reverted. - -===== Failure to produce a DKG result - -The created group might fail to produce a valid result. - -Failure to finish DKG is verifiable without additional proof, -but requires a trigger transaction for this verification -after the deadline for completing DKG has passed. -If no other trigger transaction is made, -the trigger transaction for another DKG shall check -if the previous attempt at DKG has failed to produce a result. - -Failure to finish DKG is _objective_. - -Failure to produce a result means -that a honest and available majority -was not present in the DKG for some reason or other. -The precise reasons can be unpredictable. -Failing to finish DKG is inherently punished -by the opportunity cost of not getting into a signing group -despite having paid the ticket submission fees. -Because of this, -failure to produce a valid DKG result should not be separately penalized -without further examination of the possible causes of failure -and the effects of collective punishment. - -===== Submitting an invalid DKG result - -An operator might submit an invalid result for the DKG. - -Invalid DKG results are detected automatically. - -Proof of invalid DKG results is _objective_. - -Because the cost of verifying a DKG result is paid by the submitter, -and the submitter is reimbursed only for valid results, -submitting invalid results inherently punishes itself -and no further penalty is needed beyond reverting the transaction. - -===== Inactivity in DKG - -An operator might fail to send a required message during DKG. -This lowers the effective safety margin of the group -against lynchpinning and inability to produce a signature. - -Inactivity in DKG is determined by -the list of inactive members in the DKG result submission. - -Unless DKG is performed on-chain, -proof of inactivity in DKG is _subjective_ -and subject to the honest majority assumption; -a dishonest majority could always forge a false proof of inactivity. -It is not possible to make off-chain DKG inactivity objectively provable. - -Inactive members shall be removed from the group, -but not otherwise punished; -the opportunity cost of not being included in the group -already provides an incentive to be active. - -===== Disqualification in DKG - -An operator might misbehave in a variety of ways during DKG. -Active misbehavior can lower the effective safety margin of the group -against frontrunning, lynchpinning, or signature failure. - -Disqualification in DKG is determined like inactivity, -by the list of disqualified members being included in the result submission. - -On-chain proof of disqualification is _subjective_ -and a dishonest majority could forge a false proof. - -Punishing disqualified members based on subjective proof -creates opportunities for dishonest majorities -to attack other stakers -in a way which extends beyond the damage caused by frontrunning the beacon. -Because of this, -punishing disqualified members without objective proof -requires further examination of the associated risks and incentives. - -For the first version, -disqualification shall be treated like inactivity -and only punished with removal from the group. - -==== Signing - -===== Invalid signature share - -An operator may broadcast an invalid signature share to other operators -when reconstructing the threshold signature. - -Invalid signature shares can only be detected on-chain -if a tattletale submits a proof -that includes the signature share and the information required to verify it. - -In the first version, -the infrastructure for verifying these proofs is not yet in place. -Invalid signature shares shall be simply rejected by the other members. - -===== Failing to broadcast a signature share - -When a signing group is tasked with producing an entry, -its members are expected to broadcast signature shares. -An operator might fail to broadcast its signature share, -either due to actual inactivity -or as an attempt to gain a lynchpin position and guaranteed submitter reward. - -Failure of an individual member to broadcast a signature share -can not be reliably detected on-chain, -even in the event the group as a whole fails to produce a signature. -Thus, individual failures to broadcast shares shall not be punished. - -===== Submitting an invalid signature - -An operator may submit an invalid threshold signature on-chain -when generating a beacon entry. - -Invalid signatures are automatically detected. - -Proof of an invalid threshold signature is _objective_. - -As verifying a threshold signature is relatively expensive, -no separate punishment is needed beyond reverting the transaction. - -===== Unauthorized use of individual private key - -An operator's individual private key may be leaked -and used inappropriately. - -Unauthorized use of a member's individual private key -can be proven on-chain by the submission of a suitable proof. - -The first version is not yet able to verify these proofs, -so unauthorized use of individual private keys is not separately penalized. - -===== Creating an unauthorized signature - -An entire signing group's private key could be abused -to create an unauthorized signature. - -Unauthorized threshold signing can be proven by publishing -a value the group hasn't been previously requested to sign, -and a valid signature for the value. - -Proof of unauthorized signing is _objective_. - -Unauthorized signing shall be punished -by _seizing_ tokens from all members, -with the submitter of the proof as the _tattletale_. - -===== Failure to produce a signature - -A signing group may fail to produce a new entry within the deadline. - -Failure to generate an entry can be verified on-chain without a separate proof, -but requires a transaction to trigger this check. - -The proof of failure is _objective_. - -When a group fails to produce an entry, -all of its members shall be subject to _seizing_ -and the group itself shall be terminated. -The submitter of the trigger transaction shall be treated as the _tattletale_, -but the tattletale reward shall be limited to -`min(1, 20 / group_size)` of the maximum, -or effectively the minimum stake of a single member. -This is to prevent actors in a lynchpin position -from profitably stealing other stakers' funds. - -=== Limitations - -Slashing is not limited to the amount originally staked -for participating in the relevant operations; -a malfunctioning operator contract could cause a staker to lose all stake. - -Chain reorganizations may lead to honest behavior in one branch -being punishable misbehavior in another. -Mitigations for this have not been included in this RFC. - -== Future Work - -With a different staking paradigm -that tracks individual keep and group memberships, -it is possible to limit the risk -from malfunctioning operator contracts or trusted applications -to the stake actually corresponding to the operations. - -=== Authorization - -This RFC doesn't cover authorizing individual keeps, -or situations where a trusted application -has the authority to impose a penalty. - -Because authorizations cannot be revoked, -operator contracts can safely cache positive authorization -after the first lookup to the staking contract. -Lack of authorization cannot be cached, -as the operator contract could later become authorized. - -=== Punishments - -==== DKG - -===== Failure to produce a DKG result - -Punishing the failure to produce a DKG result -has interesting implications that could be explored further. - -===== Disqualification in DKG - -Punishing disqualified DKG members on subjective proof -creates opportunities to attack honest stakers -but can also provide a way for compromised groups -to profitably reveal and remove themselves -if seizing on subjective proof is permitted. -The implications and tradeoffs of -concentrated vs. distributed risk are interesting. - -However, disqualification is defined by there being _objective_ off-chain proof, -so the operator contract could be made to verify DKG transcripts -to render DKG disqualification _objective_ on-chain as well. - -Disqualified members must be removed from the group. -If disqualification is objectively proven, -the operator must be punished with _seizing_ their stake. -The submitter of the transaction containing the DKG transcript -shall be the _tattletale_. - -==== Signing - -===== Invalid signature share - -Invalid signature shares can only be detected on-chain -if a tattletale submits a proof -that includes the signature share and the information required to verify it. -If the DKG result includes a merkle root -of each member's individual public key, -this proof can be relatively compact and inexpensive to verify. - -Proof of an invalid signature share is _objective_. - -If the broadcast of an invalid signature share is proven -the responsible operator shall be punished by _seizing_, -with the submitter of the proof receiving the tattletale reward. - -===== Unauthorized use of individual private key - -Unauthorized use of a member's individual private key -can be proven on-chain by the submission of a suitable proof. -The proof must contain the DKG merkle root, -a merkle path to the individual public key, -some value that isn't a requested entry, -and a valid signature of that value with the individual public key. - -Such proof is _objective_. - -Unauthorized use of an individual private key -shall be punished by _seizing_, -with the submitter of the proof as the _tattletale_. - -=== Chain reorganizations - -When chain reorganizations happen, -a honest entry generation in one branch -can be indistinguishable from frontrunning in the other. -It is easy to punish the generation of unauthorized threshold signatures -on values that aren't a part of the entry chain, -and this can serve as a way to incentivize actors -that have compromised the group private key of some group -to destroy the group for immediate profit -instead of covertly frontrunning the beacon. -However, actual frontrunning is more difficult to deal with. - -[bibliography] -== Related Links - -- link:rfc-14-token-grants.adoc[RFC 14: Token grants] diff --git a/docs-v1/rfc/rfc-16-pricing.adoc b/docs-v1/rfc/rfc-16-pricing.adoc deleted file mode 100644 index 60806360c5..0000000000 --- a/docs-v1/rfc/rfc-16-pricing.adoc +++ /dev/null @@ -1,551 +0,0 @@ -:toc: macro - -= RFC 16: Pricing - -:icons: font -:numbered: -toc::[] - -== Background - -The beacon needs to capture enough value to make it self-sufficient. -A method for pricing beacon entries is required, -but many schemes have serious drawbacks -or can be broken by relatively simple third-party contracts. - -== Proposal - -Beacon entries are priced -based on a _cost estimate_ which covers entry verification and DKG, -and a _profit margin_ that scales linearly in group size. -An interface is provided -for customer applications to query the current _entry fee estimate_. -The customer may provide a callback to receive the entry, -and ensure they provide a sufficient _callback allowance_ -to cover the gas fees of the callback. -Any surplus is returned to the customer. - -When a valid entry is submitted, -the submitter receives a _submitter reward_ -and every other member in the signing group receives a _group reward_. -To incentivize submitting an entry, -the _submitter reward_ increases as a request goes unserved -while the _group reward_ diminishes. -Rewards not paid out to the operators -are paid out to requesters to subsidize new requests. - -=== Goal - -A simple method for pricing beacon entries -that doesn't present easy exploitation opportunities. -The pricing method should avoid -the known downfalls of previously considered, more complex, schemes, -such as price discrimination being defeated by callback pooling. - -=== Implementation - -==== Making requests - -When a customer wishes to receive an entry, -they should query the beacon for the _entry fee estimate_ -applicable for their request: -`entry_fee_estimate = estimate_fee(callback_gas_amount)`. -The _callback gas amount_ is the amount of gas required -for the customer's callback to execute successfully; -if no callback is required `callback_gas_amount = 0`. - -The estimate returned is guaranteed to be valid -only for the transaction it is called in, -and for callback gas costs -equal or lower than the provided callback gas amount. -Thus the request should be made immediately after receiving the estimate. -Paying more than the applicable entry fee estimate -has a minimal cost to the requester -as excess fees will be refunded. -Insufficient payment will lead to the request being rejected -and the transaction reverted. - -To make a request after determining the applicable fee -the customer must call the request method on the beacon, -transferring enough currency to cover the fee: -`request_entry.value(entry_fee_estimate)()`. - -If the customer wishes to receive the generated random number in a callback, -they should also specify the _callback address_, _callback function_, -and _callback gas amount_: -`request_entry.value(entry_fee_estimate)(callback_address, callback_function, callback_gas)`. - -No new requests should be made -while the beacon is already processing another request. -Requests made while the beacon is busy will be rejected -and the transaction reverted. - -==== Receiving a request - -If the beacon is already serving an earlier request, -it rejects any new requests -(implicitly refunding the fees by reverting the transactions). - -When the beacon is non-busy and receives a request, -it first checks that the _request fee_ exceeds -the _entry fee estimate_ with the _callback gas amount_ from the request. - -Once the request has been verified to be sufficiently funded, -the beacon select the new signing group. -The selected group is tasked with producing the new entry. - -The request is set as the _pending request_ -including the following information: - -- the _requester address_ - -- the _callback address_, _callback function_, and _callback gas amount_, if applicable - -- the _assigned signing group_{blank}footnote:[This is needed -if changes to the active groups can be made -while waiting for an entry. -] - -- the _submission delay base time_ which equals -the number of the block the request was received in, -plus 1{blank}footnote:[The way of calculating rewards -is inevitably prone to off-by-one errors _somewhere_ -and doing the incrementing at request time seems the simplest. -] - -- the _estimated gas price_ at the time of the request{blank}footnote:[This -means we don't need to assume the price feed remains stable -between the making of the request and the paying out of rewards. -If the gas price feed is guaranteed to not change -until a valid entry is received, this is not necessary. -] - -- the _request fee_ paid - -==== Serving a request - -===== Receiving submissions - -When the assigned signing group has produced a valid entry, -one of its members should submit it to the beacon. -The first member to submit a valid entry is the _submitter_. -_Submission deadline_ is the block number before which the -valid entry must be submitted. - -Submissions that fail verification are ignored. -Repeat submissions for a request that has already been served -should be dropped immediately, -minimizing the gas expenditure. - -If no valid entry has been received by the _submission deadline_, -a submission timeout can be called by anyone. -If the submission times out, -the failing group is terminated and its members slashed. -A new signing group is assigned from the remaining active groups -and the submission delay calculation is reset -by setting the _submission delay base time_ -to the previous _submission deadline_. - -When a valid entry submission is received on-chain -it is emitted in an event, -the requester's callback is called if applicable, -and fees, rewards and refunds are paid out. - -===== Callback processing - -If the requester specified a callback, -the callback is called using the callback gas amount as the maximum gas. - -If the callback gas amount turns to be not enough to execute the callback, -callback execution is skipped and the rest of the relay entry submission code -is processed as usual. - -After the callback is made -the amount of gas spent on the call -is multiplied with the lower of the -_estimated gas price_ at the time of the request, -or the actual gas price of the transaction, -to get the _callback expenditure_. - -The minimum of the gas price protects the beacon and requester against -malicious miner-submitters. - -If the submitter is also a miner, they can place any arbitrary gas -price on the transaction. If the gas price used for calculating the callback -expenditure is higher than the quoted amount and the amount of gas used on the -call is close to the maximum specified by the requester, the requester refund -can go negative. If the negative requester refund is added to the 1% surplus -pool subsidy it can permit the miner-submitter to steal the subsidy. - -On the other hand, if the amount of gas spent on the callback is less than the -provided maximum, a miner submitter can set the gas price to such an amount that -the requester is billed for the entire gas budget even if they really only spent -a small fraction of it. This means a miner submitter can steal the requester's -refund. - -If the callback execution uses more gas than specified in the request, it should -run out of gas. Thus the only scenario where the callback execution can cost more -than was quoted and paid for, is when the gas cost of the transaction exceeds the -quoted estimate (which includes the safety margin mentioned in the gas price feed -section). The submitter is intended to take the hit for submitting with a gas price -that exceeds the estimate. - -===== Requester refund - -After the _callback expenditure_ has been determined, -it is added to the _entry base price_ calculated with the _estimated gas price_ -to get the _actual entry price_. -If no callback was specified in the request the _callback expenditure_ is 0 -and the _actual entry price = entry base price_. - -The difference between the actual entry price and the _requester fee_ -is refunded to the requester, -along with 1% of the _request subsidy pool_ of the beacon. - -===== Paying rewards and operational fees - -The _entry base price_ consists of: -the beacon's nominal _profit margin_ for the entry; -a _DKG contribution_ to cover the cost of creating new signing groups, -amortized over multiple entries per DKG; -and the _entry verification fee_ for the gas costs of entry submission. - -The submitter and other group members are rewarded -based on the _submission delay_; -time from the _submission delay base time_ -to the submission of the valid entry. -The rewards are specified in their own section. - -If the sum of rewards paid out -is less than the _profit margin + entry verification fee_, -the difference is added to the _request subsidy pool_. - -The _DKG contribution_ is added to the _DKG fee pool_, -and the state of the pool is checked. -If the amount in the DKG fee pool equals or exceeds the _DKG cost estimate_, -group creation and a new DKG may be triggered.footnote:[Whether -DKG is actually triggered is open. -Always triggering DKG when the fee pool reaches a given level -doesn't smooth out fluctuations in demand: -a very large number of groups is created when demand is high, -but those groups will expire on schedule if a slump occurs. -A stochastic method for triggering DKG -would permit smoothing out demand fluctuations: -Take the current number of active groups, -divide by a threshold number of groups, -and e.g. square root the result to get a(n insensitivity) number; -Trigger DKG if the entry (interpreted as a number from 0 to 1) -is less than 1 divided by the above number. -If the number of active groups is below the threshold, -this attempts to create a new signing group -every time sufficient funding is present; -with higher demand the number of groups -tends to be proportional to _(number of entries in expiration period)^2/3^_. -] - -==== Rewards - -A _base reward_ for each member of a signing group that produces an entry -is specified in the system constants in the service contract. -The nominal _profit margin_ of each entry -equals the _base reward_ multiplied by the applicable _group size_. - -The exact rewards paid out to operators are based on the base reward -but vary according to _submission delay_ and submitter position. - -If the amount paid out to the signing group in _group rewards_ -and the submitter's _extra reward_ is less than the _profit margin_, -the difference is added to the beacon's _request subsidy pool_ -to incentivize customers to request entries. - -===== Group reward - -The group reward is paid to every member of the signing group, -including the submitter, -upon submission of a valid entry. - -The group reward equals the _base reward_ -multiplied by a _delay factor_ -equaling the fraction of time left by the submission deadline, squared: -_group reward = base reward * delay factor_; -_delay factor = (T~remaining~ / (T~deadline~ - T~begin~))^2^_; -_T~remaining~ = T~deadline~ - T~received~_. - -The delay factor is counted -from 1 in the first block a submission could be published in, -to 0 in the deadline block which doesn't accept any more submissions. - -For example, assume the maximum time to submit is 20 blocks, -the off-chain entry generation protocol takes 5 blocks -and a request is made on block 1000. - -Block 1005 is the earliest block the submission could be published in: -if published in this block the delay factor is 1. -Block 1025 is the deadline block: -no submissions are accepted and the delay factor is 0. - -If the entry is submitted in block 1009, -the delay factor is: -``` -((1025 - 1009) / (1025 - 1005))^2 = 0.8^2 = 0.64 -``` -Thus the _group reward = base reward * 0.64_, -with the difference being the _delay penalty = base reward * (1 - 0.64)_. - -If the submission deadline is reached and the delay factor reaches 0, -the entry submission fails and all group members are penalized. - -===== Submitter reward - -In addition to the _group reward_, -the submitter is reimbursed for gas fees -and receives an extra reward. - -The _submitter reward_ consists of -the _callback expenditure_ to cover the exact cost of the callback; -the _entry verification fee_ to cover the cost of verifying the submission; -and 5% of the _delay penalties_ of the entire group. - -Unlike the _callback allowance_, -the entire _entry verification fee_ is paid to the submitter -regardless of their gas expenditure. -The submitter is free to spend less or more, -keeping the surplus or paying the difference. -This is to incentivize optimizing gas fees. - -To incentivize a race for the submitter position, -the submitter receives _delay penalty * group size * 0.05_ as an extra reward. -With realistic group sizes this is significant, -but not high enough to render certain attacks profitable. -If the group size is 100 and the delay factor is 0.64, -the submitter receives an extra reward of -_base reward * 0.36 * 100 * 0.05 = base reward * 1.8_. -In this scenario the full submitter reward would be -_base reward * (1.8 + 0.64) + callback expenditure + entry verification fee_. - -==== DKG submitter reimbursement - -Getting to participate in a formed group is already valuable so there is no -additional reward for a DKG result submitter. The only thing necessary is a gas -cost reimbursement for the submitter. - -After DKG result is submitted, the amount of gas spent on the call is -multiplied with the lower of the estimated gas price at the time of submitting -the result, or the actual gas price of the transaction to get the _DKG result -submission expenditure_. - -The entire DKG result submission expenditure is returned to the submitter -from the _DKG fee pool_ of the operator contract. - -Any surplus between the _DKG fee pool_ of the operator contract and -the actual cost of DKG result submission is returned back to the service -contract. In the case when the entire DKG fails, the unspent fee will be -transferred back to the service contract upon the next DKG triggered by the -service contract. - -The minimum of the gas price protects the beacon against malicious -miner-submitters. If the submitter is also a miner, they can place any -arbitrary gas price on the transaction. Without taking the minimum, -miner-submitter would be able to steal from _DKG fee pool_ of the operator -contract. - -The on-chain DKG result submission code needs to have all deterministic -and time-bounded run paths that are independent of miner-controlled inputs. -If the miner-submitter pays the gas price estimated by the price feed, but -tricks the contract into consuming twice the gas as normal, they will be able -to get twice the reimbursement as well. - -==== Cost estimates - -===== Gas price feed - -A short-term gas price feed is required -to estimate the gas cost components. - -The critical feature of the gas price feed is -that the feed price multiplied by a safety margin for fluctuations (e.g. 1.5) -should be sufficient for getting beacon entries processed -within the deadline under all circumstances. -The gas price estimate for an entry is set when the request is processed, -but the entry submission transaction will be sent later. - -If actual gas prices rise to a level -where the feed price and margin are insufficient -for getting a transaction to be mined, -and stays there for the duration of the entry submission window, -the basic profit margin for the operators cannot be guaranteed. - -However, this does not imply that high gas prices -would render the beacon inoperable. -The submitter's extra reward incentivizes submitting -even when the entry verification fee cannot cover the gas costs. -In the extreme, -avoiding the severe penalty for failure to produce an entry -should incentivize group members to pay the gas prices -up to the (theoretical) limit -where gas for the entry submission transaction -costs as much as the KEEP tokens at stake. - -The exact implementation of this gas price feed -is out for scope for this RFC.footnote:[A rather obvious candidate -is to use the gas price paid by the requester. -This doesn't work if the requester is a miner -as they can provide an arbitrarily low price. -] - -===== DKG cost estimate - -The gas required for DKG should be calculated. -DKG gas cost should include only DKG result submission. Ticket submission -costs are covered by the expected return from getting into a signing group. -Multiply DKG gas by gas estimate to get DKG cost estimate. -Use a DKG frequency divider _d_ to set the group creation rate; -once every _d_ entries on average. -Divide DKG cost estimate by _d_ to get DKG contribution for each entry. - -The maximum DKG gas cost should be hardcoded in the operator contract. -The service contract takes the highest applicable gas cost from all operator -contracts being used and multiplies it by the fluctuation margin times gas price -feed's estimate. - -Because DKG is performed when sufficient gas money has accumulated, -fluctuations in gas prices don't need special consideration. -When gas costs are rising, -DKG gets performed less frequently -until prices (and thus gas cost contributions) stabilize. -As long as the fluctuation safety factor is sufficient -to cover the immediate rise in gas fees during DKG execution -the beacon is capable of generating new groups. -Similarly, when gas costs fall DKG gets triggered faster. - -===== Entry verification fee - -Calculate gas required for verifying entry and associated support operations. -The maximum entry verification gas cost should be hardcoded in the operator -contract. The service contract takes the highest applicable gas cost from all -operator contracts being used and multiplies it by the fluctuation margin -(e.g. 1.5) times gas price feed's estimate to get entry verification fee. - -==== Cleanup gas efficiency - -As the gas cost of storing data in a previously zero field -and later zeroing it again (20,000 + 5,000 - 15,000 = 10,000) -exceeds the cost of modifying a nonzero field (5,000), -cleaning unnecessary fields would appear to increase operating costs -with little upside. - -However, gas costs in the entry submission transaction -contribute 1.5 times as much to the effective price of beacon entries. -Thus the 10,000 gas net refund per field -is effectively worth 15,000 gas, -making both options equal to the requester. -The difference of 5,000 actual gas is effectively paid by the submitter -in the form of a lower _entry verification fee_. - -Packing request data more densely, -where applicable, -could further reduce operating costs. - -===== Zeroing everything - -Resetting all request fields to zero after serving a request -increases the immediate gas cost of making a request, -but reduces the entry verification fee by a roughly equal amount. - -This results in a slightly lower total revenue for operators, -but reduces the possible space of programming errors marginally; -false positives for pending requests are eliminated -even if the wrong field is queried. -In practice this benefit is negligible. - -===== Wiping the minimum necessary - -Wiping only the necessary fields results in higher operator revenue -for the same net price paid by requesters. -Additionally, if a field remains nonzero but unchanged between requests -even greater gas savings can be obtained. - -The field used to determine the presence of a pending request must be wiped. - -The requester address, -assigned signing group, -submission delay base time, -gas price estimate -and request fee -are always written when a request is received. -These are not necessary to wipe, -but one of them must be chosen to signify the presence of a pending request -with a nonzero value. - -Requester address, signing group, gas price and fee -can theoretically stay unchanged between requests. -If a single heavy user makes a number of consecutive requests -with the same callback (gas amount) and gas prices are stable, -this would provide a minor reduction in beacon operating costs. - -The submission delay base time -is guaranteed to change when a new request is made, -and thus is the most efficient indicator of a pending request. -Using the maximum value instead of zero for "no request" -is slightly more efficient. - -The presence of a callback can be determined by either -the callback address or callback gas. - -The callback address is likely to remain the same -only if the requester is the same. - -Because excess callback gas is refunded -the only cost of setting a higher callback gas is the tied-up liquidity, -with the exception of callbacks -where excessive gas consumption indicates an error state -where reverting is preferable to continuing. -With well-programmed callback contracts, -the callback gas amount is only necessary to modify -if it needs to be increased, -or if the requester cannot afford the higher gas allowance. - -This suggests that using callback address to denote the presence of a callback -allows minor efficiency gains. -Modifying the callback address when a request is processed, -including setting it to zero in a no-callback request, -further improves gas efficiency. - -=== Limitations - -Entry pricing is mostly static; -entry quality has a slight effect on price -(faster entries -> lower surplus -> lower request subsidies) -but other factors apart from gas fees do not impact the price. - -Processing entries one-by-one doesn't scale. - -== Future Work - -Instead of rejecting new requests when one has already been made, -the beacon could accept a single queued request, -to be served after the active one. -Other requesters could outbid the current queued request -by paying enough to process the request and refund the previous one, -and provide some specified (e.g. 1.2) increase in the profit margin. -When the current active request is served, -the queued request automatically becomes the next active request. - -This method would act as both a price floor and a supply cap, -while capturing the effective price increase when demand exceeds supply, -instead of letting it go to miners -as customers try to get their requests processed first. - -== Open Questions - -The implementation of the gas price feed is out of scope. -The method of estimating gas fees, -the timespan over which the estimate should be calculated, -and the fluctuation safety margin are not yet defined. - -//// -[bibliography] -== Related Links - -- Flowdock Links -//// diff --git a/docs-v1/rfc/rfc-17-undelegation.adoc b/docs-v1/rfc/rfc-17-undelegation.adoc deleted file mode 100644 index 7c3708a42f..0000000000 --- a/docs-v1/rfc/rfc-17-undelegation.adoc +++ /dev/null @@ -1,383 +0,0 @@ -:toc: macro - -= RFC 17: Stake delegation and undelegation - -:icons: font -:numbered: -toc::[] - -== Background - -Token owners delegate staked tokens to operators. -Owners need a way to cease staking at their discretion, -subject to the controls necessary -for the intended functioning of the Keep network. - -== Proposal - -Undelegation can be initiated by either the operator, -or the owner of the tokens delegated to the operator. -After a defined waiting period is over, -the owner can recover the previously delegated tokens. - -=== Goal - -Delegation and undelegation should be -conceptually simple and easy to understand. -Operator contracts should be able to determine -an operator's eligibility for work selection -inexpensively and safely. - -=== Implementation - -The staking contract records two time (blockheight) fields for each operator: -the block the operator was created, -and the block undelegating began. - -Operators can be: - -- _non-existent_ -- _not ready_ for work selection because they were created too recently -- _active_ and eligible for work selection -- _winding down_ and ineligible for work selection but finishing earlier work -- _finished_ undelegation so the owner can recover their tokens - -Using the systemwide constant _undelegation period_, -the operator's _status_ can be determined -from the creation and undelegation blocks. - -Operators are uniquely identified by their address -and operator addresses cannot be reused, -even after returning the tokens to the owner. - -To reduce the impact of transaction reordering, -both delegating and undelegating take effect on the next block -after the block the transaction is processed in. - -==== Parameters - -===== Operator initialization period - -E.g. 50,000 (roughly 6 days) - -To avoid certain attacks on work selection, -recently created operators must wait for a specific period of time -before being eligible for work selection. -This waiting period must be greater than the highest permissible time -between the making of a beacon entry request -and the request being served. -In the ideal case, multiple entries would be requested and generated -within the initialization period. - -If the initialization period is insufficiently long, -the pseudorandom work selection process can be subverted -by creating operators whose identifiers (addresses) -are calculated to yield advantageous outputs in the selection function. -This can let the adversary control the majority in the new signing group. - -If the new group is in line to sign the next entry, -the adversary could choose the group's private key -so that the following entry also gets signed -by a group controlled by the same adversary. -With sufficient calculation capability, -this can be repeated _n_ times at the cost of roughly _O(k^n^)_ calculations -where _k_ equals the number of active groups -divided by the number of active adversary-controlled groups. -If another signing group is created within this time, -it can be similarly controlled. -This can eventually lead to the adversary controlling the entire network. - -With the initialization period, -the adversary has to create the operators in advance -long before they become eligible for work selection. -Thus the adversary has to be able to predict each entry -generated during the initialization period. -With an unreasonably powerful adversary -that can arbitrarily frontrun 50% of all entries, -generating _n_ entries within the initialization period -provides _2^n^_ security against this attack. - -===== Undelegation period - -E.g. 800,000 (roughly 3 months) - -The staking contract guarantees that an undelegated operator's stakes -will stay locked for a number of blocks after undelegation, -and thus available as collateral for any work the operator is engaged in. - -==== Stored information - ----- -mapping(address => Operator) operators; - -struct Operator { - uint128 stakedAmount; - uint64 createdAt; - uint64 undelegatedAt; - address owner; - address beneficiary; - address authorizer; -} ----- - -Each operator stores the addresses of its owner, beneficiary and authorizer, -the amount of tokens delegated to the operator, -the block it was created at, -and the block it was undelegated at if applicable. - -Ethereum produces a block roughly every 10 seconds, -or around 3 million blocks a year (~2^22^). -Thus, `uint64` should be more than sufficient for blockheights. -With 18 decimals (2^60^) and 1 billion tokens in circulation (2^30^), -any applicable amount of KEEP tokens can be stored safely in a `uint128`. -The staked amount and creation/undelegation blocks -can thus be packed in a single storage field. -This makes it slightly cheaper for operator contracts -to determine the operator's eligibility for work selection. - -The exact types are a recommendation, -and the implementation is free to use larger unsigned integers -if it yields favorable performance outcomes. - -==== Operator status - ----- -enum Status { NonExistent, NotReady, Active, WindingDown, Finished } - -operatorStatus(address operator) -> Status ----- - -An operator's status determines what actions are available -for the operator and the owner the delegated tokens. - -===== Non-existent - -The operator doesn't exist. - -`operators[operator] == nil` - -===== Not ready - -The operator has been created in the same block the query was performed in. -The operator is ineligible for work selection. - -An operator is `NotReady` -if the current block is equal or less than -the creation block plus the initialization period. - -`block.number =< operator.createdAt + initializationPeriod` - -===== Active - -The owner has delegated staked tokens to the operator, -and the operator is eligible for work selection. - -An operator is `Active` -if the current block is greater than -the creation block plus initialization period, -and the undelegation block is either 0 or equal or greater than the current block. - -`block.number > operator.createdAt + initializationPeriod && (block.number =< operator.undelegatedAt || operator.undelegatedAt == 0)` - -===== Winding down - -The operator has been undelegated and is not eligible for work selection, -and the operator is finishing any work they were selected for earlier. -The operator's backing tokens continue to be locked as collateral. - -An operator is `WindingDown` -if the current block is greater than the undelegation block, -but at most the undelegation block plus the undelegation period. - -`operator.undelegatedAt < block.number =< (operator.undelegatedAt + undelegationPeriod)` - -===== Finished - -Undelegating the operator has finished. -The backing tokens are unlocked and can be returned to the owner. - -An operator is `Finished` if the current block is greater than -the undelegation block plus the undelegation period. - -`block.number > operator.undelegatedAt + undelegationPeriod` - -==== Work selection eligibility - -`eligibleStake(address operator, uint block) -> uint` - -Operators are eligible for work selection -based on their status in the block the work selection started in. -In some situations an operator's status may have changed -after work selection started, -but before the operator contract queries it. -For these cases the staking contract must provide a way to determine -the operator's eligibility for work selection that started in an earlier block. - -It is the responsibility of each operator contract -to query operator eligibility with the correct block number. -Failure to use the correct block leads to minor manipulation opportunities. -For example, querying an operator's eligibility -on the current block when they submit a ticket -means that an ineligible operator whose initialization period is almost over -could wait to submit their ticket -until they become eligible for work selection. - -To make determining an operator's eligibility for work selection -simpler and cheaper, -the staking contract must provide the `eligibleStake()` function -which returns the number of KEEP tokens available for use as collateral. - -When calling `eligibleStake()`, -the staking contract assumes `msg.sender` is an operator contract. -`eligibleStake()` does not return meaningful results -when called by an address that doesn't correspond to an operator contract. -If the `operator` is ineligible for work selection on `msg.sender`, -`eligibleStake()` returns `0`. -Otherwise `eligibleStake()` returns `operator.stakedAmount`. - ----- -operatorExists = operators[operator] != nil - -senderAuthorized = authorized[operator.authorizer][msg.sender] == True - -operatorReady = block > operator.createdAt + initializationPeriod - -notUndelegated = block =< operator.undelegatedAt || operator.undelegatedAt == 0 - -if operatorExists && senderAuthorized && operatorReady && notUndelegated: - return operator.stakedAmount -else: - return 0 ----- - -==== Actions - -===== Staking - -`stake(uint amount, address operator, address beneficiary, address authorizer)` - -Staking tokens delegates them to the operator, -who can then use them as collateral for performing work. -Staking is performed by the owner of the tokens, -who must have authorized the staking contract -to transfer `amount` KEEP to itself -(e.g. via `approveAndCall()`). - -`token.allowance(msg.sender, stakingContract) >= amount` - -The nominated operator must not already exist. - -`operators[operator] == nil` - -The staking contract transfers `amount` KEEP from `msg.sender` to itself, -and creates a stake delegation relationship, -with the operator becoming `Active` in the next block. - ----- -operators[operator] = Operator { - stakedAmount = amount; - createdAt = block.number; - undelegatedAt = 0; - owner = msg.sender; - beneficiary = beneficiary; - authorizer = authorizer; -} ----- - -===== Cancelling staking - -`cancelStake(address operator)` - -The owner can cancel staking within the operator initialization period -without being subjected to the token lockup for the undelegation period. -This can be used to undo mistaken delegation to the wrong operator address. - -`msg.sender == operator.owner` - -`block.number =< operator.createdAt + initializationPeriod` - -If staking is cancelled, -the staked tokens are immediately returned to the owner, -and the undelegation time is set to the present. - -`operator.stakedAmount = 0` - -`operator.undelegatedAt = block.number` - -===== Undelegating - -`undelegate(address operator)` - -Undelegating sets the operator to `WindingDown` status -so that the backing tokens can later be recovered by the owner. -Undelegating can be performed by either the owner or the operator. - -`msg.sender == (operator || operator.owner)` - -Undelegating can only be performed on a currently active operator. - -`operatorStatus(operator) == Active` - -The staking contract sets the undelegation block of the operator -to equal the current block, -making the operator ineligible for any work selection in the future. -Work selection performed earlier in the same block shall proceed as normal. - -`operator.undelegatedAt = block.number` - -===== Recovering tokens - -`recoverStake(address operator) -> uint` - -Recovering staked tokens transfers them back to the owner. -Recovering tokens can only be performed by the owner, -when the operator is finished undelegating. - -`msg.sender == operator.owner` - -`operatorStatus(operator) == Finished` - -The staking contract sets the staked amount of the operator to zero, -and transfers the previously delegated tokens (or however much was remaining) -back to the owner. - -`operator.stakedAmount = 0` - -The staking contract may additionally clean up -the owner, beneficiary and authorizer addresses for the gas refund. -However, the staking contract must not delete -the creation and undelegation times, -as this would enable reuse of the same operator address. - -=== Limitations - -The amount of tokens delegated to an operator cannot be changed afterwards. - -== Future Work - -The definition of `Active` operators -permits setting `undelegatedAt` to an arbitrary date in the future. -This can be used to e.g. delegate stake to an operator in a time-limited way. - -There is no obvious reason why undelegation couldn't be cancelled by the owner. - -The authorization queries by `eligibleStake()` can be cached to save some gas. - -== Open Questions - -The operator initialization period provides an appreciable level of security -against work selection manipulation. -Whether other mitigations are worth implementing -has not been thoroughly examined. - -//// -[bibliography] -== Related Links - -- Flowdock Links -- Other links -- If you have publications, you can include them in bibliography style. If you - start your bullet with an id in _triple_ square brackets (e.g. `+[[[AAKE]]]+`), - you can reference it in the content body using regular cross-reference syntax - (e.g. `+<>+`). -//// diff --git a/docs-v1/rfc/rfc-18-files/release-flow-chart.png b/docs-v1/rfc/rfc-18-files/release-flow-chart.png deleted file mode 100644 index b0e91fcc452635afc7364f85b4e2a007733bbccd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 348256 zcmeEv2{@Gd-@b}=B$dimDOyBj%QjO{k{G3;Y?Y9R?At7*MG}%C>nK7glI&X&vW|W1 zQ?|j_$IO`h{~bE#bWZ1-miL_Z_xoSh+jYq-&ph)y-{rI1pZoss)7R7DUAlfL7Z(?= z_F>KATwF_ixVX5Hix+}dSm_yyxww{F*=T6!Yinq1(06jMvaz$|;yUd2&~TASh?a1X z`-S_j<_p{tAg?@V#kFqZ3$FQlc#bX6-f-^yqZKDiZm(JW!dUali8tHN*I(j^=hJ+V zzSW+vmG8v%45QMUmF^qoy+rm>)QfNh6pS;5i4M-AbT8PK7$O_e|2UVcPiI-*B~)-z%X}RrS>`@l}hM&qq2Q1=V!uCLPLBtvmU`oV^YvkK7A zm@WMN*w(74)f&|EPtPxrJ#>A?viE)h!?d$`JdEO*fDQI5w3W3r)HapAAAD?bB8uKF9)1Zh<*?OECE z*t1TV@nNs4n#ac53r$wcH`=$vSn|pS=iD`>i$AfOngWS7rw_(1_`kK1C4~hl0 z!6mP5nvl}m6uUM?NNw--`8W01=Zun(xmRBl*S{-Xm-A8JJ$1v5j8i>o4(k(l41qZ`wxNW)Zw=)^1%1(?%$cCLJ%detF-@bi|LAx9?wBitog=oo9txd5~Q6{SteZ2VOUSt9(VkgeU7GZD>AhzpMujO@MpjMwc7c)=I3o zy|d?T_C~wSTuTl<3HI2$x?JfX-v4tpzcbn^v4s})C%~jr zRbL*$YrX!Iu-NXA3+IojN(P0On-q6q^2^{#@9em(Z(MxeAV89k3Glcq->~(=;R`3M z-e3ox*Q;8DIwm=$Om6Qz)T=6)?H5wP9kNa`Qdcix`mX%iA*JKHUfcDtf{VhRB7$Qwj;cyi4_5i$$$G{~pY4b6aFneuvLFfwLRajBFjNd-y{)`j=E% zoP6DGR1lgFDiC_4>SgF?DDxEgl=i7Dr@UW|85z86YdPIw`_lNO_ho6jvX1JsXX(_M z(DPN9t2XnwK6SIdL_&K z^^!soLt3A;5BbOqkMv7BcK3DezO$>+`hm-dnk0gZyilOdW1Z-#g8J(E`Z%3KN`Xkl zGOMHQk4{?X1yBcvha&K~U8EKxW?Ha?PMKm5v!kX$_v5Kix6lCKpn{p>o9_F; zBE6g!b_?%;DUEp*`kQUe_&Lkebfh>NsLK(g@*3pG8w4zKCv`7j@0d z7=>AdDV4=KWZ^;_$-SDrnL*wk9r`g8+%Rt4+oc~C&&b5e)$O?_ZY1ad{h)Gq?Hh@~ z-Q~d{C2b|1Yev>f^F!7$A_!H{RhO3(A9$xxd7xc`q!Dr;`M~(C(>E=Bn{SeCdEdhD zIrweR)I9j&PIj$a?-GxU{O-f!A98{(AA6H@Bk6e(y3UQ2t3*xUWxYFaQ$BJ{WR5Hb!e!0$#_+trG53t>MJ}19@x$O?=s%m2Nzw; z7<3FpwG6+IYGbw8zRoMX*0a5LWSYM zYQ1ld7KAs1rqt~xIgWI0;9ON%t!cIszk$1w(3z3HF*{L(J<^GmYovtu@ zBU;)~Be%@XjQl4I=APo$>9{~<=2XYE{?k<*h8{0l^Y3RL&z)+2{`O?vDZ)#cGt9F! zGYY)6r){fR3Qd$;yTX?S-PuWaMtDe2-4VAVQnA&}DCZO6VfOGP*DIv%fCS+%dw79% z_E5t>Yz@h{I`e^pCndTsPuRF5OR=f7`GlQ>{fsLIC!~lbVGD> zUXOc5vlq5yOtGur3ExYD7T0lYob#mbJ@JTP)8VW!%dwrfMdWQ1=A=bg5SFYp>Y)A> zqR$Q)g$eWT;R{vRz?;6_OSm*3TKAc*sP88J3`M$vIKy)qqsnhAmI68NaiR3saQ#88 zMS-hD3AVu*(;^rME7tWA;iaG;%)}5PkX~OWY|tO-TOP6A0>-o@27NS z#~=%cw{Bzw?3Xg@1VltTRSrjE_(_Qyve^jj4ABc$6zY4K+roc zrV7o^C>Xgp=^rhtZk99_l6<3w zoufPEzlF4p_-t_B&Gj5cdcWanZXUlwP9=#j$*RAz9w~*`Ex~u$C*RHX2 z7c3C}D7rdt$-XKVlBvNKO%J6RnZq|z)-Uld7J5?Xiwx}zQ`bNEabDpFn@2v(uVvSE zmLo_!?pPXWTj}a@Z3mARb8*jG&&2~C%>zG>dBVRwJ~VGD*MiyC=W}uS+Hi4yK1L7x z=KQ+{emI|*`@P`)Ev`l2*-G%^5j+2vqnG-`F8Jj!Hxj(ZwckKPTO0f~uyC@pw0FMf z;BwoGeg?d-J_0nXoQbHd2QNcX6Ug~Mf;a~B-WTgrG`zQQ>V zmzswPczD^;<=h63%Xaq8Djw>aW{*$-k2x>PZrU(=h>NZICL>+_4H^zkmKzjgXR$Mc>B5(#}ZJ<}w&F@EwpnipsmxWcNX zSHVa_ma57AI%|-ngU3so!9{>_Ji|F+Kk29M|WoqwxE0q^hQ($?I6 z!eib@*X6qxu&2rNE(<9+Ke8}fxO3yi z)x{f&7n#l9w0G&f6$dv!-p^aI|Ayw`4I6zl-+Py>E%oCGzPCbr@yhqI6=wy#)hxW# zG85_5DKUA^TiV^3wwNY2gS=t$<3`>ulfB)W9n71@o}F$MG+_atSqkZl2y~ z5JdXzGiJRn&)y6u?G;xd`6mwUgQ(hbi&|YL=nEg&dC9EFs99?B)G>7DmQ$o9e()wK zcfXT}1DnK26{hD;qVIjsLO6x}XAW_4kr>=pG}IIjYne724#_yIj7^+QvZgg{>Ni0* z#KjC5_&;z)90~GDfbBe9OWLOXpFIeEQe4R=SKy7^2?gVfvyQosYkLF7R@D6G#_zA^ zveMDo!NH-(q|zFXK|AP0?G5(DzM{Qdz%QSLL(&!Chggp_y3nqwK@ch_@V{g=e04Wl z%cFM`JxjwLs$(*lR@T;uj1j^kb=FL8O^p%`E{Z;ltkkDich$zhJfjK!^~-0GGh03% zwI1S7*4+G<6;Id4Pa4vD`Y%oY&o=uv%*d2WoRUvw(P%o;+}jovX+sv)^=*&c+vEw~ zgg+SYFU)*-+RVu4sIK_iUa}h*)|vuDzBrRA?PT;O z1+yvqx+~(FrWY;LVhsi|M%CRuSHQ*H9UBna`BYwXcnKKE&aIJV2}4gH26v|Sp&wZ0 zCSe|IQm>P;43`;}dwQ6ETKjZ@KkewYh6RY@p+A1u-Zf}4vTSsEsL?U|$}|aoQ$A$h z_jwJMW>&Vqbfv@c%SwJJUdE&Y@3G=l%N!k1^g!CH2j4d#U%H}>7GVCwrq3l2AYl2h zeb9;DF$+0C!uz`xM=13U59`aW;B^&4fAGjz|Lp<)<1LmqaE74^ z<*qSlYDJgIEu9fYhyQr|?;NS@i`lEV!z(;HVepMSvSGse!?nZ_p^LAKQ2zF_U#wfZ zTQG0Y-ho5eAqPJ9naH!!OCw|g5Epq1g6Zu(-V8*p>SPc?9>6B9+>^WU; z?Z;J)WPhh=z*x<^!S1%V=XRC2=<-<1*9&(pi8#YdEIja&e$;7~yF`-kexj9$spv4z zJ>cjB*MT7u{l6jm%lPEKc*uwW-HY2WZDf)$Z$yB`{$62!9lb>nY8Dy!+mj(9GxFNB(M};yhuC>a<#)g@3L3^ z;9D$Ss6ylg;rn9Uly)?@Xs@A$r_Z|UpZ}NTm8!W489{j!u`^ikEZ>YAr zyBjI?F!^(wdQ8TweB|09v5WRaOfq4nddlEdE|lOVhNvW%V5XlPtjvKt)lzRvT(b>N zdmu(Siarw`MKJJcl0#eyc1nQ_9s5rnr2J^ygsK}*py)F;KCYyys!Bbba*i}vF79Ao zNFA`9xy#V-ox7VUg6KcE*Z!Fu`}r)#0$Da5YF8r)9pX@13;JM^b z9w=(77o*lzZ?bxq9tfYyrVf~>jTOd0q@Vuqd<|ui@FQ*M2KNjS^>l-TMC~Fmn|u!v zXwvtUjlKhB@jQo6^pY6NamFVI?+55!*WyakBaM$^u4+V=2fQA#jQB?)_&>`BEGBKn ztvmJ55K-S{TIMLT!*WZ$)14WPf><_{QC8;`GWa~}q^u^KnU=poh>|s)#IG~-!^S%I zGSg9FaKHGi+%a&|6xkWi=ii=%5PG%%0BtvuOSx&DV2yo)rGGYpJ? zSk@;0!2{}iq{0$?{JJV)vYUw_*7xS$4hiucZT2c!U(HRJ(D4bU9DxV_7d!tYUiN?K z#t%b`|HVUw13~F1sA!_0P|x_hyu2DeK`E7`8q5W#B%)DM?UwCprnl`?5k#nLF7<)% zXjwmj`NkX7C4L+{Iz4o6)iT;Dk!U}N=>7Bi(LQl<^@$qCr3VeJxJc4m4&UKHEDfyH zMDuB<#lni~!v`BTZu`T@_N+lK5{F;$!a3xPW)4k0SzwMf-|YM<<=eJ{W1(^{p*VK; zsZLmemsXHiv=~PG#nQF-^}}iwo*QMv+;PXmLmPhFnsm?_@fl3dw9CYB)CeMwbZ*PH zafZ*p&YrIQDkq9TIxoDR`uxYO=nsPTPUz@@f&!-6cEb*6S`5>MG!++$5%c(XZGhb2 zV9vUx138~WPq)X{`^x73I8O6pB?Bo+Th3IZwD;xNsKU+7Z7SWQWVkm7+T95!)?g>r zQGGvGF8Z*l|7`_?Um)WrBFx4Km|FeF*jVUx>~12gL@wgr9ypK}I&wggv~wEj^L$k> zcu?#a05F{gnttOmwhkwez7xUuzJ2q%WmbXcTs(ZJE`Ob&Vb|bowSa&5ehCe;#gA2y zxiSX>REGk`{*#5HU*`SmB35NRCxhK7e5|H(@tOZvKJuM861J2BDsythQFf18--qD6 zQGo=fjXiuh7Rvuh#jbf4oG&%Ce~l$2ermq{*bFc34`a@R)sW6@{BC1umhX{fv#hB* zP*k-gO3m|iobs&cl$CdtIrf(x;~#K8A!##F>fUZ%I9Rlbg1VW@M*`9R0$mf!uxY{Y;rFZ_r%Xu7EYA?RAoU7m7C=&9+P7U-q{i_Ya0PNH+dszmvpP;$R$R<-9;9>pOEE zbj^fKszv9l(fl>nn54rHH-8dS>N`938|biX14y5w_L#{isq6`Y(4+-EwvK;q0l#fI znygY*!!cX|zmzt_ir7ttNk0i~@eTY2O%!nL;S~FN`<>z>{%^?s5;FWR9B5^Y9sF|WbLL#9Qf7URU9Ddl>ysCWuhMcpL$OEo2wN# z!=OwTVl<8#U4vrbQHm&%AxeSzGPZF-g^!QuNXqfn=n}^*K70AwVc@Uh*7xj-;{IEJ zK^N73`Vm6Q=80}fVU{N)57)(LLo-hkYjBL35PlB4jihIx@~D338NUIUFlW;SYE{SWkYsCAW)85fkuc;`NDXJo6#1cyE5t44Q(I~# zd&?uyY%1Epj5QSoyNdQ42pS;(*_C=h|nch#)vxKLpJ2>kGW;%nk01A7qA)zC!DD4v|2UVV7lg2iz4>7D-*iJ zAs8x`+Ty@$8Sq68`bJRl@#-NsZW?D4YRaLk$$^8iUdI|)l6B+E?(xe2{O*D`isIzw zA#kaMsh%am-MiXE+F1jbAb6idjcWH~;DClWO`q6r&g!qxg3{^-O2k=Lh^j?I)sULl zxtUFaLW+KXLHURMWj%^?_Q4I#c>Qhs`I`}FM=wD0BPXucz?e-i1=PeMR2>{gLEtWE z;5%?Eas@k%Aj@o!RR~g>`fwo~udCE0PrZSG56FcC#G)AGs7`pfJ6wwxfz40wY>ez~ zVob@horw3t^5fgu+H8i(rO@mngwY+6z(?nh5vE<#?eVV26g#?WSk>atTa> zBcm@7kBJ|GC2k&|_w-PScqx?Gv&AVEARrWjPZSSig3^4TxBfrRqRVQ-x7J(K)C0G^ zVRT^~n-RpeD;#FCo>w>!?XHt=j%5{+UWU{}jeBA962v>i^80r>gfkNA^2TzLsmi?Q0Z-mu4*rlV@ z;c_)fh(;v^^vrvy2-UG{i`Sj@+{}nnYD5LQm%cNrbEUY7C~8Uy0aeGb2I^erh5~`qO}-~~w={87qmwq>#JX|nr<2)1=uw`{nJ?z`W&<8c;qCUqN3=VJ`96A$J8ap|2XqEXQdade zUHB*gXOcVO{2D%oT}tJ(rz;?=*0cpf!Yl1`(cuT(;$aDUj2o@3f<=cyo>jL@ho8Qn zMZ2*5dk*UuA=bJVI_LVOXPkZ`@P^5Yc7XQ^N8*@WxSfk-%?mp_uaxkHWKeryU6f}7 zg|IFxv)eQ4N6~JV%wtVSicQSZS;WDTnz}FS>93K*pVQyp zN}IkBmo2hJCDw?4@lT|Q!Ii%?JbQ=cg zHf8+@Iu#rw@8D4)ywF>{5zB9l-J#kbWf1;y=afwmtn4L*(C=R>h#yp?F~h%2B~r;` zy*KYS%Upy(6%k#{n`h}c@{HFjr?%`pY*?^jQlX5j8Ava%Yx+jj@(=c6h%}8iK+~Eo zl;AlYu415uyyHE=chrHzD8SJR23YiQG{cX=v6nUcjJN#q?wyY1eSvQX?p?0fJ|$lW zeI&ic5MF91@8DTw9AVBVHIM4UI-?}fMod8OhRvLCCq^U^$k~8JGgou&T%0Ss3abw2 zuqmsLh_7kS00wU)>au|KoGBW{Fy=iW7{m5aNHDDDj+PQW(m)}*)9F2*I z{vJd4C-zcaaV}UTIF4sPWKCwP;{HpU6QTYPcO;^#RxXphqT0A&QoojVZ)yZqHL0}| z=9_Bfz{kQ*tFs`&`w>j#H$MlcW;G{{i{)P?Rdh6%nl@YG0hw|( zvmaH^3KSXYzHV#cIg(Z$VQin%zaE-Q{{+B|hvhA5o}Vfzq{N|)`RT!=T8F&!9E$kZ z<@O+BQVX6nOa0IN&p#>^l(}UA{`Dm;&?K2+h%Lg@rq+UN3 z!vcCnM=FG`+!FA0;(u@^i1Vw=I?(J^ax3e9pz!%+BDNX7_Q-tB!Sqe5-R@2A{Pddm zhRT7_Z~a>^`u|8q zcNJp3Z_j?EG0T0)A^Ql{jE%{J#c6>mJO>Qdf6?}w$3FzvAf?J%7k?^d{3(L)caRnX zITn(Wmv%b4-VV5l&}qfX@H(Q}Q{^(HoWvu^7Srdx9jN>yGxZ7>tf9O`4#tRVg>;vb z;wXuvA_13{guaW-KBe10iY#oYA^%^Xq5G{ATF&uiD2a>ReKE-zcG4rp?;!3rx9N?@ zXt1>Ct#8ERz8{GC;RV*nfx6T^I)+PLhCfZF%?R&j2E?W-ZqZ6!Bdw>*5y=QY`KKx7 z-?4)J`jEXGr%3}E2T6*F=y{8CxRvA_9gR*jnQ(X1ud_UXxfWq`qe>6&POl2Huk)+=jQ!aw41Kd z5a65x^JWvM#@>UA3L!;@2hM&Q9PMaF7kW=*Hv1aO=@`yZC588W9ow?`d9=I2(fseu)j@1(@#S#C4e(%N)2N07rnWLJ=K%yeX^o5?pN|2|*;(nyaOR~+o3w8f+5`+bxLQW z$?ieomPrd*r?^^i^TaL$trI;P&ei*-{sdLZVhEFA&rKp(7mj@!Y-?eG9hmhJ(iw3& z_c^8(0FfNFSx1L0$IQ_yv7Xbd7C{PGolaG*Nb*P{xH7je(!+8kYP_J7o_tac$41@QAZg1u3IG1^@E69M!1;ZKR5vR`sy zyvxb3?$EK}=MYu8p?z1Qn_<~ZvTYdiP+ehBXl8P~>AE-=<(P}%EiV&58Gx!c799F_ zt9t+va zi%2^^G4RqVW9U%7=wpq@g>|FM-E@!QsM=Is62i5zLf9(9W5Lny|a#sKg%jK z1z3EL>7r0YZ5?dpWevJ2 zOt#$A-ah-&tsf8;{2~A3xCDP8Sv{nnWtHpaHWG3|SS1zV=FkJ=W}L?WxFW+or2g-B zlxUNl#kn5{7l8Qt-OVC_X%sTi(WDH5-2n+b#MaoSqWj~L&(F+Ms_=d+-j$U$EtT8o zKFwSf`gal1Y+>XxtUX2|>;jm3od^^e)zK+|m?&Np3F_)E%eAI_r{_@ZAzg<{fZ7x@ zaAzJWP0R*OZ|s$?IY$HU&Jo=B%@w{`Zu<(w0u3>2yA}@6F2* zWYpAFI9RMix-;mn(+1*MK;s+F5O4uhEoG;^!%R}DXE#g3zKx%V&}+xD-sHVVRV%C* z0^Npy5F?b0PIvG2w00gZpy)vpFj&*+-2fARf{8YV9z|1A^9DWU5dG6GPrsYP{d?rQ zT`9k(1uvvCLvy~^|0@RRVFcmu3L+BGNR=W%<5!#}0t18famEveiM}(}_~9G)Q&Ix^ zi_B*>+@E+AV_p%a7dEFcr-zu0{dI$uvVlf-{%(D!)ZH4Xf)5ovbMbwJr>c$xqdB7r zDRB{JuG3L`cum=0h}zxS2K^vgkYguWtAr)}W3sD1km%v>-{1S&UI{L@79W3cdBI7lh@C%?b z8w={N9e4Md!QTMjL5|KJ{_jXW=B&~e)bQ|Mso_W?$Yj}MB9t^_>0SZ9&W#+fMkOdW z_7=nK@&x zScu}>bQeIMkim0WPVAft5sHa2Dd?37RFcw*dSqJhs{_*)YI1N{b~RPzJNs$;&U`4A z;6M3_#X#;EcF~^y!N(4rBUyi-jLZmxr-bao5ynusKhwjtNuvv)SkaauStIvQjy$Yi zjf1Q;Jk@F3;XXZBKjbJfz4IJgEkMImzo1TlfNs5C?sX@F^T7(ZWBD&`>L_k%G^Cj0{{K$!|Ui zkP{FfVxnxw6pHl|tS4tn%Gw_Lcl07(6}p-&Aqd>wK%%n!tICx3UO|9^mOBhgHoXwWLh`u4g{|luPlYvG`Krdq?CGaHJc;?`uf>2469azwV z@ydcfR$5)`m_u~uE`6w0K#gxI8DR3Wm8a;8ZOUgrtG`N4M+s$3;=kQQv3z!%YcXTP zMm#h#iY2(H8DFm=r~e!1f4I{2e*^vh$%^La#6e}unL5?)*Ag5pQ4=g2SlyQ*LfUz5 zQhS*spqTA_dGKGWjA5W`cxOM5YdA!S$*N3{s0a5fBFs7)u~Vp9a7>_h@Q})q>4Gr} z>Nqx|U95$eJkDG{OAa0RgJqm^NE*zjv#2T7=k!$Z^0oGkG>h_x5GmN2rE|Hd-$7F@ zXV=qT#Rz{|#rVC~#N@wiOSevJ{M-zs75!INTUd`V)cxuk{vry&*G5O$b9Z%hxk?Pa zC@%vSkG>^hP*BYneY#b7$u!0>Ab;S(_D7KK>}7J`G`T})QB z;i)w(EXn6FJSKnQ0`YaPEJ5R{I1uW$T|jrhaDmt-u)Pm3D-ibM zr+Rz>!<;-O5Gm4Bix38-7IpJ5~a)CoCvs; znMMv$vWOuaRogdpcvc-=%k2?lQo%-K*pb&UhQs-f3Njx>TJJiFz=%u%NpeTlIUJ`pps3NBB@M1z8ym))85peatic>sUS zIOanys_4q>=RTq9W>qFVy5k7V6SK zpz7GxmQdYO%;p!4NEFHOuuJ(&`B^lSr-^B2ShjrvD1h`7x%el0f-ti7*M9Kk+Ue`E zAgPP!H2Ck+)=9Ct72`a8LGPPgSAjKNK7~uQRe-#}8{+5+v+UVcar>)Zeiul0aA?9U znsPC#kJ70yaO(#aC(sNTIjZY&l9&5X}7(J6vZzk^0Au%Bb zCCb%=10-jo83RDaox(o?K&XVW-caN~yU8xzI|MOb4@4oehf@$dFjR8hw_k949`B?X z7j#pj>&n@kTJoK?23&v9q;OGvrz_SpJvm$?1GSR%EHUQDO0)IDKC}S)G-sT{dVkE> zJ%_GsOw9x1{=2dGmOuq8DlqO!vkfpJDup0gm4C9ebN@Q7&+@rh4&VC?_5&eZ@zr&LM+7JA5+tc5q!M`cDi6v9(rV6fF235cj z+%z+HkP+AXF|2K3%`Fi=0#4|Kst%|5oKwup_QhUPeH8<%Q#}p>DVslAjlo107I}7I z3+&xWy~TK4_cIS=t<4`-3MjSSwJz@MJ!}_V=<7KD3ozy@R6g)2bd-5FlEWEZZ<`1Z^7dC#j73!%~$1J?;Dnu+*YfAi-V=9_~^4&U8y{Jo#xtUk)U zh~Bjf+<>lZ!86aPXV-(!rc+3**{pLXd5o@WF}dz&+16csoWz^=o79Uh;c~E`OZcH` zhz+S;&B=dkWbE6F-iTZFQR_mk-h4zV-H1hZeVOS?Vhnp1eTI@se)nzYnyI<;LaG&= z5B()o)dqwC^2$7q_;`xPvG$mLPgY)45#K z{egI=vtknuNx19$L?KRo4Z8Tk-T4}vwb;q^BNpY0>g3RC)^e&D7fx`_e1wq_$1T=9(ktzdX+t9uaY-xC&z_hD5B{zIbL4;FK)j8dC zZ!i!HtP8a9;qGN%U=c`1!LPT>w=BurVy~icRxuoQ6s!G9dTEnHasJ-)(t3xIj}=M` z`4GAcXBG(PQ6|Uz*RSkK1DkHlI(LuNXA|f1rMdsU3!AO;xSR&zsqEEpzq#mYcRdf&lyZk+3xMW}I5Cc5(<9{oA1>AS6IhU8768@_YkG1^(|v@l8%Gak8ghEPQ$Kkl( zSj1@*4U+J<8)M2*IQ`D@&n}-dV8nhOgoEbBxkW`dlR~)XlZ^EAMvi)oQ=b&4)%ivg zu?R)>tUeek-l!;sQ>!dY04eTRE0_z496gmW2m*}0>p;haN@q)%mTQT%U~R_RC4$r% z@_SaNW(RsJS0{3Us5#LskPsE62=e{J{Q?&VbYoD&22LI@t1ZC%sx6p)HEaJEx99Ai zconKBrI`%MDTs0GY*PaZ)bDr3T=)cR3^zT5VvVm{ww>;IA_YS23#q9xBfoZz@TdMvfPf6{C5G=l%bIOfmP z<+BBiB0C4nIVRo5)p`gFt!Zt#v*iMdR8!Ychn5$pxPiNt)MIqxB^_*L36!DHXz#_S zwuYoLLQXMm<72#2a$JTQ`lLagD^xIea7WDKP5Lypkem?`g6cPfTRIQ3RTQYafxv<` zx}u6trW(ROff36>bYv+|y1mC;9k$*rZ?a#(>JchxRpY450A3;4Qa|c;-O8JR2dxA` z3NwR>3ixDE)GB{g7T$v~Ssv*I=ky$CdjJPn^~}nU$sB96EsO5YR;NB96W|q9Me&~X z{`@MBfTD5Sz}vRyl(#LEJ?R{zG-_2#hLkcN-7sWfa>_Bfe6Vi#p3nreGqEBv(i-iZ zN%b$9@gKPC;B8DaXOqlBFo}8@kqI5;jmUzq{Jt$A1_tLQ;ZDHXm)R@b z_BD^p5*L!WOa|4zv-d#TL@UBchnJ2sDNZS_US@BCERw*V;K@4h6`t@Hk-FV2%mRM3 zU5E{wzojy}FM@XdqPgMhize@VjEhIHx*HUIWW4!5unUO~|1_PLE4ckGHWy;RO3D}3 zkuk4u2ufEeIw=NsK~bW+HqMP`N-rXlhYgEzJ)%B3bU=p?>UtW??Om=aFowm1 z7b^XNZHIjfBeIAYS+TGJq`+@H`*)bPF+TFM&Jr`&7_6S6P3C|UEXEGmr-h8Ca-^XH zfDX-udgJFg9CXZ_+_-%`PnyJ?`EJ*@EY*yYJjAQ`3U9D#*_snCl5Qg>(+^rKR~(st z>BNb*XQkW(x1`NaJ1DIga0DE&_&nAPaYqyNqD@p6n(uBMrK1~gqm$MR9U;{pcPxrzNl}yx67+V5nIm&NLA9ROs=pIS zAC1;64Hp!E>uKFx`-w&dGSjLT87*fLobj~_FE8Z3!D)#2B6s+CitH8X(vntSU9lrT znQc`-YH{{VI2wK)$)@9kTY0mKLvg@@nTYJSUFVL?9t=vjMc&*%=?SSVO}rB%61A?wWVO--^Ek6&0b%|xfBzm5W%9HY$=y^jg&^zG9g zFkdxU=ZK}qiStehi0fTVel0%vi935ceeMZ5p;T%**Zx?S`IX!)3aR8K9pz;;0!_H9 zXBGF2bKQxI=nYhrNodQk#qRCyl;|xFQtB-Wa9;aLTG@VnfyTukG4)E3iyB7F{@19P z1NAX=vb^Tj{bJqN>kE1Jgqga9D>J7XqXh@SVA}%(Xk%8Nnuz$PSig0Uv`&4>SQoEa zb1{un^;VGq@fw2RN2D*P5q&PQXzBsiBRZZ>~#}S z^IBSiiBrXvTEA6%Nmuv|84Kv&;=g@81hZg~{xrW%i94aC<}xG|S5iFnBE5ExQsUoj)%~La=**S~RYgVJxa6A)Y3VH>= zc~paLBp7y6CR6SG~=_ zA2IiUHt8>}XspXwwnN>elf*31+6RB{EBNvGh!%YByp&4h+>=C`$t49T#wRF3QTEz3 z$?C2KdVNu=S3LsDXB;6=_xmMbR&d}??!dA`5JK)Iebt+%+n>dnO#UE!UU_84G1_8Rw9U*s@Rgq1yW z!5c?AGA|qZyNK5U&@;PxypUddC@?w`hK88A(ZP=Hco?8EP#aB{it_03v-EtjrG0eb zQ;F&N;bKMSfuq98$J%#hw!SNzEE9G__Lbr#*PRu5<-6OW?7_p}YQe6Ld1|c^n>)r< z9%pG*Wp{i?YjzB$kknMY$#z+f(e-y@C)ZWU7Ug$=aIe=w^GVx@QDC*k8YK0i28RPh zPE}25>L`^mDsQ~Kex_XgH0abrME8A~UrrcuzNXjLEH?Q`awDXtWXYA2WC=(Vm!T!} zTTdG0XU>W+%e>{yn~A&iv}b2x_{r;ECi!6AlM3ZdRpI=sN#X8K2L*4nUi4WZtb1F) zf)JMS`dwQblU9o1?X=o;;=gP>}YtULSqHKIKzXPL)jFgVn(<2{+=T?7SyF7L%I|%>%N))-QV+7kJUl zPzd$$+M>!zZL!#xmznLA>Kkq&w_P$vF-h?wBHA!@QqyaB5$Uw|D{FHE9UolVxo$iC zk)8J*b4!uH)YJlUg!3L?!;MEln<@Lab>3BC>ow(Q?H6rmuMI-_>A7)j`c+dSMQm1} z*6H&Se3wKi7f$BhJNyrC$S?M}&`tjKp{!xE6N!B!k-V+&=SwD5&6#5VO5_w==&g6t z-qoY;POY2Z8^5z7N*U7|WsxSD=pUry_a?ZgwA#14ld=l$R3~ku2zCnw2yrySM9pgrWEF(SI#~VyjXE%jr=WP?P|WIiD#-` zsa$GGihVL%`W9|Mya*c%yOo;m1Oxy9C=9hYVvMp%l%6yZD%)ffF^A0mM8riEJkvdFWo49#)U|f&2!D7be zdjzddd}7+#Fkh1TR`os*fNu$f&U{?Zk!lX@$Z{~x13_XNCpqi(#79paabcNO0-4U> zDch1tTL7U&1%!IaR$X6m{+`mhCzc<3De`sqJ-2r#+js881_E!@!2)e?vOL@k!lh1= zd+x;PveX4_HIA`RX^?mu|6$_8Q|@QZfK8U=bOCA;XL>{sz0&{9qnY?)+n)Nt{0^Qu z3U5ey(C|L-{idC#QR}MUX8ZV%jYA`QEh|?UF0`sX zx=?yu5bwNnTbYce<7AL>!mJ#NXwyYan(9VAtO_agnW?~#kQ4Q-X@OIAwetAoJ_BwUPk`Zyf%^hZ;yB)7$WJ0fr%U{%I_!~@H5?*G> zcxR^-FBE>yzm_pnF?CF8SZw$C8)02Ytf@P1uAi*xHb;Fzw$z>baTY5N9Wh~VHHh7O z|Gm^ai7ne9+w@mz_k>&xUbz~*YOCMoN$t0X{qDe)KG3{Bv-xbiW~mg@?hmO423a`^Edg>ClecNpCWx%sR zVn2NEhRJ9A5YNJ8AJs2K-EljYyxb#eY9t+#OA$xW8qraA-E~2?^vKfp>y0u+jf1+p zjgBtw!9~xwZ?lee4Q>4N$`Af%F*je_VhBIE;;P%ng5?J+V=kzI0<5i4+XcZqVy$Wi zlugCh-(UCQmaqE}8-yc|Oak;`5C}GXQ`zQGk7vGGzRgeCfH969E1Jp1a;Cd3(muDs zG|56z|K?2%uG&~+_>8o5-5K5zN^DH!5@y51Wmty=xdyacVF!dYKHA+Yn1?m?2b_&%&9WWrnN77Eh0Lbufol zE~)VP7~7s=s!FLk+NZI%@1Dj8pX$ijdIS%QV0-%yvwRwNKJ&~-G^?yA6_^IXIY*(PM`2o)YpuOEdn85wA9HUV zmu0r~jjJFSgovWFiULZ9G&dq5Dyb+)t4MbX+<=IRfPjjWqyhp`(%mWD-QC^!t_$>; zIcGRCXXbg|-{<$&sDsFT?S1XF*0(mB$%TvL>|1NMHAF)DynW%_3se}#Pbddmb1Y&_GUP8a}V1#H$A;|(V% zxQ#=3)uLijoGF=CS+BI|!Yib2Y01@$q)+cQ_aiSm|G3cT94W_D!}@(5)1UQB;tn-% z-(*bBGxy;rD^$s4r`@Wcbbr}nB=bObNJ*sTnG_0stF)DC@S@ImGP7W*w=H^D1mCA$ zaBI6ZS52M%`1(mP))&uLIG<^}Sh@bgu#%;;b*V+A=h7PAwvu~|jyM+7gNG*Bv^|%S5rme%_3ilSYC9^+DCsNU>Z%#DF z_?g@)eCv7axc347n&XiW z8D3081@F@kdit%tj?sy@&LF$(HFGG)=DAqKg;*aQRHCN=6`58XbX3($z`qss)Im*( zdEv6{180u>^dwgNY8|mMozA=Aj2F2q_nR>H`|Q6PMCDIytgTPP?X8d{pWV&d!hM7V z7kx#3n}!l1RtMJ@&$VsK4``m@$g-I0cy&g3l)B!BRqc-49FnGHa$;%b)s>a9Nph~z zx5U!s)4m#kS_;Y9L-lBiNsoh~nT}j9luhe|r};0)JQsZ(liDrs793<3cq1WiE(>+W z(lca71x;K0FXPPaZ-}aFug8s;Z55Vg%b>1uzo-tp+QFcK8(u`^#`PlgzP3JQZ0@!d zGJkZ$=x~B9e6i73=PHhh=5E8=*AbY!g6A!_<`XDF9KCr0SFbFDJP1ASWV5riBJ{1Y za$!1iMjkCNNH9;f0{slmkax?-eKeQRKX{J+Gtjpq59@hqsL_@7R}92(OBreAke5O` z;9Iq}bH!)kO=$TGgGuncMq<-eiMn0M!T#>l7OKSL}UW zQWX)LvYeeJVx!w&wwPAz_$u!AE$5ky(UefBQVX1zoh*_EGLOFra#S^0 zB0|a52QqS(l9^)bix+83JK={&T3cG|Ce*8r;_okH*k@qYuA2npMWRIj-KjIwaHv?M z+TZv5y0D*I^LwrA#x|tHMOM_WV}Uk4rYy-a2`?GxJ+5 z(ncj2XO$P-Bx{uB{+=2hXmzZ*!gbU>fhgcw-~dI{Gi@HzQ7N_$R_ltvY?jF)=rpZ2 zf6*5I=Z4vHtFh#_M~j(tJO+m*!1P1<&h|!^b%rMKvxOgTB`X81r?f6OiY^H3EC{G? zEwyk`+OB@)9(c=Ed0JNS@p8Kk(@NlRH3~>QqqdUM=jb#PS{U?@{G`ckVe;dWw-3r@ zJxx2qbnHn=4}guE^`cC^a9gBbS!81v)ICchZp}00w^Imba15v0b>j5CoF*5q@L~`j zyfxlF5A1&Ea#(_a%QzRn6l?ud7ydZyJXmf>T79Y9@+0?^yLA;hElBHj%p%uPqCEwa z?JzNChI@y6PP4P(bJA(56?+amh;*cA0T9A9dcr`n!!u6nM43sa%d(48EkWgk$rY4; z+8-OVznnaNJz_~cG&24v)N@@m4ozyUFKCREo>KSIQ?KD3@qcIwz}J)$O`s;P#k4LJ zjbulrg@HA+X~pYlXG+seP%w~K*9u~%4|S)uYt!*+)&_IoUqB|MF1wwrF8bj2(&2vO zr>17r){MW4MCguyk!oE1Z1FcYuAOEDgXA-chJp?@Mz82!3w$1ktvN$Uw%?(%2Mr)D9*Fy5ci8GWA@E43Vux;vHD-dgGv-=%|4$5FC(c~uI*Ok^Me?j z9|&?1aA=Q$vu_S@a%XPqv@e383T>>xTfy6#B9`or;}s~XI*2% zjj!jjqdSrfNHFKgER=2;`u($Y`s3Q1j9j{LZtpad{5z*%KNR)EEa$Z=>Ie0jzIm>V zN5ugkJOzO8g7`ve?pBrQRQuII(;>MxnAITYHGx6g7dp%qf1BmDSZV>~WElm?p}grp z+jT8fy>~yF+m~J$Z}ZM%sme37lqV@=#~kc{D;>(BA)Xeu*|W0e(N}85RXd_Oiw9Nw z0dW6`R!@#i)lg%@$f1BA$oVZUv>)L4$9CZt6uSF=IAk~0RtMa= zBElf{D`D(&m*a1_I7yOt-jlCeeHIi;-xHWMJ>Xmt&Yr+0Ll;Dps9tq!{@Vr&1yv_S z=^x*8r_jTL{ArWCgV;WBfBSs%ZKaEtoAa|GWJWL3=gaAo0&KIi^{(-ICL)r_+?}nN zSLT>g(1MQDg*cjY+KfkrSB`}T>6f^Yw)8SzTHy4FyuPZrE~1_;Q^8$2bxg}1KV;@8 z+ej35wY{1Bak)IgEujNRpPOglFMR^UJiYme7{3i;t#4L46{?fH=r5kxzdXQl+fP_Q zgDxSLycIuKT)DS|eoF<<3`nPRO237BZ+$rp0_Cj6!V(j%Dkz~>Yc=L9$HKgEQZ7hh z6&$@KPIY1(@77LF!>H#TR`Ms0^3&?ahoQyJC8ZmtYHQ0+yMn&P-x8%G2}(kR0;CdN zCt6s@BA#gf6}Pxwyl{TDLEw}ASIMAhFUL5uZx4I?tge*y;1I2yzlQKJl`%f~r`>`_ z2`403b14Z^cA)F10@0&3{8wNhN@dGgP46Rzdga-cZc(P}q`M?k*W+9wSe6h@%5|lo@J|U(|>2Gy~W>Hl2G0tK2 zwi^%4)77e=UZ?>cuj3`BPTUZyl$pj8gk6!dA?533I;nUh5c1zCV%~%|_@VQjLpB-Nn{X zF8DH1h1MSQj(LmqF5c^q8Sf)gk?huAoCBifLOkq=X2dirT+ z`v=Ji91UbV5&ea?_XgNsEyQj!$M9(jIvTaEAmb~Sk~PtH7)Ijd*VxMm76Cfu02O+0 ze)RM30CN%p-$r4H0}@WFVeDVqitoqkwI@ZU<0g~%7+j;+?ZbH%Iw`FuV@91^*d~H<(h-kbdsgak`Nzv&0r}DAg}fcS4 z`!y57@q0WOn$L72a?|p#7uQ(XS%A_niik00W-RS47=O=X(84c2(C|M zts1#K?XgBhBc2JsSu3>Ft)Lp}*xn6#bf%hFAjQO$&XhJ%sQaY+7KC%A@ zaIpIRSxiMgA>cS$;7FQ?L{>U`av`=L>34Lh?{I!KsZb6xY&yiBa#8g0tkUwn?2gu;O)PY~)Q@nyTJ+a?z};#&k&$SPYFCx4z7Jm7yH!G_xf z?a1yooAX_J6HqMw|KB$&Hhe3Hgl^6iDI7f_K8`)|xS-3`52L~~lypBBa9 z-1ufS^obK;G0n~QBm_bC>5aau7SZ0L>i2NIBylR}tgv?I9=2^BdVysR+pgQHETl)l z{`aE`63g4EI*0PVPZT7@JD5zLwhpveyXKlz>e{_ow;>?r7(^XpeDO=`-rgXZaiNwB zoTQ$aRqIv4GsVnu&&MP?qBZjoo!+{!BFdDznZTPnzlC4^M*X<)(r4wynTgvI$LB#t zv13l!k6Pt1s_sAXc_2_t;Im%MI*MMKyT4FG;*Xux-ek-eHxd73t}jICp3V^A-^O)6Q(~YqCT;>cRkv&ar13Dk@*Qk~T=q?37vEbG26F+flxh zR!J{2Z9rf?^@f0I5?~)~1Gt1ffn$}`#;+U1DB&vBQ_0I=-pbCY*eip9tc=9Ke6|o2DE^%}>za8T#`JHOiheg$2 zNUkQ3Uo@FcMivvg$dQsGoT14iuV)_qg2+ZFI0t=P*@!7@SNm9LD$D)M2e)!}HUzv& zgS;yT4BE53QY43Wz@O7OKQ$4To6`j&@}z#|l)Cle=-p;473$?9h#;e(1yLih(W+yM z>whQ4L<<(Ye+ES(m3Q*H1AqS;s!0Iob#phSdBYv}Q;Gp`v)H2QrP_xO{Yxeus)lCx zE~0G7U&?qa=mhl-J~{ODpnMKl)NL<%M%3Ht&6N}MA`#>XtlCZM%TqcQ?ONfhU1e|+ z#1qaQw8=(d&{m}_fFrT1h*&2!q5O(@>-Wdi=_au4Qjj|{{PG6kODPf!a}XKn)au-T zlI>3SFuvWYLzkMj(&Swc@}YW<89Qd_Q3Klr(v@oLL~CW>$E()}El-pVSIo`WF=mWj z$SgQU$2A22>s6J`k$ElM4O(%^q%@FfGaL`Qge2j3Xs4$OT1QNruSEd+EPQcm8Q_wnsNc78GwyY&fd!^ReaGH$ae6ks&a2|BiOu z>PPu%)#UlhmJxGSlYlEd95(cNuQdPULhZK)bREe$vfM9*D=9fUa#xF)CIKFx_o~c` zyKF@0=4T@iHGGp)?1#`iV;1knl-d*8bE*msxmy`BbW5F1$vD-F5WHBvR zl_#8s1m9sNdVHx452BcG14)iPuTC?)OBibQxKyROGt+S{yMnO=_$j_WjK%DO*(Cwm ziWCHcRSPEL^7|sdsc7d=(Et>(hAb^%#}}N>JM`DvL+vpAKkPT0`~{}@8`a;u{-vnp z?kQAG_UDaX3oKO)ZME87>!&vk7#u@)Vjp=0B9v0cuvx4V>C)Ciq-=DXAEhPYfdx9C zQNy9vUR05nSu|RsY(1scqF}&pG1_w&X=9bmt#`Ju2~BhnE|Zru$O-VHlPCP`)`q+{ zCiQ1zoif*k{bFV+fU?mDCpT|>tUrIU@|3gMAVF-#_>~rwK_$iWdtK$0T#utLg9v)H z>_7JWLuULS0YE2-YR91AEsSSBpnoN+K_T*JGxyhg7Q959f;k*FW7|mkr#ZD;WL2}G z8NySBMD01R=kxRN$a-%%k`@&cY+^?N45SwqZjA0hcMuIxq~M2(R=%0=Zq1vYMDFD1 z#Gx;YhhKCc;-%&HA{6leG=DQ8Do%&@*UtjeZea$GWYwe6J)=clhrt?X#hZ9Rl9|ho zue4MV{AomXrlG75TXNE26`3A(h-gn6h@=IbCPecYmG zBJSdN_F)Pp>9}^PRc6|QXW#8r-hZit3(A=#R8GC;D^=P#vifG9$MWA)V)e2G(wRE+ z)!kkQp_*tw-Ne>9Tu$@jLvgWV-Q|+E!K3*U){~EGxCU@IEwQLE@(0NtV&yF$$^XKem-l0KvZ^Kof*cptEpcNHI(_p*G7By_2JI$7_Hb z1(8YJgO`^<1#dQj%oAZDOq$2LRi4b_bA>$F7?ZRcUsTSvO5gT6o$v;KaVvya(D#Sh z*3Od=>Z>*aG=HuTyi9_?m0Na_ZpLO=GN?=V$>RwX_p+!o<@)XLXLVTVJzPogD#eb7 zaMSZ1a7;rgPSqD5b7di|G~fJaFHcTk+#wZcpw1n}=HqI89I3y_bE4w%>JSlnfgxr{>e0Z9{9IM^@nsq1NxUxz<^ea5Q{8ba>(7%8$)kjt(^X%|I+#BdQwjr5DE; zzh_P+h$>F!*<&cB|46t?<#`XO?8~E zd&`+&6oQ@zluN~00z>S*YS{nx#|>)#S!72%s43-wQUiT4kO%(7;T)*X=4CpOO2xXL zc&Cy)Y(_sjcHS|fB_K3g(Nn%)8l5H?IE8eTOXY<9L z2>?~9!b;##kLQ!H`b2d3Yk6dXbJgmRVP4MU_qMp7aXJ~-VPj6-Ed}UO1H{Xg8~NCj zX}Cs*~GBdgS>m4h7r7TMT8apf^eze z;xmpi`3_f=qhGnp*TV{+wm;B0J-wNQdT#j>&0-uoh|pT8lp+(29OS zZAUG&5#QGq#pZavlBl^*6RcMl8%QDRc1K!E zMg^f6zAem)WiO9f$S7N?Swl}&Jmc*{MLV9Kd5g>4cDYR>mLkhL12`(BjowwK=Q(*} zgdPsh?R7Q)dM6}zd6 zjrO*nf^46Qo0B?YEBJ;q^=U`$=Dg_2ae*Y_+@eCh#-yGB#3hdzQo@_NPbP0;}Q7J!X1e@ zR{%ZbwOZ8V1>|(YQD8IQe6%(n5savbT8|w4JfBTSO=aIO41(|}q;PlBTyV$t9C~yq z4JOzwWy>K?{Z}P@sko_7#^U(4Pya(by!L*)z2S7LY$97D z+Y|8WL;K*>yOMy3`3$!!B$TN3OUW`Q2C4g|RDy+*a*5&-LkfPHwPL0rcRe{Xh>f+h z&H5#xPYU5?ou`-jg^Nwkopks1%BIB(B1;C@)SWg-G9|7LcrI#*l-$=CmG!kUp z-MN#urS5vQ`4(+Sr$vvAdhuyl_Bz&X>I{1}(BK7dPp1tiQjmpIQQdsY{N5wV5(<1J zpsgeA1YKgEG@YEdC>O!F@d+_hz|EMsc}hV}WT+}2#`^hkp48y!x#@G*%paPe5|JZh zFp19_*&u{pnsld+q!)&`bGN(F;kCzfS0`zAm4|6;*^39;9i;Yqa6e>8^C-RvsBL^k zTYOwmvNVl1&(#>Y`)7(T9{8GqC9E;Bl#alvj()HIK})C?ySz7j_sK}#D@L@GUd1$x zcn#&%yn4NP_QOADg4m%tWwt#Va8;TM+2L#FTiG=E3cb5JJQLTb&6eD4HT{e+YH!M! zxD4~D@ow>H7@HYuUd|EXbi3e^vo@NJwO>NTL5%e<%&z7$f#@emhd#S>gO?<>^0ScR zr=x__><_EoofoPEE$I^&-^>WbB?h`<`m--}XRbfb$=aN+z?z|0Y15$eMnePf$!>Fi zQr+p27c-bE=H<>*Kyg5H26Icx%GCc2ndvKOD*b_YGp=%ZG+jiyyG)MFETvXXr8=R` z_2tHc4md{ptG9rRpJdFOd_sjSVGUzP8iVlxvs|7`0NoWSR4A8^)VX?XJWw!A?4KVv zV=>i{YB6-9+K;iOinB+T3i~c8w||C8+vmx$_lc9<2H51L?-Vj9mU?9^A7+r}mRmyw zRV4PwKPB2B;`Z6717ZJVB{AEFA~%s6cr%Cv5BH38aBi&k2Xkk=hNExM0VVBl?%0&MhqgsXRpkn-GdMo5Svn9wYmHZ6-$ zeW@!NAnw>6wn>s?-`iu60IzI+EZ?^D?)6I0!(>CFmltw#kCCs?ZyX&8Y_YDfq5~1e z;eA9Hdm#Rh8To_%Y3Q@YzhiQf&3>PJCZG4{i8WvYx{DQ@8|8Fytw8Gj;9ko=&+@6O z{wAA4hIAYZ51EVgq6+kpfjEBp36cD>c^FFf!l*RaqrzQn!@Me|%WwL9@nu)CT6DPz zAb)AQ=1r;N*!Oh}t93!YgjQaR;@^NfUF&Wp+O#9Om@pAGS00TAWRJM98yDadEglJG zs-RDN>#Bazwc!dCmjNOf#U`t*xXE@Cq!`)F424o!rkYG-yf)7XX}mr>(!05>-<6TB z*1KitiAHDigajh_CEMS>+QeWD)5V!$3X^UTjh`Y}59^y~+~dsY1U!!4p^d8%-aUOU z>~s458$tL78;Z6`a!{?t_bN~P)K4F-{I0^J)H{prQPCf-WoLWu(z<^w%Rz`}2O$bv z4S%E8>5~Z+{bB8NY^qkWnDkefVW1`CzW3>}^jA2c4D_8a>1*7ES_m$Th^6u!@)DQC zqW5%D8;p<6RO#k3e#ZX(vkxL0+?>=9pi}T7wY;m&o*C|>zHV9(B^kie6yQEI;H_wU zJM|-a@FOwPB}D#_IaH6_@tj(;4r@N?<*TCR`9M*+e%$`~G9_SsSbAc|A7=0yqpyOK z_N`^#t234GVe`-e`&F zZ8X2uJ-h692j!_JpJT?3m#C4>646Lv{Wd3A`*eyaFWm+hv@^$=qRv$GCzV}poQfC2 z@+!X8^`0%RV0+Et9(d?l@xG?^&}(6NV{(k60$b++{i2T~n@0|+y@{z{d`{~n_8{^BcAL53X? z)>H*)wc<(WOgWH+i?MrzJ9+tY0{dn(awF06Yx8cA19?uyx9y~tU~sD3wUGhWV(1oR z$R`|Oiur0_^za$QN3(rOKzB%Y;D|_Z^%dkdJJO3t*)?E>cUT=m`U{dSe@%7i5xy+Y zcKag!gto^fc1I3a+v^qHPEpD+|?{p^bbsZPtV1;quTPZ;d;+OwKhrG z5G!jY4_WIXM}_BqtlJ=Nch3#1$%t!Q!lzu3UrWk+8IpBOb-7a&2xcE_@ubcSt)>hs z^IJ1VoQe5tRuOU?k&gq}$WO>%KTXE)d5u^w0~%t1jB?2O5iOXUO1woN{9Me1+T1u8_zgx zBItcGd`0B=bMz-ctFDULoE1uh1HqF!bDdAYAUoMUd;x)JkrNkujaA3!qI=uFH_Pj! z^BIz4!@)ejQAl74j4@VX!1{@C_~|8da0NDJ9oFjHZSU)_3?k^ObCEt@K#* z5GJ!aP;vX0>fr8D`~;`>ovZ%n0{#7$!E3h%Wp`@d`L-*J_*v5K&@tNY3aF$G{kI*5 zr{p^-MD#vGR!#A&_h2GW6ZeykI5@pC#VnqK9j}eYH+#(l4z7$g_V`6^FKvOLkJ6Q{ zoZXtskfBrNWGpu#WeIoQo~^C2xS&!%{8?e7 zQJmkf@{m^@NS5H9n6MsvFH(s(Gu8^RR&w0#D?U5d7mDnZ^Kru3bw~CXqh;Q>8tcC? zNeQ|I`&?asx?)lt+^rSg_;L-;iYpd61^J!rEnI&-sCt5lfS>YWi*r4HLR|@RuhK`& zcj(RF7aEzqEPa~bD7R{QAnWVGl+#KEj5$`K?i1?j-0h_}EPQC2Ne0zVzLFjS25Hz| zfF+aG|K?o|_0}xdQy^TO)Ch48sGgt(k30IL0J(37JM zM2eYcx~kUNQ~ptDR)5Q3-(fEWeWQ^_GLl>jPvmwP9b|xuRY8#daNVrAlInay92SQ$ zpx8TE#ue3l)yM>r@aeykp@A6d(hXBBdF!NcT38T1o&CT8N6Eq4jB@U65`9I-MD8wz zH%mp?udVOQd*`O5tgGfa7SgEK=%$uzUaF=G5U@c_3gxoDvuJPBYV{qGXBauFij#j< zqS)s_gQRd4bOGt6-rVaL*qw-|rtNG!Gu34>M~{Qcj;zB~ej2@t9VXh~Epq^noT~SbY7jLLQ5FgLAV-xN7%v^}R!;STB zU=XhH=)2FuPBcNxutpgsrbS{tWnf6h91WSFn6fo;x|9g)A6rwvipw>!u^CiwJbe zpn)HLjk31nbK&a@p+($k2cK7`@RQMgeWAxnn-Flnn#H_e^{9I1s!_F8qql=i0)6fx zU;Wm@&t!{Xd;8GCE%^3`q`-hiy>C;HbUOZ4eV*laT)uNfSTwiaTKWxjaBYxtYlp5a zHb{2iM0aIcSS%kM5o_%S?tR?<+|EMK&RMQ&AQEooJ`tB#%@fPbg|Eoc{m6kYfX9p# zr1}w-6H}>Vc9p>s0yL|Y=139(vDMPJT1uy}=tzX~a&UKu8&CNr5*^?cq9xH$ zN?{T`)*2aN(u@W$2Dkk?v=Kgl!L}I*_VndBUutK`jM8|)k(ZC$cEGW!TX>MT;%i|a zsreBNIj)-Bs0(O)IS|IGI`o!fND5P_8SRjyY6<_)V#38OD%!%kX6H~3Zk3-b3da#? zvR}P_{<7$aAXc&m*!|M4Lg@w3<%ajk-$P2e z^Ekv;T`#C`y%nT%d3wksD2i}goo#ljg_Qj{B6w|Xc3)b#NU9dcN)8VpgIO%@fHIi| zVC(83ZKeY}U_KElE$YB(KUKA@h0ncuf*1M}YtX6lPQP~uhe5y3il+G^ z(kics`R5GldDm4-0z5GojAyILPlj&fAnM_95Sg8KIDLB`#Cc!s_)m$sxWi9H70}y> zS7kT$cFD`ubMxRX^+a$lONM(cH-9R%dn~tdcY(G4(4d3+R7ttzuJAyiNM>krIdVZv@jFgb-OspI9kh+!tx;!iz7VSrnDv3a$Xv_t$zpzZ z7kZ(J@u-`p;aOKNqg2CtuM1}Z`|YwcJSqH~aDqjIQZ-z{mxTA?0N)~hK5zdM_Y(|` z`iOo4%ns))CU!JftKc+(3 z)EWHm5-{d&8n-wijR865q6YA>sdYHXYV!a&t0NfOaYr@EybJQ{UET1#7?0{5ni&bQ z>((%u63omhoDsw(f68kpm}C#B^U`ij#>N*76P z_j0Pa$cy)E=}|*`SKN!jKipc2U;Vfc!FTevNSFWii+6)zVzRKuME2fw(_^^d>c8G~ zu@psuAY%$o5$MRKz9%S>pYgjknx+Ah)~o25!Y^J_DD>byK*}!|n}Y5ajGgZm93!7> zT&*1T?R1pLA)n;a5|%#pZ0<<^!7+FjRB>42m>88$d~tBY^4}AjmnZ42dPK~SJ?&4n zvluQ=>=xV|zW~O&_`3P26uX^mqP5;MZbuu6UN!7b6k9oQUBi_(D*2#G3ZvvETe%FQ45E@3wXUOXnREu`ot#wZ|IgmWj`*Yc3 zZc!xK>{2>$7MO^zuHS@3hpGK=sT}6VMDR8j^ISl=8)*3YaA{Vi(MX88j#CQ$-_p|k zyFf2~S6f%?O7osCP#|RW%j|jDdwU!rXzT7rTz1+uo_|E%F+$-h?U+9s<1b}@SO1o= z+mf(d_gDxrnbEPQ(tC?Rjr= z_dx4b{^iz?%EyF5T|hPJk1c`>v9YS(vfwBUm&k2Rc>0KdikH&u-9z;pV+Yksht^-K zO(tH4Sr!6*?rDs70cg#@{u0Rfy5#dwlX&Djt?*C8(JO#iwJTx9bE<@8-Ss(#y`FKi zRH!O-V<5lv1?{`l0HRO!{}3qiXqqW`Yn?Eel(tQ9-~TB_Leq1F{$%YFCue zKWpN}zf%+C*D!fs1VY#U0M95)omPek76Z{wY(?(rCt6VzV+}!mm5#obTOO+7a?(Y# zuq0lYU-jk9-PyJVFP9=sp%bBKkSeixvEx8|2UEw8vkSt-0CA{C0r|2*ZU{JBl~A;-nW zpU=|RAIk=gC|8Y3!rY#0FRC}J0*mQGKM}B(q~yKNLWQr3{BYdIk@#nLcevJUKG(YI zie}EY5moAoi0V9O+s8eiDN+js^_*o+zuC=T zU`h0si+`zav0h&s>m75XrNbRk)iUK`srKWnk%0L@`B~qq*k}+LlrgAngTB8V@C5q6 zt&@q5o}?&py}R%h_`o4beygP7$#h!mMCCvT{2`+6+jN@0i&Z{<(5x_$jqX0r3uW82 zA^oGv0Ng(0l6kTL9-XN>bTLmqpWj@ou`|~zzd||{?N4w@?}hZ`@*8artG7V5k-XAl zmm9!uokDj~Z@e`=#0E$_O!oj#%*;>!V{5m#grPnd+dY#zx*Bmh{ z0}{ubZ-CJ7K{i+-;Go|hUZ7xexF81l=AqJrdBl7x>hLH_fsJ4a~Tm^8P=DW*Uc~)Yt^2hfL(r0 zq!#jkzLgW4a*Ls*RQoasOi&TGKJb%n&ED=D`3Eh5x-)N#fRiT~IyrM-C|osUg}Dte z`Nu*%{B04P9>P*0(TCsJ)GKGZZg+92cS;|>brDJgq=4K<-~0b6T;%*O(Gi9Ly$d4k z-aVG2kIO!Jd~^>yIrO({#JG2v7nSBw+w9`aghAkVL=r79ff?4B^dBp|Og9A{0h5a0 zok1FbctcY@1VW5N;?@w=nv$hY)yYH!{rF-cqKW``c3puG1CZm)B`{tvjNvaBzi17B z_7vj5V@e-9$&|juQcC8*%|;DLVT0nY;gxJf3bJ`(6^99F|E-0CTX#~5!)2!--a`lU zUh=+^1}P%k_v z5!#WvALwl!ZHM_EO>ldh+kaOc{yjWruj)W=<@st;M%$(^US8$n>IavC(o{~iKVWo0CUur1v-z!hQuCh=OS2l-=5i|N-w7PLW4N%%Jj8%R`vqyfJ) zDu8$14&VweqN9HzEB|WV*nfKen&UZtg5jY4a;J%;Nt>ECLUbhPlX2P8xZ@j-dfyDd5lPg-A`=8Rf-#ar z!uS!j>#oRi{3i$!9MS)Y;r$&PZkZK#Lur@jI=;_y`!!YbeA}C@=QRp>=e7VN!7RM38^=j7jQ0d1RNRz9co_Vx}UAfVQ?z|1##%r35kz zz^M`OW$rfR(0JqSXETLJH>|{+$GmU{Nt8m!$Ksohnxp0P8u5b1~BR;LMVb?U!f!ETiGa?7;Sw?eosWq%w|6MaMzIBX>nSL5_40)Wi<2K zFc!S?RY^K6vBSpW5DQqn8w>dLp9Ep}MQyEW%*Y|e9!mYImmchP%yQ@~@^Nx0lI*X3 zMC*986}H!p4lSX={!F{JOPI3mF6*8Fr{M_*qXm`CdhB+x5w1`yHMT2>5A9^vRRo-d zHZ$oc@HKiIkZCng8r6&ixsADNRR)!bH7GifT6yf`Mn_F z+v9CX{%b&kd*yM=uPlJy@)DEN+uiM!1D6mx&F=&~r5&Hi1RF-Lb|uwXT$5WS1Zly_ z<@6E}w`n*BZ7{OZRDZG3h%sW~w-cFukEb*MKQ3Qt00b6>HPfb)9j#n9_R4qEst>(A z?821$W+JYM87;VL5PWT54U!`98h$Gt-X*Q$2|X}aR{;+sXTp8_p2aA)&}$qPPzx{% zIpX2+tHlosSv%sAtCvWg4Qg{MapR?v+BtHTT=oCmAuc(?UpKt#x&O}^M$^4mqvM0S z0gOoaaz+fTn+BPx(F6L!cF48IAQJY2)}DX*7NqqY|MoK|LIETty%A{T!6Ze|vmClU zyyP4zaR+VCkQLA=6Q?JZa(wEQPwWLh}Ud`}UC8$GqTt&OC$(cDh{eRA#p zdN=F^;yM?Mzz^!`m)&?zw0Q3I1uInZ3E#D`Uo0h;tM*kF$tB`3h|7iCW&qEUg;WBU z#T|Y^Wv*GMnLj%i{3QPvWl>w>{kIR3ELl=MHuKu#LQQA=A}uBTJ0@b(`Y4qwR<#gsY}Wi8 z?iV+okB=?9nyVKm4{eh9-$xn$`-Zr4cU8=fgF&AoFh>0q;Mb>LNfNo=;fL`lab>tX z{DX!NTsQo4t*73#Tu9c$yk5!=Rc<3-$>w1r2t?ie{|HI!r6>Z9t@;bc*03iRyh^93 zb%IEC5`m!T> zQ22v8F1v->qu?>&)UL1rc#=WqS-ryO;3I}4bYT6bqk_yzM27>RlPkL?N`E)BbnwQkJ&@45-9!$WDG$`(qR~ zzQ)}eB!da^MP^%liI(!_OyHno)brCzVL@Ve)4?pqPBnT)g-hfycH(ORc=?yyKj6Rk z<6`_-Vv=M-uY=Jd=w?Trg z)DK6Ox7b!KKWu4}2;@t@BVAB%>4XilZcoTM&o-j<`bMvp^^NuLMM&4mU2lq0w8Qu` zm5|4=u{5C}2~!*?w^}>6H7oR?LpO(ng#<8H8d*y4&D|j7e$f6{$T1yvEd<+z!?+BH zuBVC;Nkv&MB5ZLP9AwXW?PGPxR%Uv7!jPN#7;BJl8n~206%LZ^W>72GC4+du(bb=B z3TB^2Hr$M=<&;V33aR=jaCC4OlO+R0lDxCJA)q@LtZfZMC*_=4fef4v<%u6Y%)3na(W!2BCg*8d< zdYU8+zbS%FZ}W493OLQ(6xfe{b@k%6Scif7p4SLu6{f<3whTCu`50{}uc4JlEws73 zD4I`W^`6`ix8`k**flk^79WaW;(7cqE-xxN2r1w#9WauzO1xSak_53{0z226n-$+X zkWhvpQJxo8*b$GZ< zmyt`0+4e*uO%!eTly>{QC;xHq+KtWFi)7g8+lyoXPo*JAlQvP%I9ol$(Zg*ARfsz$ zhi}Rc>!(bN7W zz?zLK8(UWreX5kErp5zvsw;INk%I1He6HT-X*M}AaLCzq#)eXj0%vkYRyK(p-Nuc$ zA4DB7Xbw$kZm!O8$hUVD#GfTa)!3@v<+A>w&!xAX@Fi?`K<<_iW4nv7jo!;vFQhfvxebS3ve8aPK!&b4l#2u;wx9z% zp~R zzdg5pJ7yNF+`1H}enNgv9Liv+eguZ?@t-t>}_b_w=Nvf{U=gCv#uzD|6l6{{q0owq75L@JOA4&Uq8 zo~rgi!Lu%PBcB+z0*ztTM7{uIq&1u14L5?c6t$X5sk}%mZh!# zGRE$=YYVC%FX@*`U-Av^1%MmxA@ke6_HHdZE`P%-VQhpcY|@K!jD~~jN;z>7`!&mw z-X!c2!;GcG2ORfpVS1^E`8mDhACqteq3!$KI8f;U_>g)XNm>J|RX{Q^Sla?8+KOnf z1F%X(Akp00R+2~KHP?%RwNqwd+lC2I764@}7aV6aRUIL}V?#=}@*^Y599&9V*i~8$ zU)L_Wtb*B-lvkS?81DfZ^|xDvl-nnm2Jj#{S*_sw>4O#dA+ZP!Mjp}w!*pozWC&2< z0iq5e^kfnHI^RYCERl+IKI)d|2R!9& zef+#PK5e}S=>uXy0~<7({=5d6Qye2_kCon`?9JOm(lhWV_*z*gAbYwC^fSBtOd^-x zGM@i=7`keUxbpKCk#GT!)&wco@>l&}iyh2;pTuVvT_hHOD0pu6Pm$PR)X9v zvkYUF%fzdO5g_MDTQ)L#wyGfxc-@HKU0^$Hsx2{m*M!5rng|RBkE6n@qb-=>TR|Hv z=@v}jXSI%g9KGm%@)QYPe*-fq?cYL*Tz;29qCxjt21z#OuM852<%Pn3#LRj{QPGk$ z_u@FW9qGey9tt_FO?7}q>ibKFM-hay+LaRyd#Sz8`VrZ?UnEiDbMuMzDsCzWtf@s< zS`DKOy4bXWX?Q5r=1`>#tc!E zr8(|7w3;O;u#_a+5v(diriBX50nx{r5bs2VTr4F@U>QS_a*!b6x=eOZgw8Dc0swXC+KZ-;Jj?J|8|S|u%K z65SJ4pL#P3K#=)5G{v{#H-D{)lNbFZAdGOH`kFp%pZhD1UJRsAn=J7Vlq zpPl@L#0SYfS;n${B=iAO4)@OHf;c-ygp>a@arVqGZirv2V7qE~ibomOpMnN*ZV?{J z5@4L(EV5K4c2)@UAhdZ%R{FZyeo8-m$P4#J{#cOhdZaJA)`zI$1Fuh1eb=hp2G3Ck zIBBWUqJ`hH$bahsB->5q72gs19>ftF)f_`YPa|qDS|neRolprhdJkfQU`?+pMd+r1 zUAjqnAKGNU__kkc!2dhCsgqpLrmvLJF3S?KIdS}n`*7BGCIgP9Q3!jk(4Abq^q3S! z;p20<7ag>$lo*E?&$&E*e(vC@`;XKQ9KLCKpX0R1iBo1T-wP8;DZUfF`}pQz%crMa zz7&>wdEnsDh?hPGPTm@glk95j=xS;TAGg`)lrUS#4I1f={nlWUF>WF8K-Qu~!P9NC z$w9CxkIRH?S@=+q3rBmy^Y$5=8EdO^dOUQRv*)CERKE2Wh0-L|1(n*|itnKEv7LjIXY6Y&zRyyg$)?9e zvl7L=bC-;u%rK>j$;P}sHN6ldb%@1gC6rHe2>u@afqlMJlHN99dz{dYW2&_hiqMN* z?j(Emg{p|O5|XCGt@H%T{IxR?iPb1k{`JuiZHUjPO=S2)%ut2%S$&2lmq`mQjl91o zLW;W`It7PptUN$uP1BiEu{p~sDh*nNo213cj9V;YZCc?0jnF0v)V~dmO>os{hYY1C z&1<6oTZD78Yf=fbX;av3&ec_6@dV<8n)>+(x63ri+{TE$gcVYHpXrG6ecL=o3zmQO znA&A`SZ2CyW*%*nJFa{ZJBA`YE?ZVwy4nXl*(49S7WpM+0OPVr&b0?wVJ$bsNlo4B z@q5yMfy%;u{;yBHfdTbZU}mD__7Y*Qfc}o}cg?yl!S;wo<^f`oS2*rr1wBI~T=ssY zz2OmLL63|JimD&gPt>??s(eHALjxtQvyx46Q&amybPRIQUNV#%I;#UDYNSod%gImb z5qrZoQvI~gr!fSbsM;EJ;fkBEV{!#$WbQUM^KdZ5JHF8y71a_-@_lXw6AeL4wS-Hg zvQ%v7JO;|wRq6b!(cK^Qc{Hkh$L!r*?s#D#AN2@Y@qPmP?2m_O*Lw%Pd5)ajhNbAIRdyYJ`u z=ehs!dYw9r`F_6F=UU#^`+8semk$t)kL$;m;lCeV4MreKeDyb=P)}hk+Z{T|^6ybc z6)4(`qh;hh=>|9_ZA-`ZK1&<^^qz{UYY1b`D^h7Lo0e;)5X1T6B@_4Bp3_<)$`Szr z3m24pd%ehiAxY`O8UDWc^5Q7HPz_5ORCg6*w)fKF?2NO}smH1xl)^PjHFU)?n41vI!z&X`IkHJ&Zd zDU1xuvnG6wlBl<{IGowAR8aD=lkgdhFw6uD8`5!qz;)4&Cl!LP)`cf8`^cQ;4JF6z zisqQD-QV@wW*B{_{x0Ik^;7Nx!;gYhHlYtOUD$~_q;XGaAjD&ETmCcT`28duM7kB~ z5RW}iJEnE~tOmbq-%iqg*4QMYUEIk}lH5{(;Lfvd04h8e@bbk0dWe8U9I`X4_d>fJ zQ-TDKO#CzN+B1v2oSfzl+JyUf-~ZV;{MD2G7oVcPS+2k0gR4Ga-B950_g*eyBH-Lz(859IW*Q&L+A~`^M`>G7i59|SBGWZv&>5< z+_eJho3mITQ*uIwxz@VnZ$EW+3t2ZU?BE{F|W*(t`(d?r*%U~rg zH}5&zEqk_QI@Pe`OU3`#gMk}xBK&;605q|m0m=N5U!3)=S~^vvW9c}6D53k)g(_1T7l3Ugf3%Hv{nS$` zgzjVBoMf{16N7o0FVIN6919dOrOg9!vkpIX6u0$0=Kxlig*Kj3j%HBoW?%4I+We=h z`=3W5$gdpRGqI$cHWQ}>&h`#XG;P30v0!Onc=V=LMNQz{nTnb()rsx_hX?yS0;2tt zw!q{+lv*Ezj+(&IyC|7vN3wO~9A^|Rc@ZvTkbYS$Qbbk_FxT$3)_(v)O9nN-ecxSp zHeW6p_-t3|?QQqJm3~Smi9!VLXi5OhpJgva>^%3xW|j{xB6?*n{NqemnSJF*|GS75 zI@+L;#~%a8AMA<1;!xayX~nv|fTqN+-FvhX2#uv%;74ldqCRd^`_R94SuIn-T#%LB z(XeCZsJq!XlP|un^Yh7PcS)*=xz8UZ_G*?tME)wO{{wGlHHUVXAKkJ2gh^efYytnH zrFmWBk1ft9;0W@oT^}AWNee)dm>z5=78FM6%!+b7anh!#S{&~eNWyuAau5UNb}n(C zzUiy-6Zh?!mihjFeRG<%x&QNv?)g|lxb19I)PxYm>T62+| zwuAlQf{ciXuN&Kes-D&qNDMrPZ`_K!MLKR@RgfetPH_`GB@dL9ob3|=ZvMi`kkzmJ z%zsUc{>z*08A602->QK+eY3#Qt{JqF!&Rb=d+JW&`m5ajD#>`3?=TWZOZ@xBOSs25uB&H|1QDVtHD*}OOp4fn_8nV`w{M$-XW_*j{+!x( z*1{DaU7W>i!Q1~9n0p4tX6^K!UBT|Xw0Kn14mw%h{kxBXq;yPv^+kGb!3?vev!EVo z4QP+D&V%ddcsPlks=bItZ6}VHhgJ?~-wH-jv||I78Ms+8fIWl(GT5^w2iPZx;fzO=F!e#w9R!T)q>Zby)RQ_r)MJFtx(~2N6kF zIPjg{nr-&{+Wh~O6Ku&RvS3;*_icOP_TnSkWNFm{`WC*V6v2i1(Q!Wy7Gx?jIp!_^S*{h z>!}Aa$cLQ{7Og1C3|HW=e`SS|t66;EYIe0~-|PC62XwNpi>IX&8pgVD$60`r;6Yer zeB$XZE8UE4I$s&V_Nhlaq{sT#{*X^;wN!#>Hzx#dO%vmez2x$$dg~ zg%7VdKf1GA&;N>0bU1hu!qJv%Uy})CdE{@N=Qi;1*)rp>?r@=xz$5gYZ2}o{I)If6 z6h+ytzPauOJOhzUz;4HloTmIImiVb26(}V@Ik=S=Z04HsCs+4yp#F`>^t&qnp6wX= zR^{2I!E(KQ_P1u75HK=xz97}8j=gAUj-eg+XFlM`eOH{4bV>uk#pfdj{B-<({ao*$ zbdHQ?2%Njr6>W7+~!-BjPtX6mMJ2DBj5s|NWvCyf7<2ng;xfx7&+-+bmEO zeJZF2oUvMt-CE_A{$;0#v!3S%D+L*?v+_%T`DqD-EG=JCX2I#jS*%_4-Lti=$9yVM zK69Zr!5t1@M2Ml!N3`GbA`=d6MV|;kDfbXP{ikGUBG#CD1wv?bmdyqQcjJNJSc-Ta zSVgV^by_BKX1C59tFP<;zS{nO+*dmQ&KmueE+8UIKbZcgielQ*yBDr|D19vgFNPua z=$&C-yGF*+sQM4lMO3otFn5KDR|@Xy~E*9Lo*S4D-ipVGG2{$WSd{rEk2iO zC@uFN$FJJ*9-!M8Mv_a?0;!g5Q2y-PrflZfxgQ1Shs*o7pq0h1Y=9e~#(Rtpmg$kZ zcl32X*HLC!<~73oqoOwxxKOk}Gvc%5;$0iDRPHUJ_v2fBb2PifH5L*S?%Q#6|2x!w<{>ylW< z9d8P{le*Ao#Y>FHn+2cunQ!m3(-pMlr`yMae9iMeOGcrLPH59;Z}ANK@#Pu?;qP_2 zkxnsgmOe}2}4avymok2n0ucFc1YTVHv&B( zC)4LXO6OLF!0wq}qgB6q;=cm9K=I=u;P$8DM=+Q9;_XjdTKxh>t#q_n@aFyryaByw zO0L$*=lr?aT`96nOFjui=p}51sy5YX@E(uR`7Q1CwuHU@761fs z#<1ctoH4_T;rICel$-pcvTUukv2|l9t$$$!$bBHz^jjBKSq z#qIu{eHB%V0l6pGZeyS!ddM?llNmbW(^CLr46KN4b-%|kG7p>nR>CxOKkmFJ3W$@Y zLW^s0KvA4;`}xO8T>_Fav#`GXe=zL>LkL@BydaIr_d09@>H|PzGq^*d$h4ufM3FAQn4E&STD>Iq6?Mf?deoj?%|BiO&uyeGlX* z2T`B=ZzaIEiIOF*qYR`!+RdxRsr#QcL;|%hHFm%wa46blUrz>e z)r#%sW4eIJc0q+cedo0XN=Vhd*yjK$$ADEkI32NO2l=@O zlC+PfJW+%Ft?Q$(4z-nOAVzkPc1i#ZS3bpsIP7TD+GizmDJdl!+lQ$pe+WpRCUwptVEL})NqH}Jec4JU3u4;T{(7w>{uiNfWfw=9w!VFh zy2RVSP{B)I`7fIe?g4blLJX*TB8OyWZO+zmyCIpqk9KZ>6JC)8YNe1KAne^^ps#o3OU2k6!5bMTlN)npo+iiAv^UTR# zw3%=RVMPIv0F(k>o9JE|kG(%>x-s z<~ypR$MG&YSsw?QxJJ%#PF*2B8RuzQXTD8!1=O>G00kShR721Li!Va0VlDExYXOwvHOrSV!tFqWD;?VTk_Y(P zd(YarA>+^1A1NDq&~bXboA#%EU8*2z6{7%okwn?`nWX9ZpX**Zq6R{WM)wM~JV0*& zTnOw~@wmhwvU$w%$EmR$JtP*hJ&*E$^6JA(V zxNniI0b+1qD8<=lbFDlcS{lq_D??6rQ#$pgk~x>BBvx8W8eD)U(Ic$Eu(W$hSgZhA z!w`VyI}MYK!0p}gi@wnx@!ak$w0P4mfTg6&MgT%ps2pr^G!K|l?|CsmXcz&`t7T5u zWzJ8Dd=p*>*kknfwnIxkl%zy*1J4Hm``p8?_MWoi7adRXN1y4Vqm9*->JtZH#mi*{ z0W5upcQcfT#!;@NE}3&aiE;2HmNb9ok)tprm-*;^E-p8V;D z_pD8+YZTC|I?LKij|4PzcG%kMc+}>6K^eIXR?L)DpyL8HrG;*rnuEljtj~w>u^JA! z9L~~?VU^yVGwr1+8YRAYtNQ_5!c5X6$V-)I4Dmd=Lg=_vCn0C4Py<}?_V2FvzxL|Z z&pelrD&H6dwo(=djf1K1FiS8xUJIsILXPVfXry51-NC^B;aV_X5GxJXSX)F0ZjRl# z=3e4YY~7G)8s_dZq+UCJfgQiJT&HFdcD;-4`scGvSvwvv3=Z>LRh@cE+pSb!^s5Gv4|IT11CQvo&!E9S zxzUg4Dhw`~QN%I~8bws>iKs(@&UB5*)bX|QKWX`m73xGi9(ap4;;8qzxmX{T86Jsh zf#fWV=294Pe0SYXec*qQdZb#Rj+GN82YU7jUP=54R;2XbxaJ@g^0*s-JEh=m1g`#a zu=07Ig-mPg2P)|6>b9o95*uWe^z#5AjsHrNK=RA7bc)?+anXKilo=W=h{;3c*Ju72F(+|Yc( zgR=WOVG^7RWhW(Ntgr}e0HP%gW{a21ZE*@9|A;OUwLWEYmS8#pcd(!6?MTL^w1Ww| zSJ%ib5$T|zjYLq!BD@hJf%5GEF1BHgKvSa~tWP@iX|c~~CNs6%8PHyLwCKC>)MJXu zVtK;Q`QOSX@suH8R8M?aNCN;NIf5@^o~e0Q?16khRE-i>(lm^l_E@B(c(BA}m4P`5 zaM6)Hd!E{L?a?kT@LfL#5pf6uKtF^?=Cu221^Yp)s6M%gs-TP34 z;*kbSsa)xz2MP2c&;kLcn3+e26)e&s;h7|!eKgEx#Al!hW@Q@^U%q^v+&pAp`3HX$fE{L$6mv6g$K#*dgjUhCn7bbsaO8=sF~%_Eh~ow? zd9p;BpbTN__zhD=#FwqFOoG zsbXgbnH~kO)^q-b`tinh!JL}NXHT6wi*vqZ>Db-k8VBTS-d`a!cfM1yxx)y9v0Pov zQ>Q3Ylb+5!OI^^7R8vM8POyn4N#)n_M5p=*6)7I2g8eq>%z!yAv%!1o!rboFBKaybZoWeHJBf+3tqmr~ zk5rLiM`+}Z@^rwV5grMi6g^B*ia4PS^-{mS{dnN^F><}NZ3wguT&Io`Ev*G5VgFVP z0^Eff!UVMLKL5Jb%9ttI`C=wm2sfE0=Lx=z8i2UI(xdOp$6wwHU(61`!oGmL=1CqO zTHZ&4$fV}_2>8sm?Y!_ghLsDj%z!h~rxvEHU9SRpEqe>EJr^|~lCfh?PhYbAH=7G~ zfPb3$pmf53PG%Opal7dTRLrHVz60wo-%mYp;|uJrE1IP<&oXJP;naDMTS|%${0x_e zK<}2by6}5fI&y4x|GVHaeA;yz8HH?$D#ufZHqABSD$Vl>(lFx^V=>jsInE^Olm5f0F*fNOR{`OKBgb>JnYao{Z0ba zcdI+ZHf}>i4S$N6M9)3}gN}EtpxLU{h|N5>>7g(8{ z_%7QKR3s}nlA@bK@}waC2vE-885Y{h@P`d|biMaU+5C&F5MmSM8v0PhtRH-@ca2eI zq*}JpaRuC~w+#ol4#34(e-k9Rj34$%m+yB?4R3vQ4y09wN>m(xknZaimTt$3O>XWc zZuxnQ_SB3aZ)BLXI6KrG2R7nnVQyxa0Rge;Gf?JS2Y}{vs<}f+U#0$PI%kNl>N;>)r!Fm>~l|rT1XI+!2;-Feid^|_AqG!J9AR| z@Zs-9bVEO6_dZC(gJO_xe^<~3IPn%s{3Xl;Gwl3ryQ^u#{X(9*$c~hwdF8M ze+K>Z;yl$H?32+0!b*wi9HT2C%|?r}5MgEpTph`h*QjrOTIvgP=27<*DcV8`r>pg{ z@cXAjFA=VD9^2|(Bx8Ho;<&%XiLM`@Fw0+p!uelZ&dZH3jvd5D$PI2dc{$3J_5&xB6rCd34cMQkv2>4FTn$Qm zjgp&CHzdto3t9WX1*rau1lkk^%~}PycIF$NwmH9PqzUi{Jj|u=v^uj3eglf8G2Sqk_)D6_onNM6JaqYRDdP%~Pydyr6k5|ZY=5jb$9S7 z0^L-$7aby+7Fr5iQ9kwlyYhfs$J@pNn)-jN#~5hP7eBo}M0w$AB0+IB zK3ECED=9Nj=_IlC4J0vOYw)RVSl=}`Td<|BE z+ST#=y*0eK(}bUC2)i9djNY0yUW78kZXlySUwhQcc|k_Ue3dzid2hN*0vQGgBs!qW zt^D1)txhON9-Af^O{h#^6yHW2Oh`e)@+p@-@4-SPsyh z4X}z|YY#?lMhkUlGr+5)^X=vN5d%gYscV0+);CNhdgc#mO?ijLB@=gNYO&9UWtcZu z4Qs3AADgog;xOT? za07hHAumNUcBol3*S_?mRk=1BkWE5Wbrd(CH~DLwb4Nx@q-}<|b6hPx3`pO6x@mHo zh`aBG9vRS<(^52hvKq?nC}Pc@AS;fkR;^`;EFSrscpITZlaH@+j@xylaVZ@#^Hxa* zj9rOS>45zUg-r;Wy<^Rn;{Jnq_-FdwPj{gOu##4!qzy+h^?#x&{>?u)0!Wsx!^-dI zUOIwEJo5t>aeEQM^dx8rj$q0>1Ng8vWJyF%+-lcMXPzO`1Eev&p@^DfdTK~l=i11G z+WG;!WM4agT3qnY!xBHg^8(9Z<@I+yd=sZUZ(|=Df~-6XVBIeic|QG)il=e_#m@W` zzvGr6X&+*K3WVOjvF@Lf-aj^zha17eRgW2~@|(O~z0s;9@q-W*AoY)!Pjwajl5md{ z=Hb<8Lrly(pO(uuxU?w)+#oAu7wXd{E$SgKyRe@|-a;GP?*STBt5H2JF96vZ(+n@3 z@`75(xW%U?X=P77$HlNJW3jgtn5{%8b-ZI1mOD|Gq<@7iw&atLX64K)rvLbEKL3eu z$gxoWodoIU%Q9`4Z&x=5pr*RhW7>(!J5diCcA<*&k=(?CiqZ+?=&>Gr1If-u`itG%np@R<$AAaxGOkF?W zqUt}_8-IKB7?S({l`nt$12mCYCCHx)Um>(wfZ;J=9{-(A5Gn_tCXo-%tF`6u^6HAN zxoQAuqhaz&hS_H{AYqjM9QydT9z2OA{b2f=+jGfY+txn<5}sdUe?lVw!6E>4JePU2 zF>N~q=hW_C?+8VYe6Ljk{Trk8*ST}PvwKI{@}mHQg!R8z^~cdetli!!c?Y!|qlUC| zmF+&S7oieeFRN+_AKIRl90WxdRW|FR34+!l}%SkB! zF=0GsrZ8&j7LF4e;L;-B3(=nq!)OVuNwNFe`r#(3U%=!6pG@`=`dI`-%Hv6u?0Yy2 z4zKCtDi6>Ko&ZnDt#*Z`4SG=N{_{zzgqU>F09E(PN5uiC@>%U+>8`t^n}T+TX8@Io zj2iiQo&s{o{);tMydkT#QSx$4X#cyVxw%;D5xa%!<`0kWutwDuE~!mTNY@4(OG**e zrhp^s+VVuKOhW!knN_~j#H+X4v9FzaC)&V4h$v1lqGjEDm>#jPF#V#J(9*eL+V-zX z5R*?39obT zRHfx*YDlR^zW(16`acf;I&01YD?*1C)q-_L#@sJ-2f6e zG!@XJ&eL9#V&0%e3g9cZo*5oK)BoxAgwm#WfDo~nqZYOZ6#DV>o0aA9Zy(MLRV^2` zC5!R#@F_-^jpqg~dmgh2Mk+##Mqm^ubvVg*DtZL1>v|h`t=RZO8R)7>i)=(a)c94( z^>G@JusG4=Iy%Mt3mAuQ8RUvp#4^3QX)VW_Gl+x2qB9HTu$+Zw$Za9ZqLOG$w08Fp zf|TRqX$3z#R^Shk$hB!j`)y0Y(Tb;;X+N0#$176m7j)cNG$V@8ACu`(b$0weQ+}f$ zmyxhido|_IA_R_TQ?+>p)#v7H(7NiG8N3g78}~9ke^q1rSc6yGVQkT0L>?0cVNsFG zrqU$T#MS=vLmMo%dY92wW`qlk4T+)KIU>QWKlb0h^$x;m;qFL@gTbB9O9zDBnAMWK zU2DzWaS`9gqQVARF^>EdK9_n{c2v4{IzuCt?>PT;?cIt^8f@Koe{!#spkRja^EZoa zuj&ccaaZE((L~iA%c!XN_c6+xZ%tF`KUl{KG9u|0eUaSz&ToJ-9U`)@(4*ehs60Y! zm|C~xloix@Y{wwU{cqCEVaheWVijz~{FWIX=OMAW`^sqIY}`<|`}%a(%aWRvjL%iz zVb>?7es}oy)2J3uhb~L==edFP%e;Has0OumnL7`q55eKOV_n$1h1p?MG4tNvQqF6u z9=#`j;b?TpeToo19DyIA| zl9Z=2PODwj9Uzs_{-(7$<|G79kWK-&QuB8X0Y+xp(1gc+`|^+Jjga;C7g`DlY_##%7+q#|5Lk0sn&uVULJ6)-EL$$UYA>l+0= zHyA!<171}XxvFOBFpB@ziT~pK{v<=6zpaMGFVMqzjkF+&5`80E$pWRyG;}N!e7;Pz z;Ffhia?T-uqW9c4b`$N#ND3FxwlGe4_V8%-f>RP0Iktbs{}X%C`seJwnZI4sun;(4 zNqD=l-!9nLP%~yEJ$$$JQ9X@n3VOdlwhVs$0b1bxMu9k91aUTj)sM=rX zmtI>)p5H_hp@jo^MTgK-u-@mT=trjTua zSe0mYQEs}F7kWczo$f~sPV;}1x#Bc({DIW zj8>?2(I+2eKB$i>N5K@eM_&8u;?)XRAGIdJ$U_+73eLT)R!D=ftV68c_MJP z6gqe|7#;#C!R+375CO!xP2ZKi5tk14KKZs@YAG)z#voZ&83{{SjFq&Cf+!g8;kxx7 zS~oh6h;3lq39N9}uWp$Y9({xS_ZgmC#Npu|)pwgKb9Tt-^H1)>NKErFEf?S)Yve#> zue}Lv0WWaXeJi?)_+t+Chr?G{sDYj%nWyllq1n|WIAO)6r#6wi<}*YwOH zE1BuJc#KZ}r#=Y#=eaNt9s_fs+{!Cx0IjHG8-2Y~1@M>gNqVZMS zjy4ZrW(`8vCw=XvTXA34S(b((&#=gVY+$;<8}T=^F84m zG@zcy3)=9hR405b?~b<>@HPf|UJ+=*G<`4?%9bv`!Nv*2mY{y}3>}R4=-}s^HaPx< z+a_?Y0|Mo|-R=DxRLG(@@ zlF=!6r8Jc9<4sr??xW-yPS!kHw+P0hq5r{@-`3HbxZ59Oz{$v1pcVtTw>i(1bZ6vK zk^~`!vW&#UiPFfT{7rWoNs$P89=Foj@K_qN2{Z|NHFiYLUY)qQgTW>cp8bysz1GQ=y_}Q?TCYvEa2ag+cim)h-T(h+mcQ;qmY~+sE3_rckpObj%#Yph`A57F>05%6O7uH|g z3i`ZtfIqNi0sFQ|QR!smS9AQ259F4#7Ivc^4*h*NrT~=r-wDSVrXRopVVF4kD8yO4 zXy|Nrzc*+J+Qr=l^moPaq|qvX1+>gE((*OXIbRd=lvOHcfDkaC`@GiUqf4+KaaMGZ z3q4uO%Y^^|ylEbkO6g!;J`L<9@-&W>Ie!FU>&CP2&A!KK((*+pT4>&3A;VBj;Z`paSJ;z+;)L7WAm#kHwQ;Ot%i-dcMy>ckB@F%O)32r{7|}2 zkgZd18tTh@r+Wb0Xh*f(f_!XNL>Lvl^>tgT}brXq}NBsz`bAM(eKwQm^pMR#sN@zWxx~Lf2z+99qEv z=Unq%F9_uBm=S>8FDHON6g7HCn{uet`R)h69^38oFRd+sF0Zs$F)2~7gQr(3p$YXTV1<52L>e@?#Bs}P=UR@co zjE%_iZ3L^h+Q#5Zr(;(DLru#HkVGv2jkkf#bZ0oI`Z$P<@5LL=vXK<~hNJGFW6wW1 zC3+rS=A^%^K`0*)yl}+x#wSrxGE%WDTIzf-Qgz`-GI@_tX&_!$i566+t?Kx=5eU#( zm@3twfw5Op5AQD)GIivUnte~#4t8>;xh^-#uzH=+>s^k#U6q^y?`y!af@ z;IfJwSMwlV*H_Zfn-Rv8y<-Bv!h!&<~5duHRtq8m-uKXEY}c-yecyr->c*5PYR z>>h7&$+=?Xok@h;OcyUHjf2F%MrfrnZs<8%25g0Rp~wvEDo%@nI~M_hXer^5M)7L? zOSj7Teh|bmZKH5-iF>bO0OMeD^&@hziF??m5#?X`h=#|L&vI+4_K2- zjzHUNuU$h#qo&xch9<=0d2oEhn@pIxF>QW?l|$JJR8(eK(x6ShXcZ+dqGTpF$z{jw z!LmGr8opvhAVw0$*0>$@F#rj}L6E~T@9WD$E>EZyab~U`f>(4I5L|cwC0e+u_Rc*! zy-Gm=`2ANNy~0n3h>iz1$yo-IXhcKxY2hU=QD~0;GAs=+$_qU?T2F!f&^@WuW%Qf< zWfm{l#cIe{^*q}E@28`Guv@fkjJq4id;#KlyD+_@sn#Sa^}cgmZOV8+Y^!8+a$jjj zvEAv^Ual@kD9ax{I^Ht*0xA-K%tTQ?XSN^eZot9FcY1D3!0+D*pT+%sHc}QJW^n< z)TKyVV=N;mYJqe;rY>5?r5lfuC5c~crIVebb_LGVT*H@vk$#C+CX}yK@d{8B-QW}O zB3Fyi!5rW~VSN_nK(jFqEkF;+`1)BcwQ^B1cDX24B@x8isgXsX#lL{_vwBdZC)7C8 zrba>@lZZx+J1pAdEhPGL;5fD7v&<-ppFWv7*`82S$wPqi!~- zbMSElqjy%T;TdWJbPBl$iroTWzbx@y0Sf6 z;WMhm@FF+ZDrpt$(x%#i0X`{zlFLBqzQ!v;g6_RtO#QBb|2+2@J(7wl18~Ryq!J&dtK&4iZ1%u~%ih zXrIW)FiBrZnsIp&KUy&$07z+YF9&W@!kVYAFqj;J$}WJ5EI4Wl6(K*)#!6j;$4h7U zi^XJ&lo19r1MP&3PqZW+ZqdxC1-kUu5$0mI4|QadAx_w5a&*d2WXmS_<3by4^A(d)F~Wq_MUggvaOXa3;_i! zdg^e_weYVBphIMEeq+4Q&cIwJwjP)g++a4MEL65-dX>dgwW1P?G(@E{VnTC^p*Gru zmo7oCt1f2Uz{}H}`NF9|@v%wfAi8jx`e$^rgrND^Lph@3@`(WsuaT5MHTSp16xLwV zL#*^bhvOZ%*ecgn4~@4Oq56L1_9d1>XE>;p_vv7#;m(t$A6!S4eOkF}5Mh(=?mBoK zhqPiMX60WVO-e~y`vpkcI1fqLnpgtxi6Ax(5w z;P2--Wh9`d=rUe79(6mbxlxkvbRG<+({VYkqW=XoHWMQ@>`DANXj!ukOz#G z!l&dV8Jv{z5r-W>T<0Uuj5;V6c`3u#~crQ z;B9=%f84J8u^Lhp#YGX+wLj;G0$;TcM3}laAi$KwO^0NIlTCBx@y;e9L4ThdBaxd! zAt)Z$?SDn>YRk2DJvT1NAE#+)ui%o-;Mpw`?(fN`)PswFq;RSWg=y__M-mkmugXn584gDP16FBg1lJa53wlGIzI8VY9nrH?d#Oyj z=0nYFNRAU!t3*+E>EFz_y)A?ubj3CMd?Xt%VnHppejHh}^9ySSmb~KCkq~e*Qw;^J z;ceN;U3a`=x8$ayvbtok2NLeoM+d}O|87-pt)4zC2I^i0>2V)*%DG6nJ=)|jr}b~N zYXRKRa_NlTq_E#@Dx&J5kPt%rZtL8uQe6;R)uW*S#aj%rk456)qBR4YwS?EQC0Wde&N$xyiSBd zh(UeE zs^^H%4Laz5HnrE8T4``pI0U+&VW#iBB6wlGhI+bTR-s*Y^^3xJ(Q}_ch)E>aX1jRh z+X0P>v*@LzCJKs|?klrg2!fIg>ST?54mO&p+xk=y~r5lIbcW@K?=X{@WJUl2DM z9STvZl-F92k(3dg3z~fAd3EmvA#3o;XKt@-H|f-a3&E@_AK)UpO>ge=qX91Gt<84r zSlKJb{gwA`w~C>Ee&Gcx^Z@w>-Hf}=3^K{^olEUCvOw30TV)u=Pjgi}?1PVP32i(6 zLf3@dUh+^x9Hycsj3oq&Y;+Qsh7sOgw_)0a;Og+#Ec1>|AoQNgjX>x+VZt@t)u1;O zMR+Iu?#ASFeG2g4kogdavK%bm4SLmlq%U4jhg^XWrZF2Elxk?~(^+RSRzn>Z`K&by zM=+9XVq#(F27U)iNAeItcX6PFy9YKcwe|vm^;l6pfRy7UOtF`qGK5fY92A`$yxfJ- zK>C$f!WGOPs-~CKB=hpXgIB`u)(?HcKta?w(=eV15D#XCZ39B}Gf%ue0}CgrvujgS zP5i1|SBu_xyUgAG)tY=p@z3t3?Nl_AfWpYsdCtp=7thExo`6{_fkQo^3EiWsN;b@x z1jDoJ;xd}%G~;>mXkOl!yK?t{mZ#UP2Z_VubmIu>FoFj(Le)>mlrDnpn4!{hRjjf_ zQKQ54p%7J<6^F0_t){P<&l?al)QX;NnJ{XQvDPHQ;37A(dWtlpyH`=u>bA5pS2jRC z5jtdZDza`V|6Qq-*%w#pJlgKG54_ptgNXfum}`o`=_w$&0|H!^9-o7rb~T)yTL~Uv z%{$6@e+#gV?-lWf*rQ$4r&07V9n#=TfW+0}1RdzI*1g0#rrQbx-5#V#D{D(_V4g%NWVvc zKe`y(u^XK}(SwC1Edm-{Etz%aBJ1{m1HL?diJZ}GcK7`ox>E*4;|D5n&{mybXrZ={ zU2~EqX%Uc$z#r0{f96WFx4 zk*2vF~6 zgDhQfqg%#KUI1?im~wB?XQ-vnqtc5ko$tqk>*bV3NN&r36gY9xdR$0PMju7MUL*}AKFU;H?oEtmJ=wh zJ@ann2#o*rT8ixVmfP3{NX9v-PO)e%wlmh|)R^dwcpqI&-tKmMss|8brVD2O-9a9r z##r}f+tyVlz+rFS#6#4ao>@M(Llp zOI?Nr!wZ2hErF@PcKM}(A3*|7C(Abl6fo7PAo1Y>YnC$N_RNE^2=>(YuCpm>(aEMq zliqYG0+ILr*l%E^X)RdA_nUb1D4I%0@x&{M?P`h}S_E5c0&W}Feg+c_!!f?0S!$U0 za=>oq0(kY@*&U+N%d?dsUW{x!V0Dkuo$@Jr=g(kEg4n5#%o>God{BUyB&iFDcA7pN zOFsnkuqQ{rWSSb-jq5-mXrcBMN2urTO2nC~f&drb#n}9KH3CAJJ(LC|oTGEJC^+|qXMoow5}aRL~FVH&a9lx;JePE))a4qi2pslh6IUE0nr z4DgXkdbztzi{$iH=uuH~Xt1e-V?}kV1dff4H)ruePXC9911*st1{mPV{*Z`P_>}SH zEu67qMR}VuCQe?{YusFCOP*^hUI7zA+95n@c#g3%1Mxl_S^zCw0Ap<`BV(D?&KX5O zy4_6V)skZw9T#4{u7lYf8bS^6T&Q(wSG!^mn;w6szQB*vfzzx(q{|#Xu`* z5>%@5Pw8i<2$h{PSP99{m3pC?^maPUgIVer*X?2Z&+Af0H|z^bT>!3X|~+W~-mqHM*BO+S@7972l+ z6JO`Um=|@h8kn5h<`BCp{1=OO^~NrubzIJiLA2& z>)|q>FN%Zoww3i1F9|iCUwqr-)Hlyz2b9sJ&|Xi=y(f)^R7q1WX&QxGr&RJ0p}dw; z>mtFU1|uF6HtYMr%DIh+DSkjz>fED#u4Nw_7EEGh34z_b1TlfT2`;(-bwBh6cjapz z)(L9w^zRAV+{iFlU9CTLzCR6nkZnbxuxsYlF@$b^T1`mfF_Z8dCo7rw1icCWQxYBK z_s-oR-_UAwmlqo>xRuJlzF>uKnCkiDBM=az6s95Fi9F)vQ#>wmJcTP+~RCCOz_DkOO;Ym zJUBvNG-8dC)HZP?*QW4qV50X*BQQpjOrJ$D)6Z?@hG1Ye*tW?W|GW`(K1CDE`@0r4 z(B8T>-ePU17p7dOuW$YQGSP$DBAY;t0b*KQmy3+e99^PA5f)%{ z^O>_G(Pcgq$W^eHwXjlE0i8{GsU^ZrUG>3)jlCB&ABPC#1XO*6GTaO9qPF7lKN1R> zMle!rZ?!HLb z`VBC% z@EahBlNRtC{$AAnUYtK=L#NNQjiFs#@Ls~G8?#GatX;(7FXv%<0&jB{&%HW*7#Nmc zV=5*XDwZk?2XWUvJ+f%oiA1c};>QyLaEL2B&3zzBI>!n0orh=L>oi|OIfRR29@nUV zhgJhM?>Xm%n{7F*TKTz?0)mE=4~)W|#wLkIsRnAU&jJ(00=ThHEy$SVU~Uz6+h!YE zp?8O@0$*-re(7eN%Ve#66)G=SqYPI)YQ0~81L>Uh|{A~;#Q8KO|tPG}p z8!8Uxs!H$pC{Cwrj$Ht*M2%&4k`sR~V;P7Hyx7kXwcwp+Hi~(unN0m$^+iP}K5+b6Nq$W}epJuh%I^Ri{$1n52BoR`s04e`U zB49t9ZL*N7y8HyWpv&p|49c3O&uBSvk$nJQ@m2<}y_&H?Tw>5q*n6oDlY@}1B3SOm zSHySw`2}OX6h=lbGF6>eWqc_?VO0+Q6o5{g=1W<*jrk^AI5zC$c94%+vJ4Kd36-~K zuFx-pj#;P_x4?Ta2ijdN*NUZ1%sJ_6P&N$7ibSP@k{}6?)hKYQTI2+t&w8}qI}JVMi)S5~+>TJLQAS4fLTIGZwC z$uf~-(Yn8ZKur>MPJ3x`$Ec^}d0U%a8Ger)*rP5HoChK~7#Uo}+z)66Bc;w1N?}5^ z2{{uw@5~N3UHMvQQ8?ZtEot)&Y{Gj9CW#M~hRO&&Td}4sT0g0K^I^NdIQ(L-^n2Hb z?gk^ENcnBQRQR+x_H&53#$wB?t+XItQNIgihd%S z%KcW{1-Pk3c3?x0z!m0L$t!&_>?LU}FnFr1Nb(h%>OBj)l4x@PvD1hp(}UUz_Fy_*CPRWuwt?fEv72nmlkT_dmuNrOH|y;-3332U ztZFh{udOQ*_Hd6NJ9285U^x|}Ju1Q*ksT);luTuH!BRfjStR_dLsHTNlsT{je{sN8 zPH}!=ZgR+Nwlkx=r-#3QRJ3=MgX0TxbP(h>Z9iW$9`$V@y&Xr zE)tW$hL|_sAm{gig~2nF!WRy6UIo(K*zk}z-6Kg*<0O&TZSNW7fkuLIz9~s{ujI1oPWgGtyw!SB1iAI zBTrK>R@duGO6zsli7UN=u|oL+yAyDXwE@sX$ z66oVsfa*pwYzL&zAhS(e942~bjJ%Bu3UalMr6Q6CZFY0BI_8NkNe3SH@8Z*cwnLB6{nVsV3bHH&^+GFj`R?3HDm}Ul+Nw2)+wGUiv}qy zX#P3A7wawl%(8df&wCh z>xVWgw<#sId$krm9St~k;8j$AD&j25OjVf$V`+_UEE*YMhE_6EUAP_T7-Z^px0s>o zlJL!R!&J7Z#Tm`}{TQePcZ8ydG2JIaK%H}KL#XI6G&f#IZWK#ze7fX7s2Cg})X25b zUOu2hliO0f$rV!~sDd0ttZy1k9+Sz>=DhhtbcU;y@h!uonoshJ1v8!+xIWR~rP%zo z*EcecX_k*iS&e#7I^J9hVP~QJSVyv>k~cRlIRlG@Iky)0EC*C!(+SRgWE7ziM*gVa zp=|!P+yi^g%{7}K*7FU1|JJ^buBU+emvs$$tMkAFwDBNtJSFY_u=SQZTS}TOAYCF-Qqs*<5RmTfZcq@(4T5xccXz`kH~+P{&pFR|p7;H7U-#t) zMSp9}HRl*(j&W|d5p31vhr;&2j_So?lH*h!Tm6E~@`ZwY-5V_rn%q1MfXnj^NeUl4 z6xvy8B7hFHA6fX*v8LVoYx018TJ3uF`T}+?`3tzB`3w8dy-Krk;yU?O*Pq4QlgC?s z*1ZAWbuZC`T^%3SJn0~D_sy2p7*G)bcJ?TbRQO4G33tq>%|&bVWUVtr`8LEtfX`^? z3s|%5=lmLdg!@&*%YLipZJYDS3$6s*pqZi??3}Ocf{H$m5*M=2x*~5`Ede3VLSm!9$^l)X zzA3eVX$Yw(sAH+>4r-F>^?AuPKZh`)04KaZ(1fdo%zZ95emy<^*=t_Y>h-}uQ?4;# z9XhqyKah*@-h7~y&;v8N^@h%_OAL|-Yx@5B$~EvV(z#lbgea{alrtr1x`jfq`$~jO zUgKFf=rWZ2>Nij4;(TIHMU{Yv)vPp0OD^)_Cq1+6+CRDl)jtFwizYwt-M>A3Vj7?S zZ!Z9c=e%VR1747;<>NkfqvX>~f^&W@24CcXjVdGc@Mr~N<#DyD2PR83WWbA42-YvOrc&Y(b>2iToHhftcs4ca zV+8BPEe@kC>|&|f3Xb|pxbgzI_=fFgd1@<>XS)E=lO+R&+c@iI zQfoqNFa?!L%M0@(0Ob4Rky;eZ?Ld5e zvmcY)lXv)-u%lIt7)UmcVYyu@%jr=cyNn=Mu}7D6GEgL`9w~y7I?b|!c30qrpj1L} zZIc}+E?6kr$!+#3M=Ikn`i*rqLrSO%kZ@FN>>3TVrdmlKEm~=+gw!p@?g|_gZ=np) zP*~hCZz$I&%eF4PD+4+eXjEY=guQ~mT|qPe>HH~ zJEtv)H|8BW!Y5b#h@^P8AfD0JZ)I}Y-*)C%0tt_v5CpU?VHav2oOVzks20}bUv?iWl^Y=KuJ#QFxlnMm~X6rA5 z@9Bgf8O*KLY3RxCn9+w2;WCgYVD>>wFfph%{N^kJG8&CH z(!aflGLL8mQH&YEIkJb~%a{EAy9+<^!&va_DAB%+Q*Y9Lt3W+E@gbOfZrnuoK= z3ic@z-7T*Hq7diM8&rR#Qc}DT`Bxzpfy{}jiU-}_*lT|DB5(oMb>|Pt& z0Nj#({fknOq%jR5Bsk4>O;^q^-C};0m~Q>`@N@T9MT^;TYC6tQ!OB$wF$3+tOb5e{ z)FPzMZwXcMOt&)h+Ud!`#KSV{qvZy$4BeAA>n!Xx(V38NFvE?q3ab9u>E~37qE=Mc!Lv35D1m(!G#euT zzyAjkLeOkAs1@~!ih3n8gt55W$BUuGPB+O7NbThxgEtV61M)#g3>emKx=}>zZ1^z z$e~j>QY)u)Sxak=B!TuX*hPb@GR=t!)57r`tXQ;rpQ|8CZy}9}9ez&9r^!c0DVSfs ztGEE%6yr0!-b4UXO4_6CARhi?@(r1I{EY~;4wGNKNr z29(6FH?zK<@%q`)=zm$`wc`hyq9`ohapboLC&K~y9SZ2816kG)z&a2*`y7lI$Zwd< znPsNLrJ`OEc*3XeufCX3y@#B&L+RF8Oxk1Wj%eLkvIc$QA_hcK35zEfU`NJQTvAIY z6RZ(^%sO{qCOTx@vC1&Xn3I@}l{4^#yi73`voJi6r{fyTIdN}uybh9(A2^+xnRU~! zLI+ZxOfb}=D5r3?goMnpx^>@86n*6K;9-(j5+-@y8%n|sPK%WWJ;?!BlbIJTPv2;& z$m{jO0%?Bq#1$Dg(~Ql&xkO+}36VB-9z=KfZhgL~$hwN`uX+Me+B?H{462p85pyJ? zkx+T#+ZUVOVi*r|^TU)2x3ag+;8&owHvPdI6{lORNWrm%c|GrE9|kqilKi;V5Q2$N zc2EBr%+;1W;ZdEERi;3)qmtd7O^uOR&o_i#iZWl@v>ntC<6f)Tsb-coZj&1z%RNS? zyE6HDq@27qBdJv#SnI);& z@~hM@RJwzD!gNQ^?tH>JKybM4mBQ>4_!As$fJ5EprLI$hw{&$Oybjj)WXL0vlZJME zYeqAftt{Z@hmzsxB{zKqvH$%^r?uyhQC%^i+x9X^x2c!1GXRme~@4<08p>HH0 zb9ArZ&vK}92Fuq;51%J+8&677Td`1Iw$&cZ}cp*rY)T04B>37C0LSx&46o4 zRErmnNb?>j{ubD&6zdg!Gx~zU+ti0Iyx;s|BrJZNvtGxpU!ofQgNL8!S(d_`?rNx?$`|NwOyA<*9%Ob4o+`%{i*dH}%h{f>g70d}U2l}OSycox>Zn9?~e2v<+y=i3S&fG8bPv7SJ>MZ-B`ZGPG(%u-$`}$o!rR*;18SDv7i^&<{ z8NBj0vYWAPr6f3C7VO@Lo0UtDcdce0_{sG-qNm$RP1iXKnRW~JqsOl6Y=RrWK}J0i zA;Cruz(^1x5A)Rra z0GZ8PMc7$!8ghB@terQ-=xRo=wiDN%HnSh(y!!ihVmj}m#sbGSXAV6|g5%4~dBalv z582ve=nPoO|Ki>#0v)TiLhz3~>zF4ws3}?!4u8nqWOW^qD80Fn&PgSsumqrT03t;e zX80G_;(_W6_NY&5`N6X@S_mee`B6SUSY*Q{0sruqz6;iZm z)KY^f<3_#7-NltLY<>mxyjimCn_%Ru_(>29c>*l(ggHs?%goMHs+>hjLI{pK)yLo= zsC&_@qnX(vb#pHa|4YKdd7s*Ecc{q^sZCK-ENP%x=-$_Ih<_1ew0Hrir);c>z5!ycw>~Fa zW@Hve%-G}~rO=HJU|gTMAg7^?Y3L%RpRCC3MC+$g$zH4(DGYiJdKHhGyvJU*6EaCK zaC42P>}J`NZB>dLFv$qUUC$YxI9N{C5M@ll{5J4L&XlL(@=g6jre0j%`}keARe>A% zRbOB}*IES6;T%-omQvGGxW4}YZb!KwOQGXy^sL*;S?J78;4w-Qcr5JBCytD9G})*4ie{zMj)73??SfNqp$T#T4wyPTG+ z>%>Y=QbCOT=)+cso{&3$Ade4LgO%aZkV& znJkgi7US+#Oc%^dGU&SR&msJ>iv1;XJ?7^#nAd4GAf8B1>K}gX|3^!Q3$%0{wPH61 zbPhrW-+OSnSE%jglb3@ssH6%MC9wZyeo`Y*EeY&OBT3E`k3cU!u>^F~n~-?LNFyQ6 zh{!3sLHTp7hedLd%*2YYu=55KG@-lv{iv_%NXW0QL2;~{d%9N~I6Oa*y{X}}%uhsr zqPoKZ9m=fB|H8!SBSVH9KP`yEPTtHWn3UInSUUS3GSm9Ll-aPc_ppF;=_(U$$iy0H z{KKPO7}8e6(1XW9bAE*79@Kyf)k-fJvb)An5%PD9h4atmfzAB@Dv(Aip!p~vQbdfo zl)V?|G^C*>i(3ZhH_1-`B`>fX&qEG8+6LA>R4geTs9_ANOUGfH*7}NUmjgeIZf8On zxfVht)jbQaT9vCl*-o7$-gun|yLd9r!<(I zgv@JPD<`iqZKJpO?PW!Ym>~lt{H7~>@nkz!zIBkQc{Sd(zg=E1B>zhF8+=^Pv`qrN z3GLDL%@?bvn!J8s0R$_Nqd=cct@jLJogK`5)+@4(rJzX#FQDeb#h(>E!iXx$DM1?8 z=K4FLS|PROOs45y<-b~qsX^y>F|pb=a3hEM7ERsC3i~$)@f^^&Da%$COEi%vUgTdQ z!>t!o%P)JSxH!Twr3PxSTol$0-cVEI79O!&UylnAoNi|4?^``Lc=&JzGfw8Egw#B4 z9IaT#1M-h7PZ$qFosOdY?}xqkCP?n|@;VHg?Bz!fYTS;~HCD2S!`a#9>JzK$o+{%M z*AX~kYSwmS)pq9n&&FL!*O+`{$h{{hk#Wb8yL7cro? zar(b-bnvps5b%=;*^}vljtH0OoRMF&gWMkRo;lisOT(g?hLweB*#lg(5Wwm}N`c%& zoNbr}Z$IayD{0Q!D_V$z^AkCQ;Idpant{7(mSY25ryh|_Qv_koMdf^~h!utNF@d$*oGafXKa5(PiO0T-;O@E98ON~Y4xnnCD^oSHp{H#c8U7UA){YY^tEtZ zJBCf(0%BeDuDDkSgJsQp{5o@~3U}~6w))6L?w*=Tht?j6DNmH}_Gx*z`LAcI_k}Li zhiizEvwx@LUlRIStrIAJ+=696OWa&`;Rqw}51O&X9Mqh64MkYL``t#`fI;XyWxy_t zu#*ZguI=@HurM#AuS6(vPvE<=QK#P9YSMUd>P}}_Yrjc$dDLeztJkauRCU5^*30Ai z#S}x7Yf(V7FoLEPr#+PmQ=L*?b8aDE%=>)CPTZo``6@H zobOP6-9HCSg-PA8QcJA+nNxpF+uSZOH3ZKHvwa5TH`_*aEzmAx8 z&k4+y@x8___>Oso#-a2q9WkJV-mcV>94BB-2w*9d`VEvnGPH}0k1=F~>>D~yhcI@H zlAVpnw2w2fc0bU_7n7>fu>bgT`{j#NeAUw#$9j6_SL>M(rM^@yCSC2J(vtEWGbg_* z48f4;iP;Oc^?wwQq&@E^GoS$i*UG?oJWT&`z7W7}1YRdO2S5*h1i}f^R&FcZc}ft&%0VuF1VQd=P(Kww!pHc*SV2q7e-^KB2}nK%ie>I#9$)?#-+CnKl@LS`+zEP;;14=XG2Jc#kW>Waoq+f z+L*?M5==r>bUScn2k1kXO5k3?_NRo4v_Ni?vZV(1vELd5II-Gz$wJZ2;%6+y>%2Y8*ysI|nFpO{!Qc(0a1&AYiryM!<2@dFfp6qMAt$noKN+0b`nqLd~r z43RHY4bTX)2EYT(t!12KUkWnpYkw=5^^d)xvn@gX%rD8Fi|g}GbtWRMlQlfyPyltz zd*y|VV*K=s)^d)t6U$}+#rA|%cltjSO@;B|q2%KyM!(6vzl!@BJ^?xcI-`mhP^h+m z8e#L@7V=^@#o}i(FMJ?)_=7#P#N<1HqG=E9?7*(f${ylBBubpu?DK)ufm7&aSs z4Eq6_t`;eJFDAxV$T0orwKOqK{v0|3EH}2@wJ_mj-dB$%ujD?JC+tb2AwEI7O}K*r z^_$mp$GuCYL#MLq>JB06T}##Fw>96C|D07;(2-}~HfAv#xRw_`&pfeTfA>i&_%;U1 zrqE7`D=RGGv@={7K9CW_>x4Q@M0)D;Kj+wG&+pecOcJ_gp$=X7YBuWEHd@oQ3&TE_ z`)TXDSYzmo{MJDCE?zJ=lhC+K-z7fA*r6+@J}^*W!x4jVFpui1ZXAbn`YpXha zIOnoYA^)qf=4po>=rqq?clYhxEVo{uLskq;p2^u#)*4n*-uvaBihLK0p{`=m)dpYb zW`f8!Mohdy$dvKua{jCKsC4#72cAY^(lZqUEayd3fPj4@$?S?@?(Qon?WUN#_b+_7)CNg{%h1c(W z_>f2tkK$VCO>~owBk$$BO~rD)0IMp~eqv|RoOdFPqdcb4a;o#_wRQQOokSDQ6E%0` zH&WU!a`$5fYPO2)j26Z<(O5H7_YtMaY6S2rLS?$`PVr3WC%u?AX*@%@sHUPER;+bG zw;x06zA=y$1mXMNpSM_bGIHbQg`2P)+*98pIeu56y^ndP@t9aQ?R91U58!qlY+XLd z9JDbKlRX)El5zHvDF%b86Dip_I+FlJ>vXX?D{yt^^#+fbiZ&GdM=s$spt%xVfmu*~ zo;^!>+D7AG9o)<)*2+204_tTHU7Q;K7EA%J_UL_!ysYSr%9QQwyB+h%eTy?7d!DOj zaR&4^ahZ4H7owo1WV06yIRr&l4BZ>Q#hM47pR4z1{c`)Kb~!TF{b=N5K+0sLsZ09I;=eHYuNbJ~RbWZwylr{xAt3L)BdW`lHvazel zt_mhTAI5Y4;_^<>Sho1;;DNu6(lxqH=V@c$W4I`^JT@`$e-r=Sw`3$+Rn?V>&AGTok=I*NzoukyG<2;k*&u%9+ljv#Rd2^L}F$8j? zE6aL?1+-A_it}omnn{N`=XSd(fo@o(WsafWWt#Gt&I#xz>B7B0(9rhz3P&LmyX6TT(#Vc7MVaA@@G)z})Q50?33xky)U>Ue%>lXELj|ajuOGc7{*u(~ zVMP3T`@tQg4<$~6hm!7egXU);LPY+#Qm0l6NwgufTbaW0lu)V&QF;=g`RHHcfWA%9 zh=nF|s^QSawyV>If5a$5IdIp-`{%2gTuM;poY>n>{1p#&1$niG2^POKTHx4y6}SW} zo74W#geJY{BQhhQ3R5*ySN)$p3|by<60zimjJt*6lFAe{%00syU0UuO@I)KQe7C z**PBAHWTn5Qf~b)g$5=C{e88E-ucmHp>F4h`fH&YkdX6o2Yx$w2e8cbN95C7$rvfY zE*FeXO@OhjSYbyKM{?OPI+<}=7FVq>;i?h;Ny)d?{j5k_cvK_df$GTwtiFP+tbwDB z+v-ccTwwC}*YkfYG0rlF4?Fcb#7^1aOgRgj^tjm0vgifnb7w@$%3e*+z5H-QBng7M z0vLS=q9o^fIa`Rk+u8f+D)06*SZr9VwSU#_;~2Ir$SJ@+W^3E?DklM)$Z6QsC@iQw zz2bEJQkoM1?)5$P9?0yaWwP^X7zfItP+cLcF-W;`1dx6qGNjITS7~ z$uVL{K#W|JB~X_-pnNQJFZ!0(^Gu;t>^u7stN8f#_l9SosGcWBegQlTM-_BhThXYN z8ucU^G=Nk3v#^3#4TkDr{_|E8Diu>$)%H`mZvE`R>5xc{s#e&rG9zQ%vLA)0Y!px! z`t*BLFaP_Murw?_*goiFbJTKk!&wb_$Y=Ha^$Gq;3Ji&d{SkLCTb{sq4~M;urk5Rl z6rKRK82HULBROcqsXVpG$at*ZIa~oXQ6*TDQCb=Yn$S&&;;(^Pi=RiY4+gH^Qinj0 zm9B#cGfTA%XkqRUVD(wW$JO&==bz_D^D(BoQVaXZCtW8bMtki}m5KCR4h*?S6sLC? zWdB?AQhqjOx}7@pGMa>n>SK!J--pJ@&MRcCj?UJsGv$kF!bGeslpI>~WSFpJ<&~%k zm5!*!oaup2^{>=oppsQrb_Lf=+dn9h>H1r3W(JDDhKG^j|9N#bh@eUC8%E_5{cZBo z`Q(3?J@+KA> z%E2cl&+a#J5|)8X94$psA&@sU1(xfUP@2UGAXemqr8hWNV0wbgr`}x#fee%L@m>$r z#x7t=KG`#RC zGrH-fZJ}~sGs6doN8@9e*I6O6Mw=E>1Dz~MByLjzk&<7ZX7y*#Q*NtX&E@ZiQJ?o! zR>JGvezh%WT+tmY560TA14{x`Skz8^s7S&dtxAUg_TNscf5bky+#Ef++puQ)*oo2R z{e0x=k8ZGk&vaNg3g5BcNy4eOm8KnciF3ZL!Gyk|_pI+0DAnM3qYHzQsSBP2vUaK~qq0NA#_2avLLrDlB4PqW~#y;~@ z$j!f=UQTX1=S@4Aa(aY>pIORuO54VZuV3dX? zxqMp0i~di)g_?)FipF`$`EMrGlPNAiV(>gd;JPGa-W6B=+Y0H z;t+7NZBl=9?i<#^vd5x!`z(n$R@B9KJj`0>LGkgTpQ~oNsKfAUYw7j6>I%~=N;-@H zak7$2y`5||g%?2YPH$$^JU`tWU`|Gc$@SV{t0=MEc!KO8D3U`wRcHsK2JW;%kUw2P zreG3+d>MJLT3`uP?yIy!?NljW|`=(O`{($kt`)9g4dt(_dmRbI_jY3Ee1 zz|I;9>8Ju(mZK=iary)PPL?vhUH(yEuOr;!I2jM_PKw6_N-_6g z$Ow$SHZwxGS`KlB)7c3YOm49xIeNPj`(`YLsJp2-Pxc%ZlqHU=kF-&lAG~}wQSk!9 zWqDB19AZ6wh|Kx*7c9Kh+}zJcF=bb?+W+_2g3sw|7nVV%r--L66Xh%2KXJ2aI+U2X zyxYH!h!7sB)>@(;zO<5g!+IdbFQ1P8uc_rc-Q2!GYrL!WrO^p$m*QTOUYmgnj{wl4 zmH{G)?XMf>9FZ_5yLj8@?Ve`W62VY+kWJQ6Yh$v4;T}igZ|Lz1a?uX;cuJS@LU}7n zl+&t8`SSz(^UwQ%8f%kQ^+JaoiE(Pg+jBEurK*%RTK#Da@_dt4cP2zlw~ZJOs9iXl z2g3N5NjJ!;Mzs4J(J0**=fB>Uh@1DN5xcRruA=Zs@f=)KeFZvad{m~=z`S6rE%AqR zj`!4G7;!YC^|goXvfW##*+TPq3tP+UmL|h!UAn^rX)=3dj6&2X7x)rJG_3bYPmK_= zEVRAKtam1}!dhYM!O1xZc4;zooSXX;?51p}V3+&j{gTwI^QgtxE@oMynGM%vj=c=X zR)qUe1~pO4b{ElA_S+TSuuRw!YLtkLv;N*>1Mc+z`{`fNM?KUnVXx+Z9yjVNNb#Oz zEI?ia1r`H2Gw*vS^VEP{4h(w7_Y)C=ndXtLR=;GZ7;2)uoO1`Jtj3Hku}&5Etomj5 zoN2eVz+2H(8!B3-b!|e$vZuLkdILxhb6Hy7_xayA7{-`uSRj2%?w z;5ZPV#liuVA8n7b>4S=fe#EX@UjpEsai9dG=TqOU1=^gBd(o#(`GhrkJb$@KR{ZTHH~!1^yQwcmB8omGLWZ{3~T-{kgJ4-|M`hMI+4f^JWzbaV{kq&Pr- zUgZ<6c|#?Ou1qvKcMP|Gu+({2-OO2~YX(ZYd)&Xv+}aYCpJq@%sf0 z%KGy>ci?T!lgEV5BCrV8lEErzmEAM$E-j`qUu*wl$uMCF!+Wz@pv@04boVygIv!6c zBz{8D5y$w)M*znz@&RG(GVMc8O53g%=Q2ACk4_`{;~;+VaKHhioBQAD)jH~`rJ$<1 zl-@9pkmp%%@)Fj@o;fgC(b)|o(5CtIx*_c@YVFGJ&mxL}Qw;qIZU#c+1i~oJw20GL znzNLHg4HueTs1DFS%Zj@6&KmFLhdI1_AoTC^=po4tEFAt0@bgtH)@CBs|}F|L#BjC z;IFup&&J9vTERV{7~Fe5@;uXtXCGd=bW%|sHEDskI!?k0C(P5HW_6K7j?1Au{Cjva zW)n?{H0<%j`c8By*b>ewLe}l|Eu9IDjLD?}p7|=O8nlPR_?%W@DxZ~-34eU*mH*3` ze>q&#qjXVi$=6Zm4to6FT6?lrQ;j~f2|+UhSq%K2v`=jS{t=F=gxBE2yq&)E$A z#UTz9lK2<|X4P)#@EOhcyZ#2Z$QX=3K(zSxH466j10-NUk92>YJ_=Vx&ZvEKC!%;2W)4JZzPM$~JXztFmw%>RuOjTC8jZO4Uh zl6>&!5rkuCVRO(M;C5(6mQ$7r>P#+Y4HeZLG?Kt6#4i|S1a{pO{~<&C_cEJ?IijyZ z77A^R<-M%G&{M%g`%sQ?=?_p7seRv5<}c6+upiwcK*jgHWh&WTUWRnxi!qo~7Zh)e zbNgWaA!=-=PhlxFvwFdGs4B|28$>e+Kov`>fSE_|kZSCuljv7&?%lUEDzE*9 zwAzR?h#e!V#43TnTEg@Qc8!41-k&vrX+L?Oz{b97aP8-I1vb4S9ltF?N^fJF1kL3E zgjj+tStUEIl8eQ$B_35R4LZCYd;K8AX7qBnbnzBd1^=SP4=z4< zcL;Mkax#WIs$<-?MlH8Lo44&;|3ly)lq&QR#Q)Do%}j)U_%aGUG@bL?q^t`gj)3XM z&4u;!`vDd5a#U+ePb2(nyUqJt_HPu%pX1bO1{R#jZC4qOOHnzw4KJ)1KhOpsNF#w4 z+3!l;215fKsdlIgIbir?JOCE^RdTb_@g<|it}Chb7SNdPS|bU69X1vY9DxCl+}a8T zv^1~SVGjz=RyBb%h)l9xJ7CSz`Qwt8Uv67q&gwG)tAm_6ZKV4h?7Wbe> zVI)=d&^+k5*%zcRzEP|`ruCWc1s8j$y`s>0e1XCbdOe>gRZsQ)ZZ{@ z$6VBh!?w^Pyb7Bo!vpV#X_m5{r^k)zo4l#jEfqJF=?#DYTbNWu>%=!E!p}^jj^;%(;1ZC#F@oisqE=g@@>s!Bbmfkm< z>%W|lj(~RDsq`^sa|Sq50FLAXGtG|0rA}u1ySf`?NMsFc_m#tc?Q}to;NKt z`5n+w|HkE1$L0!Sk8jdr)w};&h=;b^uZslCs2c+8kZRTQiP5?h)Jzvf>x3b(ig7J( z`jmi;y3id@Xz8uvH9A6|9&HJaZ|}=gIaJsESTvBX8`cI>tfF#W3RBo8*8bekW7{wG zFgbnCc{hP;hX&oKt`7YDYv729nuzIXhuLls{M{F?XMSQf7z&zUj-X>#hQH~V$G@nl zzrNbd(*Hc$bKXXcXItrt_0FN2+|RzwQ%%Yq=*2D))$S6-eNi(ZCOZR5GV4Z37OK|h zyR81z;EZ;ji6uV`&^3xPY?7~Cn5zRz%Jxgo=PyJcTEPMtje07k<|zIQdOk#1f2sdz z6i*LK;lulQ)5dB}?8Nf(>Q0dp zHgx;wEQ#O7*$Pc_s`HuG9@Y;-SojInk2_Y;w)Id78U(ufr0>f&BfBW4 z(##M!Jg2kem?X$4^q&lE)jJZnMBD@ppP zpAEj~9YRGkq6ba4y@GgW)Oq%<7zBXCe$yjSfal@X$4ZzpQ;;q zVR*Y)sr+$Y6_|av%ud**z&C&Aq0FFfitWiO%LI#xFo*gxqlB8Gig8WC#<8U|mL*?r zT$z-+*>Gk_MW$y~3{E<3`^`4Fb71NYWe9$u`@n|_4exQPoC^SF{az-nkO^yn*ige~ z#`PuJs{lHaKd5Lpr>K0jk|^e6JfdN2kNj9Mmv`uu>W@pmaUY`&&`#~FKbszTQ6a^J7D z1&Spm@`|oumzEL6kH_ow`64+pb)GQkv$1)i%AZztk(o*>C%_O2hHy% z4V0A<+T8k|Bh%{^FPqFj(95gJ5&f#{UwMjck{uKD#U;9(!KKJFk&}FTR#?kTSmC z{>%TB`%!A?CMmCl35fpQWJr0+`?{_{pA&CFL=x}Mliph#eP06wp*xLVr}%wsXurlo zq8EEmDvodspyD_Q5LR6rrH7nJ`^qJ8BY^(~Lurxyh=wGd6>4?8v_;L^YzYSy9RIE1 z6xaII+YW(`YI_U^LZ@S{+YiG38Zbnb{*-(Cxes~ky%)ibd}bh~ zL6`-NR7Z;x3tM(Z97dgZPVN^V>zoJAWXYxQfhoW}23)k>(2HRRLMEm1>OKWDVr?+<>{H3{KuduFTIbouQHNfKfFVCU z=%fVcvbU67H@A1zVZyAoVk2sWt$cPldw;I*+ZLy+;wP_WXRmvOE~d&J`FsZ8RvD)4 zR)Vuxmd)H5gv0ZagJ1R6$8jI_76e9XaaUoe<;X5h&M!| z%afYjQTHm9%r-Scs!z@y`__o#h4Suvs*Ka+jR-W}(o$AvhF+yrd=Gmzl88-im3FNu zwV?kQgHq&Vks;@{t$qhuGMRB=`>HJu0+>>2K|*SB0@L&}MSi7lz#EPA^rb^TRsX&p zr`HyVA$^`4P7NDS(UuRT>wV#baWC@y;;7ISv>l4Q03<53|A6;^LNtWlTO>h@gWbun zE@ro2oM2hUdef9708k%vv;WG1TdSqk!As?`Ep3kAyG}1>RIy&6!JfQSADdqdrMW|mG+7aF3t@+odpCwZ@$)ZlV zKYBlP8+L!M6f*Rz5TigVN;*XdE`YIMX+wYbAeDC3E?rh5O4B-7@K@C zYWA^Cb*QbqS0u;u!s19M^PMT1gJPC#4h4ebb}Q{@{iOm0chA>b^gbpQ68n;! zwvFN_%x0Lid+W8e@yItG%GH83*!To}Vae0SjJp^89!dkO*vjwN4)W9#r}o?*CUeM* zml<9wN2^xs&gAR;Ue8W2LO#%1DY6KzsZ9&&(t1Kj=s}>ka)nGCCyfLaM;*1tkTiW6 z(x+uSB0j0NuEJP7neUXGGU~%s271h<`dpb)<0_WoooUOvn7tk9Sj&f$;t;9>XC?S) z2^Q|Wfi(bE!iK42m0`fbj37X5PXuue1Jg99JddhcFf3of zf;!E;N%X6f&W5N-*M4ndO9$a>;F8(x{Slkn#@ut!h_&3`^e}+%+5Mel7Cu)$@qw## zD4Y?gk)@nuz(#(#Rsqdq%qe**HmF8GMI_Q<#Hi*q+HjAfII5`m?%!AgsQHK{uD=G2aWQe9HVWlYLxN+rX`v2p(PhXfe(Rq0&E2?YJ{YL{swY@4#8e# zdx!Y23PE;v$VCqT?B9XC$eMPyURT?-Z~MN{A7=yYDV!=V#1xWVti6ZSA7Pihge=Da zf0(Kq$n#hf&JhPmeeM*8D7D1s3pj{AG_-8L3=eq4v};EdI1>rE#c-O7Q!JSJ82LH9 zD**oF*}dzjvfg`a2ekly1V2VZpnaPjQ5*YuI*FLDG>&%H*LB%j8{gb6{zfZ#n20An z2wA|{H8e0GU?0+{{-!NcUU33=62H4M*GGGSnprXLp2=v9|x^Y zyLTXfij?V@PKij$S;Pos8oYv>7KdoMN%R$#2qlhdBm^$-UQu1*bxaN^u1#GUM}v4i zif!`Rf+?-3wUF3%^nCk*)?1?({W~u}Y67s2G}{3pLB^DqZNTn`^sVA;=J-rAKElqs z85D_gx9P3p)TaP2Z6KAl|JLDzo`9AuVnbadZr6Vm?1n|HzW8o~%)J%J^)~St{@nMk z(qRyLR#RJidg*V&f(LR{v5{yq9qE0z-lnW2ZhH`P{k1f;M8$*Je2HM!*y$3^C*Kr51|&x02%a?IluP=hqDh-P&LH=0b=@zf<_$vu569 zgn1G?;a$wR9iZ`<*+la^CCH$z)w7U~oqT4&^54`(ddSK8YLa6z!)iuqZ!`IajUiu_ z{8Dzl+ReA7t^SF>zu)5a0m7SK&lo;zT$`T>>8|!FqZjA?i8SQIk$6;wFY;Wcv(7s9BAdtEDHWx zGiD+IKtsJ85-ax>~ES@m+U&J%)F zc+9oL^3xQTtU1=kh(~IF)lVS)WibM!w2^${Tb<~Ug0;&K#XZkAzldh?+{n)MLF8j- z+NC!O2krg!FZAzr-i>o(_0&d*w_{hriNrKUokqu!wyY}&Uu8N}Fh9;`3bDMue50SmmU^mW^f>!FG-1qRW5DZ_ zAgmr}X?|fv<*ZXykuQoQ%M}+YsJlLyMGsAhVpJ!<)X=)ymhab!d}%A$9W(RdU869u zjOkBpfu;zAoTjylbtNdAOyzRcW2Z2gxJACaYgQnBU@zRepMR}LzHwgt{X})ye?Qcc z{bGngtJJY;hW%W$%`Dd7rIon8(%0+9q6g7)h7dAusr!GnLG~oM_)0Mj%a1Q>PrqU% zJ;xJDQ@_XIAxh7dd@o~>!B%~xcE+Xlaj2%#ythEhK`pnd#_kKm(2H2-Ulngsbbz&l zCk2&Jpy>-qPEScav3U};AcTv1lyDTWK&TrGR$L*RTedb)VRV%v!H*3=- z@nU)0q2wOb9zkzB6H(me-@jZ9w93sUI5yfxuRFd76HFH?j^!vM4>#eK2i}#K#cFQL zoMrMP9u_@!EpVy$laXZWvV%o{a?$FkHKXj8F-E`l1dS4xUUYpcHuKhmv<<$9z`H#T z>ojzUSH6D4uUCEcV(?;jXO2Sz%c`KQTRK}(eEfR+(1X`GK`-e$#A*@6-y|lJB#?9o z<^$_n&p+&y0sBaqR*G8k^9(~ce(AOJ6KyiRAw~gmC z3KleW5_fR|4@~b9J)#*BeU;FTM=#W<{FuSmrqtW-HqIj_F2VKNxayyo;d5$qhI3zd znieB*{Uz>R-6Fgn%R;j^17xfp2PB-5i9+tkT}s~wV`8ViY2Q_L$O^$u$ZhpdN5fqQ zA7j%{{k#*s<@Q9b<{%3>feEMj(YyD7@8|uz(df!EMW{e!ZHG79j3-76IqE0!_Xhg0;E|F%#N=4<4&W(5@S8rUFm-xk zaVe7q142blX7>95vJ>n9I=9juxN`>xx4gk<{6U(;fBeMRdtqDzi}E?n8jZx$aVmJqgh1k>pAtv0l5<^NNI*gCp0pIKD=!i{m5 zMt57VwKC_+>zFf@`*#E0J%D*f4Bjg?$>r$uAn*PQ^D(M$DzwAlHw)GOyl z?h=iHGlx377g5nFJ4|1O_zFeF+{6^)syZ3a&T!8@t2>uy?dsPR{R>04`>;)JDNZx= z+f!suPea!L$$~SRx$8`E|8Z{lt%8$5t2!D`03#=#LZYvrGRXmrKj=h!6yL2fWWMmQ zevJuL5qwr6igxGh1%)Sr?>bs^B*zklV71RcZG+@vB|}|I%iUs49uj;&S>Zl)99e17 zb3Y!Yl{kvkqQ5cmebOHu`tBhZ^ZJ1Qy=fk+K=YVQ6g z2n}ZEpB;pVa&GQ{>n6h!rs0aVRnv#0hHY7&l|c3gc3-I9+Iw6=ZvtzpR4>uDyHlrf zcFS5S#A%91R1hfV)LIuqJXY~~f_NsRbkmlyOCO9VwOuk$TdzaM2wMj}n-@N5iaDPO z*2{}@VbvZy?PP+$_ws&QED=kz2p`=4+_c+x-62+@cu8bH)Am>6I`ytQ$nL^P@z!53 zZkBcm^d=;GI{%tb|HX$dY2jnJ-xn00F$bo!u`t$n1PqQ`lX8oUV@~}HBUl)yZ)(x! zvUKWQR9>?{Q{B!nbt-IO53teb(F(Oq<0I-A9($Hf`D9Wx&id2j`$|fjchSwE0W1xO5v-97V9qvEPp?& z1XO%G`MaWkN4_scYI1wkwQhI7_;*(*FSOO$SARV1>khATnF{@)6NpGj@gnlN==grwGKNUZ7 ziuX}%)K6C!Wy?pw^*9z3*smbI1z=*y?{?-3pK!a{P>>+^jaIOs2(w+ctttMsB8R&Q zolT(2Ast;p38XbQp3;ZYQdbA`^@Sg%q-slXp1@~TOcwq!{4FGjNIz4_Z<@!TIPL2f zCO=9+F8CU_O=>hY*cUI5Imk>@Ftk=Cz~=!|(6RIU7%_-+l=A_pQV>z^%w!$G?)y=* zU`r&1T+E9K)rK-soEWcVCEK4WQox~7FiWN=SUnd^-#5Jx2I3lsnASzi-s;Jbv>QH+0@~XSNg$Y&~}`u`D;o zvi~G~5GPea0KZv#mFKYja{x4c>p{u>n{ma&v4Hiu?JUN~ywrIq$9ptQ(CJs3UR=Sn z9NcvXUFPyrtH{wcnS(CL_$vmQuSSsQxL5b6Is6Imv8CF`+=p{qSD`8uvlR(-1skI zZX#22o?jT-RLZZ>A`y1`S6z)^u$&l+*qUGtqDOxd@G8^^g+g+b$=8NV`RcNDrwqsQ z2f}yNPauWn9P1QjA23%@qZkPpISRcn7ffAv8{cYBrG+%(w37U+Y3X~+=l1VGHemT!ieR@j+<;)%)XG=#nQ#03L=@wecr+;b9?jjyq57|7V~ zIPDyNPQxdphlq}&Yfid&ib!Qz%%6^R2FI7bi8UHPzf=(_9iz8LEsBYvcNTb^wZ=*B7}}9&K7cDvOHe_)LU@s<7;C+$Twu50G~ga z=8^^x2AOgoPHRg#?i!9skdAyUxXY>XeD#~WzgsI+!P^0KpCL*JQrG63BW!}|#pEpoiIn75gXKC}^grPuJe^rwF73TIrz{}CftSaU`MV8D@Oqe_}`{9w<#}fxGF0a(vH&j&gH0v}vy89M~}GiS6e3j0LOj4^mOR=%!#a_8w)Gwj;>!rPTSpkrGpx@1wA%6B;~d zjAgSou3U7-xT>@e|2twbFkPCM&+-AzHxOwg#e)Ry>%bV)_EVlV_v%L{PxGVk2Kf;u zJ;m3k9bx9oCDlCHG%}C^RMR7Xlr(T#-)(86MQTXyE1k=q$nKJ?Bt#NQs}jZY0JYvm zj16gT;f2VFa7hZa#bpJr6648x{tQs|i!XIAtqX<_35S+LTB2M}>$oXZl`~u8tG29w z`~xj7VXy;@$`qFS4o>`EDRCA$@*wZu?H!5}l{02uesM;ZlO=b_&jIH{ycM9y&1>B{ zVsHFfoIl5Qat~d8xy|)ulMY3wMYrxb^_)O+e^&jgoeCjENHUm6;AIowJ{#lSwmN2H zfZO*-57YSg+S7VjV%1+Sw3)8x)~OaiTMA;ZH(jzpnDRBXsTY-Fricm$3@Z-d&u`jE z%mo3d|M`g3H({4Ii!4U1_fsF`%1UovITlh~qggUjM(P?r%YND}d8C9~?-lRH=#;ya zPxssIH@0H842%}Z@x9TtfMutm>M803bIRbCVG_#;X;Sha-vOJuMSKp-pan+HktgLp zh{UJYRsps$%cl&|>jV^`S33jM#yE6C$3!BU-`hRsuc|ty-=N?aiy{;W(mpde>4wY7 znSSp?r<1~#0<)pIC2BYQfC-)Pp?HF6jr7{Ou3U-Iw?CxXm#y*=2DJUXn*!AIz<=dT zd9C(AMn19*rV$Lfk)}_mDW|M3QwFh-O?aY%0y&i-&mUT2QCXg+!0U6(i%}>T4QidI zI49IBQBwFh6ePwxN=}T@Qc|;?C1QhNE*^?Sc!ZSyo5pM439OLb9PP;t@QSrW|v_j@t?rm)oPGd$z{pORjw92hO52NVvPguFpBzZ7Qkh~kc zMxNsx>9db5erD5@)tTqD zKrPZqMc@XSrg68_AC}*X5X4%$DlthYArm{iS;U|2!dzoSt28c|ZIIzkDvx30%Pkd5 zW&;N!rqJD^oN?mCPkGlxtfF>%Q9vK4QMT9er zXsW0dwNeZH zR%zE>XjXzKq~Ut_7O$U+Y#M1X3Wvivb<0G2HLLRpyW#tF`CR|?3dT0$FGc6+yVddj z%{q{xvZ2Lm>Ki|^>?7#ZGSYaXeZ?ie&^Re2ZXe3{EXQfX<^p)yT&-S{Uo7Uq0+4*gGhaiW+_wmVTH zB+6?uEQciaPPLdM?%fw(>&aB|ja-}APbmz+!{p}WO+OMcbl8t~XyDg_C2mx~OZ3P^YKIdx?>6O27t*6uuMZcWaAT)^)mHTdpEMmX^Br{sOh2Y!=5WiR(fj-9{;P7~`__u5RdGLMye!0Jyl(?gNl zT*U<>O#6xP4ESuuyO4^Oa4Q*zJm>)_tMIAkuDt{eORq3)hTZShxqWoJ)Zq-}INXsv zD!l6GrP?%*V{yeAK$Z_P|Ip5Ug|LlB7kI9eCsaf;!lbOgk4~FJA^sp(g6U)e?Ur4c zuWZ012vc=vgKc~-ocS1n==qa=m77Zb0zGbiDBZGX1({^ugC03${(PxzbM?M`&F+f-le|fYw+&!&EaQ$T!Xu*{NN{;tiqm7rdXdvdC`7pmWc9_Ky^bD zv(?1^icXJluPyk?aBp?bd)&1#*D47l&GElO($L~LJ_viXt~%p{a%%C80Uj;q9KYi; z2>$@-)%O4!eMpoga=TAm_i{#X9SXZP@s;;+!@=BiwlU4b`KsSZEz`98r zt@zAF+k#WU&!eBa~Kb{LYE zQ_$&COp8(ZqtN5_T{5{1X-o>w)wm6OJ9HPGA>vy7Z!J&p@0qZE$ex7wC!bTVUw zn?Mp7rM@OMpQh~BIqG6xpdOfXp4Kta7CQkWD-Bp9rV(DxkS!ftal$W$%RK?ebzD3F zE9IqxUkDit^d58CtG3&CxS>BWm_FbF|VUSq5g0 zetpyl0-zK3K#lxyRzv^T&3?*@6RRbU(bD~hCu_(_A8q%Pbc$*-zRO zd8at$u3k6;Y<*qSI zD$A3B*>i!BJ{l8;Ju0^Iya?)mjWp!#_oRxAVbhk+@EAj25kg#+u_OrXo^KiQPKu+}cErRzr0aG0s+mIt2rKQ4CdB>OJ3Q^azN@p9&)< z_~wcv#Q8p4OS%WSG?*%KR5>_e7x12>sH3Nn7)(9WV>}sn&&LD#@M3K1b-v$1O2Tw< zU7HTxS=8!Sf&QbPCat`5_46rSZf}+`v%Q12tQvQbhH7`|r-;MlhJ?X|JFFTv+yZ^v zcN}k;JYOkTm$ebG*nLiFc!Qqc$zv!A%)oSUVuD2AE2@lUB}EbEGYei67)^zaF(?W# z#$8r?0y&4RM6dom)66-m;$D1KZ~b_fiJ7z#r2SXy2A$0wboOiXA?G>#LvKiVE@JJ{ zHcS>eRivZd0xFx1^Vvp+Ila`6IfG}b@*(k_2Fx}psDo4rUI*&IEBhaUYRftIXoN^| zHr#U?pM^i1nfn4+z~gJE3iBW3?=e^2U!!hoi#;QKkDD~Ndl=nE{uyUu^@i1*Dqxv&k71C=TMkn~_7D68&&OabnjH7{$xScyH#`jEYZ z^oSld4%zV3#Nt5x(pUlBckTcK{(uKSale-pe2(-fS26F34Ic2 z&gT9dAZi>74Ut$wTMk6`RC2-nr_-Lt4K0@Vl=~zSmZLy>nfkECO7i8bD3X*-;Rm10 zp+vuM@UzYmd~n}$8JTkGy(nx_Y^)bn;e+f*1smCu#4R1~FU%2O!B2(OEyw%icYv;L zHCR#ZV(f){h+_)<_&xiSRquT-VxxE4lf|t8>m`I_FrRM4>>mf_dtl2N|JAB?`=oTh_VqUZ2 z`E(H>k~ZEeQDEG!$qQVBR*nhFkfHq5pkfQAmxI3ptnheNqu~rIhZK1S9pYb~lTDcn zvz#8#^N^-$=Xn@Z>-qPr*=Qc3*CLuTFH=HPcH074P+$VN|wOH zeO2}1T5YK#BLQKK!zdqhL=~44jLZ9k$wk?aVkn6)%mrXpzB&eDjy|rGdECKc)oa*Z zDeMXL*PGJdp^HArlN4~Wxa=pojakHRWV}XCV>;X`4eB&mzxV|qxORAR-!$XEql0T6 zHFVbU)jjeZoDZ_4SbvUeC4X7fLVN$mQ9kvLHhf`s9hm^Dwrg%IKXUOD)lC4+E%hcb zvVn#G1+y<-pv!1&hA6fvut;(K$4MZ#VgOxt;yE^ah}whX@O*?OWuBqtnImBz^r_ca znD;D;dLI){~$dM{6?%IfDKy}?x% z>2HYbv=CAI8rQzXyA)S7LEqP7!x@i_aD7w*HnkCUg|`uUvsq}*P#MoCAh%b+a{~Q>Vv{GERQxNp5citI%k%v&P4K4rF($ zeXGe2{0+#Ch&ljf(gBchf$Bp-BBPH~Oo;M>;-|bwm%83O{T{p1Qjsaj5(n_@$T($HUv*s2RXF~4p&pNw;{Z(o{$i%6sMlD`*Y!u( zg93|K?%$qJ9H<0s$YORQ6>PrMq-!VHc&O%h_h=9x665uxy#eAzT++O*l0wc)ZJm|m zt^FeW6;diuTb`HlDU4!**OdAui6Q1B=6XsB3UMf5Tz%2OpY{iG6O1>)392QIz_2CP@>{LAr0$0q#6e~PIM$VB*{vpV;7`r()0bZ4|%jtg)z_Ft!M zpBA?A>xzW=6<^eRM-WRC5#dQOqtCNif!P(kxrGp>_#gF-3$ou>100t1o5Ky#Lexr2 z1OTbgBstfQ-2#+yw@BOe?a2q8ysRhV>LWQB1oD)(G0l zy2U70lntZ>+ef8mUrHBhM-qOu9Cp%(;+Q9XacZ#BA#UjTVK>K1&KI9-mzq0j>&5bQ z1X%Dh!ME*sE&y^Smm5<#hWLK+-+_gZItueV0#k2fh>JrARpDCgT6bJ6m=AriGzNP~ z6vs6fmsH?GB*cV*{)D-B&|J$OfOjYNAe*pxj{`n(=r178moq~})a^8?4OD*y6&Sg* zW$@S{$2xNgK1Pz6x|dinYN$>yiuL3r%P?W;x*^^mTr~>#T6^_j%4&Tb&B@BQF=Hyy za!*-WcToTE-J6|sny-&UQ5DM%;&gbdpS)QzK7|8jp7Qy`7IUxMfq7l0{sQHl)6PH! zrh+l0#tMz4-G~^$sH4EeW@p<3x_gxmG^kHUUd$}bL~f3l!cPZ4oT@U~)#$-Ir_7F% zP#qIVo-V+e|C+r3R5BvVNey^Q(EB25K&asl)<>pL7A`%u9sx%_Q%T_-Dl zn}E0Cb3UhtIN_FH{aq1^IBRXYFyh<1A#0!11j?3=iUkr0{SiQf@}4d5B@9gLwDo1| zv6L9^vb;+ewhsoRuf*XJCs{Jq{kwo4khCcobF3EE!7_$8Gi?+ex16|{1TWBu-+)7nPI+GTd0Cig0Sc%|8Hzp~@yRBngVT~o=F@y|) zG~WEPzEIqLPtYdY26!hO+t3Z_qjJ}IIaba30LCNT>^dWv(x=n^1~Ffke=9BhqqCuB zKjnN0Mx=lLw5628*l{sFK!Xi&zat--_dmsLh#~KZV2^6@k5%3zDtHloO?8bEkRg)Q zY2ys;q3{18=~$R*0r==Q33Q`;WClmg1vODa&O-L)q(tdITOVmHgbfegS-C z$J$}Y4OlO+i%CULVRP7LYDKZ~Yf%ei){js*_ViwRVMu*u5j)%tZ7wn<1V-;*qc!~# z{6c==FHO^|Xy{K>?n3Y;*4aAmo^mcG3?Vb1OaX}?ta0Ip-gsVcW}7VV+Nb}ASGuxi z)lp@w3~)fO=Lt;Tjz0Ncz4#sDjPbY-07?Yc_TyZnzds*!R>PIBcUtluP>AsG^`A(ZX`ykRk_NJ!0@2CGqi_J})Gnk&J;ltNVC6|Ab=r1< za@iK+pr1$W+S6&#&0vykY847t`EhVRG|Q0u;MDoeU(Rv6`O~sQt4NN_?Jo3oBqO|$ zVO`KGqlq!q-^%Yd=jlW>f7bna*v>VbeMM8dF7nRagGN*S>bK9umo=spWK0?cm=up0 z^ObU=h~so(YKqWl@!I9!KC#~Hf|c^AdOu*xFB_K zM=+z^ANsG@_0yT}iFvlAOFw+yma*xpX?kvdXU<3f+>~(V9~rjK)Tz)tU}NFSx(^Y` z_yHix{>#PsG-lPe=<-bC{1Czio3=wh4?eETRT(^D#i@hEQC9K{SEmtEK@PsCNKttp zEJA%L=XYhIrCY*rv+H z*Ed=xHWXqnC6}Qw#MHWZD9VjYc%^5L#Q<0Zy_{o;2kzZ)a<^D?GT+zAso3dUg=HD< zveqTuO|YZ|;ocSZeZr}|KU%)28b>eJoUp>8*$|-my0jd-%6keB$(G0FL#SmRU8%sl z5+N9Rpzy(*!A24QQ^J9+>Y+U{sa*kQYjUzEvqCXIf(316dV@+sN1VSD z*US-7hX4{E88T11>@#-H>hy^6~Pq``T>#~i51mx++&f^{c>ch2m zO0$+v!>jZjsGRAw%nDjx4xdap853+Mj))Mux*SW4UNX23gAHe?1NrCZt3vv~Wpg!W zc}|n0YbFm~;>}UB@d41rqm1hmP|;OgyF>9GfoUuJ_Xp`3WWkDyhM<>#!2hhqsH63) zL%+y*)9C7V4@}e}J`VT+@h|#mH`PC+lCwqk!Zrp^Uc%=2|2ItpID~$zizZ(}3vC^wXJQ*pW1e7o7(06L%oylgn3*Sf{?i7>D+-=P(!i*@7 z{>>S$_{b{b;y@QM?;Ug(IbzdsMrM;eqRy~U`H|MC4gg|7D&p}@5j;;1Qr_I9MKbDn znMcKcLO?fIzWS?%O$R5KeVVZ-OoKvZ04Zu6W#e4={uuy+dJWPi+y*<4q1E4q$!C0y zTGcP$J?tjG9~&0JR$suC7jJ~RK7GfK_o&istgVMU z*MpqM`~2AZmacs{G(n1ONk0P;(Vg4<^yMJZOzjO>1be0TgOD0{d6Jor1p4IzS~uxY7nVRELz4=T9+A>5QrV=9zzjZ0_k^EZat zU5$C5rZ{j^#}b7M1X!B8&X@d4Up(4Uoxr+6JN1@TE-Cc5Hx283JD9o1wUn=%X$EIF z^(#i!(}A!I%h(U;z1fZhCfbA5FL%FH=?}`{af$D zC{;OnO>ObuHK3X;#my-HxIm*|U>*S=fIN>Bk37xczzI?#bH)V+uMc&7;%U4!Ai|lp z|27Okr_+MNG)>M*ogw?H{LZJ4zvR6Ll}4fPa_j=qhD7o}sUj`m%7JZ};JVnFfNN`b z4AjMR_;;hzNWU1vma^6^GyS!i>P$Rr2}r}zDkgP6`F~&MS3C;irsPKRr@ou~7Q)5f zri&#P>dzgaQ6XpacfxM;bVWz=&-Li~Cdr8|XUBHqQ(W_)(#8bQ!)u(2G73w~mRO7h z0IF0??CfWl;*<0Q)GfUFpyk6MV<^_<)!*z%^n;wPI2Ed1_hXFZMV(gAS!)(QY(dB? zud78fo;@-3W)(2yKcwcIRIe8RyvcYig`*QFV&bma7>vJp@CBU!fi3eUz|8B=V)xTc z=uiLgz!P$y>N4Z@Ft~BcEbq+^{8tj@IA+q$xLI2R?93;~fiF166gnDtT>{GpZvNoe zPWS75@j{_YPT|Y`dtA8LUP3sqGXAN&;827IYBpS=W zHTm=!uRemL)HU5Ooi)j@%TK}4b1Y};q6<1}*6+y1wolu_O8l|LdSiue$>hJ(LASrq z!76Bs(Z9(M6?A=coLlfNDvJ$HLtUqOK2B1h148I-KFw(I9HF6PBg!zb?7C5=Yj|ml z$@5>G0MJ|^XXJN6n=0amMYV-?9Nd|S(F5pL4TLL0*M*i3&`Wr&HM)_aJ-4oS+*fbhrVHspQI;SDc(*3FsV|xz@L3MFOhpp^;YiR4q)yp zL>TM7M4rllyU5F;^#M~g9N;0>B1(*8+H%ZY8wa1Y=i&Dx_wM=p{Pa9q{*|Fd@$35Q z4_=REg2Rnw)gyU`u$V0-GDk~_p#&X1(=wOyzxOrE31g@M=L?zzCV9j2{#aHGi^AJ2 z_CYP)*loaJ(c8uYc`5}lLMo?3O9wpi)h8x#Vq*bB1m1nCBI9N^e;8s#q#sd}No)rJ&?eU$i&iNYZjVN+NDSC;$WjRZah+JAMnU zjImRu%w(>M*jVr7LfIF;tP@~>gp2c~ zO;cDw5maJbhctTdij}=@^Rzap7FW-Gd_9Wp?ezm3KS!T#r~ghF#mq=`KzFEn5ysWLA6nWU)gIg3Qfp zG?y$cqf)%n4^xa#QIgeDf)AA>TjXmBawu{MNpsG@NHpe*+NUJQ0UMq&8gnE3S^OT? zXS}REW9n*gGO1z#YbEr0D%zgJF}PUsMv`0^FF&YKr8#6fWbBUwYzW~#eNd)Ua;d)Q z8Cz~z3EHlg=rsi0Oj@1Cak!9iMhW#q&wMsNGsbdHmyeQI-0jy#Qt`V$T-zg0J)(=2C>$qI0D`$#=`ZeO5hP+s*9MYNR_noG@dAk~+(8v~OJ>33*7Z0Fke)Aa=Mj zZJ#Z}rdg|C9UdU=Hj1g-UwuN>_+-fg1cX!wliW&NPZ%$~0%jPgThh7VHz7Y+dK3gc z6p@YZx-v1$Y$c)?O+0W&%!$8|*eD{ZDxzj9R(P>m<;`Mqkw1jWZiID9h&~dGyE-U= z(8*=+>k6&&9c(^qCqF34f0^JGCm{U zd^taaYySC5f5q_)q{CX%VUzEBP}oqpMbr_;ef|1R*Jr=71SLtGR#n{czN(ryDZ9=! zj6Q*ZEae*Lz(!bNl53n}V{9LkCcs^UvRqqkVmsxjVAXlGb{+ekz60HS$+S6sk6V;_ zx;&Q>mDrF|dbl-#;7qIj&NRTVvFi#Mc-IV*gbOcH$~?;=T5CsG#A8OIB9L`hIEeZ% zz4C~5iwf3dVK2Y#jJn8oZ#6n~Vf_$_ZCx_msjjKxvKTK?dw=nxp-}&KpvPRWCfwdn zl?}2Z;g&CnGi|IH2-G8f7)O5QEQV9u@1ST;XeSQA!TSWSAqoVpr75rk85|>tU0W~4 z7!T>upo@c;?o_Vc8oY`rxl#!>CF$9_JC_L|oh^Ikp&DKhZ^g-qGc2)P?{4>-VcYL6 zZJN-ozyw$TNQQIymw&UM!N5H;uL@(zG=;HvgaX04-le9U$CEG0rX&i%{M!~>gCt0y$K9U5hjXcpx* zMM>ZW=>|{vGR7P0VhO_{xd*CzCpwvhzqK%WjZg>dnEW8hv6|bF^>G<1@o_$VLs77K zj;%^H;BYreYg*MM#3w9)1gRRFHClP~(2`fbuwE~)YY3{{nO@$hv7vt+N@qz^OTbuf zekA9oR{UB{f7o0rrh)b{s4x%%Yn?if6C^zLe?ga>Nj@tgfhG-ez~1Dn(l2k7NR_x* zq`L`;?3yuwZ5DiM{2%v7@2h1$ZbE+Hr*^Aj-^VD2G#{^G1QYM3-D5Nmc?I;UQosB+%F zsnW1mge7NRK&$aoXQlTeRsbCw!~U+XFnHETd$a4}vqw5CfUy*wD#VGqy+$Ph2vZoY z<2ue#6&W+-i+7!B0hq-oJHaNS|{TF@T2XeXM5^~)85aPeb2=4Hik{!OD zEc%TvB@pk;T}3P+9N#7!e=3W*hH7(~J^oIzLN3 z`*p#>(W3P)`CIyV@zg|8t8c)1=-9$kieKREaL9>q>riO@`t49Qd@N+j!&90cl-9Ud z=S`E63EY2GvHdilpLEafL1)jNh2?yCw9{npnKa&XyLg z`(`l=(qSQJU&&oLXLAwy1{ux)`<=hLTHWpPZjeSKM>g2!r8lU&2}v&JAfUQ_NAede=TA6Tm>8x zIj`0C__m*NSG-t-tk(PY-;++OnJ%w7@z^}cwD~=8@yOH`78nmwHrt&*n?b>-#Pgua zx~@aO`{MfLg%$IYTSB`hc6U5qCN_Y`@%pyMuu6y(z;%ja&VSe2Q4e=l&6f{eQyXq7 z{2}wL-Rxg6YRLmi5vh(eATays3H|a=_E*0Ord40G@sk{9ct}@HwYT)I{vFpcaLq{b zj<%zL2X1+2rTj2CbN=a}*&Og%gO)rxyyp)pV`_dual8)nQXj1CcM9OEyT4ogs@xMJ z*Wx^RmQ~LrdwL>)BbvApWYYTPx8-pL{5$Y=+F8a)`hF|v zK!bOMIa`dJ%nU;B)}Gz)#qQF_VX3cg#cbO&hEDl>Hx#Qwe(sQ%YZ;ltix zhabP!6%xI93{0CcqaljMA?u}fZ!3ng=Q})!_jCp1EpJy0ac@gSy)d++tLHsn|o0h}HcYm>_o5sbTn4}wMK6uviinmXgpsZIia zbVlt4s`Iz3=r7u6+!%tgticMj^D8x6(QiUtjht`#gaSd$w?e;~VUL$6hAT57TN{%$Tq(-fgWYE8xoScEFI95%JH8s(`5a(q7NrjtTi<(mV`KfAMAL{Cq@%mF-?K!Z@Ce_Z-uEJ8aZ!uI>|J zhpu)TPKbb2nfhiOUgnF53J%OSSsso1)f!(X_S>*(`e@<;S!jQ$eGtXp z0wzZ{6#cOR6fc}YnUrlq zu?Ag0vglndX01R9YNv(&vOxs%i(;MdE9A5gLlXy5Kr%S?5ORkXbgRLcndnvPk+mtV zV(BKa;|I07Xr#i?AmMUBU}fdPEMZb*xNQ zL!eehIMHMwVRc}P1J{n>c+1ld2%mCsY)gS>L`~KV;C>#^TF%{l_oZ3Vtq{1mg%5N4 zzP3abfRBv|k)P(~(n^80b0+BJMsL~7cb6YSzq{A*Jx02kK6RM^4n|?f-NkzE+uyW; zb$_8u`4R^7d_9N_FS}e=SEAQxF!7Lt6a0I9i0BgFcO4>4^$%vAU`~=@;`6(U0k?Ty z8OB7ppR3|n&Tt7lQ5 z3)%1m1n@(Yj`qMo+W2_^mj5q@Ouy48!nMr^oi-ojHXhhQ6)WGFmzUDt0AM+}^%saQ z;d0)LO>G3%tR@4Xqb+DeuNpA#NN5D7D6NW3to`q4HW%7Q5Uu8lS)SJnQDW}xR_y{l zxhktsO^Gg`F|f77dN48(7Yq^nVOxMq&?}fP*y>hXuAqjz@Mc2a#K`5Z?TWML11B}V z@i>UJY_27KWB+RgfT<{RT3!$$_L3W-`W56nZX8*Lv`O#|#Xszxr2R~6$u%{grno7j z62IZC^<;m}eeIX2v92>D6KRC9(^K(*@IQ+|pz*Gz%8`!lIsF~d{wBa*`1uRjphdU1 zHG^}-t??zCb3Z-0aRLY{tEttzvABNma1}^6T!S$An@Q4cB^`2Miu!#cpnP(Io`-IC zp_Q8Kz+fADM6F9a$8|g1i0l^)Omc_noW1zAgt|v+HAXh1d@Em&KuTQQk{tdT(Th_! z_xSXleGYr;%!x@~2yyD>+|aM_8b(QCEj+jnYHfGYz}FtQexuR8ByhoLEolV^sWj}P zhu_@OBnF-NtVmFt5WeBn@KL>bmyEHHCf-*xQf% z4_X#r$>@TLsm<)Ucov3A;A!csFjr{~z}3OVW_{?*^ihM81R0{=eI*w}?w(6isSp@Z z<;@Irkh?pRc5PHVQg{cN*vV8Ry-xRaLKkWMzUfgtqelHx@qbtVbBy@rkdFjw=zbe7 zcMCdCyoTRBv?cnDK0?lTw3dNv*{6y0zd!PIPs|;&liv=w^$hON(&WJm-|GZ}1AYiZ z_8el9H*XxGEVMTCn36Xj(j8N{2jaf}B;lqB*TrC+bs^D54^zX4X}*)y5O(f zW*7aGe5*|!LiOo#DHa6aet$D3$uW`LHq3Rcq2Nl@qHuX~O>h%;g!Z0$czqZOszs?T zcf`+(1)u8E=WuOefEutUBOD6G=QhrlfS5}bIO~|UWf5suxhqd=R5OEzaj)%!K9v(_ zBPr!Tp(ZU*LNqW7KF)0l9*|n?AIBxK{G;!}51^ z4G_c@K_%DIH56O zh)co`%=%`CYKJ*A^x)*Us#l)$xmF+`lE`%^cuCgAX-8w|amz@(OP-T|P3hCt3h;g1 z0XY$g)VlT)Q@7r`%Q?12g4lA4+FyB|5Nz9vn0w0c=C--$#KOA?$7NQ1KCjCBw>fPw zC0&_TXR+xekAXm*hrcy;>)TveWfr{m=o?sK{oaOhsMV?=v@9D*RG0drE96I*7j_!I zDqGBJ+nwU7NM;8D0Rge3I6ZddVF8-}0)xTO9|ZnRUkeRn1kl^R90s{~d`uTJjR?{u zKN_vEI;}GJ#lIL;05sW~UxCho%4)#Z>47i_MQaO}`@RD}Rp%S2@w2+?55>*JUlN4{ zU^NWz5%%SLzupW!6$?8U5=J^^Y%3&>%$m`FMw+^GMnQ8vDEh#!d+q(O9 z?<*x5)W#O?03kwV!!1JDWs1I*ScmJ}#h8pW6jY*ye6;JApZ2t}&_+bQlr2=dSRJ^# zug5_&qt0+8NnsrJVMs#UTY6l()2UvJ!$IDQsSvORwNvaL+;%c=p@qxXNP%_#6=r$s z&-H!&b4qWA{0ECy+g;>FeF|tk3VAx;^&EZnApVuNafw;0lA*X%L8#a6z|k8w9z)6t zeEd!Hrhf@umxVu*P_llwx8A)yj;slpp$+=&5@ZHz)RB**>3tbXl;rgXf8}(Ex+Bqx zaiv6XO5?G4i6>l@0Ms!u!nIwO?a3&Dg-m7+mb&E4p*69UR>846wA`1=J0*{iM)2=x z-mNwV`at)x$Q?RZ4#YpO7M?iJ+#Xsz9JqJvv&~Y%!8v8`p+74Vouz9ZM(|I|K*Ra| zS&reNdjMok`WL;hswFYw-vyBA{bYUUeE<1<`U?Nw$aR?>_$-3aqcEo%_Dw85GoO+U zsBJ8trG9hu9Q)OeL-qD)-IYDVjmcla;IMK2xTh%2lOpq)o3JDz)T^ul48Jd%FJY-4 zM;P`~KhoEDo2<>=P-TR1kd!-d*_E`U?DRD>scL>cA~E{s`xdNMw3A_bm63^>~W=fNU-r}*o1)1 ztEJ%O%f!?41Zn@YwC=b`$PD|^qq}=z2{AJSm8a$xKEJ?U=?2@`ZkYjc zxZf9Oko{r@*++~-(U}_w2MPrE{upvShS6QY zIMPdyV&k+)Y?7ppCDaQ~?qc+4H(%}x0X>mvg_!vR=L~ERM5R+EI*XWV@p#E0kaArz zWsK}0P>KCRi$-WiR~45ReT+lk(}i|dhK+WdCa@dDP^mmUEvj>nsAX}rAK8L` zn01Q8{a)(2*M zw;ydvXQSNnf(XqdIgSi3#Sgfl-o>3j=ERg)7%_z5M+f3#oI@#v36e%m{NyP+48?wZ zgl_Ne&t4m=kEj(K+Hl$cMj<|ua4c!SZjEDU9_OP#5+=XSYoGpSw5c$50`?f2Lu0N| zMcj_My3hU#Q-!YoYPT@da)XJPL2HG%z9@d>ubFCys+89+B^BK*fUoaO7!LjXM`czA z4+lduq&#idOpT6sB8dMZlyrHhP4LMrJ?$pQilttev7Ef%kTtQcI|ouJ*uD5rsu<38 z<}5?rvZ3$6I^D>Q=9?Q=@y(dl(rqJHw0y!X>xRT>w`NgH=e)MjQ;`T8d>Tu_=mgGIix4R!h9giHwj_!_qjXLU zuZ8=%_ujp2B#Hh=g!=S^1ftT}vzcg(%t#wBcWUD}F6_GigiU}!7}vEIi3;U>3>1or zrFJHen% zRLM$ylJSCK+qm?$?2Q&$AcsM5?fVN_9<-)xzpWHi4e#?#;{;2)3(?;lho8BL0bOv( zz+enM%JwT68VqBHbc2B$dSb0p2E5lOPWeE|;rNn4dt?184*QJ1@^B}hCqRU zB?AC1-%QB!f5DeK%K@=`_x<~E^Sq9a{LO6A??+Ls((77G1~p5EZG(Y>eRcMNtqcoy zldA-eVCL2Xj(?k*1=WU-Z-hm?J5tsUsP@8mFJ6$5l?83{J3Te^l{)Eymwi4!)QVUO z6Kp&5fQb_QT~QtbX<*ktXY~2+CjA2kq#Brimp*qdEV@_b`{R_d$qHYE>D2T!4F5lD zy=7OFee^agAR(}nqpI-kv zo)^y-U@g`;zrByW_Yn|5bG7stS+SJ41p(vWu$s=YOSDf+;Whg^J0->0?4)Y@IqKII z62*>y!}zcT3{&D1Wp{<6rH}NZQoplGWbMO5Gs%5q5fO)N?qzIf0WESJv*yQ3YQdyd z8zp56-0U&fItmRgiPS=jxeWd4a$%12KFMM6rRnNXD|88uBp$79C;p$0b$8pjc8uuO zH^j%}$AUpJ&EdJQBU<$IK{73*tYJTfGYR>%hdNWG-TZ^P(SJLZ$a)mys|Z(($4@PN zV(+jguH9CxE!}tZ-G}p-#Q3K}ThAB_V0%7IOS;TSRN*fCv)t?hrfu@83m#zI{~%8| zOLb`gRc8r`O6iI9Md%bBzp3MA<8ntwkC2= z4thcN`1*_s;~=#szh!LJ&tRL|2_f}3hm1)_3WutA`lP=A(yeJ%x4*Ywsz(rAV&QZoFpV^S-0sGGn!KZaOdLA9uF-*_JZcp_XDcMNYx6#-g15 z(wWNRU-(O6@V2O*y-hI+{c_Ym%t9YQqo7UcLpTbp&1(ATBWg9TJD>jT8W%m;qR8k zhT(6&ER7ZrHYXpZ4Hq!5d=cxB+w*$EB{!Aq@qfP>*svR%eB=Qg9G{wCe~r259; z$ZmAp@}z#&Cq{TT)pTS4h}^W^7$o9(B7I+V8okLPv_#J@eXQGHm^Ay7Gj1c01roBm z0NU+DRxMZcS7zQ-$&vp8f_FH9jrGZ=qhcLs$GHe`fco{(tmoN2&-TU2Y;~leDsHb& z)CMZm$zL|RO1QQN+12LMKd}nI+~@S@ooRQ_Zkh0v{pMvn$~fSTi%g#F#!+d-P`cRL z@douvO>r56qwhH`S5jTLn|r@*FkN(f55=Di_;)YsCQ=p4yOWFtw>Pb#&PUOKg`EcD zdlW}b_I~|N=0S7kEk|StEGG!>RtvYp_hl2gK(C#@Xyh^WWJA1FK{HJT>B=eFo zyN8zU_qN?XQ&TE$h+5BUeGmK%9&&of#u1w#ZJYMzARAdVmFwS*5Ue8gr$=D|1`#+9 z?=22#hH;{M{Wj*G2x+1+RP>o^M9C7Oa=X~BPJQ{!OV7Hl`wQ_Y#zQJrnji|LINSM? z$0N;&5aA;4xm5U@0cpADNhu#{K54XWHndwc8e+-4ggxZgi#|}dBi8Oa*sC8qdr#Ge zrHlf2P!DbE99liLiT6hAEE`BGoEGrLs&ZzJCGUq+|Bg`}q9}Ikgc5zcf8vdd9O!|O zdg{m#&guJS8PrenetlX*mBreVb{;?DTWZx_`bTra9L-BJy#%)stxdz<=7v3eJg*1j zxDf`JVj<{twz zF1CpE@EzUXQqPEtd0Gdy9GmxHC8xwVUOOsxIf>osIbx-+P~JeJ@+G^q?sP#;5_M|; zJzqPTv-O=|W@GCu*9N8}GSIv*N*AlB+UQt+C$p6h^l^ovpepsM`kvV z<%TPHw-K*5tD$N#Wp%V# zJk1BNit_qa=WJ~~&rthLt-haAa|7=3tf(!0GWN-x|Z$zJ6I`_I@4d{9(vE^D_!3_8QgqP=pdLld>*-xV0p0K z1$|EJXX5hhaNX3>b?Y$VqU$4aQP?p!Kbq~Q(T8qg z(pGo>$RfqU)nZbn&7-Dc?Iqu{L{X5M@eFPBeTdvLhzPQ(pN0~5Ueo^91A_{k<#Y}lO?ni&Iv37s#{8GUXtq?kO{Fmn~mzCI$MTx907On+vq1n@s@YD_yg|j4x=-p?8mKOFh5`)Bp;dOw&*SENO(KjD_Rxz-A!V_Jmon{)S#*K^6Wgbt;}rs*7qgRC-gIRC{H^^w0Vs*XC{fszEVfw z6bGVDg>;^1Pl;2R#931XCk*Qkwhn?UKUeKE4vpEVH!9IDF$e1z_I}Kj=$M?ykhID- z(tM?vAbAQ|M|Cv`kmI(Q4L!9PJvRLTOHiY<$hH>cIU#*mil&G_ETclfo$_Cu1p%W7 z|Lh|Pr3cjTOYpub#->Rji8i|#?}x!BA0nzs2+@DMkMWvq69`sPRcC!K5}5slzKq8& zj2Wv(HEBop(!wb3K8e$zg!njdL#}PoqE;+xiX#FeNd|0|%l)WQB)o%plO>=c9t&RYR z33W{Z@ZmV!u&euZ2ZO4Q=BE_qH?}7g!C3M=mT zf;}4wRp#o=@B6L`lS)qkXv7`!L#XxWn0FE<%NN)SRcvpbYZOq7pBvu}hN&s0wyS0Mc--5wV!T+sXEsGBD8k_g^}G6dWP`(mbd3Y`eYFJ2pKQ9 z_oO^SNh_h&-UP`&;{x@F66QKw6PXHQE%{-qfDb2je)1Luj^gTDk-RZH^qg{Tp-GN? z+Sdqjo4PufYrn1!I(sj;+g5vwL$e(wnEPrEHY;jyk&}7Wy;Ch_N>*tOElB!l4i)0V zG^SQwD4XSji_oIE=ReVeR94gH|I+H6Kzj&fL zh*2mP+$ zaAvG=QGDA7sTaKJ`|WV1VyLmR&eUy3P|S(%*~wD!C&riRynBe*lOEG6dDqS-a)90p zGe5V;M-_7aWTV?;E0wXzsIj(K4lp$CH2i67l|3_Aq z$!ni_F0xqlXO0UvmBcKH@fWu_!>ecmk-1p~Yes&3Aan}aBW23$VCR_o)0Sn7TuENk z?=HVnPcW0+MVpQg(>BXzLGZp}XTnNn?nQj<>W*ZV?HS`C`K{dKv7c#%7ozu+EkNd*u5vM)5j59dMfSNL z*6E z=CGj|iB9XO`G&PBBHX=A3Nx84*J*L*cpHN)%<~}v)q-AVf@IK>mCQRN3AXiNL|hpV zd_>H-qZSG!oT;8U|AwZ$=r$r1*#jAD)k#u$g*l}wJD)PhkVC*M3NxpqdrbhPL=K`NP zX$)OXGtm~&;&z{W)7Ytjd?sWKPG=yXCZ;B*CWsq@iSQ`qaR1mxs9_ZHhgR#9!%7ZJ zmh2ier6~9JMh4|7x@RC;a^Y`wLlrORC9v^2zr$bBbPEm7aT9DtFimOcZz=qdt|0wA zw!&=2sxXmO^Mg=PJN>5WQEX|&hT)6M`1%Ah`PtL#uKA}YnvP&GyTJ*vQZDC@N2dCFlmGuC^wSKzi57ME%44 zKSXQweTzUM1{Sti3BCD^N7ZlZHxj(H)xwUR28SgqgCWQl+3>`Dz`wu;Bq=aM(OkQf~5_uL@#G}_6+0#9iDsNvXT@} z)!h%i+cO5`M_(LoQ!fx-_*JJA9X`nhS-mLx)AAr^pr*~DMR2uVmmDAbdT=dQgLo;m z_`>X-NlO@8Bc>Liab+fMsgRpAYNnnvuvffRvmHY=VKt*0hIVE<{oRH_usz{0;)<%z zVMf;?bJvtrl`(injf@YxH8j}2wG(8LV%wP)5n1bsrV9Ez40dx4%^ePKUvy&8d}1yh ziGqqxEPcX;Tm7c=kg7S|fS@vOIwXeBTx6DFClzdx`UH;A8FHeY@EoRdKnuea|LY0s z$SMAx0_r;UuYd}=oq=Y~aDpi>`7h-U%WLD#G5Ab-p1bk`_4B2Hj8Rnp1jv9J$nIom zO+=;G_;aBac4=wDz4hESq(^jO$Lp}7_`aDs^Igy5+T&k;Na1Jc3q~Aduc|Y zJbYbMa>Rh-iYlxOhDg?!`xk-e979#q8t2wvDCzS_jF?S%1O zQ^FeC&&2Z@_0`P9+`>*6qqNo(n@*y5R96n;x1~T|?K(@BTp}NI`EXsL(embukO?+l zjbZi>(c?H|WB6A$i=*FZ{(=aW*K(3XvJ7>0^YFobfkNIf|NA$gq#NSPEc4NKd9ukZ8Bj*dmwr7R z2`pZl{sh`+GEkM;Y*+kgiQ|7T(Imj=E6TCS_BeUCCURTn z2C`YDZG+tRV-W#UHyFhuE2=_~<{`B2UoW_&hz zj{AN+=!F{c|i?<*NB{5*hpj(O%v0 zbRTh4S-_R zY6bvZAeu-8BIUXLJyGSo?30Yfv?|!-x~l(B5m&3M7wHh_fmb_46? zBY?cD!@@V{7E9W++cDD$bloIJ(RTjl%}Lm|OiO(K?M{l9hPi6ekDAOeeepSLSyk2J z^O0&aBC1nRpAb+luQ8^=2y5ILkfGTJgfIVouT^y1OaC~ZCt!D*>$A#D+iYK$VDlP> z6DQ#Cb4-Nsxr&4qGmhd#BLwtdthZ$;L=UCR7M@*GPp1=aTBq0@g$@+4C@5@Mn_IS` zx@EeHgrS6=y=W3s7G~tmX`A~ujpN8psFQ<#RMwMy&T3%Uczeg{ckUwkz0u*PAkHn{(_mWL-%L(tEOE(+Vj4{$i8;T$Db^f0 zB9miTs!YkgMW3qFQ5PRx`)1yvMz5T;uxX7QVyNyT&_Re;C(>=n#TM>3C-lQ$);MFf zNY^JR3qankmu7>dX+U#=UhOJ79~@htA4$?;A;ybIt$SZ3fTaw#jrj$5Fiel{ku6%r z$n5layqx<+@#C4QBJBke&z6^3mZUBO)3fTy_}%#V4v;h`cTn`qbnAo2@VFRJq10h; zm+_zXcac3Uo~nP->?ix3bi7l#@-vZEwRQMTUf#4@J|pL;!z_Gz_cu$1$rd`nxnj{l zR?B3;#n1*AWq{#9D$8P^wBVz#nH?s!2Kje$>YjPiMrhu53~(_%jhu0kGXI?ju_nSo zFN)ecKhxDI8?Lf~D2r+I>iYX5-Y^E8mz$gjUjku7Ei{@>2!HNZT?;|bYj;_N=}A(^ z{eFn#Mb*aW=_lwGKE(wWj?Gdc7}t2^9gF^a3h34Ovllb*> z)D1WJ2&8w$q@0%?&2hta(@yZF)OSk(qON3HibJZSGh$kC->r1FY{V1M7suy>l`ip= zQG7!G5Bb32&rwdA3);P4!&Vx0IKga?h@gU=%ZR1UQuTx4_Sar|3CEL;lZRQ#k;#75 zeqO|so)`w~YCL_`BkL72=8KJ~n%fM$=ATG8$e}#{Q{yVnVb__K{-?~_(HFHI)3G8b z;g(|VjSykg@!JEQTaIFTbHup(w|@EEve{Yd*3uJV$xh?@?z?oqZ*6K;zJ&HbQ1APm zkGy|UE56h&L1g`HC8N>Cw|jY4-?&kUHV^xv67(5gt2~fnL{WQeIOZh}WKR{Vf?28J zirIo*;Dcg*>*!^#llt4BosJlYhTE%CZim;Db{Xr12u+ysLd(VN#yanaJvzByEHuB^ z7)>R-eGY&A%05iu?-70xX5}dUE))i!EdROAgg5FT8hQz z5we}~v4UOK+(X6lsc@hNWSE=Ok-0N@bd^pki5!m^adZAfBOBDz)2piD*?O>zGEm#* zd|*H#NBT^Pc}?@TNSJr$UaHhvI`ht}kKba-y`nZ3j(fJi%?xa(iSjN>UfO4&mMcr7 z42(vA^@$Ye6Dj5&Tq4hHK1nfmZ2%V}>sxW;X^#}f8l4uhdnAoNSkJV;m-C*piA)wo z7sV$PqV!Wwc7u6vo%)Scq2G6s+BGR+&7f4UwxqDsi(cn<34uZpxgrs+D9Vh(nTw4w zJ>Pu(ey!^J)i@!L6ewm!RFq6$-FNApFyuuiVg5yfNs9F7C&UDgJA!b+T*(UMXoIP7 zrEHHy$Oa5qhcbVZV)ky<`POfvO_LVGju(Ndk#IQN-A=nK6v5|^Apf2%6Qo+8!&^ez z`@)XUxMH#%TKtSpT}wB>pjW^zK^eD@{+!4>gDz3VcQZa%HMfnUqDk5ss-njh8>!h& z*G;*ds0ZPr(0ZsA=~S#CoICgU)~sQ$)d9>qm}wym2l$myPaqK{N`%IV4Z=q%6yVlV z>7xse;hls{jS$wTvKj4<;^j?~Q5&M#ek>!NwsGeIF8q$3n~^LS)t!W9^eYFdgC9wI z#ey>Jrz|`CC&r$K(>@>jd*>-dYHOU4wq)fAvudEGcKe6{hV+0soDbd^vPECSnd*^b z{@0@#H%xft5(lMi-cMHM+*~=rm4(>HYwQz7XXwH|1!dw+H|4jMsOktbO!8@MjHiw- z2Jnw;xGOJvP$ANXHo+aoBU%#-NKwTgA8^TY{66PA+2iHq9-lE0KkmEZeSOyt%I?lq~;Wd3cm}kce$FA^7sq;|Q{yhjCY9C$7Zx(@3Ac3}> zE+Z)L0YsUkJVYlw(&<4TH7*rWwsEQos_^A`mZ!Yn^TF#EVl%ql-!hwp#U+@vVNWmW z!K1p56z5lmgS+y8-Z4(GKYgb6YIC}f@7K&4ycpMBea9|zw0qz5aj}b$0vC}@4YzjL zK;?meXUP!~y?mPUUKu}Kxvf`$yi}>C(+skPbC$8C$E%}_A(m|1n-zaULYSt=PDJ6_ ztk~1+=g}v+63r=Z2b}v&cd{BDI(Cn}yD1FCWX{59n{-WMUww`tLeHVok{~`wlBw8w zR%1Bq3< zKd}F~%rOZqmz5OHf49$=T#0WoI&E{i`Psx=&H4qUnNKA3A=i$=Wo0=(l#wSqaQ2Hv z7Yk(e(Andy=X8IeX`DFo#LbjtwL~y@8-qq4)>S+BB!PCql79__)CbS7OU`6Q&X_-r z?j%5RFo!p`I=TI|;5F)PHH~R`-%y}+G84~9)ZB~mbK8!EV~=)t^ifkSJXW! z=PX}=KuH@D*XXt{G{nc>qy)C&-BRFZZVVt?M|cP7CY&dvFxebD2Nz4B_F4NQM-r z5RS;H^@%Tk`})SEsN~q^|b_}v=3zYE$+8)6GgYO zOE%tCV+`j&RkVdeu2gpQ)+S@(!N(GWKb)pDA!IT%Bprx|zL-%Pbp@=oM+ zY1;5J&?`bN%K2S=LUz8$G5EhF9o1#uA+R#EXT-~gmWqwii0rG1-U}p4bxNAdsO`qb z^{wICTgW-(CR(&B{kh|8ZjAdMvf2SDi0Sg*wMRcL{(aUd zvN43TkwE}wh=feV?rc2?A0?=Ud^T;Obks8vr!wOGxBlvuv#$AQWX>zz3zTbEi&OT+ zjMFx_^7fM`64#W|Ov$)4AZ4`gGu{d>4a1>PMViPK@u`j`$OA83TBRrZOY2+g=ctjpUvXC`K zoc}&lWWx7T8l9Q2PODj8S=3AFPnt>Pr0iYsnde(iXqf$+ zhvAxF0!a2zvc?Uwia5{u!ZDD|p6z;4{A!;C7~R4-9qUeZDMX*YXo`KtyKKMavb0iQ zSZHhD7}jMN3~^;5`c#hrlc#@P^rH~FLNsa@GqZI-l{v&qA>0F6AEDe$lmmgbB=qIz zt|vxbKUG9+b~Jk~5@?HvgTZxnN?WT`sONku+pZ^x92lx5_?!=hjU4%~qiLWIov8F4 zoh=Oeqaq9}--PAOS!z3(w0>48Wr?WdogdC^XIDgBoNeL&J#xLW=|S^^=4$xpuymL& z!ck>Aim-uWf??~E4*sC>{9)v@9)eVr^oocxD)sS$nE294Fn*U*7NU&E?@gNQ&o6z& zYMukbT*eU2so}8P>*~v2dh)Cpxae>Ufhb0T9kI)~nuU_juw;%*D`vdUk%hXP#TUH` z%kq+21U91#m(z$C%zt)ZafQ%=DmQxCeko*AzpkJNPK8|;yEn^#2Ve-%2N$Km^c?sq z3g=0wCNEBa!6-qraDLu4Dza>3+_SbdO3T+Cd)(?hrczvK)24^t=wW z?dG8VoelMU5lT`Yr|5&g!BK>=hpSkPr>;iy_(X72=ArLB*X3>LOUI}~cNnq=o@8Tb zi^Rl3(Iy_iR^P)+Iw!1CY8#5?TUb5;)DDvZrvbJBR!!S|u5W++sfoTr`6j>+Vt3^P zl}b{cd{)PiQK0b4f)|rRBPmpj4Q#%(_`w78ZBp<||DmUH$L{WDI$+Ci<+2ISU)LL?=WpY}JPcb8 z63|oa7ZU4>=lHxK!`ZN2#Z4dNSKs+0$J9Cq*+luAT#o`{O~*_5!#SqvV39I?##^Sm z;2Tu!qlzF^7Y8}Xf2d#T0)4yAP*Vr%hBe;uF;QdZ|NP*)4OdK7gF6Omsr@j-{dgr! z>^=i=2tQhf&9p`i_x?J?XkI=tPf0T;Ph$9rJ9BgDpas7|=Lv|f1)30)`>pt#o{Mt* zS7k51{E;H~iwluikHNt$!q8#1XT@U6$Ht~?8~KB?>?|AQZExgX!#ZiU;JjQ?BhKnM}Xg2K5i{f{oDC@wfIx zupeIH+wg9Z>jj&Nh1c_yKYpb>iv(yUt~BQ6u@q}@p|8AmVBa@ZK-)r|@wW?!^_(>z z^%maBK#5-)8ep#qs!TVyc4NfN4{Z@aR}GBGbDP}+l)()QyrMCnSeGAn<&>{gRdFdy zuxF$;k1Dmz(C-lN{>X*XoGQP?ka))teyMxN)o-{Jm%qHq&MY>N8eK14zS!u(99`{* z2&scMzEz3xc~2~&8Q0^XK(k}XrzkxAvqnSxa+a!o@9#U97tt*~zA(q3!hy-*EIdwB zWm|eHytai`wW|L6OzipR!#nF60Wg8c(;~7=kuz=0HVko6Y4E-eXOWG%!W@&lAQV*kt>(>RJ@Hcbu-X4m%ySpFiYeH@aqATjiq6)zS$+DyXR zbH0-oQlh|}q9xMR6U&9MfvBx?PK(ZNQxeBT)EJ>(H8?||^AmkSQ5bs77HA@l6uo^1 z;n;o9q$)zo-<|6YMBm(Qd8BF~Vy1GQC5In=ExT3b=PY}9bWt$-8#81Hrf5jF{O$|+ zJ<_^6yR<3gJwX*MVf8%SbSmR!J}swDCZXs1B&aUf1aDtnQEU|s>HQfbqYI}G9(C8F zspQ+;N>0&HF(`EoNRAch-jI$%nx8A{bHevrI0x1CfR$uB~FYU>VsDHqqxN)^NgHiIC><}J<%;yJUH z(Ffz-Prtq;VKvU@WG~j4i5BZsSP$_kAXG3Mx{`G^fx>?`E`_n)&VwR-2vK2?`Y`Dn zlbN;zqQ73FV4AHS=CDj>yFU2A`|9)MJ8o~b4EG`zfz8}$qWJ2f?=s%!GV{TPf8Lp1 zb<%d>UxlP78B@yYRzv0#`auHO;S9D#22QK38eq}ZfcGz`1Y@Kc==CP1y6*k};l;$}XGfuGgy@RI7$yV#G<9ZI!Efj3BKEuYQk37h zG_JU16e(Jxq#NUfn8KgV_xmFjmdAG#L(tYTw@G>cO_}Y~YLXb7kIy04ZCvD#6TL5t zd3#+!`XH_Vq?KZC{SoC7vAb|=aH%H*dFy|qrWej3#zqByQpY-*wM60?Bx&PaO((v8 z=T?24OBM5`!HMm-^2}06X@EtLDbf;?AwuqvGbIhXpBpsH-x*IGPH!9h`#ib_?mnAu zs}_O2DsQR^a!@;I$m^W%Ne{2rnn^E?@^glXSheS7Uc=ZD&^AH4zkBh(2VFCry+wGC`-0k84MMF!Naf*xas9EaGOKewTsk0ck?s%ShX; z97Yc7!?GMBg)w->|Fzq3Nuw2Zr{BDcFy5%?G>q5Z=fXpLLbun5FG8`BAX4_F)ROR!jiJ zsLrr7ks&&f|hmFhY-_5&t(C{G$b$k4aO`eee=|(7g#^J%f{nkPm6XcPK z_CPLN(ZS}{_EH0z;O-2xem9_m zW()-$|Bdmrq%fjn6KA|-H>p@Zvj!zAkvelyA&aZ`EFSYxD*KPo&}!9{37?ugDs~n+A_Da zo6Dfsk~?PEBkP=D1Sf90=gk^bQCAo#VMO&=bT!ZiQ8K9vFWi5*F2o5@6qIeKP~ItWlnw0DJ|*?Et(v|6U*1(2j*Mgn33lbZtC zhaU-t=}`ne>u8_aG%AQVkK1+)G`X3wpV@gf`fO_4BG!Na<#d8>YS68bGQS&d=Dehz z>VQUfs>Y^6oIAc@@0ig=%o>ozd*!Yo$9O7bOx!2o$BLTvI;yU>2j@t|8;*=`3hM&G z6JzUTl{HPi%2G!o{*ymjCg$TRXPlfYs?nl@yG`)`n6ghrCTlcgp5vygPC0kuu=)WH z|1cHE;eGS7C!<~u_et(vq-m_Ff<7nPJz-Ul_Zo_Ps{0ZT$Z(t+BIi z=Dyb1e*dsFOFP-`W9u}G#BCqKRRvPZQ5ADoT^KZYmv!0_!u#V~nQk{YRoKhwThd+_ zX0}gxOCDu+U**aed3BW#`MYX>PkcX}TY!S!npz6j__5{z(Kx^rg#CnW$|C+rFyW5# zrY+!2=JjiycK}qt*A+}40=*EV6ol?4p4P>z2lZ@2TZH^}s3qaACVS5{@Lfkzd1VG( zP14E9bxq-Ke;vbpPpBgP<(5Z+v1fn)-Gy^^z$Z*E@na{aVN%P!Ke?oQ@CXqFe)x{Y zK%kcyCrzAF60+!1&Ru9WYXNh?;9&fyr&7KD?3vP^qSA=svt;i#DzD>_2fLB$6d-?`4|YyXVkq2+SXJTgcr%E}=#^yoTU z2dg5#d(`%PnovrsMKiO8T%u8@2e~S+bVluu8o9($><{l@N`gp*OuQQF&iJ`PPPzifE;d4Lb|!5XE&; zwC{hBv9?zqh+v%9%{4sOtJN8RFJ4_teany-Vt-++M#lvgt<9}l55iG-PZxX9h%}M( zZgk>p;4w80_RF8QQOI4P@qrcQl#1Y{gA?|bDoZ&-ypsk1n9SxvRQ#_b->7d?+Vh@t z8E&OT=akTNwDhSGNz$T$!_GKpsldG;L4VC;aHCkyjs~%~+MU^2xH#jrXKHZXNMMh2 z#i;Nj8of{5w+_c_jEGWvcB3AsenGWX`$ zhNEJ8Yp@n|lj#}4MEzJpUa+_V22d4akxN5llZZCIo1Wt4OAXBipe9mxgsE5h?QnhH z*4_bhl)Qz$iK<)WqfNefw)YmNv68D7**C0zlm%Dc+?aBKgc(`^PpO{qQx%X$*4^c*cOtu)3@92l~Ii^B8!owTg+sj2`c|k@HsNnx_|QD z;rc@5qDJgU9)JPeRVKwhQS3)ku)=%k2h)*cbJFFJIEQ7;2B0+Ris_@;)HP zTV{O8)hVaRbv4yV^*9JE`XvDrV-D%%IcuEbRZb%Hcs;U){WtlQ8nvhr)x_}dQmkPk z^#{>;*C6}T9StG0DPm&{}vF;*u8j`+B8jLAqRSE}y0`2~5;3sd_j!$0$8 zT{+HBoypj53IHxh{cr^BRyC!FjR&PS0c^QL^yXuv))@L z-OcacDD*!InoYb7dI8I*9c+w?|LX-n8i%fJm37USIodE!&l_!=d(OPr0HFCkCQc3)pJYCm4N3L@;U~cOxZg58zH`*@F1h2Mf#3tNBJN-E$huw z&?1IkR^r^(CDf#-BCyT-yHr?#BPYauYyCGx@-u&|nOMmux{ z&D}dq1S${C|9)J=D2QbdGaabkD_XXG_`U$hK>yTU#cU8+PALo7g`RcKm|mhoV5*W| zB?ZamUq;+QA~zqb0SSq6##c$WyHLf)J8Mku2_Iu;-)!Nr0MNYbO$rSP+ zvs^IF+L(%JQa}+qn~4>wh|jpNhzw09DIMtxRLdMa^XQMeeQt$M^i>?(c88rmkx7bC?tp9jX zE{P$w)TVMzkXrcQ{CWMlGe}tC*0@+|(hL8u=zn+C#$^M?gHA&% zIl?icqX>DeR^#mGcmp`^mx^?wYwTb0+Oa6ia~62vqZ0<@0sYM$|9Ydy={KQ&PZF}W z<9o>qtdZe^hQbKrhaj~thMY(_sh~2AD)PW>&ZkLOg5)_(vx_0cTU}r`=wDIb@)Rvc z>-(Y2v!dhSu2e55{J*!T#$J1v_JG`#JbWe3T9i*0&H-ZyEBK=D&~zM%CW@8wLndv; zEui0gG*v zx+mRLML7)n>S>^H66JnLA%Z29jBM9=>$LDm{x{(B`gv{^<65%r_cuO!tv%7fR%ncl z0V8RUm-^*w{^GJf9ThX{G+Mtk(&(X=g?c|$!h7~MF6^7?B!TtBj zIKi7;9H-QARMhiW=3{1;O8R;FWmI+Ez*Jaw&g4HEpSPcL@MPG-Z{9JUiMC^qVtdV zE9KS)tT}s?q1O0Ur1<7)_yfMcfbQ@!@!um2KlGY<_0p!q126IqYN$GHlB3Zu z=wy&@WV7UUDe;!ILka?xI12R}KF|8CZy0FQvSVP$CRAl_?G8-t@Tg% zZk-}*!@or`IAnW|p@cv66;mMj9J4Wjv%2>M`guLjzE!p(28mQ9Znscx8R8n`RECal zc1+p@I%+J3bI5$)K@}uYKS#>xostd@$|||FpvLIpTd~W;o*dXYmw2r0&YjPh?9EsQ zNu7G7@J(xUk;4aJ{&7Gr);>COOZo(lWa4cS*(^7iCfF>NMv+i2PXNwcEtjJsQYdZFaZ5 z%O%LG5Sr(^sejrAXQWDz5=t>!*0X;jDKhl&YWVx(?3?AvPw}_gY;(~VX>{(K+)j>J zn?r9^6J+0gglKNq5#jUDHLi%?X_juF7jq+B0b^hcotI$?yW{v59iJcQSloI5I)}}Y z9DYKQ0dX#cDdP9ezil?u?{+(w^{v&fo8Tw^-h>9(17D`sG)H4)t(e@#!bzqj@xiiMJuU!Z!fzxlDCaI-M(Cm12yOE)_kWSjX^{S?u1K0+*1n5 z1|Yv4U0n~y`88{K%`m$ZXEob$jStj&z)=@H!l1WXju5@|)bR1jP$WFj=4+6i4DD7_ zoz}xtkupwxD;eO4R7*FHUE!Vtkhtrgxc~Gxsb;6>?_jk1rK;^58$v_d1c}E%-#c)3K`iKLPvTL z%!+TFmg>)=T1dU6mfRk_ss3S!%%DqtW$T6OCV;|~q}x3P!}JpHBIxGQ(5oxR-mq~k z1Al8+v5w`EJ1RqplQIl&uvcHw5`0znGj{b2d1bD(oXctVb2-rO{ErvkV%zDkvw$s1 zfL~xEpo?Z5e;yAx{Q(_PYsrh5cy3NV3jBjaG+ujoPdXxktP)1k0An7Kbv22de>)3z zLZ(kgGP(M9ga_Ci8tyxzkOiM+ zzzm0K(M#SQj%8xZ9AV;wDE7ZArprJ`g=|T23Sch0#;NhFe5ffQ-Rs%SvRtiN?f6M% z09bZo^rNav&M5s42_yN6Z}Cj0v7FUjGY=}K%{@`tl|a_IO(v$HP+hZ z-K<_rRzuiRZWrx-E#ai^e5AQ+E| z5sc5K4OA{NNfRAu^(Z4=*UL!OO1jsw)o(e~f4rW=9~+c+Rd$|Mm#hCe{0tc&Da|f? z1|n?9x9YKYitpbIN6x1jjrJCypQ#Tn1Hz1MhG@=w>)~^@;DRp&lEeb)e1*P!UUEjJ z;doTU4_y8s9sk0I*fHrHNoC+7&+=I6p|cpb z1ZH<5puf=gf5-o%4P41ZoJAg8qban!4&iR~^bmZBl@WtG8eXPK*i#{=gtVaS#@#nIH*+JM?oi!@4G8v z52S2f21=6`*6VVKl93dNY-LCiuajVQ?`7;G;Oj@aRXYAGBOSqSQ2k{PgN4e)w!46b zoz(xC)_^gJ;1#*#!um&Gpm#MrNv`xM45Rf&o{6;c;U`o!yS3VH(5NnbFtR0qEgL6m zYNvHBwQc<>Z`w^uIX!?r6BzuI)6D=!ur7 zsd|YZ`UoK+#6(0!)F23=m#8BM5`u^pb%ZdY_uitHFrr59MjO4G;k$p5^E~HW>;3-t zzQ4{|S?gft-uJ%uzV@}RYjhQ1(mF>kttNnU$Wo;qq=4!h3c*l8^A?r4^+|>ah%RxF>XUyd%PTZtK*y|nfggd( zyYO|$K4^qoa&lWqIzn$`yvL`y1}?op7kYF#-Z`&v;)STWAO)@=%go}wb{LD;iFTL8 z6%0WtV=YB^bCr8B^Y-DVA;sDs#H>uO$5bqZNNnB9xB{=4Ok1-^Uf8(X8fkNRY9~yZ zliKw`V|M+csj$7TPmwLf{O2*So!91sU7$HD^)p^d>p*k7t78(*IRt;hI3m zk{DUH-p8#`jB#TH)>ZyW9P}szu1b_WY5>o}*4(b+?JPV@=n_36V?OLD=0Y-_N}_M=D@!QjNkKE1A!es0~i#9X*| zUPwA3?Non2{Nh=35Wd$+Viw%~S;3#1Nq791*erSY0bnrMExs1Xj(nM4<-lAqQN6$^ z>rq*h%B9QHp&@ausc;*oU3NH6Q>^yo2j+vJO}B~qAQRrHsQf>7>l-c-i2!F-J+=~y zx1HS73d-A5FVLdZJ)6%c{TC|-7~H@K?)r-%9p9t0>_*rSd*p*Q;iEvT6e0G8J)Yxc zIW4hbm%&tw7T@mV`wr{y4p4qscOr zNo)C3jz{Pp*N<=m%j6yoY{ZnHUEJ+0HGcH!qo*<6KUbBoEKK3DN}s&N0Uz15PwP`x z3%3&Pr7eTkGStjQ+5W!8{@jR(a{p>*83YkKcW7}jZn9ng4^2k#bYqyyhJ3 z1%d1i5vOM@WCLU~PSV>d>8$-W3^rv_rQ?&^E2IiQC!6kP#+a0g;ME7^c;Rq-=W;vD zfwa(Y<2DIM{_>rT*HVA34NC9_zM&KyiMKB~z`ikWn2od26)p@kI-QYgy&gc#1EhpY z;@7eMa#;dG2;=q-YRq2_*~t4TUUW%H(bhS5^{BC()rUx;Q2(zvAy6VI)^dsrnT^~^ z@2!wt{W&vjXoEAI?KG;*qN6GEv_d(WSWzLONN`ZkfzK({#Qm zCDpWLr>*#QhHA30W75}DX3=h2W0@qeRgZXPW2pN|CH;qENa7}-zv9OS!Xf{Yfi zdv2$#^i~hIIQ(<^xDn2qRxQh`=`-i;LS!60p(l_Zh_MVDZFZ|Pzwy`$(BnEcohQoU zps)UBZzd8|lT?Jvb#gOwh~yT}?F-82pT=mo%@PM2UR9)d8dlXhiy%QvSBUbkUma_B zvI2A{(x|XoyVSwNJU6ZyHtmZ!KaWbOwsg^W;Ymc(xB?thRs;0#vb=1Sv%=Y`(hHm8 z*(_uMd_}3Pp}lq_hX9Y5$nGGY1DOLLKiKbN7LD1TwWS{iR_2#vBjGsS+wUtrg{uNcwy*Tj9%ceKM7@um zC4QB5&VPIXs4l7HA91+a5*SH7y1Ku}j_3?9Kcad+fq6;wmB$_^Q%R)Ba)90Y2PF$> z=`=wauuki&Vqm}#R|^(vvrpxTvc7w%Eklbv9orL?prXQ_`hr}aWfwO7_Ozx$B9r#Y zITkW{?u;DS-CFvp1UK>#n=RVfVqgQL&|VWtS#sBzR$mbDa_taIAtW<$8yR>*m%hnZ z@5ZgTDJ-@N+i^Hs0?Tht$+w;fpX6EDe*K`Nm>GiHoU&)01mE$vle;$F4a`R^O{>UB z7*{UT-Q{a{-AqqtBvl#NTg;MJA;Dr`((i97;_PC`JAN6EHS&q+(;B0sCA8h!dx40r zlXnoJz;LMoqIxZK=-Dt%gJqMC+%Y17Q%tvuGbN{Hf^5W`UDiwi_pZY&q?@hIzs_N2 z1&A@!E|;&sGI)ri;mmu9D)`>jhPy4Gl^?8pWyTCd- zj1)a=rxe3!R$}~_TO!0cpqFp!-oVCb*4?+QFDNCJZdLlO58GkXi8_JGndVeZgg)*g z6Vu-2JUWggNNoF3ICFl>-pC3PG1F^X=hDGyLr|EK_r?PUB z*;!xv#i%n@y+JMPL9-H%AMjW!xq7$B_^l_mbqGK3aG90ixyi}2P%m8Wx?F0q+wVa@ zY{mFXV{FjiQt-|N9$$(TecwA%h?U>lm#UjbVya!Tf01%#>XM_j0~D(_<8}+OHoL8G zffNTmYV7zPqpCrE6$L3NyO;I?x2Sw=Zf#zF6?2+W()x<}Mr^jrF+{gUABa`Yrcud< zOHuV*VtCAWPr(S~G6+o6qmtGAXd5Ccrf<4m|Exk~?nMv}Ubps-R?G16Mg}B3V{0Op zzS3|SqidZ}X-g}k`Uww!IaYuR-;q+4H1ErJOQihH;9NwXuDON9jv8D-eQ~ed3aK`A zwHcBfRsSLk@yy+~N7(Um3eqHg9+TFA9%F=^?^j*}M422iK-&L$%Nh{0{nS*%mFZw5^wJWJ%OD(CaZh z)3PYE?hwPK-hCvfbeM|GDqm)RES#m^I0JhmQDocdzji+qg_rv&te52PsT~cmv-VwoT&6vgy|4-VEvz!UXD>b=pA;yCUCTSQAD=l!T?F6> zDWfPl3{=OMJl*BC2v!+$V3}&2eKaNNx6}jkCTU}yvRyweWe{9*M-cJzhghx<2G{ZU@7LT+|P$~XZzdo zRW?{#S0K#Tf#Jc?0LIBGOVV(^MtMT^dN_|Z9d)Ykr>MgPCR}Y zwRq5vIVk%)taUV#Nxg1RP3&AYy_Y17&B&LVo4VqU%S~FlQgI2-IA2{`tloxw@A02~@5);Yi)9FDa1hK$pb*=Azs7CI0qv#UP={5IG`e<|NHm4}) zyK7daPBiE+49d~T`DonWdU-nS(;^l7M+KwbYY>U#^36jo^T^xPV35v(OCbD-XeJ?+ zwsBWbVx#B4V?@?oRJVeI%59{tbJCRT_R~q4zI2ABUkHaZ?+r6SQK&A z@4Emk_1Km-I0^Rbz&nGfpR`hh&fm6cm0|T}n%%>q5FV-&aX0ddBz^ZbU+?%;iwH(0b$(Lw6wlwPspuFzia@akyYC1BHM(}*I|IHmMKG9@1+Qkiv zwy$e~KK0)$&bz3dtzsQ5V6!XPqZE`>0guZh8u;+ITxRgr<>y%{oYN#UgqFgtQ2*ym z6n0;BquzbGNSW=p^S0Z<^=i#+{ZMs_{muD?^3km<*$fYr-LE~RKrHW-&>5|1pHQ`* zTujt$@zj%T4#Erk&xC~IwYPNLz#x^kUenm~3Yq)^v58@?dpB~=Xf~h6O#)>;&T0Q$ zSrr6*gl^X86DJO~2BUi=3Q|;Eg?8_fh8ZME&GcoT0~x@#^M=N+LDoXGZ^fY& zF0DWQEX!?yxc+W;qBXAfu#_m7+@(eE8021~anHC67<@qRevP@- zxq6*a`pL75MyuvaFQ)thxf;KOBXpmOlrQ7wBYD8;J+P=|d9(9gh%Lco4fNwWiL@`fZ<0$Qckf8`f__862e2wii9JHF32PusM~Ysrti`OQ6C~5LGJ;4v zoO{zJx-A6;T=AB>_MHT~;zA%43E;KbU~EP55TKF4ng97-dOlRY($998sWILDjt)Yn z*&35E&$ut-K0D(M)*yR6Uwfzu9C7Bp6=fLu?HMf3u?at(`~?N4Y_5Q#hSO*64$^mN z^YE;)U#aJcno0d^Z&>fDOl`Ecyy9`QeaLWf54`osE3EsSe*T4hn(0Ku8W0xzRK|WP zP~@4?S3#4Gr`-1MTDG>LgSAK0qTv!JZ<%tk?lq`nnIk;ZuE_t6oSX#DB#7L2S>+Gu z7ngu^xq370PISkMWLek-JKVbx6!>%p%jMZbk6awRWHiDTi$)}VFbW?oBrkL9CO)o! z7#W+Mb++s%w>(QtGVW^2jS%ik5;nCudyNM9%TgwZ^pV`fBjrAf*bCL*p%*^9&D2?) zXb)%YXdDVrU>SIA%V3)_Zd%L9*3U7Qm^wtha=aGxk;}v3+E`Jf64tpMig-MROzB9e&!ts}0Fu`d<$geZm`f>NTkA`iEeTDclFzbe|1_;XL&^U`zhx6JsDgaa|2u z5a}>fHqvC(m`!gzdrZvyp*Qka3GE{6Hb~Cq8Zg9*3c5(J_YP69|4sfkGm=w8m#78& z^G$$Zi{?POZmD&&`@;8`Oraf{0W=Fxy9|?_7u^;1PvAU{b;mkBR_~MqL;jkpH4npC zFZd=S#vVInp#}V21ORSW-&?!2270X=7=$VI&70M}uiKhGH)VZ}Gg8y+I~^0g#EaR_ z=qIpZEcy*B9yVQA#Y2f%-EyF&S4cW=Gq_q51-PB;R^?u!_)=SD54FB&&3zhr4fdHg zKzC6qZ}J_rN~is72+7`0X`kr8_}(k}Ks6;-zehyR9I;RiW>hiVXl{?Oj{?%_`L z*m>Gzeca%HR1(X{TDv%!G}kjj0+$hQDz^)>c{^YSOF?U0HN%cOzz2GWv?Fy5;lFc# zH_YJW?$~#05~2~yy}sirvS%;-V>Eyu@(R4S|MX?HolZR7EB_6y%ZH5BE(SIKLLboa zG@W5-WPrnSJe~&p_wlMU-F9EO%Rc+NU(cBI-L$2wQ7=STw)g^?G!$K}rqxUuxbf+4 zg#fz>{;`C02F=j?$(8`Vvee%%yvb>LfbEN#bvf;pe8@WJ{GJ_wCREL+JvTPy#B^iI zl|jV|Vd=vHE~_abm5Li>JEI3Qd>-G2`Pun1zFcE%dU4YC+^v!qIijM0>S`aaO>4UK z)}P+r_(Ks>od*;#F&?NwEar`6t-f46JJ|~5YQQ6(HAvXdQmx10uH55XHywgw3}BZeTPr^3OZ!9NL<3>#xPj9KUcr z{eF?CURz=K>D~qI4@Y>+k#<6Y&rE$aus>|DLK0#o0S1z&xqar27w=g$CX&Ex=XP`d zkvAUI@fD51Mfc}7fCtJ14AryD@q@_iB#S)NrK z)s~PRbKBtL$y&Y7nXd*TshAFSvCL~>(?o*-&Hc7FV9AqKJKvB*=-lcPZ5|+E;$lQq zE7NKRyme_Ma0Q`UUbe#P`50Jw2}hk6GUX+SN~ErfDedHA$_4*CUc{LR*wx+F#NIhv zSg~A?t`>@xJK5;S4M}qgZf>!W&1loT)ecpOY2u?`r$F3IMzn1NN>9}IXLs_Mo6sa) zzC}*q{8?mvuR;GA-Q+l{pW2})KQ}QVdxP8CaCIrF_C$QRPg%mpIPnD%w^mtg>z5s^ zEujU^*cX_}A)DNx8(YCs-&RU-ERpO!zuE!M8vqfvnS^W6w=>8_DOqN@>UA^UHs0Jk zE+2^x{f9mP7kj=(A|F@soV!IkuKIbl34xUI53c)USY&Lg;cv|Z@*zl@?%xwQpZi0} z0{R&Mn_Z39;=gkvI(<^@Ar3dxCoP8fffk!CLPYZsSnd$M?V-nT3-V&P$P~^4OJX#S zrGzx*5Us;9vYYhf1KAD){2cP|l7s=_&%)Ns_7&i>^W@%Xri&uZ{Oe{EAM@jXT*U;= zlts`~ zcWAu7iYPv}GtR%xbO#x|mOd0=3B@zpRO4|x$5gW!zD$H$f_RR5UyQ8U2l1SY;&Pkm z(x?3s&rj4>*eYQEl+XY=OKhlI=p~H>SiPB3MLl!J|$fR1$p`v&t#jYtJ86x=jPA%H{t^Rn8YxraX$FliL$` zpOB`muDVNdu#^u6CV%AK8VjWS&Mit_+BlYa7X#7RFNU=w+!+a`5Y^|3m%t--M5AAN zc9}S&%c~D)$fST0Yfa^;@!L4YqL#0G=^`+>NXhAq(DJb`woI~a@JDxr$2Lf zYlvY~awW8mWA1MPp{WT>a%b3XqLI;xEKEV1u3dpnV&bD<$2r?Fi3~6a4P7@?zvi6l z(jl_qra$1J`E1c{J~{GiDFes*i_wjA6ECQYew{D*6xuJN5}rN=k~^K;Ja0zXLfQm4 z9qUi&quw00zWnau1vX|);!<&r=0cbZ&nq7QQQmyNuKgRB8hdFsWkNTp z=xd;OspU{5bp`~gE%No5dUI^}0)RoV0$6OQJ=Iws%%khNf8lQ8B__GYjMJLvE3(r$&DR3X zg0-k!$CcpUC|Yow7IL<#-`zg_cAt{3Ap*Y_)Z zHd`^a?>`r=Cuy91yldsYs8y$q(4hq`ZH!RFKvG%X_7XJ1hfhi!#!I<6 ziq3xvtsRlBmdL37u|LS31;##^j)7BmRtWmzSm~qEZRU@jdAUqLK=*RdnB@V4{^8E& z&`b4`cZjY<3ct40GgXLNnh0_+mX+-x7!w!R-H&=Z_(F^kGkDSm(cr zc%rKE?}&Vr+ax$bRF=o5Gyz5L#2(7hnv zkIc`R^6tHiQo~6Oxj)@a*NSyrrFT{#I!+XQ@l3~w;tVU)I}6g{)q|qw-M|N`L&x2U zqVMBJ1>Gjt*FF}p|9xI1Zgon`YW^vfEkpO;siGI83d&exZ6=nZL-3~opxE6^%ozdKJns&w6Fk;hLz?fHX+WM>wSmW|(dz92XElnGEcUE)eP z_~{Z)42p*+YiGFIGG~fqnSd#UTEK|o(4*|h3k@BzVa+@msQM-@EV#ZIbh2WZy#Db% z=VnM+Jr7on4y}BCm|_9TMS0^&_V2a!UQzAy>Jf0J{!veO8MVr;Ri!1%uEte2u-3ry za1C{|hYGcpxeNe1tSrr`0FR>`4=W$2pj*IvI6bbpr&TjeB%Oc9{|I9Ju$P$p{PNX_ zD!Dkqr&s0Hxpdo+B3E{&x+M?s@VeTx-Nd1?dr9V%M!cu9;THz!5^2&3PF9IIP+IU- ztk#+lMLf{(ru8gaKZR(e#_Ao;==CIKp7gd#fupi)&iN6SY~y#Qf~;l?37lJAv!eha zq|t5(qV{Pv023Gb^y2b#)GjG68v@iPok)E-oajh-3qJLo6hC{mBEaVqQ=hDSh$f-tvQaXsW*sL|wMHIj zNJsOQTXyjo(>M}muGcNPEn?_>*=(k!Dm@H9F(+Q_4E5xD(3tj zz($aMv0ZBfqJI8|?5y@i^Hr+|{l7}b7ZpP;1LEfw6Eq55_bJ-V7cB(F$dy%+zKfL>_0J-G~s60A6&{E7D{D9wa6>-a+X=(%B6Ixdy<+m#Ub1020 z*5RX=lW6$jMdNj&fTmDJ^zH{4?AHm4T$>97|NDoNn9zBcaIr{mH_V}k?q&5mvqyr;_d!KT zzE~+;IXD8zj}qT68B7_n{gB*H)GW8QPU*3GZ^)XI%KV*=#O2RV8 zw0j0%c|v{WK>$4dTq>*6xaTt#4&^6Bz<5(ViP>%SM?<>qRvPH*<8xj%_|WT$%3PqC z5V3h{60~cck$Yce-;wXx83G_@>hJ)yUY8LGN$=Cd9PcKl!vbfc*00K1tiBbLf2_u$ z4&O5rROY$%8x6Z)nKT}~_-EX@v2pw;1fakIrP{pnhno=`^-q$yyuSV(E*TZ5nP$+g zJxb50czCrhi8Ob8NTP-#`Oh1$jb12yB0#rixe6qQh)DY@H5 zElntX_Gdfs4HWKB11;s6NndL-yZ&=NYDlojN?Yt~4LQQW?k#O>3;8`RZ;s%Rf#Uw{ zhhJ5M3E%!UJwlHL-bjcV*$nMDZ%gCWFZoKZiio^r+F&&AtRf6D zHFxz409Y6h(1kHc+v9G~$lfyB6>4~SU}F6 z;U>2e(^}|IztPpy4??%WH?(8J1OQ~g+j75XdU|E^jyW5bsu`-BY;J$}FLvD13$Ogr zCWyA8XfMQe+uQx6=qBq>Y&QJ#}gPDZmDJa!VQ%ps$DncMSsCR<|5~A`GP^6Q-{{1 z_??xl#(&|tPsi2yfwCDI*v?L1R1SJ{aq9G!p%{oA&N7YY(p1-hzeUMDgl7%d7^Z2)Luerrv6qI+_qe$3jy zKjE2UfC3C}U=jg0tX2VSovyre-1_^vit&#O9u1;%n=Di43wIrApJH>K-tsZ9cVNy9n(F{sT=Es8(;~ zwZ8{++FUWANGd5m{q|b9k*rJUq=ZYYgTJoM6rdV#o3Dw{YSBVJ^N$qu|F((HTFMXu zl>Hrk04S;u{ni+7791l~e|(@m)nsr&U;2bv-Sjl}%C7zJTvJXTKQqIhHp^hkJbvrn z_(|sK?#a1|wjfgzE_A*YX&u3>E0dUg&d6C*})V}-CzU7{E z<-V!{b26O_Up0RHnH!HYA24Be5w36^q+Lo;R=oU}E^q``ZVJg8XtB+K|26LyPF8gDQM)$m58hem;B!yiKJYu*T#c<~u(v zcEqOuMpsKZKwVC+ybjB z7J66bwf&iHpn|vwPQUbzi`^(Coqts-VE#wM?9|&vs^Sk=Y-JLbg}M1lMXi@UBV2ol zIyAVwVB5b98vvojmC!(<(wE?{bW81iQJ&*L2C3)sQYpZw(S4RR``qI{N9X~@qJ3q{ zBbszG3Rz+boZVsUDdMnS=O~D}Ao^F`hq|}#3m=Ekvm$r(1HEn8{XYXnI;!!W z;yS<;9(a1O2e~N^gd92oN8-okSES1qO&Ba6#;0g2Y9(kWGL+wEA@$Ul{N`3)m$re0 z?TCS`<=A5a9LUiN!W++6TX!4ykv3jeLa0M*T$}t8AliyQAV3r+&z+BjyDz9^E{>~` z>Ad>tLu2wxccFc2Lqnj!A?cj|6JF5{hd+c{HhxioD!WBZI!wBxw{LfB8JBtG2ju2W zDSko_CX^~!*9l?0ZPWXbcCp0qQva*=ghM^Jpuzy& z!@pRAC{lnJ*k;{}p~efji95lVP4?&g4tXq&4?1^W_-~)r$P6YGll&Y%(sgyM2Pe>% z8PoTQV%*KLx6?>tO%oJoY`8{Z#q7K|@}4%P`>&3BQ=ZKwLC|L2mPAW}O!}HMh(oq; z6gLB?G$x-G{Z)O1v*S@>Gc6}!%J}I&Ltx1vZuIh_SQqFMDg;)SWgdVGOl=92&#i$% zKJnrPg*1NEy6?FOk?L$im)1Q@m0Tg;2Kg}+Eo^^lR zui)286*hi#cPiKiK=JI&!pr(#a7>X%_5Ic;I8oo?tc||aX*IZSw~7Ss&uC$8CQzPv zx&?_&zJKPy75e!~>o$iwnVl= zNIJGXed^D!k7V+=eKEW)=NY$pnz;@Rt?%5jh&R;-lz27RbAY&AKgVCy4_T}IU=0scyHkg~>U=c!UgBv*hIVqdXM z^X3qI%5{7IJUDIrZv9Y01cQ_Z&7D9c*hec3xW-`KwtnVMJnQVG(+@YAl1Y=JC?eoM zOV1#BVWv`LcMTBVyaL$Td!Pu*)Wa3Cfi=B)z43Y|ro|_)4U%^p6UTJ7zgG^X-?2{H zda3t*BDr)>#Zau6i4Kz_nRw}2#4MSyG(33ylSka@y?>NqQ?;h&kRByzs zq^c`j-qZ>VxcMkUAGtHQk|x|1C1^tDx>8t-)cQuu;&hh)DNEA7gT_34=9AL+3Ccwg zwnm$pE4((lHa=y~wPt(HBXi3)yOgx%Sr4b`%*Z>}Yi?gL^^_6snrg0Fze!;f>RCZ$ z)J69Sf9^W-YEGA;Zf=17B&*h$z>PQoL*Lpf@bT#U^`f@Zu~fz-x%OcJs8T(tRqjGt zvn|0R70mIhgVXOACswhb@|zh~2$KnKlxr!aGU}A2@zm?@3Y&}j`1ua=Z zqMKn%#{rKv%$YTF&9ybtrH+pqe=e7W6!8(-$Y*awsozSgC4V*$YCh4z*wCd7
  • Z zTt@51o!Ssf>8{Mc1!PhsLdT(3HUks1Wo+UvJ%oQ5O7Ei)mi^pmx{O|e@N~lTxYSE7 zaRxZJKciJeu5d^4gf~#imim$N74Vsux-af|e)i93b$&gc)&zkY4x#jE183^(EpM_b%kiS}DEm6$N6 zF`%H=E}E?zh3ZU*p0UL-4vuBE=&M3Ci4ebN(p_o0+{mLoa41==tKFcEhz*}Gv3zx? zRi_tcqkde=i}#nE&!mQ;C4CI6$pMJHy%IVYdgx$C{p?*w(A#F&Wi_TWGBYpB{5H%w zweM$fxeY994Ob<30TQIkS7v|@yd;gOWhP8H&(q(cHI47^JN3t z-Qel{pEqS^K?F2nfQDcPytIDI(}Ck~IJ5{C2zD(*=!`4ZJ&ERMep-f(cj4kG=#&j# zOS^_&ep5{fwWI0dYloQOEF%>Kgd!O7GKfd{S4lHDm8kF)e zxo`f`pYWmYI2)q00q&j8-+OnZa$JGtx;MuaKd8FU2P{+4Av}(Mfcqz%pPjo&#%2k3adm#!ShYC`bDF`;1xF zUr?}i$&jq2Indo1S**RN#3#@rpz@AV<{jKW63hUM46nTT*mm-_(vkMrV!+-d)eGzW zzQ)K)))NBpcggiW(n-07JH|rPUU^qQ?k1ry_q`r0c^i;zrDVd`y_sH~Pb!1uIZ)Zv zgB@MIjDoI*o;xb*zFhd}^&qfY-tOV6=qKi6*%-&f6R5}ZhbFrzU=Vg>`Sp^gW<=eNKc zUK7RUf9JVGG*sn%T69)=+!fak{Frd%9SOw@d-@P6y(&;!mhxw5$ z{x=jHM&1$Y1#UFGef0V<$x=T=SbDfIPC^to-;MS|$GdS!?)8N3kMbY-h98Fbv7V=t zUe7UBU@lWlRBn4!qG9{trn({i9sncK#&NZNfMU6+b!BlV z<_*jXP`2_OB~0e-eK24maqck%+mRG2&KOsF>Vil~#{Kz^h2Uu`HjIr;BwcZ8lBhk) z__|Yk_=N5ytZwcccP(LOEZc5ho?b^NBL`2S|J4V}^5S}?kM}$<0cU%^wRGN`(TM;y zhn^B48<}eZ5pBTA+3hrfN1B_d)dr&MvO0h2tKDt9fJIOqrU{R+p;f5#!6+vn@otVAmN@jR)*@>9_dI~qH;L|qaAFbm>xv`rwDSirvo9{a~SJ4$~ zo-hi@SWw(fq@`y?kHd!@`QCgqkA!Wnpgn>n-V)b&EREsH6#zvvz_RUkeKz}9z-ndL zBr5{HVIsh#3zwiIe9UZ3WUg!tJ#E6&r!X)6-n%5jJ58Gcnf8KenW!nrW1HuAt6FGE zh2mz=e*?%L!fpCCXfzj?9TpRe z3BI9ykkw%wBN(OS07!i2C6Q30$31C*J8ad*jktJSW5ZaP=u*Lk%8#(6H9v~uE>yOj zwc)2}cgpwVhZ#?8-;*ad3RXGYFWKtT+HyRtGQ|tz;2-7-8vlH}%JUPlLRkeoNl{5a zMsPWC(&*QSF^(=GrYcs`$)DFN@#TkP9HMeTJ#9RY76K5pc)u7DUGf{7jj>`W8n#s; zq%dLQ-(*Fco>3Y%!~p^QYzo`(R{?$;#K^TkqMCu%`R!~RSzMhScxId33(&rv>ZLGp zB75tTWY#BCfaOVXP9uZ)D}UhbBNpq>_k03SGk;mN`V(*j z8e7%1(lp9|oKKqkGqvdH@kSCW4H;g&q`CO1GK(FRTL(B4x#KYw@vQn!xBg!!q6ftg zeUag~<^x=7pwm*ble1{FczxF9r|NxE_xj8y=vZ5S7GJ}|BH%SrG;4jo92Z~LXjg9g zrm8lc6~?Y__ts3pe}=_0oj zW*zXFS&S!~i=KKZD8R01#FYC4ahaXn3kVB{-wS(TmzVx=N|og{U_k#%Rbcql-wsuB z5yp@?5_XYnx~N>C`XLgqc>}9cU4u4iF)i#U?Pg>Bt0Yew9EU6s+MrWx03Oz{YVQW? zLmIpy;!3;I(la!h9fBaRaq>x(FH$_o=D4J|Y%Hgks{v}uB{fuMf`%@i+(6zJ_rs-0 zKr7~jCK0k3FX$30Qf-_rV!Kg?_E%dI7_c}iSJzyC92dX%@WhUr;#P;`hBARJATrbK zb^GdEQZSvto?>?>1u=g>;ZK8Lscnwcsp9S+2~M)fsly$QBShOx|852qmc&=z%`Yr? zQr~>~=$;NIvGim>@5m$|@Ar!ud2I5YJzdg+Vs{{JOo_2fGh*X4N?r!`)d!Rj(`k!G zV@l1RN8Sw+{WN&iZnnlvRf9jtN%Hma)vI2gUdUdPA(07@MK)aIAr+FNYJ0`Ge^ri% z=M34!i!?mbeqm)d&R!d*oL0Ja<)+;5r!$%D!R@{yJUgzK*P~KsK;@3EdNVpSB()Kn zHXVzsHtDdJ?kG2z?TC$2%zYWLEj*Cn-i=)t6v3TB*{%%%G065yganm>+s~7dskvcfd;qxc$%H4UY%?1ONXe3le*NCTiWvxlN0$IDhDy&qui1B(;TISIW@PB}ZvfRV*w12di?2XMsi+ zpXtwnFSmK8l?j_;V4$oEra~37!l4`34vCe5n9M8!Pt&xxDc)X@6y7ZsVQCdi`MHxCi|du z_!r~e2wV0zi+|hT?ot>CVT^zdI*wj-N-kC}1XdUAynP>vhNn`L7P0R)xZ8h(NM>!8 z-KY$@ye=J)eq<W<^1?rMVZ zYkk9fzwTZku4lz#Hi~67`AY9K3QE27gKb<4J`#q{)brhatN69g#I%fAOs`vYo?PdO z?P!xDQl90Y6B|W{A+e9!an?KWTk3wGV9`cfkjFDuQMbm``(dR$(!0t5?dwD@{py;Q zU9Vg89FkeY%1c(4!TO#ve{1k9`uz(?*zuZW=yiF?YY9cuS*2KwKROx|a2K@NU#TVK z&lu(l%%syCBzzl6Sxg~{-MdMM3t7G%H)Q(t6_T~+g%Gdp1HcR@cr1vkX6`S=#!KvN zV}w)=_4dzV_ANGSo^&)m*oh31c2`p$45oCSyBF${w_W_WY;+LQfE7V)stwcG56X6K zS|sk>9D%z_F9euvEV>f5I?6?S8xlLZuf~D1nw67q^K5nw7UxfdZs|35Up?}rum3(g zXV&>ChIK!x`7NFOChPevO&9VoU6jS9?YFqa1F4Ap+?_48p_z-&0d^aqN;__yxrTM; z!S=h%T<^%XM+HpQZS?PRz2E<(yUWA^T~$pCU+a_|p@eP?@9#G9WXHg@1Y9u|2VJ?q zx~br-^16x8(Xj_Bc4T|3v(c>?nD3N+!6Q5O2U9l;Ms1=|u|-Vn6>nbFZHrx)uj>UA zi=!yKiFDhmgOI_iuov6&p;`r7NwZQ0vCY68L3gr_`hDz9F8HWTu!<<7;K4Ix9j^6L zW`lmIHjR$R!oB_}zc!O*E4iDew|Emue@(2ntQblWQVEv_MFX6W4(=KGdl-6UO&(s| zO**d>=@;FY2DFmqiRdbvpapsnebiN~H(NYZWHEHZa;k60KE|G~+5UB&y{Fp%uB8!` z6+@>I@3Qbc)J^kobQY>gOmKv4rt2n7Z9f~S*ss_Rj|_u*IHBcZw~m&?L%I77BP}Db z-SDdFB_sYACX?1=f(of@_e~uPo!e~Px00xD?j1WLS&@woL11jEtvQxUj`r!TR1^n> zPO4((KXqh3U^P;()cEK7q_#oI?~|F&4lv#X*-&*$vcTqAN4600J+Z9KtM!kOT%(6{ z5347wfwehYH!`_;Y_^oFVIWAKXUlM95na@FvsP?<4c!K_i_9x>?=HI%6S>H5sI#NBr{I}13WrwuPzA58D`CbJew-(xhnfXU7ZcDS=L zYVb&_;+3?gW&fkG_omY3@vs^=sr1I;w}$Aw$%cZGwVV9TA4c4|Qc%v-;Js&eF9*6x zQPq1f)nd;x_C!23L}s?SMVyz1OYPRXSLu|oj#Xc7Q$*uk%ZjY2!yI3Z-2HZTPW zU7QY3R+AjtDbT6@Mkp5Oa=`7+v(I)Xc7z@M0NJ^vy$gdu6Y>^+Ye1{w>`mcC{rOZq zjrlglg-{;V{eQ`$pMtn6kuF`K@%D1nA&G~@kM|YiFGOAyLr+~+B77qh9F_gN_s(v5 z3Lfb`D_%zhg?_BwVt6okf8F^KDKUEa=^yrg-QQ(GqU_^g6X)UM4k-z`^-Wm&5)ke3 zRhAcS%9y?QCw#zlS->7f)w2IN9QHQ0x)IV_z`% zi1a}>?g@+#xghB-@k)~{itb^GlIAe@4|0ZEFG`!8_p=+I9f8z|4ukI)k}9YzgBEqv zO!LKl^3jSCr_}RT(R9v(ldT2sg?KZRi*r#SaKmp_lgbB?S&@e!(S!__)?}qJ%fYct z!EcU|rmSONvmZehmEu-LS^mvVn00Esjh}z#X5hxGNOdV*Y`37 z)hpTNO_|S&_en5SwHU-^MS}FpAhICI+y#oHq@`wZCGg%Pbp)hB7xMv1zg^Nb2_#Ud zw0OTeppXimeetTv0kB>k>GprKB7T%z40S>+iz4d$s$whXalcvWLTSVAr~=fsUZiu- z>IXOcd>%&IL1EGo-XrUqkFw*+sX zn)`VZZ#*DZ{^xJ;wMQnK28(B<+JIBq!1lQBW?(0-KrbkIgR9wjrP+Ev_FUD4o*t3W z`|Ymvq9Jf=M*4{ecT(`^qk^S%VvXbILz+g7JW9ZGP}Xsfu|Mx3q&oExhi6E{fQ6^h z=vj}0^F!>Uom~bQT9&Ya$C-&j!BQAJ~0S#KU4Dvi;& zOr-P2^5`lT!?7BgPouIzm#^!rK;Gy09#_p&QxFd_-Hv78ckXUJN|@iC*AnQK?XoW~ zpfnvW*j+!US~*|~;O^cFrwdFucrdmfl@+ zt$=))Cu(P#TzHi1bHS9Xd>Z_0LW+ET5x;3H)Msgzx{MeFz%hVmyUvRLefZOL z45UY%tI+T?_v*QP9oyCa9#ftt>F8*_sPmd*vE>0Kk8_;&}fM7o)biXXfUBVRH_A&do0xMIS zx*t^+sV27yT?fYdIp)8%(9z)C5r6`hP z-KV~f@Zk{q7*L~c@}eEx=ny#QjADdzG1o2rh}zQ->#^j?A+`wf$09ABvleZ}gS zdyMShVC-%cOttQygDJ0cnYZCt>wAyrT6YwBmokPs8~^5hV3ojxH44@~T5e2sX(HB#sPxc}Xyr+D>yz|&&NNJ^|}uk&*jRJy{5yZHlHNVZlPsdf8xUZ_wC zPFI~Go5w%gU~ThXtFQ2SfP7NB?h^Icm-*t9A@V1WIANtPfP z$bGDBdxg4t;75*N^Y&Kp4yj$KtnQ5yb}!vU;lPw{XevLe%-He&u=nQiP_OU*_&F!1 z<*4LT6fvh&SDV0#!PPS31v4rf|PYFp3#=h^vSjJ$O z#qhgdGwRT)&N=Vz=ka@-f95f1jMshN*L^L|>v>%lYl}nG)LEX0ASHJ#TUX6Ox~k&# z#KuBGjaqeyNA9)IDYuf-n|E?5<6CEib>?;UGIH1l<|E7vu4RCWi2W*xBs* zJX@(+8~Tpd6OyC>{(U7E+yF5rgZ|na?l9&+8feCf17<@l4n3L5-^NTr^@;@8C99h} zLcC<;KEUJ^jMnlddT|obdY0Vh`mmRbVE!C zbKWg0u)EoKRw8>jh}5r@)TSX=c7(W_cmG%xX!+q2pO_uzI?HG`wr)y`l?8=4K2ZPi z6AYbj4ev3~@I3Z}hrJ(f0lTFtu+A2uC)^$9|z4mOl#*(y?*Xb4)vt(`}bCC5V z+4SWeQzK$Sz&}nuF#GTjJ**$JrD`3`4=q|D6n^x}|ZA7BY zkr}7jCZ~F%-xJ~VK((ZqV!P>LA~b0rr>bEOSBns&vH(Vo6&)(kA54M{RBnu(^W?xkO4x9y*S%Tnq(_ z?}K<;N+j0M^MY0qjDq?l&HgInQWb^mXI*KR3JJv$>N(6kPYuNfC4_AHiwq_EJ5B4VIbLg*%t33Fy|y`t;)|$%$ns z`v@`=^lym-Fj05x50iV|1S*k01;u1Q|M^yAkG}vStH=nL$+%1L?;+0ate6obx=TMc z_p14W<#m1rPax|>CJo5)YjbH=lQGoIk$RpZSyP`|bsapO=sU+8S~ zQ%X43U@Img*;{%w1uv}?9}k@G;i-LQkk?T`duYy!*$@1M0Xd7ZV+fnw-d)rebkSxv zb>@pYWb-+0FJ9$*TZ?8S+nipLJG@V`dz2bIX!8=jpBnD|67Fv1b?5*EhT@pk( zL{uBbZJF`p?kybG$Rh@u$d9>sj~}XE2|o_>VVq!UMhr~scU&h~FL*qVzE^>w1(WKc zC?x3)#+4-t(A=f&uMTi$fmnQkz-^rgckhS0J2$5SaSNLqX>GRH+<$S&vKyd)FxwL; zXJ(s6se?-E`(1}8Bd*daVrhJAU4N1MK=_uv*8Vdau|6$e*|g z0}T}tmS{Jk0-`!m3Pye!IwHf8)2u9_e-Qzy|0Dw@WHi;=i|Sq4`Iu>qB5M(*we10! zlUE2ceXV%2DocKmCO3pHs!Vk5P262{D7A{RH<9z@7WmA0Bgeb6qMV8~I3IxihV%O9 zjvM-&yUqHSh4}qR^X1(QU<=#Zv|9lGM+F!(rzEe|rgmj>r(N<>a{FZyQ6=D0+_U)y zG`Qgkq@MMe3e1-TfeHyj8R{NS*BQ&uG?f^P^xggTsMQ$U?r>}kt}`BkI%|~F$2U>G zbq#Aj@%d^jr1$q^YJ-DmJ4VaDNDX&EQl3Oh-{skP&Y{7qXUQzk8uMV`s#2k0WR1Pb&2i8sD1{p0MGJwt!5qwy2D4c`Ms|&W zwr&+ts@deq;w;cegSSq|(}R>70&ah7AAU=NUPz4G$sYQ3*>=VxEvJAXzn8-8A3v~~ zmEPHIpW5>Ws=8an-6jA&ad`F^4KM^s{T?*=Lf}XYhB#f5$x|hySi)o!%zC^WOwNa4 z2FJD9{oIZG_{^`txswKYfa(~_-C)9eKu8*H&a6kqzH$an>$}zsy=njwY^fLHXRcA! zlBYDF9|u$CNYo@^#gDZXV~LvW zq4gydc!}v|-WvqN(cCK@5qp#T-MEIG>_B8tYJQCrAUZZ!c&$GEHdul#3!j28p^_Aq zGjJHL*5yF_g$7P9#JP=rdUJmhQX_RuT3$_`*w6fX&xB9>$xW#Rxkfj0`xg6>#u1yR z0su}QasUkmZCoRVt^#ED0Jzyd9{2V+iQp!9w8IAod9~XC!s`o@ssMMuG>lN(ho``@ z*y^fm6?Y8}Sf5TJ@dWA!bMP_m0j7D3ULx4!SZQ4+>Qabx|y9+FRK%oa9C*hPzpg zCE;RA`l4ZCj~d+uy{|-xazy9^;KKmU{W8X0_V$q)J2Kf&^oIXIsu(=qM}_>$ih`mN zm*jKCaL4!|l2N({-WSXqj(A7Rq zFMw!@ayW68T^i>(F(DiNatAS!ItLl?z}k!MQ~&tAy{kLtM4AL9-}sbTo<@IJNuP-h zKeRO+(dH{*sI=cIjv)$1lL<*sfAu0Te5b!I;)eT4Up{ZTMMT`e@8&-8?#2hxpQ&;7 zi?YB>J>oK$SX62a7hL~W^Vqpx@aZ)njpOLYZQC&Q*ChG8WJI2@my=e#0=}?WV zCyknlzsa&7)IEfq{v82Udl=L`N5+=Jvs6>ty^(Z1Dm1}1Kpp|&C{D`wC=0ik=){Ky zO&)->*JUK*jv^?8|)K)5Ubz27TZg@bf7{Aq}VrTCwxce`_c%Gmy&*@ zW-u6_+GAvM>_(OjAGN5^6nrLBe{Pa&5!%Cz0#H-|7tCWM#iM}M7v=*rcC*<-Uq~vk zT$msJyy?rjWH80kR7eT1AAaZr(R^y8wfEvsLvr*`rW3G(fQnG^0nvO{mYwwmOWFnr z*iI+U*RLuJ5ReCpi&X60R~Zzvp660U+zufGKzwcib<*prE#-n|eoU`{Z< z^RR}yXJ8wlC-bgH;Iqi?R99jA2DlbylD9v0x37RLX4<@S*eD5fpXkaRuShLd=Vw8; zos+SfP~LBrWU+8bLc>@?=aCkR*1BLql1}KN?qj2A0wy1U6)a=$XX}Tu)n1PC`c$2* zGL2!k-GrX2J~(>h`TJ@O(tE5^^917kU06M024(P`xK<@o!C*_+&I-gVs(JXJ$H-nQ z1eaHBP|zPXEHmM$SkO$ySw{PbSZ+d1-0Xz19dinTl_GHlhU$i<_0wLOA%6aUF4P`# zM?~hB6FyfRVQCVrXx~wuOL6p2RJ0{sy4Fo%oF}doA(Zlt>V7MD!(~_!Z-YWX^Ge17 z-Ol=e3E2%)D;S*w%{F{5pJTXD-{_E~M-TnP)*+_%M^<%z;Q4owa0X&E%`x?2kVH(! z$yYQLt8so}F|OZvdTErm8@GwB`ySGRMBU=Ns+eV?kOAs-TtDx`MJbXiAyqv-ok$Rv zFJk+dt_V&$wc1H=-67vS$;-NU`okL3uLu$v09Nih8h^!|pOP&Oyw`AJrxLwp>bcFR zk6(IZ6tI;vMp@YRJePQKPQ3G&$!oO7J1*l^ejCw8W?d@JT4cM#6E}4IxZga@?{^Pf z-QG3eR+f{-R6s%M2wy**W8PDApCu8wdZERmclBKrQ3^p8D>1QG>I+M>?iLq!fsBZ_ zC)!gKR0T+MXLmogL8Yykr^?u7|1WhVR5?YcnP&Euf5+O`dXpU8V-Evt0%Y zdAPDm>)6wXU#Pj11UoTM#jcyhz+95?8tgm6xSXjw#!9ak<4Ef{lDSzHbn6Z)u`Bb} z{t#V_Zn^>)<#hd+OwA+%;J=p9j=O}X`}*@d|F|k*$$4l&L9X5@2mxhg?~K;u>d@>y zza>Pg+j-Pp@6}K6?N{D;*f*B4Y?m`@S!*zNo)33)rvxgY)PKm7bi^3g=9`Y$MAf&S z&&!$J)&JLVc!(SmW3NCfEUIY-T$2HaU7<4l z&ldjT_YT!B0iB(n0YZ5IkK9WfTr=+$E1slC4w`q`BoPr@FcuWvIhNdQZ1=_=oBvsX zL(CQczV%*I0KE*w88!lu1x;sH7m+{Xc0r2Mu#V315_1dg#Xr0ok%^XWbt6Q?m!A&1 zofegne=Ef;q4BmI7%N*eg~Cm}&hNTu<=BW>vTSu=G*nDr+AfD6uSICGBj$@&q+6UD zG2)k}2Jog{>`OfHc!9FR{fvTE3`JYs^o^>_{=7fT0Qtvq6VY5w#)u0BXkvxtmYtN< z-blXj?_MCLK$p8`299|pb>xve?Z_Y(o|S7<)2&(~>s^RdXjtVq_m{SHEmXjI zq~Uu1JA|a{15W&yI5kgB%vZhh(DR(LEZXrVlXbb2)B(_XZ8&Yso;-4w*rV_~pIWP- z)|^aPQ0yE3Y?Uw zafG39v$CRunlC=YKk}i4G|R9o+?7$X_M_y&&T*(wO;HJaGI=24F=eL5fA+ysT5y;T z)Ftmnq}?XPiF;gPCM;KP(`wAvDVa)^h>cbST$}e7k0IW5ZvIl0Z|yMK)RyQVfK^hI zhAB4VhjK|cJAK2P!`@b;az<^m^w_QZ(DcFj>Zbg7XKv4GGRqy^9|uF#Y_#9WD@D@m zK8kR!7-b71Fj}Ls)ZIS0qr_-W^+tjKP%MFMeC#*ty^G|7xhGxPojV3m3S>AVYib9Z&gdeso(8gts^xBc3*Nm;ssH{xrVuw#RE5v##?4|8;F+ zuh>GXD1bT{y!#sRV5c*EY=H5-G>$al7{W3%3ytiiFaWoUa)|lV4=6*VQ(&MhEnXg!1cLVA$Bonzf~QM>T%Aiz|vI2!Sh0Q_D)ijKZm zKJFo1s=*6eww<#x;IynEYEz)-@5rm2jwOACMY>IvmBSR{fHti>I*zyG7NEcqRuv4qRx;gB;Wm#`EoGpOur z+jaFm*idJ;vJW^RERSh!Lv!R?O&2;LEZLab(6TNkxi=fye=B?QTY>trV}IXa`%8e# zK->aHkdm_TX$^=~UZWk)y8gVlBw%X+$Y*I;x8-KtuS{PqB4gS3$MI1y8LQuS)hs=@ z{Ws*5=;VvY%MX716Z^cX;ZLm6u@xO!o#(7O@IS?J0BQd#FxTFpV$BM2sMkvM56#&? z^9>+r0G#9FXKKa=DvLYGYUOe`l0N7IYqp|)`h=j@NIqj^>{mY!d#AM5U3U+M`5?pg z8*E|&v>*4z*@#NyuRy7cPvyvP7M+pcXw7jU^t}aqHODq&!<< z$oV?&^gPL#3yK?v*g>l>R#3`I%w9dueQ3-ldJ}+H#;M#kv)Rr9%JLfz8A2U5e;1R$j02rLPM`*+p)A!1Z1y#{wGLTbA zS4Zar5VNp~JU7nQBRefOX`Ee4VWB_^z!3wFd) z*c{kl;t5z5AOt>sU6a6oH0$)S47b$~jcB0;cu+2+r~ySGBC5%q8Rc$yOU9-j7JW{6 z`LNV!jlVI16@?jZoKlT$`w6lIdK$VH7wk^qDBA+Kw~;r7;I@aHJO*`fF8ZGLDVKYI>zjJE2H>U}ofe+YMzl~sQ;#qVYkh2-j34TB5n1A`?Gl2W=Ig?E5 zZ;Uh}Fd4uZ`AX1RZVx7H&4ilQgqlxg-mp!Pd>h%X3*=ss4I|Rp_Emb#J}=;P8Ock1 z3cy7ngvjg@Z$;}1twHPIF$o=}{F>u}QX0noxQ!QwSnlJT_&S}La|}KwzSEwk(~sIU z6S3$#y=IVWolbl>Pkns=bOwg}w2+GFvV)IPZ-7Rt zRjVBehbvJaM|ZA!f%_}@_NZx zZ*oJ=-)4!v=$(-c|JYrgvm$avg=RgdDu~2hb3f#h#c$-CGC5S$?1S zIXK9vb_-5D?NX6&*R&tWBJdz6T8QJ*lXkPtStQ!NN{B~aw9!0VQ-KnTWL@+vo=f_{ zq>RQcuGvv8pF`qVXD>95UF9EISuSMhbrp!ZKhCi1lpe@X0&iPR?W(hp@-UY_!m>_p zd7RVeGxOlzD*SuNbKsTCC4C5EBlH3q-34^5fVoX~^p#I2F@=lJx=9jtJU7nZn=agd796y-=9Dff7A+Ce$}{D#rdkkx&A< zrul$=t`A)SAxA%#Ic$d!{f=2yFkQCAv&=jjazv=<#*FkXKm`#-6I{^d)#y%6oWC4#kET3~1C@Mn7{HgQnVA6TbluksG4@TP z;3=os0j3&m(_GxcQ)r&YspN*LTM+Tg*B0{uwV{+cD25rI@i+EYF4uAJ{D|$329Sw?z7*y6wg_0=ldV-wwkox!e@8Y^*nhD9 z`A``_7u~BX$FvcoxR}<+g20h7KfFJN@aYWbs}eVaBRgoVX&-@OKj;d)#iI>%V2p70 zI=);}3OWAa#)x|JdtQ9-&W0j`7flo^3!9a-W3?sf*gsH`R&<>@HwjdF63>hG_mH4K z*n7dd&+}W0%WA%BDH7c*<k%hCBT+E~7$f;cO3u*(fn~IU5c4L2s%XQYF`*^y%txv9Fs=U zWJsogI}y|vg7az_g%z!uwJ$tNPH&2iDaZlQ7sWqR44th%2=HRjZzBk7ycod$6WLYb zZ61u^)L??kr#z*%+w(Rh@g}Y5tmir8K%CevLQHuKf3*!)KA2j`spPOTsXcvpUUQuZ z$hG;(1j}?;d*x(M&&`JfS!e;LMD7#N%7cGGDZ!Kks`NV(J}Wnp5BmM{(h$z>b*Yh3*Yl=(B_w8uNi*ss>P>5H0afY)LtltEf7xIB1)$ky z#fYW3;jJ>m;?Chu_qXYW zoP~(WAel3yMh%~S86d=|1e=Ijc7(^XN%0ZJ#j8&eqo*)p?;nOL!vd?>&S=vGlj9_I zwb3eEcyO-8k~=_x2n=>x4{2AQ37dOKt~3$rYpXIfoi=m^tOkUltJ16C*~*N`gM|Cp z%6Yce`Me9-Yps(jH5Urd=g^?P_Ny_u79^bQ;!$olBU>kjaxum%OlG(?Js7HR1BsX7 z$zRP&5b;GH%-dk>L7w?40$_hW{$A7FK?1X2PM!XAm&DAO+eY4?oD+mE>jn%E_{{C_ z8M42Gv|ZcD2P)B+nF*{M78JzKgUo=n$Qn0LKj;Gn{m#X2i zhCb(u6AxE&GXj>LxffmcabJ*5KIo&6Y2A2i8pxhy_v&_Pu?&wfqpAJ|=*^JhTHz2W zS&AJl07DbS;p2C4>!9`#KCqciSR`s||1NC!?rUCT^JPlRIS#>lnLt+J`h(<&w;4F7 zcICrKss&oHqz@9@!NF--Mt?3GwRLAZa9esZAQCtzZD|nfAEKJ4e>iuQx(RL($pvhO z!stb=@J;7ya)FCHXm02|4{iGdOW{+8z!oB!>QTcg$rNtbO_1c?n6vw!+7OcOoVCye z-Y`c2RNA@)0OMcT=&$^nAMk3$t(cC6mop#3vn>II#gnRfG@sj1|A>ZN+jps(ql-`9 zdwiY#aecXn-Tz09@XePDH=tN$67-;!U-*)rJh9?-ZhQ!!@+rxTwOKw#vR5xmozK@_ zA4RI)P)a^^SPM1|+?eddX9hYjLn#1l!#SD0QOmdlMJGw^h$=Z^O!STNFd1ZTox7pW zlMB(ozCb%(1&POxrI8mY#BX+B!CCa5Kur!eo9CRgZcKRykrKS}=Y_bRS`d`PPqZ2h zu2s`5-y@%d+c$^)gza2gUzcFu1Dw_)3zr~J#&4fdU}*5wLTQ*mhmf8XDJCU;0IJfH z#z=c-$ii7v*w0C}!bR|~F)*YZUl?#H zN#QV0xa#5l6K&TFBpPzBSWbDr%MJVRb3i<+Me0ZaA5guN^JLA$ORrmJ9ex4j`^@2{ zG1`^jPo#)J)+6UJr4T~8iIOI&8D-ZCWiG8Ithz5gE@kpc$fE6BwffiTytlbhfeOa7 zNh~ZrB2f%u{EqMRmu;Q9X#lZi0Yz|0v$Hwjpvq97f?wIN&#E{OS)E(;Am|gJ8jExG zVc7>H9(MdE7Y-o9V+b92Lj!n0<*`q%Y`%qb-V5rq`#(fKcFxW~q3=EX^vZy`2EXwWrxMgT^D*&9#lTij{g!N67A&qCRG$S# z5o`p=;RWQdu+>lMLfq)DeE`PkWfgru83YtlTp?^!+^TFQ`X6^Ag%n>h?>2#Lv3>prKfy8^#N?cu2>m_cGlU&`917 z&jCZt8*>%*5?LrQwyzQz`g*|lZm2kD;(apNX|V29V*@*{aiVT*)|F`P;)OYk(b)5Q zq(?1oX@5u6mgVE8?l~a*ElPNk?-~zC!dKl<{|57en#mH(XHz1<RvCfTFv0&KQ{p-*LE zQWLPk#eK##pQK5Cfmv9fj{SpU3F3Uy;MxnF1Ia~{JD>pR5a{f))SfsYC(f@!74 zeI3P~6BDKrAWGfew!UBB3cceJzO`NJTTj`wU4N4EFF7-R%kF_3&A!U!8-P(6mcJ@< zJP~mgLT63Mz%h_^1r0?!qEfptwOyaY_&#AcKA;^w=r(q*U`2vPhK_zJ3QxfKiOa7~ zMhu`&^v9$xMu&XCDShZ70Kx+BlTH|837$rqrcm~Rw%yUR^gQPClN(6M{h8Lw*Q&0*z{GXaU0{XgTa%m)@1dpd8) zyzF0i#|P$WhYGMY;!6i0p#g~-(LgCp7F+*sN#+~M|KI)+fiM6%fOxUsj=btt9v%=c zis!6@gsa$ji%ass`e$lya>nxkym|bvzbRah34|cr`6l~b0XK`84otR?K5L?++jw7W zi+&P2Z~P1B3h_jgbqNvP zrI+y6RzRj~@cXdLqr)?!bLB99`)<5lj0qW(zVq^25~Ok6u@)~rhJZrWFLv>%s+FC& zN;RhWW`}9p%K4AzulTxa<>#h7?nu z#J<&yVYb<^vg8+QZdSwl}!Z2e7OvWy?Q?|mOd=WA{-*hB_sIRr5T-)>7(ydYkc*Od|B*! zDu^d?aR?CEHw}QBnfn=A2}SnELarWcr{41H`2MFnI+3Mi?pqE8ie85(X=MAODQn;x zuYQcAz~Zfa*@p}v^DZcSiN({r5>-)p_v^~hSp1BL-6Mj;vEuLBLE!DRtHm@w`}GV! zZL>FNeJ$R1;o=1Ri6QHj1D4{rPS6*7MkeEI>WH&UjkBA{DBx)91W26B##zudT?EPr zXC)=7oXFBFQw?ESWLa!i0Qh9e_?acJi>aSEtdBZ2z=l9~Wkm|OEPo3>!*7}0GYx9V z)MKHF<{<;D6?YTmxID1c4ga34empff?D`nQqFznz z1DXMpm6Q8OR&Ei2`xpB~??n0lkf~2RGi;!Vz0W^XF3;_p`7dqb--3!EoNugFQPJwjke?8d&QtG|zT+l==ZV(`xAOcBw4)J#sEH_0iKm3tu-G9zK zd6Q>;&)51O>u?{)#ndGA_*GrIas?z4%EX~o4w&SKmxk8WPNP+yfi1u0blwSp-|>_? z`9b_qX(6>2B2-?z$>)6~FSfEMO_+c2HP$q2%0)=g%SG3W0sQVnRAH2YA?Mv_hVRwGpd;*c=ymVRQehS3dxLo)bPx z1|T2;D!zsL^gc%aeXl-$kvCqR2Xy6hZp?DPIvE&%#taYdZu>NR&jxLP{Qw0eHY)mI zvLw?sdLuM0@v(E`^$9IeL-Zxnx)ZaY(}aOSzY5Y#0DP(LE27L%oVUqwK*+~i_@P|FPlqC>UZQ<&y2 zs0*8qf72&33tHcS^FgD^RN0ZI-O{du1Lfdh^*KT%IF9%zjhE?}M;vF@KPd^e9W8*` zfjymT2gYh9uxjys{rtEeL}2+~8hr4wF(&9ZWm=F>$iOWs;|Mh2I}Sf^x(#z~)YfWP zoyHPDemu!6eRIheUg0Z~qRz1xz_&*(ZA>=tmOt?d`~3xMgmY+^G4cttcDr-kqcd@l z>B&@p<$L$t2Hk8H78`veW132wL-LcvE)AvqaG~yZ;)OrV7^vu7%sr?klB1rUo&^~B zRlg;C#M8s>CVW^;vYcI5U5C@Ym&eO0JjKIx7ZjR(2x|OGcQ%?PV%iyb?IP7@aJ;!4 z-xq-ae@(y9d%=M6GlYr=*1%>}+q{c0Q_-NK)^5-bn{NXvOYtBS<8(c)Fq!&#EQUaa z`X`d#c2fMJcfqyTL5SiOTYs>5a*pBAq+<|3&HdgC5Y`I$?f(HY)xVqZK&Bi_HSz0u z5TGH<8c7FLZTgy4+k&ohPe-3~`ef$ziUmT@i)nqokSQCPl>`U5W^r%y*|3( zJik*U5Xd^tEB-tSn2PVoHWaZz)?XX5Q8L9)V-w(H$l9%Ox|_673x051H9+UnsoZyB z2xQo=?)d40NcUsp60eDpqFIl@SrI_hBOFg8ig7Tf2?&IqLbhFdeyPM3#j)G|qJpEp zEz`Co*eK^2%cR-M7UVWYzOAADD~)SY)4c(%|AtWi5iqEM$m)txyIyf?b1#%lL1u02=Tm2RO!^(+6xeb4+ zbv*t|n)m%1mjQZzPl+HEDK%XLuNeZX!6A#OIz2<0MejYIzh>epzwJ&i%j9*Jkk^=y z517=NRYWd<8Bc?;9uD@U+d~ecavp5-2D(ibpx4>rl3|8pcmmfjy-mhY6!bI;H?-DEkPz^+!mZkLsKukg6j}&xGWwBl#U31(f3+N$tyLP{lrWm4K~`vx#UA!K*+bEIZKmM7?XK8kOq zYAX^As5L5af9svexEs`y-3?<|H>H`9pD2f;B)EBkT;inJz~e2Cqdl6TsJ*d%pIT0V zo(-#!LkRAWG5r`#H7o0(*WD4%=EuD`8JgWgIaYw*Fc_TZ((Inc=1!++&=!S6gESA) zuwxg}O`RNCpKF$~W?~t-W7!R$_!I-;QGn(x9tq9`c|ih978T)C!pRLjW=%D;XHx2Q zuX+@T7-{B`JV_$Zh#bJq?2-`9LYchTDtOtuB{d(Yviax&ebaqJ1Ra3U&t5Q;Z|s&c|~y6=UPwkpWusAba_FTST0etNNzewFA;a0@D9XU44SCO9AaGIH97$d zo82y>$&`>IJnl2~UQAu`Z_5;-a%UtlwAWo=#8GGu0vL|Ke@B!kv{7%wNyS@Dbq#g? zwax`jlEkNd0xY{?BUT;w2b*(CH(E{y!;KqPKeLHOrwChyPdFG4n7`=DV-+=ko3(V2 zH!Jd2{gt6J_G7PJsgv(yrcK%0pY$FtyF0|L0RA#0bz$L{Z>>;X!9#Hq z1H>c0?Kl;IdT2BQsK9bFl%_*`)(uh`?VL&s`YSN9uOYXB)h8!BpJ*QJ)5~s|V{Nt= z#_W3`wxJnRss*~Z8k5QXUb&aXOOfal79$;OOPU?W5z?~hY6)g_59|U|z9bG&mZyQk zZA`u*fjT|rdk-o*5jLrjx!;D|!19bJdnYr3sQ_-MCQ`ro}kpY;^0Yz1tH$r_ACXOQn&h5~hD=L!oUKEcj6^&`OE69^|9nC3P zBKYJ;yKI?i9_HsX(EQN)&d2K9zr4|0ia7N6p+Wmoa~|9Eq(E|8o_d;ZW0MgnC#kR}dcgYR^?%&GY}qKT_9(Qm&Vmaq+Z+dV?Km=o(G6^;2NXn(z;X zyo}>eZS=m!Jb!o;g4TKZtdh*tT#gG0q2C2S-+|cPxaxW*AiX$?u+TpHU*P+TM!%1_1w}avKF3?Y9c-qWQ`0N zjl~`PTOCq9)Lq3x6b>cHT~H-{0<1{gd$Ex^+g*lQ(Iha-nlw0-rbwU{cw4R>>4^6b zBo;^j^Rm1obB4UWVa>dOQg#CmVd5F!iK4Ca~K7U?ni( z=>dtLF*yr~Sp8nK_T~)#iisB-I^YpP&X?OyLJ^L~8tn#0XHJK`z9+j#YXq7eLVfYr zRqfh5m+A_*(*|)~gS%t{Bc|f@hT+tKEdis=`KatVRj51xw1Pp%m!D&I>T~d8_w|GN zgTB-1?`wYak`*SIf~daE#>Q>-Ns!r{KNn3l8OjAQZ6zB*F}@*eeg<&Ko|TNLh7a4- zJ6pp=Ir0+7tFjFVas@`LG7DM|=pXzwPs!?J_<>(Uu+X~Go6k`~Dqfo^ijk5m#TMl# zVG0LX%;;A?_{e<=sa;=nD2bsRv4P!j;$y817PcJxf<`J9AiLPV`JptX<;fw0<)$`7 zP19mB)W;C{fNk-n0i4V=Fx3OH5P%3*dz~8^GJ;JSKh)T_7ixg`1yA#-W!#p=Ou&Oc zDiumqSl(;Ps6{f}Q!_x39`m@E@8_)#Rqt)*5>30`ltHQf5&>ulaT+&S?Q%RLj9*FP zIu|sl{J_!9&ZfH9<=Ai4@8tU}=q93}DFj)(B<-@lrK_)h*tun}+EG53Ox0?5T&EP= z_Pzj0yU+^NqAYI(#}c%Mi&T$FU&;^_^|zwwp!swA@g+To69 zKBMmL9Zk>Fq;iY@dq~y}A4QTVs+D#HOlNmcdR-#oHP%x)(O(sP_jz48I@L~pZ>Q3; zA6{p9)}u1aOlq8b^}T1;^la+7jO2N#HMaOy2L#F}ALZt>8B}!V#MS>0nUq+HB6ctK z3-HZ-1S2~R<_v?BGy$KT9*@snZy>`+PePV7qu1Ej2x?1Tr#}tB)mh)9x2Pqgh9H>( zt}f8yE`!b9{Jb=NPEs6nQHdTIN%f9#Zs@1$?qa$nr%pt6rvA-$?RC(iBD83YV6SH) z+Ome1Rq5o4aCJ2?THSN4;0CF`5VKVi_Mcor1{eV$_I5j%JbNmYOVYLU<(I@UX_Sk?TDqH1vr&jEQAiVW{+-R(}I~T@Q^Eg#o zIL{lI86%7m4*GjvgMR@%Z(XUZi<(UoUwVa+%o875MHGbeX|om{jrv(`aiTYfA4FkzEOD2|MMG*ngl%K zLtY+jZeX@AQ1)A4El*$|tvoO#Bz@J|Uv7u)6<*IChHe7J;+G}BSew9exaiX=b!`bQo!1D&%oQw8_|PmGa23=tU#_msmP5sQ7z6QP0r%QF|8 zHWz^OZz3`M62aSQH-=8_2>5<1aQgGF6B)FudVVG2Ja?yb?uo9hOTJNi5A{xDd~4<7 zr*EFLEXbOJIpvsbZp+}KWch=iOj|qgLjv|p$m_zQ|4QI=3l|1YXfVQI5O%%9+XR#N zJ+Nhq{&nz>r?>X|@ZyV&Z}1_mLoS8=oJ+w4=|z2^Q7xAmCOXY&GP~eTLd91*ly5X* z9b{S$T9m7;%B+EW-qWB#z~_8k;1OddPjB7HuQYfzJSSRkjW5_O{=5IYZH$n@;2q*7 zy8z>cAR$AZe)2E{-ldh3CJsMx|BK(Sl(^IGiq`aH_T;b|oiShwZ?l~DEycPCZ=7}A zTlMRxXMaMCmVW1^j$X{`j121`&p`WOz!R)ClJxN9^d?MJ$=FKFSG}9w35OhyeucX} zsnHzic?o&aamkPc5_6~}pPMR*nM$o^9>1%T2i-6MR2(w)Z`$qF^+1 z?Y4>1Vpk*Q(mSIsXXN6CyMo_o3F{{9V);$kzo_=o&J7MZd2Kg{ z=={=v=Z$>65%9;fC)^VO)uH};wy|mnh2w>fK`g5G6SDNvugKxTxBi9VPyd>KF&9JH zarA|7BL9oel;z)*%XcIB|KhX%;b2tuH*SQ6Wuj$uLHzRw$$ul`I_Bzh8Xa*psTwHJ6H6j9VCM!id00qu;0hgb{z zC^hCo=*hii8Gi)|;0FU3`8&7)=1nNd9P0hcs}4^|?v;YTnajwTn$dp`mI2>fqcyWf z!HX|nqd3bW(AcoKt;fhKI~1`Bhq-F^e>xa`Gyp+%WN#RDsy%PkwHNe%deVL_+bPxf zhzu#E>fA`OLe5)|tB@<(bgYj+eXSU5P8C)8N8h;=5kMadT{|YZyF{0w|7^Tg>MqiA z(axrO^E4Ro8K@Dyt$_nGu49t@l@w*e;{~=t7?T%5VY2!MHg7tNJ z%&S4);!1Q*RoE%{(-2>G0k_gN_Szm(E{d9N?XAVP6f zeUdQ}@U@w)y~s#~yMl`Dd$by|8|@%GO=0JWi+eNwQs*G`5x#%1itH_j0rYuUh(wZj zPh+b2*P9;1^k`vF8xlPh@L%5RAI^dOm-kwHZXCo_aK@;rG*j+1m@Rq47)8EfT)Ikr zmR?`*2x4Z-OpDKsagzv8H`WOPV%AO0b3>-5uPXvOb^iZA;(!T;H?^d3Pk^oo_(E^4 z!Q-}-Oq|z@By-3dk@L)@##pY4ISn!j^rzetmz9|QEm86ycA3fAN(*np#SB6))|-@U zY6xx@zk$)4OaUmW`l3w1;&TeDPb&5z3&*jY5bUc)t4$w1GD5+|)9|B^CznNZO=Fy? zVKffT#2t=rgC27=ycS#Yzsn_lJY!}W3Z+TeER9v#5KBYV48m*izQ4?QpCXOKl^ z{B3_=F<;=h4h8|RHTYc-5a|2x-v)jEk(}=<#aZ7d$RIDq+MUlw2En4_QxQF-kZ1@tsE&Pc>HKYPb`tpB3F z#x4xw!33F~0<>bpZyHGw1=APY=@SEo9R|$`8f6l~TP81`D;tYSIapHy5^sQ9LV!al zI3ltnhkdW8<`3S|g%)#`AL1KDd~1!s4`opO;CWsP7x^n?fg9JPQ|hFFzz$cZX&w=R)dex zg|B`in27vL02Tg=%i_6%>&GkcsI06^pRm+WaF6NZoIVyb|47;Y)p%81r`Lf8NYBtO z05Gy(a4ar4uVJ}+)y^40cMRcHi!p8MpPx=vu>bden!S3H7%EAh7A+Xb9tYeNl+>Zm z6OQK7PnO*Jx9BHxDYpL}@^2G){`OAJF8k)2+1b(pVYfFEJcc4x!LsGkX?Q0)~$|T?-#D@c>U!1Hl@u`Fum}NJiK?lN!j^>tZ>IZ9s#|j-*cM^ zasG6A-Dd8yYxn*76Zfs(lzuF4pQ%r}gHOt~ZFOMe8<6tyr*Uq|ii+#4Ov=>J2G-0z2I3T0mJc%5#nM45T_i|wEOvM+!W)I+OSd13HSHqY@<&EX zYrxYFPj4C{ThtVnVuP<^_QT=6O|rC_-DHQCC0I>OW*A1* zCLCpXm%6v78z18vfD~Jcz#39>sa-y9>6uNI@d`!~&q-W^w;OLE;h#HQb;f+5$go5R z3@^_{GwI=NU@YJGQ{`83jDv2&4VG%xMx1F|G>8V14YsIPO{#Iu53Bbxs>JS~7AZyx z|4=nr?lLl(G+C%K#;Cn@;FlwC6~WUtQ2VwN?V+u6`+e8gitFp}Jz727k6sFGJ9an# zd0Xv|Ett=LF!L2QT0qGs#!|~Pf@z6+TyBxRRe5Vc%sL=*cH~`F{IPV!pvbnawWNrq z7WUP!WW4DTw(;6Wyk!Y2I~?eK`%awlZV!3#p@*OF1)(Rs_Uj})jG;u1-BFjj`WpXycSzz zR6NgT36qsPkAW)`8QC>Hfk#GXxyknZVG?em07|0WB9&EdZrEIfE)=pmA8=cn8L5s$ zHX;K~jCI8}1*vn+IK8$??Uffg+cxx%b#^E)2)9A5*fmnWlj7#l+&ace_Au{FAIP9GP(4$SP!|aO=JHYY_dZJwfzu212Hxi5X z99Zl5^`yGmQMpUSVkRcG!pm}jK^#-9Kj%R`Z{YfqI&`w`cl<4PI{nVRsx<>KzK#FW zO|(#xzm#ZP(Dv9MvmzbU@#jS|Fb7HO=pT@ubwI81yMUi>zxq}JD4yIZi{`?Tj4R9H zSqCpf`#nQ*N5tI0TYcR#rx^|r((8@N_;j6?%&Yw~)-P}WV=SF*-@PGZqo@d%|#=tqXN)UGw{G#?>U3qV7jO`&!i}=WlAY&ak&%R12R``V*a1hXb+Ic)YQ8afWwE#^`wt0ZFr) zdxQ`y=T@;?$j-Ht_3ZoM?j>JmiL0HHVKrLc2`G6lzhMibG2{IF7Vno0=)oO19&U}X zJRQ6A6wt^_6;o>us(bVEC2TE>M`@c}U(R-5uRGoeQGpBIJP?T5ax_xVJ7)Ph2_KZghTA)7%2BR*J>Ac)DVGX;S5&qI#-+MV9nQVeh==C-^A^pq z>%WpyUY1JTn|(7?1dGFcjxc(^Q{IB?3RxQCvOj8LKG$k z6t;Hy6YV8G0}qe7WqXTYep|-qHz6zqxD-}<>buiye@AKA_Xo#T{KoMQzLYw5f*>hs z>rMfsBA(|aaU@@@0gDjw`U}>9J75uO7NKvk<}_AB6nEtz-)}%;7xV6#nH+8UZvl%u zsek?i>UejpEk^$A(&mJ%0&4#$OYLV;V^q6WurC8yPU!1J{^PgEh8G@#qjd1-S-s`X}PP{X-pT=Xv|ma3_Sp5|+yW?<)Hy%av~H z(&9bv(*c%uCDb4F(?R&RxBkhO#(&^a&yTpbQu|~I8dvh|iTTx``oTdn;74*Eey%)k ziKqF^Bb;=uJ-DU8ax8q1-(I@IUZ2{4sK{c}$Olk{;WG${eCnCDTL~FW!v6I>ql`lL zv(h~QUl=kaG~vD(+pBAB-9q(@zNTU=7p?RB`#5VSLV2>w*fHnY{)41^*8~>L7`6P#Hh9pdmOn?r9J+;bLZNO0?kmAoUQpg1k z!%W+VMo0V+N>kviME&$vEBU1#D<8}|aD#q0QlWA0CH9NHs!ivZFjDHJ*EJPY7)H|ZAu@Cq!!+vXp zH1>Fq@-i7uZ*~;S6bqe07jC2VUjtj$7P;gB3O%6M6j|NYhd;OamgUI@)p&7Sl39X3 z%JGcnvt41u5ky2)l9^ZOJxYV+ z6?~yz@h(J%7evXqTe;?O-t4R!mD}7op6u^=SmJ<%8u!z|ik#Osu)2SUiu7(x%*dV(kgKv7L=}<$mS%{%?m4wc|P-wFNY$Wfyc=zNpp~s7djvVRnS=yzY3F=Gq z!helKb(KD){G7RU#U|$U=vHC1<9xiR+X-R+A8l_P7UkM@jY}vgh)NHP%60>y3?&XN zAcEiq6e(#C5Tu7@=u#w9CtdISojim zl7zV4pPeG3u4BszmAla>lfJQI3e?Oe!lIc z`=Byh=BJfTe-dv}i8=hfPj{Fv0)@NX(Wcz)!s!DWvRti7N=^eu5x!k(lLh7OkdAK$ z*34Zl*2aJS6aTlxRH@!&5&LtMhP@u3jnBd*9{CJ@rtFpgS$>Z|W57XYT!+H7$81MU z7r?S$5|my_y{47DRPJ%h7So^^t`PyZV_vAo}H=AX3Gof&Jo@;qPh6W--sq6Y+cf#Zo}W&@Jx^9W+C}6ecNU;ZU-{)jt;McV+_kh+a#7%?)Y& zGW9?m(f)8Dw~?_m2A+${0)ECwOI#aflM`~X1mNB+ITrnxAunt>Q}>e1>!JaJXt{I_ z{12%2|CrG&oxwIdZ^Iwr=l<-tRBiOUkk38jGEW#kk-zte!v0~M^x zCUWaWgFvI-I=_}zrg{ak1hM{A#JoZkiPps=IE%db@mt)25&;9B)f<&Ev(oH?zI6FC z%V5BM_N}B|JzQ&Gp3i&CtRPD)P;XfG-imEmbmgah>lnI;Dac>*O@Er=!ho9j!`->u zFY=5y>7=cP@5$+T?<r5!&77YA=e3*D8&#iZBso`;Py^?vQZKZC%4t?f0> zX+&->L7pr?RT3bBjg`SV(+W-E9>l{$Fe-3J@Z*-ycf{|eCDqww$-$b)HL zl&-S6rFSq!PUO@&uUA$el&^eS|GzwYT=48mTN~qC$6OlMni(F~z8*vn#_-#u9lwxP zsX(nQvkF19ZV&&v%f*aZI2-(zG`Fff3D8@P!LKkWw$lnh;^oNgR7nGI;Xl!<{y~NG z<{|k;Izm*-e5-qTz4fB%G&KT!#vX;OUn$?akz|ENu|iIT z%|A1Cnk_0`pUqk2ZTRllpsONovSFM-L?&VheA>ff=PSnu2ikg-W^x?Ixs&mUqNrhA zzX$3rsB`7QNrmx8FPDspwiE|sL9yz;4{Z~<2Fjl~+|8$eoI$L}6}@NBQ}G3WHru-| zQDP}x2BUY;-i@yu;T2*(|D7x~&W?@&n8`j?XzQ%!KnB6{}Yv-N7zp`5?8GUK6j?)&;C=BMA;f{>*u zb-Hsm5_>`=g*EQ$a&CWkvDCs8$4-??b6A&RJs&Jb?Wf|8)O}UD-IVMnasR0>=RFOF zx!(FaR7`O+p;={0fNtr_TI_3EeyOqOm#ZWoman+v*8(c>OFKpZPXI3D9OJ3C=E$7)_om6ioZ2M4aCme7)UkYSFB9#0qk980exIZCvMDhKBGm# zk82Z^BIm~oIkn{6a)Mi4hqKW0MTmIOq>B?KG#gpZXDJ;qYF63a79%hi?Rs{2CGczS zkKedyW^+!@4^~}inkc659l_3~NU&vw4sKr4eKWl^&Z>pgV1L}sP9G`R^<5^s6jOOr zkR6$;*H}s^qmdABo~d5aBX~A6yC8DDBGMkhsxY=&u@zumd{hClM>+AXkaBbiV*Dcj zlHr?j!#hzpzOVUDUq+#4vm~>kPmstTAZR0ivT1jO-jlLrs|2wXvk);UGP~^M)K+Xc z+s2Ms?OELM+2%sh-OIfUudtT>?+$yR-)Vg8^+iJdC-Tz79w7SpDkuG2 z*uBA&E(JNE{uC)zhlr!02LjycYF1^=nf_Fbr) z5v)lG_KV_rJ1laM@LnGZSSm=ngw_Pp(=IL#EdD5WIA`sx#1i}99s5x|XjwH@Tj$oP z@meL(IuNsMT(b+Q?n&04I@vAXaE6J;Y>DIK>zth&{#I`Pw$JU=sp3N+*0p4cS}v>Y zZq|o0U$#}_2a}@v?3U|jKNqGi%@b>$&9<72XMZe{ONgQ8QsoJza?a>UEQm{QGh>U> z0Fmn6Cl%6vfbTOb_)fgBA&2BRhp%MhjbZ3Jw`?Okn@(myX(&e7Ro&iMObqHk-*O~x z1TW>^x@(T

    2BeOr-gGuCs}`@0tu%7;PhxWi#5-ngX_y)OrJ^KQT~aC0M%Cksxh4|Mw4-W z%iNVLRHP@l@X!#YxLTT8+F4p8V<2q&{z$;zZYv;{^b8#Kl8)=X&B7neR3nhbD+$TH z@s_zrHgLVTtK;;V#S;OEGw_f~j|VZGA{&KalC&#xM%W?LlAlt?{By{VU}VT4@Nq8} zemS3G7BM=T6*MIU6tcrDh574}aqcWhflQq)R2Z zd_*qixqJOL3BYgI5m|z5l)as6)xk}I!5rlM-;Vzj1UL;K zUpTzpf}|dsJRpqvDY@PK>@W1ULajj6v&PSSrxVFt6=4`_bOM{5!Z$AB;2AYTWjde* zCYO{t($kBha5Mb%ille|EOpSC&ooPuaT%$n)-VYhL)EE+eDG$QeJ`=T{h4enlU1dV z%e${Dsfoj+l1kkHj*z4%?=7umUbsZe>}{*&F2gh{pm>(79Z-4)^+jeFIB@r**~3 znHs6fy%)W(?&+9`=HdbE4+$+h2GLx)MeGF)5|Jb@C7sT)eGx+YW4$J&OFzCtM7tZ~ zj{1_@rm8*L>#4P(1-^Xz3D83%HqLzk?0ZOfQ!>kzuEi{QI(q1E3_W{`e3KYvzJA4(0m*2|?csa`Q%;3NLZrS}|mW1~+mMG>yxHb%I z0PnrssCo5Bn@T47n&VusWF&TF#&^Z<%h})yX>j3D`Qrpk9Bi|kPLS2T+0QRsYiv}wPJlqir4~iycAmRxa5PE2b(T2M* zHDNRt?qXN}R0q9bL~e>Ay1l6*uq_T7`rNLA5B=2~IZMA#x{}3>+NeO?(7D_V5{XBU zTO?W;Ufgeo`5t3CFga8JY?3`6ept8E1epUJe>(|a@oY8S1m2$fhW^{N@Jqf67d6s^1=-p&c=(GlK zn!(~W{$?mMLJf8H%8A50dILCchceAy`kga04*F*0VR6Xizh+O|xgUpuT4e{5CNQB9g!)vPyEV(^uuPhTKzYU>~ zB#S0VzG+EHp#g_N?M=i9?7j9XO(Mp>InNe`0sn)g{)tveZNed7wGfW+c3{&L4_K+- zL=rfhawCgr&lB^agFHo`C4L<=XyLl_?K!UXL`l-K-xxMTgpVD!u)?L}YOzy2ItxtF#Qws-(VejTxuD#y(SLgn5jOBko z6~c)aL~8TZN}w8iGreD4iU09Z8!fomdPgOGDfS30XIPuI*B zelvIca=3ARW?s~T4zJkxj+C%+n3zSjd3RN+d?#mn@3Su^_$7#cndOld-)^5mJJ7(c zLL@1s+&+eq=3W+3Qr=i`D@`;FSh#ed*-3lfcalE62cf~sMxzO2A052o&h+}DTi252%EJu2L5 zBSNZe^d-8q&bGrl`0zTCuu=?SsH((b?qE?;WI4-sMR!zclIY-PD?2wA^;t9a)%RTDs?vp;^cvgh<8uPNW3Sb@k+ zY=;%m!0mNyUS~{shBnka!-T1saU#$i4^?uh^fzVf;Q6}!9G1dD0PRL&?nl3vO4$aT zOY>^ssM(eDtUFaD7?3abv)7%gm`pf1+Ddx;z2Ay<)JReJnrYU9DAU3S2T)ntLX|aD z2PyKUXYY6mc`AlBP%mGY+IVI>sY~+=+n@HgpC7xPXHW9EmHIfHSKqeoh~~Q@i}s^} zaUIM494(MFFVlE;aipK_%_b-${^Ll;+iH^&<CTn-G{{PihRxxQc7G?BNS&7}IpWjVoCG4Ey2G2=ts8??eiA1fc%3flk`QrE1t%d@&~{^0v=LKe=$gv* z@MB_3kc1yqgf|IQsUqj`Y>+%MYRmN#F7Hn<78e$@z?W_pr12lNaqDn7lQOZ5_rU?m zmYD2G=!~|vygBKk+IZ9{rDh`bG?P1}{FB;Ls&T+`WL7zpW<8k)#MqqEfS%NK47kmI z{S(HTKNRs9EY-&|F_$$4C{$EO3Us9o_L4{V)9pHlXmAj9u*HE_-U1%E;FMC$h>kBq zTe8Tm(fjrueVMCD3pFh&abV6e2J?%x%a)%O4`{jLs(Fo6mI!32K~^I&!5{9yXjw-g zyZ@+i>o;!X%5=x!mZZp0ushQ|VU@eq8|C}F*nW7dTVv>KAEY2o`qOeZnAYEOIHO4a zum*NUbW|h8iY?7r>sMT@%K7H|6rvG#mrIW3`xhFb%yE8zH_4(>pv!K& zHA|EoP*9&MhTmnEw+&Y8J+x~Ei@BQxK~Y;+}U8@_Ksi1AjE; zJEARwT+T8u{;i18z84;Aw3Ixfnzd)LI)QB51`;h0Q%k&z%X|aAt~1(}phjwAE=FzZgkt?)*~jn2VX(sIjy^}fn~hGmaVV}eA^s|puS$8mV_qa4W+ z6q03a$P!M+UBonXBC(!&>pW!s7IFK*3w-h5OJ^>RRf;V`wJZrkIo0oHCP%JiJC3CN z@a^1p6e{>1X!?KU1^ILUUT|M;EK^sDAusyj^fh)*qR3uRo5CaohQ*JnvYvN>RN`UzCnx>7i#;fOsnhLNdSi)G`I1m z8ekWc+msUugkM@gU_(v(FxKWWt21OQj`WAPVZ2;F$%+!&m)@(44%QN`ly+&@^ zym(ySWe1nXPP%(q^%rQ-`NB)-wGTxdDfw)@Q!ceG)Men{LPcgB9~9OdT)_or2+cFSu+nt3JT@`fBQn z{t9&MPLb81diZ&Y9$ZfN@XfD?Yi(=QS22%HVuJ5jAeU}7Gtb)h|CW@{2dzC2z}2I1 z73aC}QV0g#`K(M4?*G75{aC$)Qgm&Zget(xSTR_b3w+`n{nE#&8JVd(N$9= z+IzaDw3JU4ZMI^U5$*9{E>pp%;)td&qMkTW+k>)JJ{;^odt|2na}RGQ=O5z%HFOJc_^pHxfW$#>11oFDtyh?SMF{3FM6tR2ZKsPJ2m|LITO zuE~~uwHT89`@>lev2QwPNG{!3v%vOyn%srr@wWe0dzTFgmeGxWpq;m_bDn%ntEzbn zcQV9;b>fKD&G9=#=+v$*+&U1@#Uj}583_Y`;J{QwU^5yT@UTwC0$E=oW#)=z(xXb> z8-YHFSn5qi3|`_4{55FX4&PRydO2SE1A{_~*Q-uH&{J;AroWg3efIl*r853+gJFO7 zUjF@xxKQY^&VzQ^$C?cv6BDxM>Zvt(oPs7tu{*%HZ6%%~xVoVXbFi&t9*o``L^iY(c*+fr2awtBN6tLvCO}C7hs@1Xk9?7ds<|aW zr%)IAG`4a~iYmy~*zVhxAnK+izdov*Z(qN>Mx|ylU6;bvfpY`jgf)n_w&VsBj=~bc zyjn*+;r<#p{g&x=3}u2f?c^rjQ3}TAp0jBhM)?gCuUG8&idKVRpRHdi<hyDu7-C z*EpS7b=tlLQ)*dLJ-mU$$~C``^tKXNkaE!PD7z zPC*QGYlDu+rG=bQUTJaMub5dq<(qA2=o$ITn(cs|wY?MLKE~i=y5!Rcxkdbsl@GS? zqnbV-t z-V(D!wHU@0!q_ylq5-Auz<6h9;1sk28yc}8)fCl{);?=Pr`j=D>SqAyMHt2*I`|?q z^m){*IiTox?SmLM-+JjrC_RLbq2#l~6`c^jmUsIA$R zxZDGBs~C@q$;CUgywjF>2V0z%D=ymX?4Qn)&;xBUT~~a?p(~6CJy#d?FzQxHq9)s| zA>$E#v_2Lwj+&JYZ}pfQ>OLradC`a*u|fSc+TQ7C9iVU!nm*R}7UXr4Z)i~Zg&(p< zilr3e&iE@@US9`F@PEg#{F%{C<_>~%oG{{;0|~R?@NxZ1yN`smeLEFe<61;)N%mK< z`yYQ6fv&A1xI63D=`Ia0sx_=Ou}!uAd4DN6u45omEnKy8m6Yt8t%Qv7(`do9dy%v) zw*+^(#3M8gx$@FIs9N4LEfRU0Cw62vbEx{FPMoX`q^6HDs43E?kyK!uQKcuIWKG7W)Kbb4c7%dZ}hAuuEjQX z%rQ>}27DlufQyRhWr$X$u;`GW)|iV{+#k{-4`&{<2Tg-I-T4PRR(Sllt&QkPlB0zS z!yJf#gP{(-`Hk}xujlC0s%uzWZAuu-;s>sxXk$e1tJ!j5N2&+vA;XkYV+3SPhS8Q! z3xO4&9Y<%$2R}@tWGwfx-k4q$WcKEM*SgQWp&%_g*?cg|xn(>1#VYWXj3=MsUHQUE zhx2ZyPe?jU^+|0O<6^9@J-ZdzH|~|Jn;3FbskSXJ>*yyw4QzQDL>Dv6fEO9*nGbm6 z`{}P{^F_9+Pbd+?LzC_Lhk5FHxCc?B`%nGV#<&YUwZx|XNEQi%WyXoq{{LbdyD*}C zx>@9d9@yMF{Y~)gsHa%rOe&?pOwxzLW?1>oXE6B`Fe--K06mGxgq#ByM!TYJ5DO-@ zicC>9(mdEcGdJBJ67ceq7Y*Jhvp5<|nCPDY^9p~7%@of-Nw0R4U8TQ`8xOeO$E;c( zH1NNT)UX}yH>o&O8w*<+qH}2pVZEZ3eO#U8Vzeq9zYwAz%h?D)_`}jZG#2_4!BB0f z$uY}?%3}`bm~pF2i0@H-^NtH)Q!N7djTf6x*_0Pv0RH z6MRdLhC_t|H1zwLGiQ@?$s!9GqUfFStW0YQ*M~aJz)azz4f{rcXtKq6+sz>^4Csy# zg9Yhv=B|isL%9Z4vvjAGPw!Sg23;8)Q$x$^DO201DUC+C zvoW0;owDnj}ki!<4RVO)r?DUJi%v-AHE%*9-!Z_U|`DyqjU{>1`?MPqz$|uiJIz-$IQ( zGx=`p$}%lHuGB*=cYkyP=>d>+N${(Q*LBdu~gR?ApVP$$iD1bWyO>-^(%)b0m83W08W2pZn)Ca%cO zm(Faf_Hh#%{cT;-`{}cPFH^Gz#tmSAJXzvDo3AkvvAmc$c{|2slC?m}Vb}pd=Pbqv z8uziFbKWX1@t8Y}jv|8(Pd8jQqRGM^s2NPr5TpIEYa>hYQs5pl-kW+sLJQFh(;WOj z0W2fc)b5B7XnY>WE95%twQV~ukM1L6mR>w>&(ju%*76?uEQ9?o_H?e|N}ORdc7OEIx*3gD;rJIV=~&h=VU&tGkk9ZsBt`%$$T!7x#k5JhcetG$L%VF~jJ7m7k10A}0W=q3q%eBWrxWga+)7uH_EV9IoC@nQcfa%^o=F_w9%*1tP3y9%GlL! z+KkBVmZe0-p7B(a>cQp`6`0~WrY_j;tF(gl7QlM+%m$hW?5Smcv6X+UJ_4*qLq8x| zmu^qBe(Q42T5Vm2m+G1^yL5+qmJ3!gy$5u!2f&P_`AXxwcctCj1w&u-5;yv>9Wb{o zQ10e&|6%izb4AMc;N&0S6~~IdOCyN8GcE`c#JbsF^pSd6Cob6-_ z(B+yr%cEueug>4Rr>J4P5^3zCvxn89blfRKvn(pz# zQS;Sra;|h*!?MyfXRtRr25%0CPsTu%f^eIS!MQLMvE#h%tD%C`WR5`<#+_v^1t+sr?9hlaSq~E@v?p#aGwPQaT;^QifGd?s9@xxS3Fu7G;tt(;F>m^sDrv{3xRzvt?czazl z_VT>2xFxh90Za71<`Req8Xri1l>e<#_SXDYyH+1iAeyjU+vut%ln&g6U-4&`#(@bi3#mV zxEN^NEDf@$XflZ9X7-^-?_jY?An(;J^-h1J>4UhRFLg*Lk!)ItqFGbgtP{8)l{9g)MS$+63yUQ4#O z@f#apHNQZbd5hSwm1{*EpJfA?dI0g$+Bs%5jMc;biTc0^^xrZlo9M}Jmr>}ktdjzY)S*L;XL6@4iji0+738S&zs8F@Pk zq_q_qA`*@~+4x~1=IE(q!f_TnA(p(c3AP`yF{KIPg;%AD=>FM{yQhHKsvaurXkIVz zwyfrp8jj6+$~PvyYCE}Jp&N6;h0H)W?)7K8JZwI_`?s?(MEQ6e^E5WIKWF4jk)+Mi zLaToAO7Y}Tg7NGfMQ8A=wvT^Czz-Mmo07Q?;-T}2MQ=Sr_Wye0K9Y7Cvgcv4E7s#b zadL+Y);!;O$03z{w<>qF)$Balam#j2A^XASxX(e0bGb)mdVcJ}d{8ADO*j4O=5ZD6OAolI zG@T?$-_bz%*jjaF=R+bs{KLqDNd#Jc@tPr}C4M<**}fN}9)0uA#uI}p>9##fQKrt9 z^l*JJH>@Zblh+2;q_aqHsngHT#ga0=f(ISp$f~d))(QqoP1I|%s9sxCT^B08;*sBe z_xi~{dwL7gN4xl7_6A^meERzb2`!hPPXc&48B0nrr0q!Ps~TQP z6$pwE#ZEb3jTEnpkkzkW7OeQto296_lXN_tvFM`>8+KKr0E{46LTlIq8Qi;}47SS$ z%h}i|2kjIKW3R-8`EV`9Q$eu$utcafc=aP&R#UH41zbz_uKeO>O0nPu;slG2A(t3F zH&7UzONv_bJc+GLW9cXd8|c+5vL(|=T1123=63>CZgo}?Fs-9?>g72amOq>k=qF9Q z-5AQ%OW-0;U^G(GjIWmhHzC&dI(;g+aS%I$*Z3Hj!_Qz64iKV9eiT5666fFIEGw6@ z04Unhd$II#!I)#28fyjFU@w73w3W)oEgl5iU(~_&NDgP{x4}o z@v+-mD_XFQV>ux%`t9aF9OZv9Jp(*w!%Kam)B;z>*Y&i`DwUp39}fICAwz4|~)2>BvM;ty|&IzGa+h3iCjrycYM;A4&lLqBniV2^Ix!ejdYHuyiQ-`+McAc)iryhwM7H z=e;#W%bVuSXUMh&h(3IdE1XoE%vI&ow{0rzG%}rXU+pgKZ1oG3Y8d{L>3YPQe3=#a z-{i~A3I7*E!>YdUWR-p;A-IKde8HJV&k6^&i->V~y_P-#3r*);#bg(d_-NM=e^x*S zpSpw=^yV+1YXN?zhmP3kS;DxRfj@t@2fx1|71|)d90<(8cB2J=&PQx~b{cQ3yiAgr z_X-Agn*b!jmBC#G(KTtC1~YS$)v)${&MD%4d_6)~XJY_;c!pA!Z+OMQdvTWN1}tD1 zq#iGkw_D>VQwojMN>RJWq5$==6Gu$4qs!&QdhrR7s{I*Lkl;)MRYMIpS?G1S_cCr| z?ZBA=L2gzzWIZtkUMBYB3y8w!`E8P-rSGoNuWjPvNZ?Dt#Cwui4Yt6{m?~nPM{v~- z=T2tH%gOP1d}Dkqh5cZ+N{n{Revwg(OIv!@Oh7isMG#zxrH~_nx}W;9nrq<}pWj!{ z>1vA->3oR0KMw@_(RPv5y{)VCN(Gj|X~L|H${#n>UKYsgOf?#Oz0t&7pd*?0IOxWw zlB!@yMxzTC`N}ib0>>?&6@d3`>>3;-`w7YK*~#50_~p?X)LLQd?Czb^b-nyJN3TbJ zaX$LJ3_*rVNfOf{{|aHL5w2vHat71lr#-G?gbdh2B+9YlDtB{`Reo^U6q3S=asq&s1KoY-km zpxdURFXgn`yc>*Q%P#vFOBA6~>stb4sQ%DnR`}PgvQcs* zXxBe9@mYNAm2OkDnr{hRADayn=!mxO`LM3)Z)tO&;~RBb-1jS%_5D@nB2oie=<}@B6!rqC=wTseiC6t*HwnYhaj)!aCSQ*T=LtFzt z_?dg9>9Y5$J@tn|F)rtP$1;XdB<#hvw7N?*&$%k?h=9j@B%l&Vx$!8A{sxJ(BkQ9B z<9=f>a3clo)?_2euIn2l)?D;S`F|DEfZ0K{+EHo@D}+H!BT}(6Sy~PAp8GMeaE~w} ziV%YAs=mU;Qt@)c@(u{TV;w<`v(2aKD<{+N;I6CAHix1wVJ(zjtgs zYpJHC3zUa{i?QeugE-cw5(W0o@C0Du>22K2SUp!})fcH5tejJ$7OVM+sdlQWDP`|R z#xmHAaN2ozXFYYiMJ-7L_c$U=VrLDUTFugn;heg4g`mJlA-QDlZ3oR+K~%2zc^St< z$1IzPU)=fy5~#XScnFNobQxBvu&PwZY^guyuC+G3oynou>d4-{h=r?;zT9FLMATBa zVL?$@b3Xd3g{yu*3|;#O_7$UjgYfH|g)DgEgiT8k9`(+|9f_G<|8%LWWNudHUAJWp zjL$ibjrG*d+H6@?#xj_@J`OMap@QeR`VRNCH7zi|JsJ#c?4aZ|KPA&y3cM%}`#)CQ;ioqVo}6XBHCs3c(v_>-x^O&9ZBXCyGz ztT+Cm@}1hXQOdR8b>6>}A@ZXaxJ5qDJ1nKn&u!w+2R$gaKQCl{z+m%+fQPEMKe=nC z+MH3{Vp~)b=p!tnEY>sBtmD(3;qewdH6&w7(dkuc(dAPtM9lXxK6(qnf4lV{@P<7F zQR7wk=R?^yQpYge=}m9yIu;n2F$+_N7AHZ$=IfO3YyuHed*_j~%woU@VH9ekbhK=zM`qz_R9W?ff4zKfg3UZx zA?su?#w9zM{erY&fZ|Wf*yc14tCtrXQ7MgzS5fWEykFwtJtJTy^1or}?}3L0`NF~e zi5%77V3AQn5lCloUud8QnPHX? z3OAIZjdt3SphjUVofoTxh-7ci)ZqxJkxz~s1?U^}wN(ltU!|O&ioFChIF4#sb*fLWw!Vv zxRWD}L6=1bF*SU__czZ_Aw@TL;aumph^zZrkGZagFH*6I*T5S+{#`SQY^0CRy9F+( zy6CPzr34LiE4(G8A^&uF9e=NqgM6QM40>u++?iljOg-)LAyg_?qil@rR;_~-!y?)4 z6r<3(hc$9Da!4HVl08P_Pt{m4`Mt zvAo%ErNQrHin!DE#9m_VD&+_+7pzN(i%RGl6vJ>xFY#uCBKnk%0fLI^PgvS8qNO=5 z^jOg$^Kc5DWS>jEaBa^WlPg8}FtNn?S>WrZkm2~FK77g0J8P&&y^!`~8MVZH^4Gg0 zgpa=df@Sr3{9yA}hpo~d023nNhRAM{NfYy*cWhluWCPbU$Skc_vblbR48qcVqOzxN z=i+f4n~G@@T9INBMh>By`g9uyroDCNRiXNBOgazq1Is-+?JICY4ih1v_ACqE{)(yl zIF01+=jv8VcRO-P$*zH9a73Vfu@BsIn$F_r8u}qzKOyk54`Zdvr)trwgC2~1B4tz~ zSA>SH-#DU>ze0A$;<|V_-IBXz+53u}pE8)xvi1;R~1&1W+9oj z(#i~O;5@D#z6|qV2cat%FqAk_rnh2Oe1z?O3;+`5#mYg4sA^ZV(R<0Lwf*9-t0fmc z2_WCzN-Ah|O(iqDwetYz=QY$T?0E!dwXM!&CqjTdk})+W8x=X2@@$`L{t|=1U!~St zn)@Qli;lI+LJ&Vz)7GOgwAiVE*QB{9YuJR+*J2r_Jg1EJMb=9%^N@#DgIxL0Q{PhU zGM(tzGLQ~3h}DtTqi2HzCLUL2K3eo>he8SUwn2vj`I11m_M% zsJLi4a!}JQlU_Ms$L(^%LtG_>x`MfhSuUqV5qP9K4#e)-l)rmvjX_;W8&TOgkHF5y zhyI1V2gXA**^gc4!NAhg^cxq4>0T2X`s5r<(l!LEdx9?No&AqVb4zdf(tm_F};T#J}o;;o}7hY39wOE7*+ z4Oz9wG_dALQ#Nm|)?COsctJemZTrQz4EWKwXJuA`(h5j+tAnU4VO5j2rh{1X3*`p{ z@aG}|D#NkV`1w^9EzCerybL*G5@0W=ObMIpINUa&qt|E zzI!;AD5j|=itXKfk$C6(9P6^4mb^Zdcv)0GQ;5#bnJ@t zt$=s&{)?hQ3DmnGyi>^Y*WU;RpJ;5lGxn*D3`+%RsMg2emG{WzLwECJ&9btlJZ)to z1n=g-Y}M&&&Mg>*IE3FPj%B;-rnm9C8K9#PfxVb6PjY=_EoU2ET@*#cI4}Dvir}kYC6F0!>{H;*3GJS!-2;0 z3@#q)k63B)PeMKNr{lZ##p&|)6Y7S$9ya-H9K5I3!m5P~fY5$_QMBCBnTS(}W@X?- z>o`h2%bzi%I=Kk%pfiU1QLRunziTP^OcTlR6&t@{9lK@q?`Y)~+g)X>S8+U-Ikxu^ zNYwcI=`0VK2N5wQkAj z5$4Ei`*;hZT}(%e#pgI$tFhDD5bD#eY1cPocaAJW+z?r)J^p0q;O4Hl?b6-w(nErs z+W~IH*-R#RrxYqWWS$s#f)LbFL)2J-#cy!|3S%7QxSKru4#;3RXWZ1)h&_ck&R_n!sn&m+fN5zIj+Rl6 zMcd9$TW;$znZF?kKI$WbRxu7;@M39yf%49UU^!7_6$FLQ`kDP9tls?!2 zTt0p#DDTx6xb!E%Nh8tiDYp-9PI$sDRYPv<{?4gv(Z#2?^xvq9OWKQ2NWN0n+NpBK zKbc32q$X1?k4up+yKx=tC_Yx()P-9UdS@P17m15h4#Szh@#g{$1sKTu@_QP~KLRKA z9L%@2(6_jXNaHB=SE9c~x2;J~$6`{bA09rt~Unda~L)vAf4iH z88Kh{lQnlkq1a#+&sk9dhB=qHyZR?+_`+Q-=1;R=Dw?a!^4gP1xR0(ZPE4^+AFX9X z^5aQS0>-%osxDt1++`Mi4qtat^t3rXGQKyfXR&2QB%dC#`G_XVlS|uEPwPr9>p21I zo+{>hPIx{~Hk zX~t*?XY}*MDj7`?h~r`cErf?+>e@ZaO49B67cwJL0*MLtty>G^UFMpChugRfsDv$C z-aQRcm(e_$;b)Gq{_J$<=O`|sx%$!b{#>q`@V1sQ6u7j9LB>w_aOM}{daUrb`biv2 ziuKFz^lt20OSxPKrIb+o92{iM@&gl7V7(g#u0?Lt!xZh+UM8h9O2Z`;iK!$va@+>? z1_K%nmnp(Px5951C+gWOivw2{XT=-;!})lU4swe~!rgDtaD<-V?Z*TSU!ilaX^y`U zblh6>-JBhi>}4AK*gsrpYhL#PU4qCIU(7cOq%gUQownck?&?L!|eRMY$^ zArhY>(4w;nB61-yBnM`{if)#KM*T-s3nc#EK=PVL=8HESrT!7f;;TyEWuP1ivy5aMc>8;9@()ptgLs7+INMelM=bzO`2+)c~0iDn5!nU02p5SWRf4M9|Yk$vn&1hG$$N z6~HIjN+x_TC73CZ2FKDi3FMm|lpWLuui9~5nc&M3=Nx`j;EKMV+p@ujj-LIJCK}nG+gjpu=xf9jZ?yx)UuN&s{ZE|in`JC6Hf62vlHZJ1yAIP9XXd52D5`1 z7bR(tY1gYr_Nj;H)+KWU;CkBi$v53^Jc!Y~aN%|}%fG&RacB^Hzvl}bmn9!el~D7$ z%^Y?OlEv3ZEbQsf?S|cQ6>mzLpXQt99&#NJCpfcp$1v|qf&83>$uopN-|fMMF#NQkI}&9kke$ zo12zMg`NmHe7MJ-1kvnjq3U9ewb!+7HHL>hqjhj+L$^}El;@6q?iQSjQO(cY<(Sdm zk)j3Z2Ax_TZo(|4ZxS2WKYIW6z&9fYVwJTxdSLp) zR@T9yE&U@#;w=-6vIX2tflFzpz7>fC(yUk&ammk@*GBH{Z|O< zT)9ANLLci;y z)?6V}YfnSj|)oWk!+4F_c|aN1ov{VKy_Og;AvPoz#1 zRpaK^JSn4t`hI^$9W*QndQD43q!TrGG}DL?TD zKj(p9!;3V^vkRjRKq{bt)BI2C2pF~`b#pwfx2)A>XaP>ocPd#g+$q_VXi%lk5_PZ6 zvo3QR_57m8kh2+_fG^N8D9swFTYGdzVvCh2_Ct!9?=7im!~G)7mMb&zdiyp!i46`a_xQrh;4A$~K9mIvCl9rhy_m5mxfJMVNCk=Bn*o z;V|uzqGv2wX0$PHI{zv49bXw71Gi6-NW;3uN`$><> zG`fr0CW@_DMkmd$t=Rh=PhBRhc6RUe$(;E(XU>WXig%dUmIbDW7zK5D-temxUm<%^ zH^esVyJ?BAxCc8>o39OQlFcM}dt-|CN>(S9sC@!brDCugDR6;TcZGzv+KcT|{_ij1 z@IME_?KPLe4GvEZ2umZqn)W+ou*3DI8wHVdWAy7u1{=)c4(hpt+j0&2uJ#RkKxJIF z%AejnpN9~8B5jLzd}*rldjb8K*z<-TRex?w%ah+K{O<~s2^r+6r8^BMGyg(;>Cdt^V2JQ;+;8zuJ^G*zr>1$q_Z#a9SXSavpGn;9YSFh2 zMndyGZ}Suo-gxd1peVW+E=Wfs`a)LbWWL>g;;P{UW*4k+ifUIry?Ht?lKn-TZRnNZ zWg#-@lT2p2(wuOqMS{xX0u?%_9+x5@1~Z-utv6+Z;uGU-)9x8{0|ebvPVo^I`1*xY}ONt@+UGInZs`z5H7e z%vjx$ARAo5iO)JHsJsq}T^oAmk~@dI{{5N$H@h!*ri=DKQ+r}Tjt74*dgFjBd8&8z zrNtki4lJRv5W393=<1E=Bt58cc^h>n#W87`1HlYV?;cgO^=M_s9$!>r0gERF*Y<Y_Dr>pZLB3+Pd?cU#+Wki0uDvUju|CzBQE~8VZCyXGqZ9pc5_a zaLoS?h3m|<48*&Z782e1xcJ2O_Vo41$6A$?;`{rC##@@)rA$m_XZDTg6^%5+qoyF5 zN4SOidJ!RODwMnw&yF1!&y|jbz1=7xv{lFS({X*pW?KfD_*KTqUny=&V{4tKYZ|geB_gK5_ z?m3bMxS#uA2=MysD3e^LxMzN3A}R7C|D&20)&=(%6Z3!3IC7#@FzyR(V5lOdoJMs% zL3#8>B<&w@dKMw{K?!4U*v-LG9cJa))lX|} zHJzGQZikhtH3OU2^;C*^hY+U;-%InLkg9!CtFR7ddzcY7IiT}mxLSBNoz+hAm_JCvgoRK z7W0xFv%ZT4()U41?<@iVyrH1?$uiXYRcVokK_Q=@w@)n8fPrk4?8)8d5t`3h2!uTjB@3x z!>_|D-({Ls3@F-XLz1}Xm@Z2e;2}63gX~Ao|A~K;|MNyAzP=RTLxcB@fV41A zw!BdAA-<3lU&nDIj(*a=oH*{SI=UFYmPrC=kOubJenNrt^+snWoicV;?F5F3f?1(p zwe9!705W?yd#36c^?<%~%Vj)^lf8NUV(ZS)qU7x-Q)oqAxXPtGT2b3)Vg1CEY)Kh2 zdxFke;gW~LeJt1OXFwKqCzT!&|&Bm(|gCNMc ziuWjn=^D{Tat314d|kf>myfh)h@KHlUevRD?j}#Aq)d6(rL%jWJXeo?*tpub*w`Qr z(q?LHq)}<|H^kb)?+Eoou5=dV9knS3RR7LZ3C6>f5x_=HcKi@E1 z0pc=&LCN!QW6!zk1Ho*2JwZf-j2sJme|EPZ?xM<%N9y7!$->+CtEAgCi;)G> zLBbPub=%YBLreZfS7dttEAf@^#54RvEm|zqTO6dkk}n_0i8&xFCaPSII{WIY6|=8Q zA&ou3*I_`lAP$u|+6$vs{enwFO^2tA^O0KdTF$u{Fq?780Hht}m}}N$cH4y4GzL4m zMjsBrZBJUsC=V71>qn8{tI~=cWbAa_e#Y38-tlnA8HD-)7uk9>!o6S;#g6%*w;6Hy z&N8!~y5xXvlzSFJBKZIvbJeN|oPYg*d$m(u145_zKq+PjgEH^PHg|2%1F3vv3LT2Cd;f+}d_Is^NAb|A$4>!6-MkS>~^S4RK^_^}A@t8}vT=k9!h+@LO~L zQewRN(OW%-b6h8bqAvV?Y@WI>Xs5n$GxzrB(R8E{)ORB3R+X8~+ycY}I~dw_d=uvq z&EWZuWgIkzo4&eE&hEyQNywtx@;M>Pi3|U>MSKon^0Kt`UpC&{fWV6=mOIz^W zEC6|}ZUvq#Pgx8=u<4!wI-pji5CpN#7a@tAV~m!WSz1h%DOZ@vdX!ZHs(aY`6raaO zMHAVZtXQ%`uU+B(#`DfBJ9bOJB0`fh&MZfAEJdl~{G>F4>^NgTx&2er&X{8ilByd= zVCBLQSa(Jr{YY!;-db|!HeUNq?;E$B{>?n6t5Y+*7OR=DYAMB48)aGytzdeNf~~hF zO5QwjJx5Lp?HBjCNAwg{b0(Igk@xM?V(3x%8U9~5e208E2UvgNv)Cx8%nL7mdx8pk!*Uny4d&PsTCw z)`8b{Qh}dbWRdoD!-pTJUlAgRwMbCdS&Q7_)QwbHrOG#qS)BolC5i_99#`2zB@H%R zK4}mJQs_AcI_VS}7vqsfc4MtJRoK%_8-pB^SJ1i_udM@_CIKDksaVvzI#2s!P|{f$ zsDDfYOy3=2%@m5#E9twqiMO>>p;auq)1)HQo7=n?VzbeBvZoMF2N0ulH)1S-2_vF`>ZlRIh}X_szjdz{eR|-p9;dAXo*3 zpZB#*JnGQF#f4M=2;hC-#`!%hCIGikE0rmB95=e0U-#k1+sa`jz5y(AUz+nqex9|# zT(Snxt44HoO}YQ-YrHt$t$T;n*4(TW@&IfWflVtBOUcsqTP8062n8}DrugUU$K-0} zBUC2~w(-KY6He=Fq*HpAd(X=;9k$Y4$nKt)eLier-4J8gaTllZEVy`GP_)vsJ5yzC zh~O6@o(WbNh3YQr9iu!%$m`VNv{F-%I?~dY)A5n}i<{d8z#1pWY=-8@5cPHY_9qG% zLK&R*?fn1Z%hv_R+4QnS<2+##So6m3L*-1UgQ>*s#mn@3TMCbEN*4`}7I?%y>~YZo z|NSL@UcGAVXUQ6JIwfLptHa9l@718aA5)j!vd@p;Co<=Ii^n_!RrG{Z`u3?;RtD!n zRyIWn)p?r7J9Y>+lY?17)r^aY|2UUqz(Urwk_Ce{8^BG2Cgc3ged3#i#dqA^w-rz# zn2ik(q1UDbT5(IF`l;m(!*YQzKJ z==yQ6_4-Qo3bL0^gxU4pt3rm>QU&hIWYz{88w0KWYk+GnWvR$Au$U+D6N?kVhf_Dz zI2mUJSxg#mBl%<5G(PI3CccjJf{MhqC0FWI&eZ*GlGA?_ua(>}I3j2coxk(E`8LZg zXWYS6KK@cRNG&}y(=zhj;tg0;VfG@KZ1&U**5=zUrl}XN?}~8Wd|*KSx-hyi+GfUG z1$kbHfJH38uygaYC5hORpVv;NbHNkNV+{X!g=QoiVkBOl?1NIy~g%|a+Q*Xm-s2Vj-)qh`IEj4dOCrr-1AHiDsEvg<5tJngTx*Bk^m z6kk`^OHY4OT>CUF!PuI%^&}i6?pS{jR;iPF2@yFm3yF2>wo_+1yG{74BAl1?esMD< z?_4$vm(mk)epzkQ&EFA>LyFgXh+^Gk5&TxCO$I$!{V01W`mB@3%bX_CR*;K;Kc7{e zat-vbYu1^bXloKHrW3xFk>mc?E`fNhq_8$FknWAB>dAv3s9KE;JCR!Fm+`MYR(4rj zI~q4H;rTup(aW7k#YyIHLQd|ux9@+1SYlf;zEwD?og=BZGo0diCtmp^CrSI|JE#Vf z>~gZo51?*-!uR+aJcbE^g@tPu=tO(-R4B{>_FtM$m{-740yZcv=8@igkI{KB$K!fz z;$~r8WJ+{`)%l$n`QMmZmlM3=x~ISl=)3lEQIKeL8*A^=N2N_?4ovcqt10%olV3`rf!8ZJ;fG&rarYyh=$M}7M`H)^A z%a#;YcA&5MP;N4qZdW^+9V!0p8ud0Vx>p~*C$?hwdSAyeCGV6)Rb14~k^x2bpGDE8= z#NL>x*=bD4uu#i&IC@ty{7o@fXNNLWn3*9ptIS5YnTBvvS4p7Q+c^)peXES^a@iWl zyn5Z!@oRM~tlA?;u!=>C!VeA-8U(}me!Lu=2y+G~30+hx9ik!}c4Bu7SZm_^T)U2& zroWA%a^hX376sE=N0M{r(AqW>n;&-MlW7;r-bq;cX-A)~cCt7X+oy!%7uT-b>6HDo z?7qP*!madvprHYb4iFKJ1~d;KE|256X=P6=oXD^PYCT z5N8r<^TFXvvR?CxNx2`sM9t#`yzxAPh|J9d5B6PCuV;?7T%f&cc{9za+N2pj7IK?r z4=aCtkf5=CHXl+I)tT=(N6R?aM+k8nl05JGy#h!u!WW<@xbAno&NiQta~edlq18OL zjMDY`r<=VI=LLFJ^E_3W{Idw?Cq z2o2zCI`-i~s7d!h<9u9a@ZO4!;pn62#VKGSb)G*9*tNrwC8bdKC9GdO5r8NBaB<~6 zFQ^;ueV^Z>SLGQORq60gnO_BvkK6Ag{8hHjH2TY9RYLhpSt6#cSmlMr|DR)05 z4T`&m4>`}>#3!xdi1h(WgH+0Q^JzBQ-^YX{cFQYLN_h%IZ|*aw@s?9r7F^y{3y5J> zuKJ{(QA_WO*K1A>pP08k;1w?6;hiD!f!>i<`4GgAz?!&9N(tKFi+aksTynH9mlj7_ z_m*WR-5WD3rq?>3HBrDE+mkqRGbPJ8B}8p_w$^;ubB}8|sGdj`krzyQ>#2imHA{`R zv>aZ-EmmO6BGi1`CB5sMP(I^5g0;?$5Ox}u253W;?^K~9-0cT9e0%%o@JIZY!q||j z;kWr)c&Wo&2XGTfP(Cr)N_wk43=eu4++1FU^RB}dLfBK4O%~QF+@RTmj3aTLZjlSG z;+j29apY8UlchIyoUr;-^m?lQDt~>eqc{B0GV0YY;w2g2qjw#ojF|9 zqfgFDySz5jV!uhEJ>ATnn<(NhlC^yDAA8sGuJJB|K(^K+vk5-68^5is?)g&{m89np zd}4eEnQL{LuYY4zk5H#iP1()sf2x%sdAgQ8!-_ml!>W4c*dA&SgUZQGboqi9z28db z+&90#(xhYp_xV*wqhrA_3wv?h=f2RfCvih8n&P_IC`G_8B_dj49M-dT<6A+hN(I70 zY%toDy|)UWxcl`-S2`Qdh7x^FoN@YXB30H%j5*j&$6r`>orHVywIr7BU!MU|>V8%B zv?YSvEdF%wjBj|JaPn{7Ymy6J)eypGo5u8T5H#Sjcy+$DWHQmr{T0empty*pi_nD= zYtOuha7S_7$>4&ln=9^`?AHHt;OCiz4F($m-%*fDoc7Yia{g)lpD1lI`~N6t{)IOA zvAsUglXCB*#BOapO^(MYre)dDFF#MjH#py-R86sOtUY-65gEy&)2pC)ZQjhahjklK zxSBlF@ZuM5+?e{)P|s(fDqnTFv;vS(D`zq(05~l3H-}NbS9gGi|Ef!{_8#ENJL+4O z-?Ct!j}B?Vd3ORf!S5M|tlnXx+|N{Q?!AX6zyB$`E96axyo&g<=1Z;vK*_vApy8&x zOuyTRDgLSX;^uEF>x<~>xXbe-t14zsThEQ;B$rIJkiny2&K!{CBlf&yGdS!kiQn6e zPbKW=lXdX!G*SAXmv7!$(h&FKqp)<6l0DJ0F1Bh(adPBcm;{j5AsAlnKpd&GdL_n+ zoy;#-{CpMCtGbwW(_Sr@n5dq6Pq?f6XTy16=9wo_jS{sxI}5w={)+9qRw#C0J8UI( zcUF=+Cv9z9ASS>@HDUV&@oyZwy!eA#>hpZZgg}5mZy~k@fX4S~5llC%@E|b^=_dP+ z0}V?J#Ix3m{>AIW+$CshdRdL6Kt!jvk#!FH{gYSU5W1` zTbNR1Rpc&~f_N$h#0&na?eZQqX{psx_p;0-cs_J}3V9`~{DH8{P;?_jUC@{Ks7s5Ki2QKI zP%II5ls=EVyPJB$rdemT!k#W>Fr(sjcMly; z8J7)wX>Z&UAE^gVm)+KPz~ri3UWK@?F|rrtg?lQ` zpFg4}(s-qp@MYDkei7Crc-&I(8t!@3zCMI$t-qQACeX3yUK?dDGnt4h&pz^*bet_E zuX2u4M%~*t^(||=F}3^5`riG5`3t;o-hI(@8y;B2y_Zdf4ql=BDd8UHXLS{S-`W{Y ze{YR%$T(gw$f|bQZbar=Ep%3rKzcZ35e-gsf4*$wZMU$uG2F`YeEv>-`9fyD;tpur z+i1b$i;|sOOCO^n?TEMk`1}9n%lXIDerz|z-Yv-J{=K-`1LP*o7Rq451eB>nKaw6i zX9{j!qVT(36?3A1}WHv7keU zuiZ`3!HhF!v12l8PO@Izk5EcyrjBQLG#?tfpx%RVojgKVFkY=w)wJErj*@mlI3x|# zgZ?kIQ)TOYTX4*AMOXpzI0K6@I7m%(l9m*-gP&1I+;z#?fuw$n9iTs6j zmRR!Mv{+4Jiins<5zX|#(mNJcql}N z_f7zwcaCJ4UhWOF^Aaq`0he=2t>vHPl$^A`xX!$Mw#Gg1x*=sgzL*U@UZJkUYIz()@VJ zRik6^;~F{W}PV-^3LrcBjXZrBC-JVF#yj9mx~j_AI-nv)ksVRXa^SH@ z##z3Z4vPA4%;?a?7<4<}ZSVvwhKg9SIP1m1?ax#idF5dvY@TMuZ)B>B)dbwGmg zgUBFe`(v{+;$vVIxWYaNfuVX%WRaZWaJSR-ycrJ`88}fxHtX)tEeaO12M0eP_|dm8 z1Fc3$u8;p7Dlq1^OL>cq_b^znrCM(kT&zu&+>h&*NZ!45790#2=>ix3-hjmJJ2@5G z^xadpyUV77u9rF%!!Nt7#)`P`14GLvz$k7zcL*&La&ZFH)!p=1^!_ARfxpDfMMZ>r zt0{JEcUoN;z_B7SnTPe9-OHHz$Yv6d6VBc(2+ZbD@cs*;lgJPE?jzcI#TFyUEo%v3 zU`#D?LJ^b-nfkIplaGwSQgb`URQ_Avhd9OceM6BqL+dH^j`YBQoc@1iK>iisQb`_1 zd>QMj^-T8?V+7=+QzDj>GaxeUBfkf6f|>W}?~K&u9%9ig7Gfs80O8HzXjdKKGls}CK0VW7&Qpp2W~l#}23&@I=drS7&6p zof~iHG%DYwB4N20fE)j&X`##XEEH#NKX@4pW(ii)u%-5Mr6*G?&^CK@s@04vtOEOa zfHMxsld@ekGq8Lxu_#!-UM87C#AVvD>V0RFgkO~Mn`f7~-?UnfJetDL!Q1#XWfr|x zG-g4HD28>tQs!;9P|l*_UU^w!a>l*=ik_uIj|=$V^dTlC_2ll)E6-(am)o+OCpi6t zl*Hh4YX^Kif_|!|MqU_`Sr@sqvx*3$eOddhok@HTxiz}PJv1c!?Z{<*&i5PLKBjy7 zS27oTdoxaU;(Tu%HS-x+Q`PNZBt8$|_Mr@8NmdEQsSbquk#0ooi(vYQpm4L6|N8Jk zR(m4FGl$HQCTsQH_R2W-3mMMYD_LiCcY`iLcB6u2&dGWkm{T9dMcfZ)uJM7q8G`O> zewg#BwMr}q76iTN2?Y_%@f?8atkS))F!o@Zt*&2XhmL=!hoyGkC&68hb`6j*m}t#9 zXww#dZB{b!_5yr(lU`GZOR?quOvhPxEI_+sPD8;Cd`4mINL6 z;eu{v{7TGwHx|S`&@8?mH>p-h$dv+n13YcKUDFPTn@by|b3vBQ1=pu0N$(t)o|B(V zja?`6ATQm?5_NX+b1<)~5lT=ba`j~#nWbgN=$=izDRl1!>t1mm;Ym8^QSEpRapD2i z18h2=xE}=clZlq1?RkzOdN2ZQ(XPwC2PL;V%sg$(Kn7A;us&Q}=@g$#dJb{4BW2&z zyLY2;dCY`P3ofddkuM@0>x6k5a4EL_Yu&W+z(Ms$2KE-obFy&!7v=+l2aC!aI0Eop ze{I8#Hx3Klbc`Jz$&MD4dBKV$;j5j!-ci_Nw93VXOQ3YqeSKI@0vPq1d_b;WmzKn5 z-D?_CV$_$>$ArWh{MXuI&@^XiexvTAx;D0Hlyz_??Zt%-Vl7T?U9rcqLG}fb*y{B~ zS%xuBR?e5j(6~I6FAd#!Ixt=2t9K>Z;%_Yzm7G;w)<^o>dAqk>=vrT);j;rvjIP3$ zycK3O<(&`@$%OV4!TQw;EkSjj5?GvWf1~Y3#0Z?>c9n zpiO8Y$Ytq8@Hd$da^vzJESfCPH#Kic}*piw>7vq0c&$5cgF}D z9d)R>FhM3I9}-)?M7O!GS?=i7e$7Epg7!(sfoteUuO?j`1~cB>5R3s><>Y>mUC(6d zm#29(SS6XfreC|t0Mi+JLk90?#wm=q;8(7#LEFYck?UZe<}Yg(+MXWgAUN-!lLe<_ zO_z6->dF{?L0tx2&_K)s+t>6%*)$6+K zu&=5}qko_+35vhVD0JVRQpuFroB50oRU6bzHn@~Or!eE2IoANgtpO?g*F zJALRROGgU1UOnxkwhYs=zaHJh=54E(X;=T+J2+YEky9V$u&5gGnhT03$$+1}+Pi~U zoc-izxYowx`HH!&MQ#mg7UoZC8Or3lia$ueO~C8q-s-H2d-WdtZh9WCrk`HEobCC% zD4p7!ugy6r=1G-{mVUZR83f$~A6|WKzNpvs;oLbcN-NvN96chiZ~3qP^2xHE(Ur-K zh@2s-Q)Rv3ZaYp7+XB!v{77VrO;t~S5=A!&XmGj|PxwRpyL#P&^LyyZXj??tOv6%J z+k+d(a~&HAHZ}S+zDk~UW#7~X+p$Cz2d$knnn6c(W2*&D=rnVBh(@i<^1NV$94$sM z6x&`wc=<&rIX4-KLY6}~TqQbWt6r2*QLL+#Z#8|`8lbSrroG7ToO~Xtm$I-q+NFdahXZRxF|XBh7O);w@)W=@VGD*z;K@yT+$Cp;JmnpS93d^WwEMm@$bG z?v$hHZVL@JurGgl3bKFnW7#OC<^PbGAT>V9&VjXvF22OTMe;oJ z^2X=Q{OT+L1B|4MVMlz)#$+v;qI|1))6WY$ze+5V%VrVX-i!GSEVf+@9%RLdS}T|OSt=@!#s!ac-icXNTtKV#rTb@ z=Y&O2?Yqr;4Ic-h9Nka{>ABapD8I^Q`SO87eA1LqRsS73mRW=~gUjd&S(4}JJehY= zQT?x;NwC5&S-uxbZ179*j17;M%{IhFE~iV3>dO8opv4*KbJeqbB%>@-XHmo2LTi_9 zx)!Vd=n8b|BPjKj?p$JxZ6TT-GqQ|$G`Y{zCdHynFD=NOV~hIx<20bp=FQwzbS@MW*Y^CO z8Pj8ibg$wAd?r$vk|D9w3}|8oAtqv@U8-w}4BN0*vzgc`6Xk_uKkpM9=wsK9RPAhq z+8#hCShUR*ZUY?gH_IQxN_T6kl+I*{%C5)H@UiYDb@j`yMk`ItFBjz1UkSTJ<-yB! zDP90&eeuzwqbfiBE;yrrs(SWHnai(ACkl=~JNc)I-#q^mc~ieV+S&6}lpv9#ZCYwr z6&#qK2~sx0vkacN?c)sEa~YI8sloMT6E@ghYsp>v`k19H5YX!|3k?Q?oj0MK_8qo# ztv9u1>ru3=2Mr1xMs}<|pg$gOH8o(5hGa1?S@mgQKMoje<5qSaQL*g19tO10j*4sN zyHWNW9&2<9tlH9uMZ$3Dho2uckrF?o^&qBc!kbyA!5)=oaAjzEVzt?~uE&&raH5Rf zy+Z^nyMI4~w27vd?8}tZ2LI9n1v1yaQA@^nynilFm9`c6ET4rl<67to33chRGr`^l zXhokuGEqUzPs=Fj6}G%2^?s5{QR|k>F0rNd7fxnGT+gcjuc?`Le!yuKDF)ty+Crv1 zCqe}O>L>tEGd;A_O?FnO2{NJ@lqcwEwXqHqI1Y2!F;{=~drWFRjYNW)AMe=jgrY?I z@E(Q0(l)UUUd!t(?Ur4;v$VPoAqsx#96e=WmEK*wfNv8>oZ5Laf7-k_-ucYQiQdZt zjODDV*{Jeq7Q%HfQQv+fSng;rL;+b1R06;~3I=3}xCcLK)90v)`^5|q)Ew#ybYv$I zBr#nxwX0p`>Mi?Vq^p#{JnoIEn|<%e3ZBFq3pGZafT!a#MbPGlmwNIhF>4BMQ{g!O zCSP#u@QA?Q=LXRWo~3H6er3POJU%5w0N;3VPb@DrLfXo;`qeETM#Bp26x`!YSVQutTZL|2GqI&bwvIhSbRNY}I*GOQZo;nUBUJ5i_$Td8j5E_5FSX>A03{{sZu=`W46RkC9BjJ&SqH?B*9(0&W z511xi=;fHXA#x<)>2AF_^f#Ak84+$UxI-il;h=6Q(Sx&h38r~{1d_P|mo;H5rBTg( zm=+6AcRTd9U87u}c;Avn{ygN8zNpg-Kqk+%)s86R9Ys5-(3ucWBIynn>*^pkpE3AR zFscip2l}woTsGfUmB3j9a*JJMzj{6R=Yj;)G*^bprn#bt%oWH)Dr_Zrhft&5WREIj z^;CdFZofW+H+0pz-npmlj!QTra#tnN>bk?lIjYWUzb|?99Ke2R-_epS{T5rHZ|OlD z$~1imr?Fx3ikHn1Q=YYJhXdyIc2qYd%frspumc;ghL_W)_U`KA%$I@B$V^ku@ z4c^s)Jld1rd$QtlzVFL_J(TESt~BTA67$$dHr*pq2VR%~AjVr>r3E@VpCw^>4Cp1Fqe^`h$U~y?Q0~Gtd%>xaejL zzassu7uU&$ezVhvv3o2}x;wrWK(#zipVpH{(WLF(1V0Z?BLZWgR>}PnO6#^RiWP}j zbfnnwl3t(Z!Jv&W!p-skEI2-aEU#%J$29byH`a2?DXPPLO_1>3yXZ2xVY$_b5NpdT z$sK&ZUyeO>)<_%#O4+wKln{-5V%~M?!O0uKhh66M{Ih1uQ!5SLO*Uhu_NE8Gf7WVL zl2xp35dONuOn7WU)zUI?LD=Q_pQm0&qaD|V!jJB(AzAH)GG$jlGc17H@08(*Shjyz z@g<~pSRct2kq4z<-XZi9m7^M)x;>%leE?>|v=W!?N@Z&-JNpSv+vjB@rg=)6@#0sx zst$le@%AQlhtbbGvDGc-zK|x-VWX0Y9ePk@=Zk?bm41K#voGva#|6NqP#YNiOp^ia zZk;qL5bF6eO^uc_B>>Puhn@oII$sG0)#=1Z`8)VVUpE4A-d%3^JFiandxF_Y5du!U z=i}G7()tI1UB1{H2x%8r!pzS;mm$P8zIs#VCz|$*#_MnF{}uMmy8S*9fqjty{{tO- zu`e4z5SoPao;Tp{hEv0n;tkBYr3^jcA2pL-(L@#{wH$)Y4o}13uN$qP;IskLX+GzU zb(^Hi6{PoZ@-i6E|MdY_?b?PlA@2$Z;wUI6q4qFHr)=?8kHnxISALZx-r=TmglVP- z_dBGSBEhIB=iZe3ZV!F#-|t`9fe@MvQzy43nz>}ch8+NF~6 z`dLoz|MV)lZmE_ei{XmZ|9BTgSRp&WDs1=zba? z08&K=fKkG6TO14A_SYE*zfu5*So9<^ZvU#~rQ!<2Ah%_Vr&!l4mZLQl){$&|cscu^ zdnXBX|J)a4Dcx1~ahHB^_qP2PX^~N*vX6JYflEx;&a>q``W?pd{sAaT>Ks3s?q@nd zyu-=eFEH;HKM#qu9Y`(sqh#(InmfM-QC(tIMB%a>bP^rZf&8~p17F1;b8(Z*^^w&< zU@(0N+P>M_82p?sP1#hhl%?27FE`SJ-xV1!V*EP!B39$czymPy`}Ye%|6ji#zR3;! zxMlG8y0(b_ElOl;>bR+E+9cS~MjUmlwi(8$O6Crpzrk5$pqAX3xrtUz=36^?tGf(b!_k9o6OLqI7PD^T~;Dh>J;?+<5 zncS7}W`$bw-A%C}$^8K8oqO;a^smIm#}w)@WU*s7{A~e_;QhQXPp@_9ZfqBknTH^* zwk6vGN?0qV5GVC?$;oht4B{S#Od@4b1!RS-J*?Q|!D2Q2t_`3HDW{lqhF-yf&Pzh>%n zk5J{yAP4;UF5W4m#fq4yq7+qrwdZw%T^)+kiuX=o=L01v1;cQ;Wx*z(88)T&oZS!1#A)Yx{r6)7aKw-gkmfEjQ{-&Sl4PUWUMsaX z9rG)ziBn5*IJttTbsvAEv*0qf^Tq2g^l0Z^188GK`nzAM9mThYkYv%w_oIvN2$mYo zfdK6X1oi!s^W;|POvj)iI&Y!SbD=H%zaR|$|EP$ylA^B3>J#0mx_*~C_L{)D5vq;; zQ5Q*8(um@-4ubq(dU8Rj!##OwS!yO0HW@Fdf5dk5nB{Z^`=4jz+kQ2JGZDnEsx%yI#AkyZe^M#i zN$64DnIy^c!En!eVN1zPU+Ox8p+udLVpU9++WqhYtCN_TtJ6!fNZ34#Y?>hzWw5Tt9(aNyf zJ5$cs9T1dwe3ihOsMo;QiaIe|JDiM(PEOi%gLQo;=N3@0O2t|I`w`CgC95WVsrB}; z9Y!h`<$uPId);pc=SrKDOh4Q%-?%|yCJPK{FlQk1O=>v)(+gwHyO`I2WU-FpV6>8F z;K?Xs@zaqEaUwN4SvMi#a-FasT#cdhT?3kXAje(#^hg|bz+<_^gsA)L8Bmt3A?w76 zkucKbz$Yc9g$-_p9S+MXt zs|`uo3flU+bZiai``z&ZBXt?m{y}#c+XEt&lAou5=SQkpZ&`0Fgrz5t!9Q1EH`OhV zGGM2^cOZ9vU=;XmN{sH9wUHDp<&L{VUBbIgkVzov5OV2p8%-Lb>4$RB=C{Tk_6xqb zG!T)LCpOsVRv~Ys$biL(1xp%^KOIc4%Z#isi5{R{wzAWEw-i=7ISvaRwe;?RI?lNj zIT`$r!h63p0)zlghBT75GF|uB?62-iwn;OlaB!*a0JfuS%9Z)i=;pfl_@*Y^{paC^ zzo+b*W?)h*rW^4{LT0qfs&rQL-*UEa7e!uYz2N?dZ2IJ~UNS+J+d>EBJRS+p96`+9 z=aMo>Au|-(mm1L&1u~2TZ71%pQqx6YffeKnWpt05Kg8-D2&|)qo{z-mPJ-${9feO+ z8|Ajnes7**SM8Ll6IX9i8aZm=AyikBZRnlB_A~`3qLTpN``2D}I<8`qqTHkEJ0Rbu zqyL3l0R9-ghO4LQoIYX`o6g!{oHKy)^fVpDxCR|W=Zej@QKnYAwB-~4s`iwhmjpE)EZl^LMv4`x1 z+Ly;49wHc;D^gIxmelb2j|&&q{*F(?zk73LxRL4nmv7i?ghB0^ zFXnz*d*ND7Y@OrsIqS=kUch{xcwSyWreJ||5kkbOE)Q45aAFids@a?E$hYTU-gVz| zZ>1p1mG}fNeBx%ISFZQ_M7a5KtTzoqK$|?Ig)QO5Eek3?RRVpt>9(*LTANgzz&lwi z^aY}1(D!bglqFeiovr@V^g?BZ1I(nrUUhLG&jT4)d{Te4oaz7w&Q=rN-?H~}f<#)W z+U$fq3v-%pAhRggRg8Mq6FROzAbr=aCJR>+ral`$orO(=|JViTA3JoM&W-ihhFr;| zs383fbz1WNgLFT}RpvX{W_v%m8G4@q9>Ze%yB*fErN)tr8gjw`Mu_pZPXbP4JG_Xe z2itt;mFmBL$vs#&V1>9(n|RLA+zg1M6ZrTr9tCd?a-!HvZ#sQlV5l&BXaavI z_6m|vH zdok2zSjEGjhes!*U6CgB z3eu#0*g?XNWkZeV(~+>mL&P62fY`qTj-@@9aMuw7`M(FQCLFsb-7ahnY)A$v8YR1z z@rV}CG1urn(29H|uasVTeBNM-euq3@50v80IQ8<2bD0->`=|1e;)$<%cJ#N5Dv}H( zN#uGDyH?Jr5&H2#7lboIGG@baS+AejJI52L@GUA{ODO6r2H8!SFKr+_Dv4D7KYp`L zfv5Nrq8^#BOA1L~$2g;qMOM1@qS{-d;oRV^9Fq69%qLxB%xS!%2WU8cbT0x*P+@rc z=8-_|zs*0bHq0N`Hn_*XuN~XD&HP@Wj{z@eXDMs^fieS2b1?7ECxbUq>fT_~S%geV z{vKh?Br7}>eG6?@vqFps^n#1XbyY<{`_+HXb=u-D3BR&>7Cr@|kyj5@x%P8mO((lQ z-DCSzx+hW<*RV-Mc@ZT-!I&xZWrdD3k+?TVJr^bObEA0Cy+&i^_7lc$*==1rXl#?Q z9B?xj3gQG-d)j~X#)Xm5e^ZSef_~l62`MWtf>vz}YeLeIePiEtuj1SxaOuv~GG@aGkzdy^==< zx=!?HURm51$;h-Eq&=O2S(qn}`r^Pa$A7)-jv1v@>e+~%R&tsvVsfruXm)4kb92Vu zi)tGQC(8_1IueG6hB8n|+?r>RvjFSEuQH5>eT>r7kaSbY*o{D?^`}8=dg+(5JU@LO zW_wjc z{3a4kJdbziZnD)d%9a+U_yP31Vb8X5T^vQpn!b_qto z)2qvose#JS~c4DN3X zlr5;yxVDmt)HsJOIfIhg#^BjHviU~stTbjT*4V;o)T;*aGxVbX_f}t_tA>cu5(3oa z@7dNX2V=JUDU|iDXEVyO$naO6yKsLEh!R}eX#)Bdn}VXM zC&xez6s=JOc0%CCeq$Y274PDE#gU+C##A9q=I?=dh}O%?l8&-VAX`1a&Pn-2?3)em zE2lb|Yb_@Sr|sp7U{ywEdlR%O&I{6u;)=}Tf>0cTJ|InbjJv91kOfabc(Fl)Bl|q( z;qUHqHS`EOh)W%XZwRvG;!IHJwl@!$^|#qIRsVaYzu&uyQ8FtT7}D0m_22zIm+|kU zgRzwoLidg-6m0!lOMKAeC*QrWG$@{fZYS>q-xpKcZ*gwedYl_JYOjoKV(qcUE(6{I zX`%Z0XG#nW8<(x8IkIr{h*WYWlx^jC!vy__q z&`jTxY$i52#>c#x}`1*-H9-vI(Lk z3KMCpSNSXwjGTy9vkpMDk$V7N_voGiAmo0-#xrWcolr-+3B6jp zGeq*m!utQi-gk#JwQb*8I0~Wyau888fFdGIr6>Z4pa=>Ql`aY@(whiU15rQ`5K(DT zgDAa3x^x8usiF5Gy@ry|0wj5B2laT)J@wxEd+&YUd;jFimlHhMd#^RuoMVnLCWu#p zA(ry~kB29tekJ^{C6(BtRxWmA4X>;)-6_eqQX*#LU4gmTBoc0-ANl zFgI6q3G9CJ70d1`*{&}Vr6anFJMq*c`DBE8eq5CTp0C#wU*b6)qj_n`W;cVXmMTXU|5nnTC7&xq&?$fd7;W7Yj50cen0ifJcIL<7C-}=puIP; z(&ez&=cHe0>z;gwY9NL7a?qWlzZUD-;6-LMGl|v37Of=aQYouFqKwCP@gU%(k9Vlb z8XMUb#+q>}z2n(^cEi!^2Sds9aSz_UiUl=n1!h#&sX@9RLa2AiM z#y0y)1=Z$R3mWB4kqIj-EZMV=ww{}pHBPW%7CbAO1A%oE({xsw?zAN6I^xtOO6!0< z+(?jp#ZJQT3s#nP7Dc}L9G`8ndQNk^8ADfwbhTT3=-UWG640 zsV)~pD&K`|6BBOF16Ebrv}pR_CQGtFc`H(Y5q7QtWfV#Vxaq%xzIaxDM|jn$wL zDB9fdaP$B^^`D<#(pl=O<3{qXk36E34~@#0miz2hF=*@-4&hKS=gC%dWOiFQAR9st zYGh&o*CuLXD47TRoFmLYe7PwH>wU2@?x?=Z5%I5L{Hi!*GULH9l|tq_Wk$TCX!Hu88?X2>-dvR zIP-R;X0q)iUxgs5d__G3FT^w;A1$G;!uJ8@CKuMD_0ExXM zw=x|t-zho7OdR#3njh{Je~~=7h2RL>_iBanr*3Opx0Z*d#f3uSjl33N&QocLlktoP z&df$4KAfxqtY%%9qe+xy$)K7ia@>i%W21)hQrhga+As@KVd&n#_W}_?)mt z9xe{MaeiuGy3g1=9I7c5Fo?#`ev57JrwEE|1*YaKlgypNy^;-%??0WDl!!SXSK2Lg zT%#N#Z6m+I`_#M7dk(3iMRY*-g+2Rfw$la2)b|71mLdluJeDkWh+;M%C^y%{z$SUc zu8aD}rr4R((ikX&ffh?P=)}+#3#41Q1LtnBQN}C8d;Z|d@E<5x?&)|$$;%~~)mO_T z+w*on!pGk+30wwBnZf4>e;0`rS7onp{y4N7)2Htr0_|BnZ2)0 zYf0PLp3`CRe0>bPba&Absr%?YV z_WVfyR@KXP#M+Zac9JXRP_J(sxRG4711lxp#lFZTHS%5+|9uQLz#impcB5S}Q=+S- z3879i1xnej4EYHDFhdz9O#f>!a!sNH=@@*+IY=v z9jrGj=So;{?jT&~D88z7*%UtS*cqM{_xK+3yXuem5+u;v(&fKAVTZlbT^pe`JU&lp zxl|BX9f15v{;mRvE=`T6>k-p%05WFw#eNscxi9U9{vFUir4xCJ?M~9km!|V0h)^~9 zqs{p_LPxiZ=}yZyw*Wa-Ko3xM$~gPK9C8I6y~9EmKs$G#8#EfM;An5Li{4J$>z6y%6F z1)0b^kizqINUDlraMO}~a49lG}4UWYD--NF1SNPqk0GYDj>Y;PTTDuH^ z-Bo@rEab^pfRG?_!8AaTr`Ik!IwHGx$0A;d=|xsun%cQQnYJ&Utdj2_$X%ujr&qZ! zcyQsRG}LnBYi7A6Gz@?yayoC27SGw)i(d|)*1nATTiH{k(Fh2w^Mj+;S`&I^7~n-* zYUggRU6%dnb=F#!uwz5TUAc=3Wk z5(^jpqm7mvGBbauC&D6;F#m|svcKq_?{|xqcDw$wlEViL{45qotZ$m^sl_aDje&`a zO`mu&<4|&Hc>@7RcAxr40>hPYZ&mmWK{@9tzH>1GDkR%9dOSadIWYCq@Sl7+h0qYw zk0*rfP9`Iq%wDqwM^=h3cI|!LTNoO1Ek!|C{}Fqk^I*u`oc>bJu(`nszI>anjs2#C z)YmDVaDACCxx*+tT?z@9T-HA4#)!0?Hh%@FQ~WzT4V&}njFE8F!^q>1$IT>@PG9m# z^YUHEg7URCsVz}t0TodHFcdOczVF{cOwuD)p};;hY>;QaKN#mqUZKgQA;+P|!w*yJ zZ|gsL@tC(VrQ#?Nm_*jfxNAKNj~OCqJ$$2Wk=4>I>a(iF9i6tR?BdyXI8Os(pCOy^ z7|>@tC9V+<^2C-KM36zecMf-&NKju&)0M0R1^Y}@8qjIv8Z_c>c0zLYkq?`9ip`*B zi*!_aw_Q&PO3I0ps0C&*#xxTSENWO_8h*VZodAxEC>@nZILA?u?esu>oVPDnYbMbDynMk(wDY zSF3=zVoi!&%3%PtZ)HP$c(4&9yZSZL9>54X8?{nGte`w7)jIxevd{l8azceTDegso zEIS?Xz`Bp2967cEJJSL9RkVfYZ35g-WQLnKP{s-jd13_=s)9Lp@uh{{3(z_z2&uUw zqY@p5`~r}XiVJCkgpn7Bt8ho2mWrylPz8!2X~;_rCV(+LKsq?=&v*6rzbyJpogTCp z-x;*G0}4tWNAra<*XKYUw`cNxwP5;Z9+mg~$e%^WjSDq%lV%MU}2-Ew1%846L93GIjlNE7vp5@^5{(=+QIyW$hS zwToGH3>0+}EApatQKNO&H)X;w&o`*i?O8`+3(;AoEco)c-uw+=sDVnp?RKTkPwjWR z4FzgkuS6MT&8YR>nw6WcT=g;n#H_~ac&Vfi?z2Wuo}4@L*rA!)zvZ^#BtG$;?i3m_hd@JUP{-hjt-)BGx`a=CtKb!YQWr zrauw`VWD7)7OR;hy2^9kEW9pa<2n5`5P@(}E8^?^o&1 z7Y1x=-kzYGaj1FU0vkPw~*->CIs!am%3WsdLA- z%ejV46#7Gl@Q_aYe*uLwOu@0ABUbriJ#Wr21&d)+>4)zm2iC*g5 z3*fKtm>3JlN;V!g>I8WU&9tDEa>h_q+wIH-vxNn$-jNaZX!VK(s4UG8cZUBT2%vnD$ zaqiV923-Wiz>YPb;JO8089Qi?*}U`A2QLwQgAT}L6_5tTrUizFzks-7%cEI!EBKYT z9sdm?=%(Tvx9gXb3wPk@;+~wEoqD8owjhyPS{tCuwZO(|im+eGE;)BCz4}Hj1_)Ow z7;t`&^W0XWm9)x%PFOwNy7fny6LU3c}I@}1$4URZhlblmiBWw_PDdMzv zKA=a63Mf}6$6r;kwnztJVk5f*2x;ue)hGz*;H~eG)C5J3q5R$uHhGQIv|f2pfzHn= zaMB(290+pL;2dAXHzo<=ppJRSjnfj&z=7a;0b8I(l^mx*w0W5hHgcMCs?>>8RR?Bd zC8j55wO$jBK!l%lghsF1@6;K9?D^OgdNp+&V|+4Llc!HlhKOa9um+2aH#Z3{g?8xW z7|~oIB?B<1WKUsDi8@K(3wFIHB}$@nq)u{_)4p!#g1^ARJ@%YgzF#VbXs@d+NxE>m zfrCugYZla3!}oMmcko_c35ZG2oJzR z&!VVrHR>6I%*1b8X7@fE@a#;(*W5IJ0UN!eFBP>1tu>PoLVlrPSoqMeb^^gVbo|L8*1>(A7fy)S6xL9mPq$1d&j>I&ifczHE)*Tnfx9H2 zhr2RArxCnVuYw9*fr7U8UKLTVXhQ~#6+9(eh2V%+>K5#z$Grd19)j)maGsyJ3hc1ybBo1 zob%r`5%?(m%K1s_=7@{h%&)zV1t=B^a@y2EUR-tp58neyXX?G0g)(iccwx)92)nAF z8+ILuC`r##ljEfk2j%Jkxcu%VlihiEtABzI>kG4C4>~D>DRzjhoT#>78o+d0?%boJ z<%;#PPF#$74?faKVP0)e^RAEY87?^ArA8V%Bc_tqv-}ptURG&r8bS|D9My2XY9xTZ z9qk;!*TqG0smb4w7m6~%5i4M*;?Im{hNnA=fgfR4@bWSECk^Hu)%Hur*nBTt`rx$T z{#44z`kSo@z3c|naUu)Yo23#@)Zo@<{-ZWHUyZ_}C_A2m@`?*g#1kB*SB{^#;>vTa z>>#tQ(NO7e){Adh+ZD{mx3b7z;dA_~+~rD)bo+O;V>FgjztYd31_8f%q4&s}-rQ^W z{U%r@hGVa8itucT;8<*mUvw!%-`|S~m~lIAE>(JoiQ@C8~CrZ;#{SGMBW{xGY(GSl3f=G$JKylfe^ z9`%5}H}pBc5mf)9UhggVBlYJA6z=OZ^};Xf^<3uX6EBLFKZ%&a)5}6cYy(i|e&(;R zUmM>!$~}*vE*q758uVjV@%LYH&eK$?garDyli0tP@T{isud zW>ZP-N=MCVW zl|X2q46CN}K!a}je##OPi%q6+DruZ&NPj_98MXns5h>Yt3Rg@#Z>DP`VvB59Mcf$E z;wOUrZJP`(PTH}1*ZNJ z;^%+_>>*p%QOuqQ4ihSA8PRbxDfy*E-gqn<4ncngD#WG$3oP}{7sma(Ck}Z_&wkh} z8ssrb^mlRPiOaJ%$ZZ@i_~aPqv)F5%H^G4&pTct_aNkh%uG4&KTM^S$0@(2WPxE<` zM|s-$Rb%gf!Jzh!E>Yn3&!=939rnep;s=tz+b2H||0AaJR(c%XarC~O6bvag@nVZCqM^5_Bom_9;; z(C({+B2__1J-l98_F~h2uDJV)e}Vh_qo@fMF>?-yY#Iycp$AYw@B$oY;e@mfm&869 zC);cw4>ADIn(naqVJT+W74AdcsIiZp;jdmA^mi#Jcmj% zAhR~p3aXcUeR|ni`Q5QO8QZbT6&rSUnP>Q}em;bZuM4QgZNUkZ?%BhGBtcQ!M=I;*@3tC&cCrr&FM)5ar_^;bPkbTBP6Jk%&q z2bn5h`G+gxV$#DCQ4Zz67DA^3nD{$#&3H-WtlDH4=T8#(EM=&6nXngA(f)|aBnYOavd!7ONm_3@Rg;shg!!kU z1_A>9Gv*-@5sgR8?0XFK5;(1oH%fs*`6l0L4UoI^j%7X`=da2D7RI5VU$gJHdFiV7 zX>NJP_X=@@IZ}^gzY1{{1CyYF75j7{)+C5h9OKJ&A{4N>@5V(y)JgByZUsPwKCuHP z#m#fYa0MM3CW<@Vv>$eC}+j9<9Fh|*a2<^2TffJvxoZQm(a1l->9oUy=4b6SJ6`k72d#cy6hlYQH6^u+5Y zy?#n-nc@SW=-y8vP9$OTT&?Fmv4?@`zq#Wr+m?`9rH?r#(~{JQ6QXT>z?`{U<%v{~ z^eDYXH{K!E6q`P*8oR_^5XkiNgy(q_kTgyNM;oa=J3VoP2<}Q=Sj~xQLBnT~BgbrN z;GWt}Au+X}i)g5E<9^G~PdA@R0pG1sn~eQu*CqIqkx*S(=9RMyK|pL>~Ee1hBu82UpK7#K5Gjm~*V^fB-H=<3~k5Dn@Gi2LF*`?~J{dTs9U%#QYU z&=)sPK9za;pp2>a1{a5^_Oxj!I9am@Ay)NP(OJC8eI96MaTtfBf8cTRy_5KBLmU-Q z7jKg-4Z5Z84Tgjj)2;D!q@qW6A2a3ER7a_|^M*y<>F1VQ|8%@8B8EeC0 zawk*s)#$H1PXv9gs1+WV9`n(G6TKK7_|4z31Qh z>f@ZQ2D!_Jd1f;eKd?4~9_X~XOiFzkE487Af#-SRmNs`ex^*=@SQ{*5m$-1AUOmuw zXa>1C%SzGvU`mC`7mp8TWIXKVJeV-faouLI-BO>n>!BUwQ5!`OZz0^nKL=J^S34D) zqMJ~)ew#y0r~#u_w{9v?M${wiyIf8#NkgM01un3bBah8cR&M~}l^8J)i~5udWM}G; zWs+$Pl1J%Mz6fSEX|8H=pIUrdRO5O4GZ@Qbp>^Trn#Y_<^ZTYcDM{J*XNW|hCvz2P z`p@paK=rZBjcyZ2uD2F&x?H(V`B`+uW=F0l)Xu(`*&gg$SflJ>Y1*>%({z+eHr!}M zM7Btw-ZK~?7u*o1?vHjA9-d^cZAT{Sb{5~Zt;&jK=DpN1oj|yZ{{f0PXPVc_0HClO6x^EpOAO%Ozhi90UQ(20R%SH{W zGsQC}!fc*N))o-eMJ$TJn9R@%{)aiLqvm$(3%~MKdPn-*N}3~s2QrB5#EbJCCQf0@ z%yS?mk_WAd8g8idtvW+G=$|hwGPeujF61)k2ARn-cLs0v&pu%dgsRvC)U2+C6+uGX z8T9L%7Mqe?04Ig^)K1^pei=#ceJLG*ao`dy2XGR(giKDnsmDoymPV5@FQ4 zmwRl>KJzagQ3K*)t`!cZF9?uN01XaNSO%O!mV~;C?A*rd4=DLCjhiq=A_9eZ2t2n^B^^?eD7nV;9KYfX!`7WTX`)ry+uIX5ysyHC@<@Y;41KJ?7=2}QLHiALB63Zv8UXc~>Gi3q*-*xG(7`1#W-Q&}4v$dTU7C6n=;U%$S8lZ$FtYI1vrTICb+&!0+4!oscdud#ta&BA6nvr z<7h{1Ga#xT+%z}eYYM#T+#GzJgac1AgL$quN6Gs|f?+Q6FLHqnwg#9CS}pdW(L^vP zqP`nU6gC9DeRkECt@82Nft!56w2N-gRvk%*i@et+cG@$|Fpge!pRccT^-clbhMQ1{ zd?unqK{{YCqCjMu+}TZ+wYR{B$f7o_o;I^TF?= zA+SQ5*452T6(oJ(V3TFNKj7K;8h)MM_F;rZmy+d`Y}7pIpb+a1_D~k=@Bq~kkSPe~ z-_J>i)W?^^2|qc_P!+fH74FSH-W^xC<0BN!#X9y|xp5>!7{^C&ZQ^gVb5i-v%21%b z(CKLPQZ@o4h9l5OBDsTatG&XVJ&$6b##TH-M0QRkSQfHdNi$mSnpio zdT3_aTs1JxoD@$kOOb{6ot;-5Zo>V5LzKhvTz5W&q|PjaMW>8|G7 z3%wi+x$!SBl>?N@C(1G--(#AP3;G|I_?$<#F&u;B7=wj;fil5DnCVWx&EsT#ox-bu zakNs)p|&e2pNCFnBK}Pcu!%B`y%c7s^>R^w(e)FgcnnMr2ck>E`LTu(P;HC*2(K($ zTm#_0K4>*d5rNP5X>Q{;HV{oRfjLtS+pYqNtxsc6IO8i=fCIeKa(jv2)yLZp+}^^( zF;x~7!9{PdCi{WWQ54+C*kA4>Z3@Tlu|4o+sO1AfvX7#U(y{4$UT+X)c2Us;>B;>9 z7^gdiWdeVXe+D$WP}{`#2IC|hi(*feiQJ7%04QkLEUgY-@q3?FJH6{#KQWQ*a*uOg zp~};_I0U&8wOEX+iTdac(S!6KV-ekgxy>)K!3+%y3H zy}=Z8b5iDQM9E`|j)}lT-~z=rod3b9ueY0>dklEEvlZgO3LFi3LLG!rjf<8FXVmLt zrr!_NK*O-5AE|_jCG<-|vuc3r>T6B&IP4I#yf--NUm$%yCLFCiv5^M`) ze~^w6i~JOH&6Ga_)S4CCyA^2%H{T=j1FZQ1$n@4R?MZuYeHCtf)e%l8_4N@hhzHg!Ik30O z`pl6C5B+D7vHTn3FIN*^EF0#~@^J)UFvk4ueR}fi`{efwL;P>|g;kgzHm8IiZsvUs zgh}MhLSQ-a#CJ^zbMs=B`kadgxPO)%lVcPaI=7uC@oDg#k+(cWTwfkC9`_1Rm%bY_ zBsxijDh#CgaeIV4WMl&8t;ynO3jO} zljYlMdJ%sAorx_2!?y+|h;;8iE*yesr?P!4Z8nPA8{{M6ZZE9&puw1-HFAj6D&(#y zjoCHKYRTtiK|@AMqV{Kl>;k>R4foS-ttd-tpK#TsftP$gc0f$G0AHX)dW@4>J>VtP zCKppy=Jw6sOhizanW6%=&R_(R-?O{P!rjL=j%z5=CjFJt*v;C#c>daNk?hn`r1sl|Y9$3Zd9+!h~Xtp=zPk%QJXtqnk zoTql-+OAe0{vr3|ZxB_iX^Nw3zKM(RK-`88%sQST;W4BYi!O^9I=IkeLHfRMfV4lFv zTVe3h&FltG9`z2e3bf{h2*SmE`!^KMvI#ren^BS{|dwx9Sh!nx}u4P(X|XlEN;l!tyf=ioF);w^y%0#PZ@ z4+Lw|zYf;xCe(it&HueGv=u?(@J@prxrN|9bQ?IekI(`*!x)qwa9M_n`p|ZUCi@BZ zEll@r*K7Rr8mO@yzL>UdHjZqq8SoeJa%C_r0nB`Vx#g6HO!%<+1i@3di81%?b zu+0e=Vue6Fp7G&pE*rNfy>lgu^Fc!uMGh4`VL8eOxHii z7JkggL4;x@qnv%0#YsMT-{A5+w6ZLW<-tYD|GoFX7YFGnU4fmK`dIh7DO;Lq+M zJm2yNs!YQ7*n%OR;*W0AiYkFkmn%;}$k7|J(zV0?t!Y?)b9h9H4wSHEcJdUwiN3vI zW>*h>1FgWKvrRKS6K=Hc&eb$Ps&U*MPmqO|HGe(r}=JG2Omb?6XU=>$+Ox z$r;dxI)e5U;QRjkPZSl80L5m|K5bGN%c2+R{o9R|EqY&F*vOghM4tXQp9H)8bF? zz$!a^;FRzhWd0}4Hy%IJ4L>cEHMWO~=ByCXr3sG+!cQQX}QSW2KtQ$uiV~qt?J|vMXvJ?7tdw}?8GmbN!c35 ziCPr)X)kqW&FIc#EKVld;8v%!oiU@ACOXUtamgK%X}Xi)gM~i1ATm%EeT#qy)2hVi zg?e$p$gud%RVC~Z__FcF8@z~r_w^xap&)~LRk1;~9v~a<8K_m2iF#ll71{<62UAWf ztKLIErU*6@%?bEov%Vsi+J~FBzARpn7jbG>l&zn|#w4$(-$U@CE1tuBrukMp(B#M1 zS{C}P(KXX%~L-Yme0*Q zf{3SgZ;~LXyINw#Nf|fKz5ZsUC8+;hBVfQ!;L(MP08HwlwB@cCD!8uPF(fa4@n@yS zY%GE6%&QNs23L&wLQM2pRm@7We3PCQEC~l&`w07->sV;%;9I(ye?9d|Vew?h+ZLM_ znAyB#BlMzC?WL1FnPkK{$$LYJs~lyMuBQ7u$$=wv*|TXpCi^hWrN8s0e1Hgw!otD@ zP)NmsTR6MIDZU#6_bhTnt^cau-0~l9|F`$aZAOh-Ws%{h8V=COILvZwmAxM{lGwjB zq95&egHZfFaV!Xk&CrGIbc-a*_O`YLX$Z&fQu7s)z(AwTYx(?K(sS`mIh9_H zwbf>vMOXNPeb6jQ#HV$h?ooZ_CDhNiT10fwnOyL&QC9fowLt_$pBREeoktc$U33-O zMT-?OnxuZNc-`Ql#5SiEiJercW}i21W$vQ_Dw+193xRBwTY$bip?0e^e1!sT;bYX{+u!R$)ejvSvkiY?BH5+iYp!%ZLes7~uEEdrjCt}eP_Ogc-U!EL9O+u1I5i7yMTa&Se+7RkF3gwxnD zM_!=I_-1xF;{uts$_{Q51W!jd%U88@Rnwk#cHFc^Z&1{#5&tnR={VXKS8yR`D<-vk zO&m@<+!G1M%)w&HR=(u z1tS7i!`g}#v%I`k7G`yc1n?=GL0PucOjmdC%Nur!uZu3}oHKO3iDr{y%=5GON#Kg2 zChP5GcrnwQv=zFV1Z}b9nlM}Eparm-G_h-)X2oq1b?KyW)+7sE-6ePAZ{pvC7J+qI z^!qjfA>60!lzxX^tM!$AFd+{n__Z^dm4Eb#b8^1RPkOTAk2ce9K7Wo? zS>XbmEqG_06G#g2_Y025ockGrJwQ6|-zaI1h{xwAbvuz~q$u{RC+4#9izJpRR$OIJ zmf^XG>-GKOJFV#U?!%a@U)p>gEjqO%3>k@FHfGi&pJszeX+nDwjDOMR|qG_@a2< zQJHgMRK8JXjT=u+4QLgyu+QYoTW^QYdFJIx%1mnGOyNMMjtit^<)jdu=(n3O9{Q=r zB`}R`cNg2bukz8J%|V%TvRmXErr7z4G>ph@?eS5Kk7S%m$nIL?;oN@VSKn zkaN_6`Ienw^Ldy~5IM7y!V5p}RX5rVG+n(TGFzFR8L^!Ca|a_TT@dK1gya`DVFZ=B zypT#S{u^Jr_ffVUy%wE%X7?JIuPSxenW@fpOd35%J=?eNGwPlV5sIW! z*zTkF#r_Pl7x~v(!JkNe`sAX!T9|DeRExx@Sr7?%Fw}|$s@3n00>)o{&ZRf}n;-7< z+6Pguz6ZC0sG~S7Q~AhWBjgQum3#|r3BpaYmf2;q>XuQvYx!C`^uA@PDj$uon2pg7 zoxVvT*Kx6scTqW(4#Jl6wbI{GwDA8L3N=c!5`BN z$3YQ3xjHUl_9Z*?1GmBo9{{6gJ-T7N|2v+B%uI8Fst)ODr!!Chj<_)jD@rZZ=K%&q zr~tO$9uxWm`QU*iq8ocb6vR#r&Db*j#o5@g8@X&|MqpSPgtkg+KM{=o&2lW=*IVBW zI^DOby7XR)pg>WG>~wuf9c7|?VG4zPh@;w=8du>0dW3$q#0`!FI+EEwv zN>8@L?dWu4M2RuOn-;Z)MIQu(s8{-Ftmj3eM-ly0^mdG_Wf5rvGO9MUYJ^HWBXbN> z*H7Aa`-h+UJud%ET>q1F>R-RfH)GQa37Kt~=ckCF6*AM-q$@#VCW$GY3a+DJSQme%ubOSCZEwZP(>t09lqH(MEm{} z+{I=d`jWmgb;2f#ysY&i(L!5LwsGmThnP9=WsCm8rxB2t$q}2bFj}&2~ zmf1DaWigi6;RS(ykU~#j;0IPTRs3oz%HHOTLu=x36;k90zXR*iia01OzC1W=FFt#O!(8;t5?9j&3MWv_5FB^|NZ0f z@4y_teCJHj>2dcc2mo3&>s!KiwQ-)h%XQ_;Rx*P^cK^a=F7UIRUJKMdrX6BceEWiw z`&wh5Pm2vY~@;GA+1GEVksNAqA&ncBqDtoz5 z*hL+?kZ2Je+FR@<19xEvU-(tYl5r9PW_e|!XJ0A_n_yRk3&I`IGpv!n{?eb+)t@!_ zptOvyIE(E5{MdqzaM3z;^MPrF^_h9;%7Xy3a(c?If;iAjC7iHP8KnW81?q8di<*L`G%GJQVad?38Cczj84XS z;G8q_JW#iD($yNBS#)yQTx%BoT6gRs(?i-adX2hcd|H0}8jP$@1b@8-zKpUC;YH1$ z7<^e=%x7KY2Jk?58E>DC8)Jg z1bD<)ntts%+>x5cJcr#=eR5!c90UhL(=AbKf9Eyr~Fu)gyTAV1!es4Y=UOa_@&NrZ3%?SwXE9eN!Qum=EM7y zTuWTaMRvL!c>1%m>k#=yQ~#eVrSAX^4X6P#w%xvY0o-F&J6vP7*~wS5`Q%Zh|5K0Q zTd6s}(haJ3t;OK`*PF`~82{puXczP21zi0=MF&lfebp zO@uYYA*~p7K~JpqC-&>ljS21)kAq#aoe!X6&NraZ{Ob{seyh@Uz2-UL(>%U63|GHu zYYvZy2@IYRsT{QX;=5)%8VYhvo%yGR>Wjg@+9TCB@2(*3HHx=V3o@j^Tib_O+wM2Kp(RoZ*!FhRKSg1r;fE?#$rd1_JV1*Zd1nSF2MCalA!;qG~HZD`x@G46f{J(Wh|Fbsd zLsTGC!q@WY$F)svJ+q$QInkFv1?KkQgJ+v)xEUwvw2yx-=huZF!dqvTR{RZAx$O;) z!3t?JH%ZE4j?pry(#Z^lNRt8mGs-sF0O{EKp(M7=6>AZ0Ky0c|?yqAKdu3+!o9#SB@FRb$uLR>S* zx#(&qbWc-to}aw^Iq{u~>O8}G6;(iKABwR+U1jRJ);bDAnijpYk57u7>_gcQ3Bkn$ z`|AXNH%mq`lJU0i`rgss-6=MAoGaGLZ{u-V5((WbR@mm-q04)io60I4ygCe3GympS z(wn4bfb*_AXdgzLZh@*1MAfds3O|@tYTiU5FXbF1;lPp&aFnxx@tih$PE`sTTX>I| zZ3B&?>5BCSulha3|9rkO`0Fm~Y)8RYJ8%+^u-gWxPpZ6Lz$yn9Pb0F|j01a)k~*?J z-+;E9D3~R`c&UM}rUClLW>@t6gR|!@$e5dHV`e)JqP94ei$*p;7VY@Ex{j$}UASCh zwz)!E7_f}`|Dl@#-P-37hl}?{>g~WF%T=&#SPv+opjY0{x0TSq;osH*StJyNh_MpR zU4A)IiFCX-Vi`8_tZSxydM2p?an3dR9EAl_pfvS~@8S>)Dm*#3L|!hcfa|V@uDf}W zGE9T~E-b}ZXk+9tA}bTLf~U1&B{18JRwKM&eejpi)}P?$$X*)$_I2~#0XsJ9#UEwV zS)>9|t(E087%_HuZQC+tB>@wfKNws%Wl)Qx&LdA^oqHxnOnY_`np$2Jmw)fEIf31c z**GFT;v751YDg=>O`WL(8o*F9Q)}tB;8-Em+t3Y|wn}KqEOgSP!EfXnq<+0X)&Gqb zD7}=6gC>^^KqJPC;VTV(5)doe+RwSW5rZgzI*iFkTb;$UY)8i)CirQFANp`V)Ska0RQ&Ph zL$o%?3xxwF2V9r?@gXx^IatZNU(Q5-E4a6QeWn?-&f8-`0j^u>MMKp)^sX_`dUL4)2yp2Npl=pTS+j0yn=u7` zTWO2L3ZOS}ka-xH2!(}ya+1+&(3Jjdh6446igH+sg~9kDhmO_HqZr*#{H9;ESN@ER zb3+^f(weJc-*n>hOo+bgT2 zK?p+x#=0kDyp&sL;g1ri{Z@q?zW-?rFPtObci**Xp@7Fg>S8Jw`qH_WH{*sw&=N8T zHdqG_{`@uXo@@5DVwLbySC*B@nHgJc=2^ET@h;f_lAP6}Vv#lWRD2sTa;YFCqafQE ziGR7u&*7kmdASZSo+Sl*OQ}>}M$B^3GDJV!+)h*^F?`g#aQu>0r|S;Hs)&t6;Q$*} z@i4P)F^*!oj4wjEOsMJ@QGcpW0fS$Abo7=>*t0Exi+zfp%apzj5;ee@1JR8TBpYXo z?@Nu3@sF0;O%V*h>iw>~!~x}U1v;6pUUdPAGXN?PY*sn>FKcHVkf1_2H=Js`j+6cQ zeOmvod8V%3NZHgC_D?3;Nxp}7x}9GrL^!47x1BmW{0&LrsEQN2@--#6mqqe$k18ez z6sNm1p_lB@IrnSD+ss{-OJSCL4KnmjKm}?Qfu@jj^j16DI-TAx_roatDVViNjPlB2 zXMAminVy5MyPwK#_~0B!9ioiHl0esdooI4H)3wCxgDxCxI|Eo-4j&nHqri3JpEVH! zqAdZ;L~ZQ;mk_hw@TWF`%}QGP+AjK+y5NsMq$5LI@`Rmepz!h- zTT(3_C!Gr*5@oo68VS?u)HA7@bAM5@)GC6^X4vJ@;~s@r%|PTY^z@N?bRg{WM5W%^ zC%x{x0V%BFKfLPqfRVgF=akrE?G$;n885zbMlW>VkMscAd(gA&hYzBi&SxCOpugU| zzmw~NPy!XYfBT|`1@t<4=Znc*#TMi*pvj=I+=eLCT;dv2(pzaviIX1Y$J-2kngp8X z6f5eYm0xY(0W;!UCp*+~AAE#!KwU&^9^#@zZ*WMMJaJ$sSrpC0)GKZ{Zfgvs1pGixznx6BW3TqQ}4l& zc6pQj6&>WL;!B;3rqMav{dChhA-Es2nu}4gTtQNXkl8@t)tLhA=}Ou9lVIEHfQZ)6 z3fPGLqn>()sNvYsez4HpeX`y8EE5sW5 zF0V=ovAT1hzyxu17_jL!~ zrtM%6*Et{mu$|h=AsA9f3VYG)BXFU9U@V9Zut@KA>Rav2aoICpOev;z!UgwI#OvQE zJUgsEm31Y|udQen^w=TQ@%Qde%kgmO4 zAdg(eQP*%IfKTTWnf*@p9>T~vbhcoYZJG?YzLoD0bF7F4PANM<&c~NlmKu-bVqRK% z&hzK~OC`kH!GNQ+otDP}lWIqEaW0lNz-e~`1T@&oeUR}%UjaA-Xs*8E3ePxAoh3@GHnA2*$2)ZCsQfNJ5I~vhifVZ$RtD{^b-FaFlX8LWbsQ%$rnYHL! zv;fH@Jw_%Q;XZ`|Z;+A8WqcDC?j+J`_$6!&&;7hvh=4d(8D;ys@5%=tdP?A$^g|rt zioowt5Pyf2_@^Hw0d580jFIl(=TrZBZ^36DGKm?Xdz@_+^)^K0&lOW9i!Gr+NMZ=W zK}0%P&!GgEM>e4rGcXoKz!gpcc#>%m3;R|JYnvh$Ge>|&7H1Fj`7O(mkeyH(qGCZ> ze=c|Ay2leie@OJq=%TYoB~ql;ZsWIf4YpG6845hitj2LL45`K_l)So>gF!^DG{;Ra z%&S3MAC*g3+`}3uG5ONOI`o^B8Qag=dK_?iY!}c`?l{EpOC$xPD;tGXkh=$m1lui2iktg`~JrxK{}QuC0G{Sg=zra$Ta^2 zK(Y6S=bOTh0EH`*9QJ<8wf;`F@OQogGK$d%xJ%v`*I0sTTqu~sHI~mGe*ju@z+QJ- zWCCWu8Ug&H$$Al?aLHkf{6HasTqe_s=K-V9aKcH1+mHou+%15Wv2Ak`7=`& z<7g;aNrm^@|A{w#?E?@?NPl;_pDuz6LVtX(f5$rgcPPa+(H@0ADA?M*BFf`}DFt`X z7Y^iXwi;59Y8wLdg6JRfcR&=Ev|9ue5-h8N-vJ9~c46<^HgdBB6lgc@!${owpW>hW zmd(~WK+F8HU)S7d-qq}2b(YKpGQZEUD`g8>^G^T~7%*J{;(rm++$PeH7kRE35eereJUuNnUOC@KZ5vwg^c1}5ul4gkZtSX8>bssmJy zb&y*3f3f%GaW!Xu{P@Q~(PX^0b6&64b35eSokA29 z(Lw%Ca_x}NBl_D2J#t`g-Q*ry#2C_bXiTny)#qyWt$TEl-rN6W_F=a?z{0DoCBON} zB=w!Ko@bH-*>jQ8s;xll=qZ1V?iYl;8-(B|tn$fJ1n7Md3G{w5em_z)sJyKY|E%(M z*hBoxj5q4P3i%-`d&1Hk89BGCQJMH7Tf zI1Cr?caI*?2VDe~Uvv@7M4{&^I-wi{Eg|JA5#Pu-YkHhksk?CBluE;)?j+SG$aWIG|F0+zDFy9}_DRYj^T^KPM=Mghue zYNB>O>9AOss@BDWI zfAi!2?+ri?(0`v0BrX3>e?m~j@!^vAT4>mnOlyAb;=_|_#jas*BtE}oZg0K;fwy)J z&B^7Dj;jgXW!_s`Y+Oa%Mt)(AR7D9u^X-_OCd>?fNVb>H?{)6rjIw}!%TGd36NgHy<#Na0VytjWEAJod$VA+%FHTffxp9DMEYu6eV2hmZE)3 zm!SsOivi*fAjPUQW?4;nTB`u3=j2|iqRo9O&fQS?o^b`Xt4D}*j~C;qt6%sXXp7R# zq=lwc=Em@=5}Q-IIUZ_Ic!EWF4Kh(hUQ(5a$*VI~?oN_f-!#Ea<35HpdEl^hU$vbI zgmP1>^MHY@w8??$WK^k181dF%pH2PWa81hofdQ}UTP-C}yOr-yA)2|CIFL-NeE+5^ zm83%ERhjsjsPpFL9n>{0=|!P&kJ*seNJ=l84oBilexcm;e?ruQzY85Ih=5n80CU4f zs*2tyW_~-X?dj9KiZ&t68`4Uvfi4->W7?r3T-K>(?y2F`v{zC!?{Ga97@t(u{SH7n zI9jtxbd&K7P?h|_eb_7nBq>u?`2$JHeuTqGq!7Ii{jAbea9}h0vY<9wDWK~Iypl-- z)gj+HNf6R~1$(%2vgqEXU;PI6_R%&J^u-R=tdH$l)9(tYc<=Q!ZQoOV;^!LkyU%8o z%XPb-d!yXxy?BRO=ZRr+S@rg4U#7FQZN40>-{Tu(DT(Z3Im@q7)IIm5wOshKLl+s}F>ax!*=o z)>pib8!*)E`Qq%pE~#)b(hZDYS@43 z!9u(dh|g82)qT;2zam(eqlxamwRHX*Ll%MyJ)-p7sQbw8jHekN^*h5&%Y;9g0V*l{ znWTm_ITt@u5spP5yszgph4+}jtT zBQw#CtWl)bsM+-k^KJHk2#s&;Iol#$0c6-`!bv~u4!wpITWozD`&~$p2UD9OgYGk{ z%{=$SQjNH~YYFPtHM0?f@FO+|asY%p?1I%8MAihD-JbV*`=zoWmuodELHBhB^KMy+ z6UgQm(ET9v1z+23ne-P9*DoxnQC77tje8%0fgiN}Z@i5V_LHtx(!SvQ`QUQjlmUjF zij>J?SfXTHPoXnR@{6%W2A`}?`X6^b? zOfz;}oGXy0im_nlJcc~=5Y7sGi}RmP726n-0?rrTaht4qTWEj1K%Kv%P*|^^QyJ7| zgyb@j?=aR_MF+}AAySFnYZae`M`0>heaUo1b9YC&cCS@odzt`2+J+9k^C~;P4fzHH+8X( zu9KFkNui$*J=D4S{hgRCT|!?keg3E&P{bLl;rh>|wc>k_d=;Z>0Ta<0zpbwxC7Ade zvl>|jaFHxGWdj2P{U?Dt_bL|xx1i9C0y0A$T3@5u;957{%rKsgI{AiQD6-In-i3{Y z{z)BwP?Nk70FP%F`XdU18er7c$6SfAGzL4i(5gLrA1>LQi|wBe-T#ii?Q3OQ7InwV z|BTlEVHo891-yRdMd&#>Q}V~lXRr{7mBWTXxO)#*KDlOxf~zQrxgxH#6ysQptm&4Y znUKiIeG?9s5aPx?<|tT^y&E?ZMzh$j#I?packo>rjQaLNB{YsdW@Zb*j=H^sT)hZJ zZ(U3#M{TcoCChrGfQ$UfKSaMo*!$h?r}YyjE59#=RGG%)xQA#<4M~l<;47WwsZt+s*31MTq?Nq%@lQcOAwt1)%N&wSf|CM&8>@S#X6-tg)0))lzW zYOS|_yx)P`zspRt>EjT1VU72LgIas*&1bMKy#|1{Z;M3Pu>z2QG8HDEZ2W-*>Q&8$ zM)hI_34~_|HErk1mfBsx?m3YhvlM=PsdhEQm;9FGX|s_Y2Ur6oh#FkrkS)W}wTwju z*3buKv_D+2(oa4+%Y5t{K^n@i`#WY#Xk|(!0-**o-t(_*uYbl^2`TZ`9$>6{@fXIr zX>bdC1-8I?$}10V&&mrIV%ZJyR-fqK3E#aQ3kbC4_IEXb<802hQnt5y(12SFNNHc4 z7jj2+-_uZC*{Ls#a3gfN@JH`s`-RXT$k+ktB0ZeLw13C)1@4gluDt9Ve2Htau_t5K z8}{4$w%V)z_+B+bq?Wxs(wq*l|46uXfFvbdi{E!mfVyv5p)5C|LBJ&Ps13wxb+(v9 zFmTqD8by?%x*2;?{^;PcpZKLI_xlZExm z*}C#wvfWsPC*(io^QRj_u?#rws<+^Ha)ms-OK1B6qP5yXkAGN*-#J=AzT^CJ zYh<_j8ISIbB|TBC0q8;=IB``cB`uxG)Q`Ds`J9py!dKo)onP9_yzP~C-)_Oq=}YpL z9NTS4bZ7#?n;_t>`KYR*+T%gaxm#0jrA3)U^Fu_s=j1>Xz{oQ$5PafRZ-(w=KR@dJ zfbKg$x=pZJE!gUcP(Z+KdPP~}kM_SXtWC?hO=+=T+do?zU@$c(6MalbqU#u>+{uY!eBBSF9Lh=D?%G|^QiZU%DDb}2e~;5 z&erJ?xB2t4^!fA(d*{u(mY~8jXTq_ENn1%k)*w#4Tk>%JtG7oF1V7cpa0=QcJvA`c zDll;C&x#|-sQxfXoW=3;-!hD_)!mKmvi0DV=>1|%hoa_(%P|*nAe|eTNqZN2Z1+1k zI50Bnq$uxxz1(zQN=COw%o-H?wWd$7CTT5@GU=K6AZ`TP)|imr^W4YwUbHfy21Ds) zCGFh%ny52>v;2vQ=IcleAkAPe@8|`Z7(ujZK{3r`T;GmiQsDmu#&R)L8x=e|GB0{!@sOnLi}QT);psYDP;<~zSd%p5dRYfEIKvw}2n z34c0cPwTM!_b%}LgO=jd@LT^37Uyt^&LHHd%m&?^{*`d32Mm3{J#&M)LTsXx>`jy6 z6_0XK5C?TFOEYx#Ke)cz?zxT$YXNp{Lf>8dh_b zu>(UUK`GrkW5=jXB@Ek41pbJ(?T@tjWp9l_iO-0qcl>{-DCc3j-k1?hWBiU;Hga(* z-1R{ZvwJ4%Qqu4q=5=Q1nh4IGFt^>pi{oB(#IH1zgHQoboIddpT_lu4@83^Y`_jZ? z(ghcZS4yU{51pt+xO$KbR&-;Ge|uclI?NJdx1ab{$8qZM{dj2c$EnTn))EKb-bub= z$~O5APujsYatHUe@WOKwb#$v@y3V~8xP)L{Xt^3rM|Dhw3gB%Kds#38 z$e9;Xc4h%OV*b=(JFUc%7Y+hg69$Q?^_H!e`&5$wgv>3A=YJT?0{H8k$InAwCHmb^ z(MD45-j0N>db~@vFt!G#K`)JXj$~B?!^JHP7kBx)1LVgtE;3yOo8a0hvD;*OW?}%N z{Z{4&m12f9T^~t_#P#HqGys^_Y<4)ZWBPQ*FNb$=*zdOh?TDu<811kwI+vmRbw&V- z4{DhpCpo25`_XBhSg}CkVzM)O>l4ZaYpu5lN%i!0r`whz44U*QD~(t z2(SiTqvpmp15S!vB3bNMb>QRAH)Md|L}8LwTK-SzxZoYfT!$hxYF#(b&H?5`uVl4w zVW#n$OS1mqvwl8s28@)=&$h?XG-KuifxqH}Vamm^C5R44=~_d+>2DNcF$<{Ni?^*D zr9T2K!p`^#J;{}_zkq$DRdK;oVC;tLQvE=B@0GH3`*FlR8zbk@l}j&+uYZEqRp2-R zKWWXAO{2ot535;gPCi4&QNDK0A3_I44g7-}jA-Cj$L)*{@3`FZ4tx^Ti=CfYgq6_> z6NOeophnMz_pm~E56X=u`{5S-c-;~8V4cBTW@ZdVEo#KY@5+>oJoa&VCyReWwBohG zaJ1t8@{6aXIm+aOEuV@GgD{Wv@|;v{C)8 zE|zRFwm>!`I*#(rm^U${4wf^$EC#k;aPPU1s$@k+}Yz=)W^*rfZQM?3wkIq^>cXO zkjJ9Cgt>=|HneeU1`%d3$h$jOzQ74W58)Bf`l2UQn_%9rh+Cj;e{O)%eribTTivc< z=v9Tye!7`+r;3Ek_`paun7?ql^)d}flvvJr5ec}3H6BIwM(R^@26P3Ejz~i1%QA8x zW-GZrC5L~M$eP}K12&o_3t})Jl=Gb&h%C^%tFJ6G8DEzAzN8Ar%+uOUMXcp+yu_a) z9afL+8ONh@WhS>tXK`((`=(LM7L6!kUu40C4AT}00vq$R?0ba7{p!aPo6l7bDNDOM zm*<6NNQ57g5cUO>dq!lfGGzGr5Ud-$RMa0pi&XI)^6swdViQ%Trr1+<(dUY~tNBJm zo981q2vNFn%vG9hW){dHMx*p^2{SHXRv8j@Io>}Qx==xJLIaaZB_(dnTVoLSVNIzB zK=p*)dy{B7%``3fUdAm0AJ>1g5i^;GhI#SpZ{@B`jYJZ`{WcIdUz=uyZ;j2W&;ud& zY>*`i0>-q11O=l*xrj##Z@^Cvsj)>K_mt01pxT-c>1#g3JHQ^Y>0S$5bl!CXsi91y z(;c~uBF!3u^hv7=kWd&Is>!ly;#KE7_-FF$Hx)qc;zRB}tB7f?K@n4`in%=W@}z%UCGcKUWu z^ji>-V1V#a0Nu-LX%9cAJVp4hxBR1r{gplZe{;pS4U)r28R4J7EFrW^-Y*5RdH2mc z(a0^5&42CYHo9d69b>{M0&DbjjQtZBE+djxR2QQX0OeMG07~S4B+uN|R0wBoZ%RP) zkJIg=Q#EH!T7pWj3GAFp5(k6q!7!w*z`-VICi&pZ$t|fN`tgI~jLCulGmjrW1hd8+ zLpPeCH&p<^bl~Dn>@x#9DX0#jk-N@O-tmRzbcg;sClA(4D~X+kT->Fay)o1fGhr@9 zft;?p=px&ugVco_>H`Q`jGR|sWzZi{89q%K7=2A6fAU4803FQSC2x$eW!J#=0-DYX zx5f3<_5#1ZsM&-E9zbx)0O^-m)%&9Ke)q8LL$t`C=YYy~wQYfY9{|6fGpr|q z=922X?+% zI0}+GM`T}r9Q;Q6sDx3T!?|wu53j+j6$odo>4rn*VyHAhVjuyP?NgE;cTRPJaNFPT zkG6ftHiEMW7NBwKjC#?Is!aZSt+bJZf#hx@XlZ%PpqF8gP@X#^la?yNf zzxb^xAf8U^B>sRb#`Q56puqWu&svygk1*N=a?ZfWtTnE*mth!P8AE!@7_l|u1d2za zV5PAX9X%p0L1x5E?Zlkc5#I%Z{^w72)q6y0RUDoH1Jj9+FqrZD!K_QQ|Ycg*G|cc zN`7DAr@Vc9PVD_X*Y#NaUaneY9yEWa3-)_m`(pTsok-&LjTp>E;thoO0F1EI+t~<& zu4Y6$`-J7$1oN+;KYPBa)s{N>s^M7BeK6lLMsXR1! zJ>|T~z#CaynFJ66yJT2$0&2>rU|Eg-P@oMNj_t-?|YGLYnR3kasRYkQp=Dmw^q~wC= z%D)X>c5V1Yu&B9?w>rdR7(6^}#MuR4Dmk*CUJ4oUP~ZLxn|~SH7F|6gOXmIm`{D<^ z0{{z7PEdk*; z8s{U+D=G>j4(?^??;LFseC3Rq{e%L z)&Jxde{w{0itvat6_!XH0sRgyLNDEV(gUDg)20|~3L2bUp#pV8m3_Vxwr^#bO0~`Y z%D#k9ji_mYD2ANON<`DG4r~CqeB~w7Z2raqho0twr8lMd27P4|!2m@?k;u;VRm9a! zm*X8YV#u6*zS#N5eDtX)SNMuJj`^mLLEsp+x`^5WYft^bX$hb*RIQF%o^lL$Mk86` z`5(0dMe$GUMn@5jgaf_|AB+bq5D4P!6rbKUJi+TL`*rS9@5^)TmF~YeIPrV!mHY1R z-LN5Q@2?G4h(QhF{Kge&lHXr-nY?P%((RVFw5Cm%pq2LX?}9Z_g;Q?ht>Od&YOyA2HixELZ#FEBIBva5m(d6tRB7ef%t$#r%c-ayHeL#)hG{aBieE1hLQ-ccsnp%_j~TkVon$LKE&czG+uFYp1EMBiNCE*&J&5g zNbVgjzp^(JFR00QXz~0_jT^hu8H2MC#6A8XLGIteAq&`K8<6ShM!3O`CE?HH2)d)H zOsry05kP=aM|(9!up1p<7L$IyN3nxU;Lzz+q5hQ%4D_aQOo$v4Iu+API}KEW!2=Bz zvemK2G~18b$Wa$!vZ?~e^)S%rc7Ow!Ylq@~5Gyix-|bnD9NdK_n(nLHF?QI__?ZCY++?`3y&qqpc`5C1y=%lUq9im!}qi`M;Q_2SGQ|3(-R4$ z#|Y&Pu|9K9QCDC!F?k5l-TZy8)3b7itcjAT#4T68n@drs-jd!E5nVd51{QLa%f`(GU^l|(80T&rXe z)w0+-zgOXfeV1aIy$vn3J;Tg~fUliybT?l>p<>y-o0&)7$fCQh2Q%C9RBHU-QNkg1 z=}g1mDPG2$ImmDpKo3%zU`c2K2^W=dlS&h0MN!#I~xDyRflb-%84B<|$ zf5XIk$C#z)@174H7DLi?U_1cyB!83Kb zFt_Suw4K>+Ra&^}iu;S1H^6h&uu@?EM(H`!c&0e*T1#jMr+fw4MSkjm**Zp2)&h5x zXiUXp{-NVl!A(wPymNeSzlTKw{kwd3C4EqOxGJ4QO~^hz9qm3(^usffWNwP_+0^rG zD^k-d!x)$I>WZcpxIYaQYdWO_C;h*C=Tx-;c}06~#(5BE_M}~fv8RUHq+(KiBATn7 zWu3LaPF_Lr`+2-nUTM1I(;xN zIkpFsBFkdkb`!R=x)*`Lq8zN2?ensbGRAckc2i48G8SyM87`%BgHFDs1MB~<&#m?MyszwY2t153}$DcdP z9no(THJVhVl@)_HbL$vR_nD6Ucgk2?{W%WxoZvPFY3nNu(~RU&s^goOtxdrDfQa~p zmTPI#{`Y0nN{6%B`Dqzu=8&Hp*YYL%JI!u5iCerxk^e?wvEbOkFysHl>j%Hm2q(L$ z738H({Z;g;;#(dx1PACIz-;dEPS(l2`zH0^^i`h3=mh;2{Yl9g=JXd5*u(mK)xPk7 zMzW5vnt)CtRpdOs&@wZ3BY%DBEE_hhC?ZvZrb_j0fe+q6+tlc=sza`e26JMOBB9nL zxG8NJ62|M50V=+&UG8+%+^(i9D)r$D_MTjfwK1#fk+a4bx)h;SDuqH_@37E>;MWH> zhTvX@c6XFqo!}3!8NP`zJrp_-_h5VY)rFkjDB%mwUkbA%f$uA(V{XO?a(7C`t?3(| z@DF*r^)<1w7S+ofq(-qa*;#n+=6PN8WmOAshdrZzB)dJYewKBDj{L|!ug;wm&$T9B zJAE@{&pUZ^6P@})SHTuUDe)JZ<30?75f6;nXLDWloqXR-{m?|#HSX~wy4lh4{awy0 zarEBnWw}%K^scXA=QqdhSyy}cIB^p^@M{h)p(F0uRj_!(<8Gmu^RdN`HQ|y8S&Qzu zC%)ssVrMVfOS~jmN}G3?y{0#U6C^MLM_GJ#7;5dpD-WJsi&x&0?ZFJR5D+imG_R9IovKVS4<(e#0TJ9?&Gr; z`!;bp`W)15ivGG!*1Zn2HdQVhoTRtSGz6UKJX8y-*rWa)B<>V;CqL>rPP2GVArkfZ-#umv0%-x@6&p?U z5i}YYO*WOf2c_CER%t#jY4>!HS( z%cR*4kKs(krCDrwL7kReSrHbKUfEGeXM}d}@oi}tec6!-NLb%z+L=)=k=qI&psU8fVzs5>=;#Qxc!4XB`u~a#1PF za>7+gii#e$?E>522a{^p$+$`e<)zd_;tpW6^R=^z^ueCWW?}@)J5nm!{IZrZ5-b*; z;`fGf^T_TlOKbXHsXT~?PFaBm=PHEp#V1kiUnvzr&o*+XeUGcJLu^ww)yy_#g2P7o zC7GVUc4_6@x{J`dx?Hh;Su)o(80mAWXlND3DqQ9G;C9t+{mdXr98B^5H_c*Dt!!N6(!}FQRYnaJS5g{SeHpw*)ph^V!Ip7sr z_>!oakc7JZzj77O8Cs`bhHmdSz~Q_KZ(whACinNR44F+{RBO@IWw=ugz4dubU47~u z9o&t}l$Tj{%cJ^#o)(`seIxCOf?~KI?W|HqeA?7gP57oKnd({bT;@wHc2_qg&B7vg zx_|egLzQU{>;vk(L+f38ylM79uog-;GGSM8I)EtPcL>mBypt@jIAH;M;3f+Tr_vVk zYv#KK)!OA)hn#(U6N}s$j&ex`>@RX_=AH{I__oVggc#JQqYmxEtKd2+T}+f!+@`j>^C#mz7(s<<4$}!i|ZOl2GjSpn&%E+QZVVUX0fGLGpWzWHibKa$v{{ZVeHRu z@8GZ007E<$4)Ko7n^8V+qz?tw?MDn13|SoaVGO+}k<8X`KERFG!!nw() z)R;Id+?11LpE*P2W`_0}0Y#&mdb#mfcFi4_fg0+fn6Ykws@1Owib30RT`)yFa8C6d zk^)h#xes5{7s9n>i4*%Xk^R=82Az+DXlLLP)%WnTV_`mQdczXMxq6Mqylu%4Ccv_# z_n`V7XNAO5(M~-|UBMWmM!^=h^-Qh$`gj)ZuCe1A>$PzI%@ovQN#(HX%*Gi$;u5Xi ziaoj^UxqR_9zHTg9nINQJ$vMPdKy}H_xn!oMGxn7g4cNwP3Ec@oW(6}j@}g8WKL$9 zu5aLIx*!shzua*9(ejf|fF^XVra|!gUv9KGUzc~5s|DA&NJ@TpOXCz@b`saz$32gp z5_8y#KTs+NFg50vHWt+7rR7ckl}U}GU2)5;`Li4xF1yTI%D#!)UY%NW4742uoATXd zZ1y=e1k0%E2YRFW=vbm-3OM;w(?yesqP_HCXRtk`ESo@+pEG?IQ$bKX04$*@`jdU? z8!Z+sP*|H+iA!ZS`4)92KXa43*0eQfJ_8|sjRGq9g zVH<2H3dQi~1=hJl3%nL4KIv9{K3mW1lV{E%$;7id^^R{0RMU^fJczMAX=reqs@Hct zWoWbm&CNdR<2o}%$AS;d>1N34c(rM-YM+Qw^qN-PWY-`ILaz*C0u?ypfUpf2I z`AVSt-8J$^9hUR%aH-T0Prmsc+*;@lYZ%Pu7_0WOQ^$no~)>Qk(8f z33BPRv*6r$VWo+s&*NyT@YITe=^ zmG2MDGU8&Qp5&M!l)}rq9kkK_@J-y@_o*vKZK-7u4@}dN&m% zw=b)|SY|EAI4xdSi0yUaWOY!qL>NlJbr?=Es<9XjtaQdh3w-YPjcKl-=!g7Bwc zT2!tvV3=q$l`X0t)OQZP{$T^dxWF@mhbYO5akCESn95zzpLtunVz4RM+;jc#qXT~L zk`%!>t4(7s%#S%dt-qQ5+ZN=hy>?jjLWBhQ86K$$J~;TA!D31gD!s;p>c0310&Fj< z@5sVs(>L;R)>Y(ybS2p{7xvy!l2y|%LaymP>vhtv;F|o1J+JFVR1T#VWqsRe$Ts$& z_4|66sPBhij0&sy{iig>4M+@idLLhPk_QL5t`i|iVDbLK4vZSMc&BK+yly@)5#VRG z0jN4|j>jLQ0P)Q|M+o#)BtNOmk>sel_}3Somd}2rp+9>FE#n18AST1l{A+(X(F?IM z9P;{#V{QgV;odHFcrH10tEzQSQN1$QP^M_WD^*1wq&bhsbrY=ElERRR!lWH~Ses z`KhyjdE|2y@3CgY;7*2$CfXz-`qkk@jzM_RR*@Ld+Iuz_R0^_Do%Y1>?jRpblA&=T z8(R|Ppxp=*kBnE!Tav5K8&t%bQ0MXE`0fsFGypfuSNQOn=)mpDk{!5O@ProN3x3th zb4E*k*{nQkb*4?K5LOam&8A>iCR@oE==(4ZL|=G)cHV`!y{=_3{Dm%#)z@2`nbv|s zjk~najcGaD7F2wg!;fI3W4V_gQxK!pT_C-J>H&_XUu_7^59GbvbaL;+6APO`Mu8_( zL>|;g4s$#!Z2B)M+r0wk^UVT^sZHSc=V`zvz7!tV2Y>J!O*T0DBqWu#Jk+nSt*@&>GX=UC@TSjsQE6S!jTb8jt@0LH! ze&+mjf5H$1Z3_sR6@e}>A^?Q`g+7Rg$xu^}KG0@14PY$}oa*gl2jM7pi6o;8>Md54 z6g%qxiT5_{#KL7U#=OPS5ZDl>(fF}B-k!J|2M=}$=A<@rQ8?MNMK)rqMobu?G*cD< zHsmL_k!3f(xpO5D<`(7%bgW&%X{8)J5<798u9NZDJq`zVHm&Pbdvqw7;Fw&KTvUdw z;SE$c;5)tshw3liC|H9tnyOFOw3H|vW;j(}vT%!hU|pyQccL7eg^4btj(z%F%YQ1W z1VgJ$M?%61h^Q)R{+6%io=CQnZhXT4=E7x2bi`0E@&)>#GhTjjb*f72tYSsCs(GyM^bcVCnmJi3 zOdw=_Yr5yRYlq;h`D)W!!z)MgD#O&k$Rduo3jdN9A$4TJ9-QN0nV{Sn{3W>ib9|lgTG4R9@W7E(z4nmIg zI=Dkqb2hzAS-ra$@Sd4k3$;gZUpIxIsNO)G_LP+A)GjbCm%yhqMGQ zsf-&whR}A+YaPr2Sfo6dt}r-~kQ3Q&94%^k=Yc&p)gx-?-G2=@Ao|LWFOlilv{$g4 zWWWw2o+(I{LN?-E4H>uePiKAGx%3OQU<~;IQXmu*6zBy$i=~wVaX^8GGz+b>7y!Sx zUAnmPHW==ioDfY(auf~fA_C%(0=+OJLsKordGxx2)WWTjQrG79g)zCaXu8ppaXq*>LC7@UkT&Ni@67Dc zlczHSWhgXgk8?=*I71Eoh5CU@{sF_+h+i}?mtI%-4{dZUL@hclulBk zidzyIcRtmmIzx81=dNbH%feEsP8R^sKAAiL7*c{Hp^T@=7<^;HbuIfa8OZBv(S22* zgFfZ1eq{RPAV1Xtde=NK34BBjxWWH@R;>DgGwba;KinpV8<6I!-cGWpF;a7 z;=PjLU7QlkaqXD(+PojSxb7@x@Cy-d6q|G@f8=k0z*lKKcjN>z?{e$!lR+s4Zee*t zkXRZ4SYr{Zq%*~={U$gzd?7G-8!)5dK;EOqFKOF%FK*h3{OMVhWe z6+M`O;Hv;cTTWXgd9fuHrJp1}xseq?JRWRh7sRRMR$+8hi*938V^&i*S@ICaFWSdD zo`|r-j{OaSt2x$Jt_1R!$FF(E&FbmSRm8GuOwSHIje64#5C|ZoOGmX1+GH$$X{S|X zqM2@aTXiq1Xh2M3no*6@?`~_qf<6r-&f_EU23bSqehk0A9!^_wSK|I$dUV3UVr+3& zNn**Y-BbE^-8wL%|G@nH&p@|CJ+}Y%HEZO+_>o4SA9)2T3|#FrL0=D7o||{IRqjj*E?bK^~zH6JuBy$ z_-UVaN```-zMn`xjZba@swXCQ)7x|>i5hT~nr8>El6TBQ36A)~v8k`=G(Ov1G?bNt zR#Zsy99Uq*3wHkBxIm0yI3t+ov=3l*9alXpKe!>E?A zTA?popr}`7=6;be7z^Frz96{{8SqLyP6z3HpEzF%vpzCmcDgETzcO6PUkk#G5tSlNuqd_dpSCKP=kJ?fWVf#)QdM`B%*_(T$Yui~7 zYj1lE&h|GXDto6a%F<|2$Gl*B$W1_LpsqH<{!KM=@#ytq z&Ah%+4p?crawFu7KV-_1jy;KmT~CN)t0!ag_z0xIYaHU3s%{|dfWGd7>kt_{ly=Kt z7&7>cdX&u0?D|7zAq9Hs;gr-y&f9PF$yzi>{@?t`0{^XjHHoNskk1DsK0WOwJid- zvNE@{|3~AELufo|M);4$8yxAsw!HpFod^u{0)!#e@C1@UX9mOq=? zpzp}eH4a#r+8Sp=5AliyVzLrzGbnV`pB?!`>E9S$kclX&|IB(^f9GKUw}BkR^R4fW z1iWg=w7@eA=nd{zBOc0!a&28eD4O+<4wA(8#6Ca zCue)Zdwr*8;vYg*FW)$=m10gzF&CJp5w2^yLRQJ-8jbu0vxRJB)W~^6ytviX=>X3)FfzQA_O{Wvckxs2tXeC=zIp<3NR=u=9ML92rap(5R>uSM{d`w|K? z|Exb9MV7?B2MW%4Jn)!o@1i_njLLeUQHLc6FVU%+b>RBPmx2Iv-d*_UCcj-~O1rULBtK_idt*2Jp|aBGkQ zoc{p^12r@Jijwa50Jce+U3--VT0-T7zV0zCUt{iURjcy{-uo9i>IHB$uB`V_I& zd6m9rGnV_GZ#iwoALw>QG_498KZhpoD|kSrAPCpCmzrLsv+$1r=^<+0vSp1gMK&gZ zd+jqyS1|;+V)RBuCx?`}8**wF2XEDkE%{C)xUt#)^rI^O6QRC}3zm<$f2UGikkyEo zTlSx6s;&zTL85v7k~J(Xg8(yy>ECfv^4#&~Ko?DD@on!9G?voM-?sZ{7{Pw=9@3z6 z@FS>}6axCqz3?>}mTiS|_Xi~|r#zMG@)KL#66AveWpHrIlSIN@PJ28TSV7?JOSbc;^_1c^_`KW z;6GNxD@r3;>k7`ZQ0#`}h?8hyycTY*;>-w(7rG;9_kW)%`@Bk< zSa};<8E=)(nMTgJea9S8&L3hR z&5Lcd4q$vw5cIP2R)JGkhCTMr$>8EMkcmGm@=@5dIVIv2_g~l6Nh>Ogqx;{?dV4xw z3^*e4= zw#R>^9LsV`zz_7A{@fo(sXKQG0zmUWPSZdv@$tD1IS?v6agWhG|KI@=G*$@5(gs$< zDfU+x8a~-5p);Z_2o2Sx)apJP)2#VUyONF1gPYmjVjh>u9SqnQQC6fp@6~L3Z)5QO>^`0qV)FsQa;vIlwARLHUf}@>+kv{ORpYUG{G#|T@F(|*xO;bPF zyug~>K=cG8!P+I6+!dk^`s{g7xIAwiu1-QK=lfHIwn#YHKcLg7Nd^|_w$U+}>Q)Wg z0m747lek=@Kivy zfz@{-_8G8WlsP*_T7fdTG90R8m2gM#=z((T19+02p;h*hU}8ugYzI&+p*J7>Ly+e) zE~3$kuB9#Ml9+gY;;c2_cLMvTmQ!!*L(k>lwyhXWd*aI=bL#HL;%XmHhSaq#OTSE;RoJ!g!t z=QNs4s?=d*Vlzo?I`LAXrjxE@*551Zl=mL&L8sOsHJi1cYXPT1Km68 zh>CprdhIe>;O0GmnX3TJa+k0c%Sk^)ut1O8+nT!#!8?)&opgz}ZOHZS#W+@p#wbu` zCW+0o!5;5xudXK4%%suK-k&K7W8NE>JYY!#9PCZ>wYeXjQgCX6eAL!LC^ zRL1za4up^ri8mR`Kn<8UzAwE7{A-{ama9KyRxG^*m=|v~{tFvJvL3G6^4s{DM$mhS zdhf&Jv(|U4&6$f*7`Z?CX2Iu(6vZV&MG}MNN~s{Qo!P2O=s)Lhh&`J5FH610naeP+FWj&Tl`U6 z!mJT>babAL2_6pxihK2rXiNMSj(WfSR_04=rkM<`(|ciHksndG`+@q4jPd1Rj1(a7 z1x26gq#chCSg!peCU`C0zfU}l;dVCY20JKbn|st@)E?7a9ra4)tIOlc!ELIk z`Y<~X2&br!p)2DmEWD0x!!39al^XV?21gr!%ocfOu3G*La0Jk>$Nss!72r`qr_PnF zLey;QOsN|ChYp?3Os@X1$C@t;5*pU^GKA>oUw6IVkaC6_fAiaWHXyO+7T0aTdIa$sOt zR6qfRY$sKlcg9m?MJ_YI&V}STV!wr2NH8%C`tZP{_XGJ5_{>eI8E24Qr%AWwTFl6x z1c3LQOi#8TpD4DS$U1g{@i(NTLm3Tv*TvFj6%%vnbKI}(KE0FnC6WkZ)L6_`wbI`=o3XgBD;RDLr!)<;0 zD5tZaaNT~%L4>M>!bFUs)fIMQ^Mv@U@Ay8^qR{yNMs`QWY@BDjjB?9Ly) z`iiMdUBe({5h{n}cVyuL9)mNoGzB|55bahmcJ7h!eI4TnLHNS|sJPM`obBjsCgkVy z{ns-nMw@NGc{ca=?@>K5gQzFi0dCYfUsXg0+0x9efr$olMhndrW+e1CXwxaRMHcQ# zBQ_7P2|y~qBOd7ip}MP9g5fS0SVfj4Fja_3h6Hw_Ax(6zDlgh+qE~8_UBhbDwtuLP zvvKXW`T1Y@k#<{WQ71CGKPi2#b8hW5&ULknl+v8iAsxu)?Z~Ft&g84f!Ac7>4g0ns z61*tk?pma*ULL0p=pMp83qDT-Nn^=}%&2lL_MLR;uCHlZMMW6SCYEoF3?HD_Pd*ikMhzNEAgeYjx=U|&t+NlXL&IXR<)>^f`C2;f)E7k2?PBs0F&Fwy@Xah7cRxd}PU5BqX=(5?028FAYM*RRPaGEE~D4zkxx)DR5pY z;#T2Lc9?*OTK@wJ4)ecbmw|jX`V0&E%_SM0e=tx{SCPM`5>Dt&o@{JaZCm}UiZIYd zKN#a!a%v&F;b?cJvv{afdh^z5UTF%Fj9UvbXny?*wCXRk3UDH51%8|NaH<9)2jbLp zSJUQomSiAlJR@!f3P-A6bF#~bY?B&Hw}9}g#(*kyj|Hw?I^q&YphMe{OI z{BtR+QiCF3hb;tpC7*nNHrR0Jp?2(y1<^##U_3+Xwi0S;4X@p%nujo6M2$Kk)LIfk-|=C$Kn;y0Veo=$PHIuziJAy}tI{z%_|q@o8}3ohoTy<-NWc&8k@-N{uN+Nr?XbB9|-;j``# zSHt~*o@>mv%E4&&uct8ApQZ+ARM$AHFCNM8tj&>C3}WMAn-MYt z2t^#Xj23;3bQq47?tF5eA58QhI7wOUmb4B32T)ANs;M5HHfp9wy~T2ux`+n5(oRa3 zH0732|8uDasT~>Xd3iP5-FAPtPv3}PXJa4G)M=`8m{{moQ54__;;skoTM!2->E2Y_ zNykPxV{ao~i>@7!)^?6Jg1<^~?QwX|4Djk!nG{iJ%quYtVNx;1Ao}_6(3||wA!WDpBk9JttoGH`$sE6N2!GPp&FfL;%b?k-o{e8f<=lT(}5&_pj8 z>^N5f#R;94ieQ@H1GuY0XoL=Q#@j(&30j%Mre$9Vbhvejuh$;~QXT1ckGatUUT7I} z3VTe5y(TbL-q1H0LYSzd;BULK`mm89e??EzFm2n zV)gzHN}D%?stSZ){OK%NP?$jwWeV9LqtVl#Fg}14*>g8beQ7#~O5F|KqV<3mh1+NY z;t~&FKP*vn*pY*o=(FPZ(uWE*Xk6nh40O`;dBbVZg zx^C#+2QjdwEswgX&uP}rVzXp&RW9zK-;@r@cLx2%g0LRj!7KpAfc?$%e_Q2(fIB-* z!(;{&+Has{caIT3d>MxQrZ{oan0XciB@L!Gb-u!P3N=$X;AjIyUKdJW$!UkmpiknyQ7g}Xq-47q$z)i?xxlH+!8W* zcl0tWW|f$|&ED-}`p#r>Mp@<r4>x-Jz%Y|LEr?^iu zIAi=iVEg~y=AaITYHu=J8aEpHR6CR;7Y4!@Ep(7Ct=;+clGx&%yNdB$v4C>5Ko5yc zjT>ag(|>9O|Mz6>{1ZQsxrf&UByAD_+iu)yf@?A_4r0nLshs0@%|;dgF2%9p|5u7(Jz%>X}7`VEflY9Yk+**|wj{&Vi}nWuq2C6=K7 z22J*PJQt{+a6JJQcXqt*U_z zo4K8M0VmiXxlR5EFab=7wXR8vz3>(JVS{cnFtkgm7-?uXe49hH2VlVUL00roB6TAtnHWBViB53YHN&Cds&{a9kJZLiVt?yJL^K(b1izzH87y~!Dgcl& z!dlhquJCpCVDgb_>)NIQ9TJRAn=hQ(_f3`qHQV7nv{+)u?o$ z^(2NXG@hym8qm-dT-O)xj$juM`a9(+oWbiI(W4pIt02CZ&`uvJf(bLB&9 zWMY%AJiQ6FXF7sO!Y3biBMx_%3%=%bsthrscV0F7J;*BUoGclJo&M}RI&$G+T5Y>^A%M%j&f<6D1 z>*GNAXLv&}9+I;V9z->{qKOt#hG_Pq+M@Do^ep~MWQrE&Co1NU!&Fk(0lQ_S z^WJSU5T`tU@qy*WfI|lwBh3L|I%8d#6);q`Dtvy()5OraXFvYEk)tj4(j)MlJ~SC^ znBKE~{pV?jwQ7ntP=}0mbZ^%Av>S7HR?H>BNA5F&GEjS!K~_l)Xhr8YMISSorz5=keruU_f$>gp-4rL2GtfST!>%3gl(nxiL#15m;n1{Zz8f2*2Ij=-lHka5_a{V%2I zCeA)e4(884O7P~pm$mLVZB(e=N6&$6$mr{||3(k|_PHk9fo}eBm>oJ-cu%^-7@ISK z%d+8pxW>DcOTkchd@NDmS;#Wy2)X^ zmoke&V>F`-4LaE`bz(j_hEMCl>wcW=C8X?}>V?AC#Q&C9^=*A2aXC^iK2m>%(xy#s z_Z;_M6H{*a_TBTurdA^I zGD*nw*($wF&&owmbnnGFA;WLt?>P8>!8Zl*$CFcO8;|HFH+#9mMk+E-o~{ zhdPu0Dk1sXmxP_lynGVxSO_|IkFJ%9YoC*$c6oxuVTUbW9(a>*Nqxz?;LAqaM*jH_ zG=_`2E*w0v^z|JpyVR(h?I?0entHY)c8El7Fnav=x1X#UDu1swx=w2Hbw@t`kkL45 zWz6A?;5)Ik2h1ax4q)R3alaPn4V0A=FIxv28Ek->5_VIjU z{r89R0*h6@7#Kt~@{B(0Ny=rU$x&6f{6mD}mD$q$2i;iDSK7cxUsiS0df$4F#hf9; zx}!Gy$?Ungvrq~VdT{icX7>vlOv+324%qP~t){A^+-dyQZ`m<9>2nv9@;opvmY<>V}{`3>0 zCxfTnhe7e8F+8!F+UOfh>;=lChGq{m_gONF1n=}wOOMwGHQZ1wsI9xRcdiWp@A0($ z3Tv_>vix-(Equ%fT`!BYD1Etp_xZfXI&bv0XZfKvx@*?6V(%>(d56af=O$;dYqn ztcyzEJ4^R@y+BEGylF0tpwWaKZ0!$!e4$OsbRV%vV;uVWykUa(vih<45r(PdM@c)X z3{vQ4;z1jAp`g60tdyMn>A}XTHAMZoNHX8m>FuQH31HY%MJlJNORChXhh2Cdy7$` z+|7FyQpY+rib)U=RM1^2Iy(oxu8 ze@FAA*qvy4#nTY4Ciawr;6YoVML71W9456PgOkxz@9ot9rCkArp9t}v7%8^7Tct1{ zUanDls6f6^2%l__;%rm%SY#U(JHSt>iL`TyOevDpO$cEjx8(XEDYB`~p~}vk>7`Y< zn|qC4-@n4TzwrDNn0L_f_rcFMEn_{BY5WVZ=33d??6d2qXZumu3|dYz;@qeEudBi~ zS7US)W0z(JKluDr;TK2>PexJfN&0fbj19fl@b5B;lD-CNXY%?T}a?mI-nCnJXZ3%>oe!M{2BU(#L1k|NRF z+x_i8us(JJ&aRl*$QF5E5fIJYFL=9)N!;~LReI^L-|JV$Ipafwd2!7>=mv=)0*NGG zWmE}`%fRB-vmDQ4q@GlXg3EdgW-tHZ-{f4tg|JR5D>2_5QMo&=V#<7}%kbA%ewE>? zE$&zYPU-7`g|2=ythF$4H54YU6m5DB@v`9SbfmWa4y=s+tTaZr<*O}^)iS+d5kiaQ z5f8;s{`K46KzO~tC3`_BNaz|8o0fQ>&$_L`>`{m64z!2 zXJjt}ydbtMuPUw3&)x|hY2*d$OUyZ$0WKK8?I7ZU)bH6@!|XXvYhxlTaYfD^2QQzn&odW@&Hm+>BW&t|Hz)5}L3GqQil(#P`{Rs+3il>~fBp}+IHn^x(UMXWkg5^K%8 z{5n7i)MCZzozq!)tvLzXU!5(9=k{2&z79G{AyKs^%3{0CR^FV}eN(|#iM8$SzA3DI z%a2N8d=EaGgjwnJVlLw7>ViKI^Hnvblh)od{eyHP@E1w3@Z*vO#bJTFg8Z$fh&SbI zr)UqXR8F`mi`e~cyh1el8Q9Gk1(vC~4wazpt&un;ue$YpB0@i~fuI?J$@T?kGGP zn>0uJ(H5$Taji%DY4xhQ2}{n6CLKLZP6J>UyTe;HZ#L>o-_LCJ%gY45|&mf$h+Zt@LAlRwOz z8}VjzN(CxeAax#5$I>V&9!uGAGw&Ss>)$|0P8i`mOA8Aj%zQJc7q;_A_ugIjI`)Zs8V-u^ zS1K~H%f6+e^#!&&qd?W}O&~Ai0z-8gS4S@Rn19ALFBIlI)?iKNsB)3M}E zC8w{KrYG(95KmliOyTKEvETyKz>-gW%Lq|$42xGOHzm$?T4t*Zva>z0 z>%JCEKA*E`*t@<}ucMPxsGj`+L#zo|Dx@5a%!^1p&7kLt{fymCrLCl@$eb+7eo4fJ zc`Ql<37A(#s3v?-m&Bz2APwA`b`k?`Hc?nxYr^6U;)!ED_Vy{@F}3ghAVkJ$c}C9r z%SRskzZDmT0u1oHmzf&p9er*a6?Ow`B?z!|AC;51trx;4pTK^D>V0_QbW&blM$p#^ zy~YI9c;YQk$r2`yTColy7eYbuW+=^DcRjVSZ^%3DTa7+Z1$Ut`Av&NUTZf~RGWJv$-`1K$jKl16;9-agQ~u7-RTK@PW5>!F)AfL}qg zyM3-o_ggT}nO(SVROto6L5z7xSntix0Xvf~#G7{yJp1h&AKF(PJCF+k@caQU@yiGv zy~qmmu}j^Gb~}LKcUD=qmq=D>)C76+dctq;koaYbL*P>*1mV@y+$Q;CFbOX6U)Ah{ zJOcS-B3Wgitt7lE)~u+qw=t&*M92;$#SHHNA9Lx+5GS^BO%B|KYUmW<2F5y96$mQ@ zol(KA96qq5ZO?H8x}{#|vM^$;$IEy@X8Wx~J@(PhA^?|Ye|O*ZTdc+F9<0D@SbSgs zY)a6Ut0<8S(>miPC$D#ho?e_A-I5Vh>p8`Lb|ZujgQvju?|W8JEPc@T&wPg>FYbB1 z0A(whr}K3#g7x*Rb)P*9&$VF!YgTc=^!FgvHv8CLJ>TPDoSJ)6I-sQq2zK`n3Llj= zgVvnYI`K=LJ58*eDtodQWe3?15=u4>%yfG|V;+cf>7J>YHC_(J5h9unz4+yIlE?mfMNC}OmRF_|aV;eE4r#;T$eLw|P3gg|_7k)nS|wm)QZ1Mo$2x41er}y! zwZK$%)aDuMq&xr_smV-zFf)fS`7=Noxlh%fE!~fqegD%u#G=__!IVwfbO6EGJn?=y zRQ4R1d%Up97g4L;Ew+<&$1f?Tcz)`_6!gA^6yWh`7%6@|zsq9tA*=qU)-P2moi1{7c}o876BZs^6T)g>mMWC*rIde5aEx zo*l0gi~X0VDTDzaK)c(juPOK1*JH{Z4R5L(D-L?Y*{kNpc+*5c!-aq6%>SArU63Ue zq%2GU{&wyN`U*hNz~<%p$x}Lj;Kd5!clzzHv|T1|Wshe9%DW>V)-VH@DcQLo(0%TA zpc*!7M(K2b*yR$RE#;N~ma)7em07*N3Vwzm;J*6+5$8MIYB+|`Z;L5if>YM!Qh4&5 zWjhk!d_3Bofao`kMn$>gT2w;3ZE=mO**zxpvrQW4CNooMk;%8Ny~L5{?xY`g`eNjM z3bsYBqIs{u2AoA>aLIzt!iEbX!mIcvFvU2-gvVwyF7N@^CX|_xyCTj`%N7!~zhzJm zp<=w(=J5j%Zoyk(^v=@H^3BX#+Z+krn*BKkKmxs>8Nk*J(@u=t{u?~5D-3%9`hvY3 z7Wh3G^%o|i7v{joGm6o-s*wFa57QtHmjV!}yS~)Lx05=-#9d19n;K?}5j zwgsa|om|20{2IBG?mf(FaLiNfJFQ6hNbTr%xxU+TAbNXV4F#S>_t=Hn$tXT^;svt4 z#WKFC2~>8ipmh&Vg!tf+xiO9%y3GD~a#d>UQR@xjKGi^A(+MWccmdi|-z>jwh3e19 z>qxiO2U>=$#}sO>p4m+!;OMKIfa_BN0ne@9pX!|dSx`?o$o3|c!WWUhE@!@-B9?Gv zF5-j1Ywn-&PSurliydvJMLH(m-$+T_K`C{{uD8J4pGzjif$$ro}+Izv+FWz!cDTf#C9s!FW2+4i4Ina^Eph|F>J#nlISZSMw zvIXPXlT04XW4j0CRu`rj{I^;NmEVl#2Rqh#%8MJL0e{$oW50z$=H`$WiZetW#sPA> zd>oj22mbI?-EcVfWeLUhlqjJ-p8rO`=TO^3kAn{>r%C}hq8yGN$ayAUMB!6I2n_;O zvkp2zPbK@xT%{1ljyURhWn7|R7g&7Lv@|8fe%8OL%gQ$nv^p<38!6ct1V7ArhITI= zY@E^6aosDB9U}Cdw!*@LrUru#g>iQFH#}U>2^xS@BI0~tW4**2cIFknz_eLn0ek4zWP4ZMs1ny&hi%GRBSI>g6)k)mg=+b%K zZ2v}V8_@?YMT68;n@c~cFt)muzLAR2=XTdB##Czbz7kqwl4etq4I+ZIdX( z(e!G7gHwA zt)Ryh^@0wlV-XctW>wWGEyKoY?7QTgd*lW-$jWkX*mP5yP$&FHNIg)EtzTAi(Ot^b zREOz_27;u>v@bENW_+~(kn*EC8Wd)(4QA)zY;AW7KBG$Uu~u;N_j~PQ^y9OE-?J%CG>z?Rpl328Ffr}U%8;d! z!;s-0xc2w<8h~Df?X`Od2(XO*`dB0nnH6jBBC(MuNKDxCCj zt1hcmVk;uH?P>2NE>;|Fs4w#gQ&CZ^Df9Lvx-Rvl)-py;g}iM3Y)0Fj{9{c$NM=hQ zA&DK-SOwIfCuHc{&nAfaJSCb;{KeWmeKw#`-_d3=+abON=Vl{-p3O*H)+r{NN=CG2 zgyKkUd)LB83I-@SxP)yfHJaAA z0QTj=Ga=qC0l;3fJnU5XEe=PmAWA3Zg(DC>QqO;WbmDdpK?7-Fy17%3jh@?pF1vD5Dir{0x}v=qhx)`eF3X-PR!a7amDg z*>+rnV^6%3;B|;$A)pZI`A~%b!WBZ^wh_zEtA}8emzeET&O@jPUYLDhH3lL&l|L@C z zQwxwHhR>NjyLc{=+gc0+2kfyF~t@HkSwE^bO zJI_5(lkeI09NKkH4l(m!VW#w?LrMSUO>UX)Y8iHBEVh$RgtfkFRGeqj7|f2Ma`3MB zH!~OY0;r=yyMF+jY#mUGQFCYPr=xy|+!D${9sOyz{`RsRS?jz?CA5=JVBI<+lRG!a zWg;xgx5b+kt&IoAWO8bMdCoviLKg^bRzw3w8%B(M5(U>E(+QL}wjkg|RRF@bKYp(F z+M~A6>D}U3gLUe=*THW+37=E*QH2bYGL>%CeNs#yJ4=>y{PNVf-Dj&w(kg;VAvBNs zC_w{#mc|XLm$#~HX)}>^@Rmk7YP>jNqh;t46b^s4e1AccI~xd(n&foSDh=#9wr7HE zt=PQW3Fw};*Ay&njic_5-i$>88TDa-g=Zlf*Nrx&R!!{7 zG7wwAk8t8wL@y!O)^<0#;(OYfDNI`%dV4%%kc?1NB74aO1D?zitKHc7Uw2QJG<83_ z(Gv(FOLu~4g+Po$e%qJ7SInWv(WmJ}=a!NZxFoFO6mLt16{D>rlgw`XQZ;G%^5d0G z{g2c4M^x7!sUUe-r~7x}nao*Q$Yo)oObdAwPcTpSvxWeFISEROv@a@Il*(w4E8TkF z*yS}$Q7aghUU25FIZr0YicN3rJO_8vi52LDYmh&uLcH2rBI(t&3H5}H;#1=*Nct|F zaW1y0X|5eEjpZ;5edCnj;qafmHjot71iD92SCjyaPRb8fs$9``BYu2st@DTBg(0J{z(NEsm zk&zRoDypE@Q2fSTDaR$Lsn&Ni^@#4_AqHXy#~v$0cRb$fGS^Z%2Q!^? zlzgz1Bv}gAWq6$9l^M~9Ue*H#6MHKy`Wl?EF0qDghKc>tNe|&Sp9#IHhfo^M8YBua zaCTrHx2(FNiq%E@?d<$X_%H(9wOi73VzJ-9A<)sXOd3Bu*y*<3nfEf(>-yW{a*Ig9 zv(vth9VQhxbp357ti~iYRsrHddq-^(C8WAD3r`-jww!=o@Z)R+C>)?ShLE`d(}#i8 zpb57&SBO1qQRzAs&oW&<0=mc|LFOErnI%G!AC%O^)UsJIf6JlMQi9QPNHzHGLj?QLRHOGiTu%>YiIrW`=b5<=_4u5Ue@KnnYE*ySb31R| zm6BZe1;>hGm2bS0KXJHCH)|3Mg1a_!6&;H9=IJntm6|ED+N_~CrZK&4>t!hi`Vf4Y z|8egp4&cbxUY5-)paZN`xJ|zX5`=SeMyzB<5cew6oruOIR=3U#;}_;tSXJ;iCIVb3 znb^_)&;svjDTT4$a-C*ZuwO!v{GqGCn+B3xv^W&k*_T4R^d<>ZZ<2WJCY|ju6gjy? zc&H77X9weLr%O5?H@ipcI~|osiHl zKT9RSB^yT+hCT@vN%7rop*=OsEOhN;5}zJi1-LiIZ>NEwJN8rqC#(xWpETXgGQg1C zMa<3$zWsQRY4Uv~zEf?}H4)*O+X4FS=E&K4`HgQd=E>Y;T&BTZp~7Iie&?{CzY5o1 z%5U;Bh$t=4)z-V1V;UcPevUUYC&=X;-!UmuRc+J@Qv%oC*(T;?t15{tz9YqZ5mnV-#isZv88#?YW}C%p zMD*7K;5~v=)zey+-JIuNVdWd4%kuVS$>pFrd> z$Unly5%SWZ`r8*CGHMI>0$6t?{!D6fVjsULWkm-C&uhjf3b;`MnY=S)AI0V}ZOU_b zcg67Uu?>MR8^F}t*qLNgf53@9(3}ipy~z*^n)wB!*c+TcR7uoIsaw?XVp$0ruMYM-Q0R?-AP@rE3I9}9ev3-*+!Z3ikU_X>)!PJWOV|L*Hooo`+MKXK$c zhY)Mf`oAvo901n;lrcKNQnDMx9vI=3tD0=HR6WL_cZ2O%FEM}xW+Usxxs1A?I_V>i zzCu;&H{a0snlDW=sUVk3=T zToOaCUL*4HTVMU#FARPJoj^cp3V1bw4xrIgVbaio@>F(7lp{>Q%66+$?=ia6ms|37GT^VzRs0?q3EJ$w}dU0uZ;3J=?D&_J# zK>%9#{kFB|oR^a?7S(VeF9nhlu(2W6bL$8E$d8i+F61h(b*q+DcVB<4S^1QY?aHaLK zi0ETMv$frMijAOIz=b*0@R*5H<|@49G0=jzWFQjqXztAqOBb2Ozu<@C0&4<7C7>)f zgPq%z2vv3lj%DXE&*a;$Xqk@ao&=%N3gmT#@FU%#D!h77_EAX48kcZuT%TX3AWa}h z@#WE>E%Y#iV| zD*#QwWC+ITWYrVk*{aF45}(q#uw8cHS`m&#PX2~6)A~(LTE@>P?lOs_TuI%5%A*p| ztcs2~FxeZ!Zvv$o!{sDh?CZK#US+G;SK}n>IsAW5@cPOAIQ}&a)p!S5se?V)(a9CS z+!a+pfv(aV4fIr9QNhbYH1yj6T9;1H3W5Vf&{p~dL3;>lGqDE<>aC~}$~0Y!m+wvs z$BvgVd4^o(Ef&szda9VJ7NvW_X&f(z8}re{`|3X3=|w_)T@F+@a6`^HhU zfWc_yu)4RtCK()DH4!E7c*Af~=Bs`H6sAFH^)|^RPs7j+1CdUt;o{8y_T5pa+a-W^VlR!&NE(yh(?Uz|u@b#gWUJ`Q$VK*K254kmfGwOF!I%g=)G|f)v$@lm;a&mtiuo}DNK1e zF9AwF{XYC2ym z|4fn}oHURA%tLNNrv`bd+d6qm-g1UozJ!T5HrK*XBfOdlzsz8O{T#2okS3AE#`9l3 zH9~UF9IxSL$*0ZFHK-z(r^6@nazGoWT)Dc(OP6=AJyYjMIHSOn)7(gM7cL+>lboS5 zwT-!*+S~}O9~zyZn8h;PKB9E|L9rgI_xMA5E!Y!;Hxco%zz*lq2 z0mHpcy~(M1vl8(ZbS(KOg~vmXVCFM5@~)zqmzmE>K-U}yO*;Faj+)X@sM{T0Wt$`0 zxSYSGld!X2yWy;&B$I2w1zd+j2Rec=mOF|J@sG*SL)V;Z++s)aj+@-orf z{hOuclq#neQ+AfigC_@xB$I)s7=A~4%-@w^LYNr-)PPK*hfmf0|S8DWT@PDKV2;o2Kvr{wm=W2Z37O$a9#zOr#GpV z(&kcpLUj>wifblvUV2n{zXTm%4K?@8njuVwjc%tAP92IQG z;&cHc!Z@dtddW2X$J>kG(||`ETCY9Z$X!y?El00fodd?bY4wR7<>jKKs^L-$kFz{u z7M2f)X%_rLxdp8G?QP>mbdf+PW z0jbSjpoPApGusl72}=Z~U!i9DGjhk9iX_l4s3@WAFwd*)57`RbP8j+^ ztAvfM1^iWS-hEHb&;gK~zLM^K@PaLQh?TS#*feGM9Odv=Ivj3p-@gFFlgvy3e`Kunzl z)zLO4{tgfQw%a{a?oTi_0R6b8v@Hs*lW{hY=;t&ET7c`P(9Xwpl=b4Y7jCcO`n*A9 zMtK0@gY@{-ks+C-GSJ}N7>V-R5dpD2YnZ<+%!3ZQxC-u(FRzUDs#5pkL6KJZ{^kNk zwf%7{U~pH`TZ@zvg45JM@{hN&0(_>-eYp9iu4WvFVHE*5Km!~HH`-aelFRL1K#t!I zk<_kwq&Kh(H0b1Y;mK|QXuT!kj@#VA9q41^X-LkWM4my1O4Jey&15IwZPN+5VNP33 z^0vV|s6?RHA7_b$+P8KI5~v>@a#W17ZUdoPdJReMpGw!C;#yMx{%QrNzpb}@U8(J1 z$W=$e;Xdu8SE|ZoBv2J8lGRIVfK)G3Blv)~q)WryPC(PK;rCvuss<$AV^YSyAo~sl zHdX@%Cu>>F_3H9Oj^fNea2_h-AXTU&I zXdd=GDxyxkC5z1jD*Il(G^8qJr$Pn>$Y9lVo%IXco=@boAVxa5di0y7aef3@{vSXr zYxtq}qT;w2JDZvfpJtGDAu+kFEgZTBw==?YiI+*+Ei|(|cJZ$C0%zG#c{m`7*E6>c z4%xnQ&EAjZ<__I$+D3;9)NEDJUjWrxUk}cOKB6tuf3o)8Qqjkp2p@?W4JX*727t>c zO^CuV!aG57Y#qI;2c%>UB-VRry7#kk&9@{GAlwaty6U#U0j^=n(1QRD-J1U9LS?!u zu8`LeOKH{^=@}u0I5kOtSUv1ZK-6ew!DFeX<5^pbz2M*dFP5~&%)5W>iQ|?xx4#K` zbAY|0D&($YIn~~$2AX(1vhn23eTgQgX}@ZbxWZP;2`PSb57+U5+zvoCzVFnWIpy_LNs&%D@0p&44Mk?6~_d;v%<_f^K z9z?Gz^vUv&OsJVYBlCC64!(br?~Vu`PLqZSMRpAdMFy=4%~n0h;R;9A4JXu^lN;UD zGHLZ?VZMg5_`v+s&Rx<`J3QG*rP_L+m435l;N(yJqwkON>v`M$qsJNYs@Y0WsW)`4 zy;kSb8C!qMs_xB#Ro4I{`>yKqp8OB1I~s=cOHL|im`w@1(89fOsRq| zZpr4FMx<{bq2h!th(EULNs%2Fz8rVtx%oND_YRpv4qvPBUJntG(U_i0b!)&xUSIJv zeNX;h1+Eo90{j`s9y~t$W&TSA;CH=2e+(e)iK!M;Yr;jy!0I6pg{fQ681!|3d(Q9L zMCL|71m=jZ5R)?k3aMWlO2cDM1Mp%161U?=o0p63u9&GvgrNTb9Dk*rS$&{=Z{r=V zsmU0@HR}zfJkFvD)JLbBntV)>e72rXGWOb;g@s5{DA(mDqmtS-0J{NoCNQ2a^mlAC z6Uug>@)Fa8Nn1C*<Z}&+?j8u7km8-m7jj*?K`6^3A(1M%HgOD(U2uKdr+P7tN26!h_uR{bR6uukM^bEz zS0LwqemHjw3#9)mS-EDop3s!0_|qvxNO`{RA8$J^Q2#BqFDpFP`6)b7M*NDLenP&# zYg=e-sMkOQ87MJkCp+fq##eMEFETmcuV{C^XytLS^k%r^^f5Na&yjOt+zcSMLhD_h zR}hDT0)*7;mC9dOvcI;u8tI!=r0PW`wsscJ~=wN^S=CCVE5BorebnPQF#w>!g_t=_XY zaUtg7Og)G)IF9SVe{$83eS+|VMoX}OrNWJWptm%x%0_SCXDzd~H+gJx-EXt;b!7mh zRh}anhzH9YS zg+$L~^5P31Ix}QjSMXfOfB$FRKi`jQ=^0Ra1=vb7c7ECzC6gDBXj-t+3BY65Z7J4W zDfP#kvV2Syitb{5!HO|I<{)%1j@6*faZl+2XwcbFr2+8zX$JU=%jlpR6qMDANuSE;H2R06Q)QywK^PT&2Qe7QpZUUJ4zc9M_$-B;1m@)M9?|@ww_ZBbSw0UnHk+h@GFe=Gg<*uQdg|Aq~`$K+m5J`jN1uy}$cSdb*4= z{*@;Dc-}XrLqHE}{~MKEhvxq_;o8fD1Oh;XtU*$&34D>Y!7SXT`|C5$b$DkeG{}+2 z+m?)=twUvzP{nSX;d$+ekoMH`ko5GsH~sg$I;P$YB$$J9sNX^68!A+lddS=&^bKpB zWZsN02f#(}|2y)VYvniSVNEwA9TirTV8Z>yt^K~WUW)yToyyJ;Lt#rElmi)=j*L3P z;}iR_`5hgprNl}4WU zBlV$T_=9)dJ=93hSn{#Uk_`hkRvFjlatQh%!$BK~`=;tl0Va=LSV{ zBMC9vFx)fw=hTRa8zWPmY0pjqS`?>pv*7KWo8Co$=@)_8x7pq0?p0E5ohKgq*n^z0 zapiGA_u%q#TaJ(7;Y08hpv)OV1?yh%Ld!^ID&!SO)oS|^Ng(`+01OiRq5Nvl(7}D7 z%aGIXFcQm%l0dq@OqY1e+F?D*xl4P7uj_N35FyW?Z5+Sc1}N*Go8q?}0=akns~s{p zK4|P({4mZJdw`?f)280tTHVO5yl)}Z>-`I0gDK=4{y$s9;5Z6+{5CoP$T*3D?X>Fz z)6yR3#hRWd1we>ex&RC_dC+IFLP%U{B%%$0iURCo^F)oIeGsd1a{mb8pb+EhSHq38 zcI<*k&%bZ&_)VnT37n4CO$EDBTHdDa{lPwAPbg;Iwk?O06Ak|c<%8Jz*7>)DhNt5k zCL>)@g>QoV7wk7`f%@SBTf{eex!sZI(_7Q1`EGofClY8(bf3pj6q08Tv{~=YM4Ki1 z*kY}KmFz%)s&KB}2uBX+d+JnXK*u96{m9{v9&Q_BHO5CjNt;vW(K98`GK@E6=lxzw zE|r-&=g)}vs%bKxAA@~4u=kvEwLdsm)yFwlfl@Gl0(=&3iTLr`{h_96^ywl}Y9Fvj zEKn|Z)+TXDPUrP=AWDa@tDd^LBTr;IrREH}ee`MBJO9FJDj1D{M7G#7DS}Z3v%kOI z-vQK`2*`YIsm69Nj=KE9JuiEZ#iM}>5}+{Fx;Tx=0{#ZjZe;@=zP}n#&OuAxCi9it zBIIMW^kB*ssQ)TPA{VY&IDz5jKP{GiVci*2I|#>#oPo>&bH=b89ez@p`;y#YxGz=C z^`5|#g?kY$Lh3Y#q#R9bI)sG~QPL2veeyWz@bJ$X|8?|W@Ps@?2c8}6RTy=+3_t41 z!BB)(Mj3bH7S-eiebtD-bsu6TdgFwQ%?y|?y9?~Qa-060*N_17J7g)MGq^^X zOLk9m6wR&y!p2S;HMn6L!XY!b5}Je&4<*1r`bS*AR!b*0@9eT6sBmvoSTd_BPiYx6 z0+|au9{kor<`VN&Lx(DM>Te74$63lRr=aAa_*mA%0)6yfz*iP+-+M7yIQs>)Y?46} zb9708azYSPdJozF^21lVsGUq(y!~fbA`084(RpiQTLdUKr)34ZSv6Us0uwVUJoZ<4S^d{W7HE4)0QD3EHNUZIy6InlhldjHt#2Y?R#vO zXTz+)<82&|#St$vxkiw$DVd-^HbHO<4lOSACeDT2aun0#UzAPczD z{sCFwBMLzRz!^nWFX<&{zaTlm$gM3>ZtW+yISiLzDsT-S=nXvI76*i%_zwi7HVmTV ze{R7Wb1s@W%gwPCTDz;w0-H<&209c$Ad-!rtTiwa0ll>f$RTLrvbqiY0g@o`v5JsT z=gz(F{$)HjvmgGUzk(otvdbFNigbVRVxU|j0r6?w?T7p&){tX6IQt5`k##p#RptVU z|B=GE=zTB#sZ@Z61LQ;)ulWOTPEE-4kRSpkGsM3H=X>Ld9pedggz^-2rm)au;sKQi zxQbn2BL5eI4k~akR=GnS*#AT$_?YK5of%7Q9zl+Y6N$BkXdnRa z%lFG!0+Sta1BV}%s2|Jg1f+cbe|g7qjQ{`3`+s@&3d=4aY_fp>^A+TJFXg103#1RI z)@02OS z-y6<);83~^B&@&9&HV_@0>MB5 z-b+Pbo#%wNB`SOTiyEt3n&d=NRV#_MCFgPnwPut@i9<15i0&s;go{l_XP@;C$g@1RMlX+ zyFPui!&U=H?+292jok4D8vVEIf_-!3=1_ua19v_5*C(og-fwXK(SJO>1RnyXIw1OK zu|#18xwV)Z+uJs1Jz(bWe){iQ;*F}jN7USZ0Bj$sxyPZ(3Gi;rKhKn%>axK&NXdG( zx>uP?9d^3-WI@59g;BeWk55MYHRYz({)MalTrhR(yui!wi_bz<)lXT7{^~i)C*;Y2 z9>wGCvl36tHV;3lR9+aJV_*IyRF88q>Ku>CCt06z=tz4Uh7oJ%j4O>Yrz(&l zISi})w+1IrOmygX!Fy%ihVlyBMHJ$Y>{ovT_Yc0g0bw=OVU=n1ZM$#{-eu#kKGwdh zoW=vkn+jA(4pSBSIir5hM0dnhAjnMyJtYoU=mN+4BNJWGN30|LKt7=6-VX{2DqB?p z=4F>9J6Ru3;InBt-5x28jg7Bx2=7qbigPD)&=Y>GB6h<3`#YP1G zMbd_?0VS_n(WY*n+h6W;CC%$yu7vXaPve_rj(pRoFZ_K~U6KOjFVBVZXA9=UgK_N- zrc9qZRYd;sG%x!tC8DMp{@K>{t>?@=*xPQ|KS6ye6la(%Y~4k=A0*pWw65?HV!fJP zaqx-fQ?Tj}--Mt74^C%4m$9^o0XM+X-f!s9O16wwjs!CUQM8`QMjsqD|Rb?D-^ZJ4Uz-Q~%yk;=(=PP7H4ucJF?y!{Gh}yMNj4 zGCM=163P`1$AH{^Rg%l(lr&Q+HjHD8XC)2YcgO3Li;}cl&nKLXnJzG%0DUC*=T91X z5{7M3J0oo6jJ5;EFMK(PdK;QoFPi9_SUKa93cDr7>yK=lVAK*Fq17Ka-v5|*On4Ks zo2lb0PSb(o@|R2H=&Azj7mxReh=M>;YtcV^G4PC)Fdr;ev`^KA6Ss7`9>N6Ll<_~?`L^+8%3bI_PMKO%#*c4X5roX(y_A=~oHRey z@hOtsMKWBS$G9oQJMxcTNMvSvKCznWncIHeL%rBF{!NbP0|wuUuJ9lRAv0{#j|f)7 zmO1a4|Nnz!wqLMpH}T=aPgsFlP5WWPz7&ghiy|cGC_Gz3k^i=bZv0OAvkz-e~^(7=W?%oL3Sz?Xb^OkwwA( z@I~ML9-CDyYj<1@*y;8L5_WBbjB9g}s~M3XlZcNE*M&pgs+u?+4Grw@JM9{ED6X10 z@=D#;4nHiM=y|2Yf@pP);$p^gaWPCQVC+{WP~d5{!@qjWR?Kypwzcq7>DYs(*SM!1 zd`w%glkJ1}r!U~Qz#}dnJ>NdzDj0XL0kS6?0Ol(OX#!ps(FDmUi`l5GpAT7)HUf9F z4NjFdsxHmSH9C%6)sj){Y3I|9e>^z+(#E|j2KOa)wekGg_$+SNGvO07##57IfVs}m z`ToT~fOF9BH%V3@yJj<**sty&hMlUTwu0PCidXdvS77tCg}aDS`^JP4VB3=^F+GLsbH3EcLy9+)8dd>R3f-51O1sn5>wl&{vFE2(r62oj_2gAv#d zIbCEjB>ZR;!?Q9j;7T57JmJXd6)KHQRObv{Jo(L!S#T!78FB%%qkR%54) zc!x^bop+WKMdj~lMgcDJaU1`_8zlSlg0GCwNGf>dexw=gvq|8@?%yQ`yl{2|$Ukc1 zr0{&CQ-+^dBOcz7YtqmP)+5RBN;B|WJ21I9dA_|ufjk(n-TN>;B?!Z%-Hzz?_)h+taU)41&>$c>PN zf(hP;4mu#~AQQ+OFyMU+rNWZ0N7({`+&#R>kg{rb82wLi!8sw+YG)e`@aL4}`6^CMJLnWqBd&HU^FDDr^a8L#+?nXFK zi~na!FQg7{1hyb&`=7$t`R)(VKvOR(XwxF=B0$_K!*9f|w|5cnc{yMVE6N1cS0_Ps z9w^nbHb8(rckjitKvjYqxpt1VHXry~7U2_*Qi8jeq_uzqR>-+E=#dN>h)+?}tQ34Kynd0#is_X;&Fp=){#(oE10%I~kn|3z&F?Y&wRC06_#! zyAQjY5xUz{aGL#TrRx%L6YV8QsqEmXSbRRHU_tHOur-A3Gy~%}{<49zE&fU+xQ~N` zeUHk)YZa{Z`WgcEyt^F+j~sI5&XIxjNhcSZvv&D#Wl`NRLaL`S(L2a8{~IVR-9I_k zc9XD-kh5~y9HS=+!FQoAZeP#C_W7u2s~-Oi^giZnbcChhOL}cg#NmkqLMjmY@8f6!XSfN zowXUsoV+9#iZa_nrfjO;w=5<9GL@{rv(d4@e21|{fF#1EKG75vKbI<eE5oza8X7R1JzuI|ix2X{2-X5rBnKK`hK1bXSC!bxU9!~Mw28FE%46FD7@Di7 z==e7)YE&L_S;Cew^qq7iG=Za2*5dEMB=XUh4Nk;0-ew4+p~Qv6@Mp{`g5q-EFpuz% z6wtUkGSFUAT`94-b2Z>*haVX>XZ}y~Ox?5KOkA%*N6iMucdcYR3Dn^QI`bCh&m!Sq zC#MQj2xzNbxMqX+q+9Qk5=@Sac_o(Sauo5Xt_yt6wyFeKr&MrM)kJ2#dQmBQya!)g zoT%gaCNZN!1C0rXnm)n{>XkY$s!$}8Hn6>xC1SKUyFri8YXcpFk_ru59VfqZP%W?6 zAhC=!AbrjNNjs{!Bs_X6lAmQ{c`^+gn^`CWH`D*!&PccDKeK&+or>Y~{RWmIJt5ig zTdX32_joTY$%g*e^u*2NzCC}UG-Cj=(KJR|>Z(Y>>|Orx2eQnYtGOCdHVE}6lzr;<9)-4Amxaa`-Y*7Ia7zQRuHf@$jHiCM`_`m zP?-hjweCB26Sd+Y*%%zm$T(WV@hkl%It6;@O$BC_;4nk@{lOVGa4p3@fBf7sl%(z| zn~pdAaW;@0f-OoDGY_x{s^c}S^>>L%n)sd*!eK%hGQ6_6X_!qxCT%-e(n4ttNmAg~ zc<1!R);(XuDl7{s*X7xK95gW&FmdO-G_nfHYUmM!802>4pS~p&MmW1pQhsYV!hjVo zX=?4XD^gTG#51(!Zgb8P{U|!VBY>ss-t0kpYG|bp?4FRiy#2{D9ey~u?6x?}XyfjX z;~=e>RZLQQu>eo>bb4OKF8?QA=ZWeakTy`CkAKRrl<*1GU4t2BSVidT53LIxv=FI0 zuA_y4WV$x&Sp{hEH=&g1;sn&kytxYuQKI?2K&{+7;{a#8oqqiM-5%I3^u@xm&@kD? zL*j!;YOiRyqw2QU1+i$t*(VIv9y7UNXq|o#Z}oX1IvjbeQRZi|Lfw`iL{Bm5hbBsc zBXiQQUiMlND!EBl{T=9DgO3PTEow}IH0HFRi|_T1h-+xwF#XpJ%}*73kf*i<7_;vI z*{bc{__Ed50Rk%NQjQy+3yVzIGofQil1*T+LY>BO#Rt(E_ka#q_G+!L$VH20{uSt? zrfUzFZ9uODr?OH^?xahG#O+CF$A6L*;uJk|z+fsYwD8;q2_?>#dGI@u%^#%h&`!Cx zN8WYzd~`W8>^`uicsAYldCxdN>8-T~sIU}W9SetlAFmRT*vA)u!TNEG;3gM#Ta{4L zZu?&UILP0K^8C-%ipbRE%`(3PlmGt|>wTqS_<<}@YtoQO#Bo7CXZsm==oD5&Uae@G z7yPMcon3^oDKjhUaYsM6aaLWdo?3vx;yeRfC-;&3lc8EI=pp10Q~1XbxPf|Ps9D}2 z6T~?L2x@o~Kq(8bo+eVe4q^ zPFtpfn`Jf8Ds#`dsSbGXi2zsX>5vX6*0B=WQy>KyYd|7==$R3)V}8c zbq{LU4L>)lb0fh4vq(OrC#Sb}4lFlu@)SvGNb`b>Z(svS1M@#3m>&?K*EJIl`@;3q z!3)g_2i>(JR`q-2wPvIWJfg=gyf5w2geu(RA=6l74+dlV;i>~7=*DwNAvA0F-X#FGWThE{m}Tq;+oNllP?e@BF>thbtYb7FFgi zl{+NX-P!oz+w~-WZ#e&O!AyLe?hP#f4#BzSyZHFK13>R=f6A>;_YvaxR`5-GYO4&b zg>f74QBhHz;nberc;#Xm1tb9PopB1wMFIY2Coj~E1+6F2{7M76;PNd`HC(>cBe2<~ znUmC;ee*NE4nB`0}NAN*W^M0y!o_oyT)yPX}of8C+g2jTR&wEa`%8n~2UA7*q@ pz_lkZSX<3!PI5QMtz+x-tRU3s8A;1KKLdYTY> - -Each GitHub Actions module build should have `migrate`/`publish` steps (in -Actions parlance, ``job``s) that run conditionally; these jobs should run only -as a result of the `workflow_dispatch` event, not for pushes or pull requests. - -===== Versioning - -All module builds with versions that are not derived from the tag (e.g. npm, -but not necessarily Go) will receive a new version for each build, even if -the build goes unpublished. Versions will follow a consistent (and -semver-compatible) format across all artifact types that support it: - -``` - -.+. -``` - -The components are defined as follows: - -`base-version`:: - A manually-incremented `major.minor.patch` semver version that is committed - to the repository. Bumping this version requires a human committing an - incremented version. -`environment`:: - The environment we are building for; for builds that will not publish, - the environment should match the development environment used for builds - that publish to the development testnet. -`build-number`:: - Auto-incremented for each published build. This means that builds that - don’t publish can produce several builds under a single build number - until a build is published. -`branch`:: - Unless a build is unattached to a branch, this should be the branch for - the build. For example, for pushes to `master`, this will be `master`. - For PR builds, this will be the PR branch. -`commit`:: - The commit hash for the current build. - -Versions that are deployed to mainnet are special; these carry only the -`` with an optional `-rc.` for a mainnet -deployment considered a release candidate. Mainnet versions are also -currently deployed manually, so publishing is not expected to occur in the -automated pipeline for these versions. - -===== Tagging - -Tagging for modules is based on their path in the repository and the version -of the module. These versions do not need to be correlated between modules. -As an example, consider the repository at `github.com/keep-network/keep-core`. -It has three modules: the Go client, the Solidity contracts, and the Keep -token dashboard. A 1.0.0 version for each of these modules would be tagged as -`v1.0.0` (Go client), `solidity/v1.0.0` (Solidity contracts), and -`token-dashboard/v1.0.0` (token dashboard). - -In addition to being clear on which module is being tagged, this also happens -to follow with go mod‘s module versioning strategy, so it will be -forward-compatible to managing multiple Go modules in one repository if that -should become necessary. - -Publishing (below) should result in the creation of a tag on the repository -if the generated artifacts are expected to be consumed downstream or by third -parties. A tag doesn’t necessarily need to be created for internal modules -such as Kubernetes ``InitContainer``s. - -===== Publishing - -As discussed in the <> section, publishing will be implemented as an -optional last step/job in the regular build process. Publishing should -include any artifacts that may arise out of the build; in particular, here -are the major expected artifacts: - -Go builds:: - The Go client executable and a docker image with same. -Solidity builds:: - The npm package with JSON artifacts, including deployed artifact - information. -JS libraries:: - The npm package. -dApp builds:: - The static site publish; this may not necessarily result in an npm - package or other directly downloadable artifact beyond a reachable URL. -InitContainer builds:: - A docker image. - -For contract builds, publishing should involve deploying as well. Whether an -unpublished build includes deployment or not is a module-specific decision. - -[[workflow-dispatch-event]] -===== `workflow_dispatch` event - -Publishing is triggered by the `workflow_dispatch` event. These events can be -https://github.blog/changelog/2020-07-06-github-actions-manual-triggers-with-workflow_dispatch/[dispatched -manually], or they can be dispatched via API calls. For the purposes of this -RFC, the expectation is that first event in a chain will be dispatched -manually, and downstream builds will be fired -https://docs.github.com/en/rest/reference/actions#create-a-workflow-dispatch-event[via -API] through intermediary Actions (see the <> -below). For a module build, the `workflow_dispatch` event should -expect two parameters: - -`environment`:: - The environment to run the build for. This corresponds to either a public - testnet name (e.g. `ropsten`) or an internal environment name. `mainnet` is - currently not a valid build identifier, as mainnet builds are currently - run manually. -`upstream_builds`:: - A JSON array of upstream build information, in order from the original - triggering event to the build that triggered this `workflow_dispatch`. The - format of each object is described in the next section. - -Additionally, `workflow_dispatch` events are triggered on a particular `ref`, -which is considered part of the input to the publish as well. - -After a publish is successfully completed, downstream builds should be -dispatched per the following section. - -==== Inter-module dependency management - -Inter-module dependency management is handled by a repository that tracks -dependencies and handles inter-module and inter-repository coordination. This -repository could be an evolution of the `keep-network/local-setup` repository, -which currently manages interdependencies for local setup purposes; it could -be one or more Actions on another existing repository such as -`keep-network/keep-core`; or it could be a separate repository altogether. - -The repository will have a single entry point for inter-module builds, a -GitHub Action triggered by a `workflow_dispatch` event. This event will -expect two parameters: - -`environment`:: - The environment to run the build for. Same as for a module build, this - corresponds to either a public testnet name (e.g. ropsten) or an internal - environment name. mainnet is currently not a valid build identifier, as - mainnet builds are currently run manually. -`upstream_builds`:: - A JSON array of upstream build information, in order from the original - triggering event to the build that triggered this `workflow_dispatch`. - -Entries in `upstream_builds` will have these properties: - -`url`:: - A URL that points to the GitHub Action run in-browser. -`ref`:: - The ref used for this build. -`module`:: - The name of the module that was built, including the repository (e.g. - `github.com/keep-network/keep-core/solidity-v1`). -`version`:: - The module version used for this build. - -Downstream builds will be triggered by invoking a `workflow_dispatch` event -on their containing repository. The name provided for the event will be the -name of the build’s module followed by `.yaml`. Note that this imposes a -restriction on module build Action names: the GitHub Action associated with a -module build should match the name of the module, which should in turn match -the name of the directory the module is in. In cases where a module is nested -beyond one level in the repository, the file should be the full path, with `/` -replaced by `-`. - -When invoking `workflow_dispatch` on a module, the event passed to that -module build will have these properties: - -`environment`:: - The environment to run the build for. Same as for a module build, this - corresponds to either a public testnet name (e.g. ropsten) or an internal - environment name. mainnet is currently not a valid build identifier, as - mainnet builds are currently run manually. This is the same as the - parameter passed to <>. -`upstream-ref`:: - The ref used to trigger the upstream build. Note that this can and often - will differ from the Action's own `ref`, which will generally be `master` - for the dependency management repository (since typical builds will use the - `master` branch's dependency management configuration and Action). -`upstream_builds`:: - A JSON array of upstream build information, in order from the original - triggering event to the build that triggered this `workflow_dispatch`. This - is the same as the parameter passed to <>. - -The `upstream_builds` array’s latest entry will be used by the dependency -management Action to determine where in the dependency graph the upstream -build is, and trigger the appropriate downstream module builds. - -This dependency management repository should track the dependencies between -builds in a way that makes them easy to resolve at runtime. A proposal would -look something like this: - -``` -{ - "github.com/keep-network/keep-core/solidity-v1": [ - "github.com/keep-network/keep-core", - "github.com/keep-network/keep-core/token-dashboard" - ], - "github.com/keep-network/keep-core": [ - "github.com/keep-network/keep-ecdsa", - "github.com/keep-network/keep-ecdsa/solidity" - ], - "github.com/keep-network/keep-ecdsa/solidity": [ - "github.com/keep-network/tbtc/solidity" - ], - "github.com/keep-network/tbtc/solidity": [ - "github.com/keep-network/tbtc/relay-maintainer-initcontainer", - "github.com/keep-network/tbtc.js" - ], - "github.com/keep-network/tbtc.js": [ - "github.com/keep-network/tbtc-dapp", - "github.com/keep-network/tbtc.js/liquidation-maintainer" - ] -} -``` - -Here, we use the same module reference structure that we use for versioning -(the path to the module) and define downstream build dependencies, all as -JSON. When the `workflow_dispatch` event is received in the dependency -management repository, it checks the last entry in `upstream_builds` (see -below) and checks its module property against this dependency definition to -trigger the appropriate builds, done by calling the GitHub API to trigger -`workflow_dispatch` events on those repositories in turn. Note that these -builds can fan out, and this RFC does not define a "fan-in" way to trigger a -downstream only when multiple upstreams have completed. - -=== Limitations - -While the above proposal covers both the build/tag/publish process and defines a way to manage inter-module builds centrally, across repositories and versions, there are a few limitations to the detailed approach and a few things that are explicitly left out: - -* Automated mainnet releases. Mainnet releases and upgrades currently require - manual coordination with both internal and external entities and are still a - topic of exploration for the team, so they are left for future work. -* Downstream builds are blocked from starting by upstream deploys. Could be a - target of future work. -* Tracing of failures is not always straightforward: because the coordinating - repository relies on dispatching builds on repos and having them call back to - the coordinating repository, tracing a failure may require looking at several - repositories to see where a build originated. The `upstream_builds` argument - should help with this, but errors can still happen in unexpected places and - require tracing across repositories. -* The dependency management repository can trigger fanned out builds. These - builds will not track all `upstream_builds` entries, and could result in a - partial downstream view of the overall build graph. Additionally, there is no - way to specify a "fan-in" where a downstream build requires multiple upstream - builds to complete. -* Contract artifacts will still be bundled with contract code dependencies. - This means that a new deployment requires new artifacts and therefore a new - npm package, and that one deployment cannot be pointed to multiple - environments. -* Publishing builds cannot be triggered manually without navigating the GitHub - Actions UI -** Possible fix: Heimdall can be updated to support chat- and - GitHub-comment-based invocations of builds. - -== Future Work - -* When running an Action module build from a `workflow_dispatch` event, looking - up the prior published artifact and checking whether there have been changes - between its commit id and the current commit could be used to skip the build - altogether and go straight to triggering downstream dependencies. -* In general, breaking the jobs down in the module builds such that rebuilds - can be partial would allow avoiding repetition of certain slower processes in - cases where they need not be repeated for a rebuild. It’s possible the module - delimiting will be enough to handle this. - -[bibliography] -== Related Links - -- https://coda.io/d/RFC-18-Release-Management_dfoNsYNQPDB/Abstract_suWVV#_luluz[Original Coda document] -- https://www.flowdock.com/app/cardforcoin/tech/threads/Ha2Kfs-2rr5bSDTvQOxJFoRKoQc[Sample (multi-day) release flowdock thread] diff --git a/docs-v1/rfc/rfc-2-network-security-implementation.adoc b/docs-v1/rfc/rfc-2-network-security-implementation.adoc deleted file mode 100644 index e606a3c7fc..0000000000 --- a/docs-v1/rfc/rfc-2-network-security-implementation.adoc +++ /dev/null @@ -1,197 +0,0 @@ -:toc: macro - -= RFC 2: Network Security Implementation - -:icons: font -:numbered: -toc::[] - - -== Proposal -In this document, we describe the implementation details of the Keep network -security mechanisms meeting requirements specified in -<>. - -=== Goal - -Messages exchanged in the network must be attributable, maintain integrity, -and must optionally be confidential. - -=== Implementation - -==== Network topology and application-level messaging - -It is important to understand the difference between the network topology -and communication between peers on the application level. Peers connect to -each other based on the rules defined by the underlying P2P network protocol. -Two peers exchanging messages on the application level do not necessarily -need to have a direct connection with each other on the network level. It is -possible that messages exchanged at the application level by two peers are -relayed by other peers on the network level. - -On the network level, we require all peers to prove their identity and minimum -stake when they establish a connection with each other. All peers monitor the -on-chain stake of peers they are connected to and are obligated to drop the -connection with the given peer if that peer's on-chain stake drops below the -required minimum. This requirement enforces that only peers with a minimum -stake are able to be a part of the network and this requirement is enforced by -all peers individually. - -Even if a message between two peers was relayed by others, this message still -needs to fulfil attributability, integrity, and optional confidentiality -requirements. Since two peers exchanging messages do not necessarily need to -have a connection on the network level with each other, they also perform an -identity and stake check before the communication between them happens if such -check is not already performed as a part of the protocol those two peers execute. - -==== Peer identification -Each peer is identified by a static public key equal to the delegate key -associated with an on-chain stake. No two peers in the network are permitted -to have the same static public key. - -==== Network join protocol - -Keep publishes a list of recommended bootstrap peers but every other network -member can enable the bootstrap capability as well. The list contains addresses -of bootstrap peers and their static public keys. Bootstrap peers are just like -any other peers, but with the added capability of being able to handle network -join requests. - -The result of joining the network is inherently dependent on the bootstrap -peer's announced view of the network, that is why choosing a right bootstrap -peer is so important. Using a malicious bootstrap peer may lead to joining a -fake network if the malicious bootstrap peer and other fake network members can -prove the ownership of their on-chain stakes. Using a recommended but hacked -bootstrap peer may lead to not establishing connections with any other peers in -the network if the hacked bootstrap peer does not properly announce new peer's -presence. - -A peer wanting to connect to the network sends a network join request to one of -the bootstrap peers. Each peer wanting to join a network needs to provide a -proof of ownership of an on-chain identity with an associated stake. As part of -the network join handshake, the bootstrap peer will also provide proof of its -own stake. - -The procedure is as follows: - -1. Peer joining the network initiates the protocol by sending a network join - request message containing randomly generated nonce `n_1`, an 8-byte (64-bit) - unsigned integer, to the bootstrap peer. The message is signed with the - peer's static private key. -2. The bootstrap peer randomly generates nonce `n_2`, which is also an 8-byte - unsigned integer, and computes a `challenge` which is the result of calling a - cryptographic hash function `hash` on the concatenated bytes of `n1` and `n2` - (referenced as `n1 || n2`). The bootstrap peer sends back `challenge,` `n_2` - and signs the message with its static private key. -3. The peer joining the network recomputes the challenge from `n_1` and `n_2`; - if it matches the challenge sent by the bootstrap peer, it answers with a - message containing the challenge. The message is signed with the peer's - static private key. -4. The bootstrap peer validates the challenge. - -``` -JOINING PEER BOOTSTRAP PEER - -n_1 = random_nonce() -Message { n_1 } ----> - n_2 = random_nonce() - challenge = hash(n_1 || n_2) - <---- Message { challenge, n_2 } -challenge = hash(n_1 || n_2) -Message {challenge} ----> -``` - -Message signature is checked for any message that is received. Any message with -an invalid signature immediately aborts the protocol. If all signatures have -been valid and challenge response was as expected, both parties execute a check -for an on-chain stake of each other. If the peer joining the network has a -minimum stake, the bootstrap peer connects the peer to the network and announces -peer's presence. If the bootstrap peer has a minimum stake, peer joining the -network decides to connect to the bootstrap peer and becomes a part of the -network. Nonces and challenge generated during the handshake are discarded. -Otherwise, when at least one of the parties does not have a minimum stake, the -protocol is aborted. If the bootstrap peer had a deficient stake, the peer -joining the network may execute the protocol again with the next bootstrap peer. - -==== Network peer authorization protocol - -Once a peer has completed the network join protocol successfully, it is -connected to a bootstrap peer and is a full-fledged network member. It starts -discovering other peers in the network and connects to some of those according -to the peer discovery strategy implemented in the network. Before the peer -decides to connect to any other network member, the same nonce, challenge, and -stake check protocol must be executed between the peer and the new network -member it is connecting to. Peers decide to connect to each other only if they -both complete the protocol successfully and prove their on-chain minimum stakes. -This is a trust-no-one strategy which allows for even a corrupted network to -heal in the case of a malicious split brain event. - -==== Attributability and integrity of messages - -All messages in the network are signed with the sender's private static key. -Each message is uniquely identified by the sender's address and sequence number -incremented for each new message sent by that peer. The message identifier is -a part of the signed message content. Each peer in the network maintains a cache -of already seen messages for the time no shorter than the longest protocol -executed in the network. If a message with the given identifier has been already -seen by the given peer, the message is discarded. This behaviour applies both to -peers relaying a message and to peer which is the final message receiver. - -When a peer receives a message it first checks the signature. If it matches, -then peer validates uniqueness of the message ID. If a message with the given ID -was not seen before, then the message is accepted. - -All peers in the network have a streaming view of the latest chain state that -notifies in an event-style when a given address falls below the minimum stake. - -If a peer's stake drops below the required minimum, all connections to that peer -are dropped and any unprocessed messages from that peer are immediately -discarded. Once the peer's stake returns to at or above the required minimum, -it must initialize its connections with any disconnected peers once again in -order to be able to communicate with them. All unprocessed messages will be -retried. - -==== Message Confidentiality - -Encryption is implemented on the application level and not on the network level. -To enable encryption, two parties perform ECDH handshake using standard network -messages ensuring attributability and integrity as described in the previous -section. - -Any of the communicating peers can reveal the symmetric key in order to publicly -publish a complaint about the other peer's message. In such case, the symmetric -key is considered as compromised and should not be used for further -communications. - -==== Message relay - -Two peers communicating on the application level do not necessarily need to -have a direct network-level connection with each other. It is possible messages -are relayed by other peers. Each peer relaying the message validates the message -signature against sender's key. If the signature is not valid, peer rejects the -message and drops the connection with the peer that relayed that message since -that peer is the one that tampered the message. - -Peer which tampered the message is blacklisted by the peer who received the -relayed, tampered message. Peer is blacklisted for a certain period of time, -tracked as an on-chain parameter. This time period is never shorter than the time -needed to re-transmit the message. During the time peer is blacklisted, all -connection attempts from that peer to the peer who blacklisted it are rejected. - -==== Group formation - -In the Keep network, peers may form groups selected to execute various protocols. -The output of the group formation protocol is a list of on-chain addresses. -When a peer joins a group, it includes its public static key in every single -message sent to the group. The public key is used by other peers in the group -to derive the on-chain address of that peer, and check if the given peer is -eligible to join and communicate within the group. - -[bibliography] -== Related Links - -- Discussions on writing this document: -https://www.flowdock.com/app/cardforcoin/tech/threads/Zc_bHNDU5eNJY8JHB22NfU2a9Bk - -- libp2p security considerations: -https://www.flowdock.com/app/cardforcoin/tech/threads/hKOcyS8EPmZ7PBvpnMQixy0di1e diff --git a/docs-v1/rfc/rfc-3-stake-delegation-requirements.adoc b/docs-v1/rfc/rfc-3-stake-delegation-requirements.adoc deleted file mode 100644 index 0b1bd35df7..0000000000 --- a/docs-v1/rfc/rfc-3-stake-delegation-requirements.adoc +++ /dev/null @@ -1,362 +0,0 @@ -:toc: macro - -= RFC 3: Stake delegation requirements - -:icons: font -:numbered: -toc::[] - -== Background - -Keep tokens are going to be staked by having token owners delegate their staked -balance to an operator account and use it to run the Keep Client. The operator -account cannot access the stake directly, nonetheless, it operates on behalf of -the owner and bad acting will result in slashing the owners' stake. The operator -may be a third party, or it may be a different address controlled by the owner. - -Stake delegation will be beneficial for the security of Keep users as it allows -for on-stake operations with a "cold wallet". Thus, putting Keep users wallets -offline protects them from "hacks" and stake delegation enables continuous -rewarding on safe operations on staked assets. - -=== Terminology - -owner:: The address of an owner of the staked tokens. - -operator:: The address of a party authorized to operate a stake on behalf of a - given _owner_. - -beneficiary:: The address where the rewards for participation are sent, earned by an - _operator_, on behalf of an _owner_. - -delegated stake:: An _owner_'s staked tokens, delegated to the _operator_ by the - _owner_. - -on-stake:: Refers to the type of operations performed by an _operator_ on a - _delegated stake_. - -== Proposal - -Stake delegation enables a token _owner_ to delegate their already-staked tokens -to an _operator_ and enables an _operator_ to operate staked tokens on behalf -of the _owner_. The owner also defines a _beneficiary_ address (recipient) where all -rewards generated by the _operator_ for the staked tokens are sent. - -=== Goal - -The goal of this proposal is to specify a simple and secure stake delegation -mechanism. It should enable Keep users to have their wallets offline and their -stake operated by operators on their behalf. The Keep client software should -be able to run without exposing Keep operator's private key and should not -require any owner's keys at all. The stake delegation should also optimize -the network throughput without compromising the security of owners stake. - - -=== Design Assumptions - -1. _owner_ can only have one operator. -2. _owner_ can only delegate all of his stake. -3. _operator_ cannot have any KEEP tokens at all. -4. _operator_ can only have a _delegated stake_ from only one _owner_. -5. If an _owner_ tries to delegate to more than one operator, the tx must -fail. -6. If an _owner_ tries to delegate a stake to an _operator_ who already has a -stake, the tx must fail. -7. The end of an _on stake operation_ happens only after all rewards are -granted and all penalties are imposed. -8. Rewarding and penalization happens as the last phase of all operations. - - -=== Design Factors Analysis - -During the design, we have considered several different factors that impact the -performance and the security of the proposed solution. We are going to discuss -them in more detail in this section. - -==== Operating - -Operating is the first of the analyzed factors. It has the greatest influence on -performance as it is strictly associated with network throughput. We have -analyzed the following operating strategies and their impact -on the proposed solution. - -===== Atomic Operating - -Atomic operating is an operating strategy that allows an operator to only -perform one staking operation at a time. Such an operation locks the stake, and -no other operation can be done until the end of the current operation. -This ensures that the stake cannot be changed during the on-stake operation. -Hence, we achieve a high level of stake protection. - -The downside of this solution is that the network throughput is strongly limited -as the maximal number of possible concurrent operations is TOTAL_SUPPLY / -MINIMUM_STAKE. - -===== Multi-Operating - -The second analyzed operating strategy is multi-operating, where the number of -on-stake operations is not limited. Using this strategy an operator can perform -as many on-stake operations as possible and is only limited by the stake that is -delegated to him. In other words, an operator cannot perform a single on-stake -operation with more than his delegates stake but can simultaneously execute an -arbitrary number of operations with the same delegated stake. Therefore, the -multi-operating strategy achieves the highest possible network throughput. - -Unfortunately, the multi-operating strategy can lead to severe security and -economic ramifications. For example, with such an unlimited operating, an -operator can execute such a high number of on-stake operations that the combined -penalties would be larger than the total owner's stake, depleting their entire -stake. - -Another issue that is associated with multi-operating, assuming that it is -possible to withdraw a fraction of stake instantly after being selected to the -group, is as follows. -If an operator A operates on more than the MINIMUM_STAKE he can participate in -the same number of operations as an operator B who has multiple MINIMUM_STAKE -and both will get the same rewards. -Such a possibility might have a negative impact on the owners' motivation to -delegate more than the necessary minimum to get more rewards. - -===== Atomic Multi-Operating - -The third analyzed strategy is a hybrid approach where we combine atomic -operating with multi-operating. This strategy enforces that when an on-stake -operation is performed, a portion of a delegated stake is locked (e.g. -MINIMUM_STAKE if the penalty for misbehaving is lower than the MINIMUM_STAKE or -MAXIMAL_PENALTY otherwise) and cannot be used for other operations until the end -of the current operation. Hence, achieving the stake atomicity. The operator can -use the remaining delegated stake for other concurrent on-stake operations. -Therefore, achieving the multi-operating feature. No more operations are -permitted when the amount of unlocked stake is lower than the required portion -of a stake to be locked. - -This strategy protects the stake of the owner from being rapidly depleted, -unlike the pure multi-operating. It also enables higher network throughput than -the pure atomic operating strategy. - -The atomic property limits the operating leverage introduced by the -multi-operating strategy. It gives more control over the number of operations -that an operator can perform. Therefore, it promotes owners with a more -delegated stake as more stake is operated, more rewards can be received. The -controlling mechanism of atomicity can be used in a more flexible manner to -increase network throughput. This can be achieved by introducing a stake -operation multiplier, where each operator is allowed to operate on a multiple of -the delegated stake. This mechanism can be used as an additional benefit for -early players and the value of multiplier could gradually decrease over time. - -==== MINIMUM_STAKE - -The MINIMUM_STAKE plays a crucial role in the process of on-stake operations. It -is the limiting factor of how many concurrent operations an operator take part. -Therefore, we have also analyzed two possible scenarios for setting -MINIMUM_STAKE. - -===== Static MINIMUM_STAKE - -The static approach towards MINIMUM_STAKE is that its value does not change -during the lifetime of the system. It can only be updated during the hard forks. -This makes the system easier to implement but less flexible for external -economic factors. During the lifetime of the system, the costs of operations -might change significantly and rapidly, limiting the affordability of further -operations. - -===== Dynamic MINIMUM_STAKE - -Dynamic MINIMUM_STAKE enables flexible changes of the MINIMUM_STAKE value during -the lifetime of the system without forcing a hard fork. This approach makes the -system more flexible for adjusting the on-stake operating prices and makes the -system more rigid against external economic factors. The downside of this -approach is its implementational and operational complexity. - -==== Undelegation - -Last analyzed factor is undelegation strategy. The way how the stake delegation -is canceled plays a crucial role in protecting owners stake against misbehaving -operators. - -===== Instant Undelegation - -The first undelegation strategy is an instant undelegation. It is a -straightforward approach where an owner or an operator revokes the stake -delegation. When such undelegation is invoked an operator instantly stops all -on-stake operations and the stake is returned to the owner. As a result of -stopping all of the on-stake operations, the resulting penalties are imposed on -the owner's stake. Here we can distinguish between undelegation penalties being -treated as inactivity, misbehavior, or as a separate type of penalty - which -will be discussed in the penalization section. - -===== Delayed Undelegation - -The second strategy for the undelegation is a delayed undelegation. When a stake -delegation is revoked using this strategy, the delegated stake is locked for an -UNDELEGATION_TIMEOUT period. Starting from the undelegation initiation and -during the UNDELEGATION_TIMEOUT no new on-stake operations are allowed (any -attempt should be rejected). All of the already started on-stake operations that -will finish before the UNDELEGATION_TIEMOUT are treated as usual and all rewards -and penalties are calculated normally. If an on-stake operation will not end -before UNDELEGATION_TIMEOUT period it needs to be terminated instantly at the -end of the timeout and the owner stake will be penalized accordingly to the -penalization strategy. Therefore, the safest option here is to have -UNDELEGATION_TIMEOUT as long as necessary to safely end all of the ongoing -operations - it should be longer than duration of any operation in the network. -After the UNDELEGATION_TIMEOUT the delegated stake is unlocked and is returned -to the owner. - -==== Penalisation - -Last key factor impacting the performance of the solution and its security is -the cost of undelegation. The impact of the stake delegation on the mechanics -and economy of the solution is strictly related to the way how the undelegation -happens. In this section, we will discuss several undelegation penalization -strategies. - -It is important to emphasize that the penalization happens only when an -undelegation hits an ongoing operation and that operation will not end before an -effective undelegation. Therefore, any operation that will end before the -UNDELEGATION_TIMOUT will not be penalized. - -===== Inactive (zero cost) - -First penalization strategy is to treat the stake undelegation on an ongoing -operation as an operators inactivity. This strategy does not require excessive -mechanics as the network should verify in every step the eligibility of the -operator to participate in an operation. From the perspective of the owner and -impact on the stake, this would be the most beneficial strategy as the stake -would not be impacted as the result of the undelegation. - -The downside of this approach is that it could be used as a fairly cheap way for -an owner to resign from an unfavorable operation due to the low cost (virtually -zero cost) of the inactivity penalty. This could lead to major instability of -the network operations. - -===== Misbehaving (normal cost) - -Second penalization strategy is to treat an operator as misbehaving as the -result of the undelegation. The undelegation happens on-chain, therefore, we can -perform normal penalization as we have an on-chain proof. This strategy is most -beneficial for the network as it protects other participants from the -undelegation abuse. - -The downside of this strategy is its implementation complexity as it requires -tracking the undelegation events and aligning them with the inner workings of a -particular operation (including adding an internal mechanism for proofing and -validating an external undelegation event). - -===== Consequent (opportunistic cost) - -A third strategy is a consequent approach, where an undelegated operator is -treated as an inactive until an operation fails. If the operation fails due to -inactivity of the operator, he will be marked as misbehaving and the owner will -be adequately penalized. - -=== Design Strategy - -Each of the analyzed factors is orthogonal and required to be a part of the -designed architecture. As the goal of the proposal is to provide a solution that -has high network throughput and is secure we need to eliminate less optimal -strategies. - -==== Operating - -The Atomic Operating is the strategy that has the lowest network throughput, -therefore it should be rejected. - -The Multi-Operating strategy is the theoretically slightly less secure, but -practically at the same level of security as Atomic Operating, therefore it -should be considered as an available solution. - -The Atomic Multi-Operating strategy is also a viable solution as it provides -higher network throughput (assuming version with stake multiplier) than the -Atomic Operating and theoretically more secure than the Multi-Operating (against -"leveraged staking/penalization") but realistically similar. One of the benefits -over Multi-Operating is the possibility to control the network throughput -through the stake multiplier, which might become an important feature for -mitigating the influence of external (associated) currencies fluctuations on the -economy of the solution. - -==== MINIMUM_STAKE - -Both dynamic and static MINIMUM_STAKE strategies are valid ones and do not -influence the performance of the network heavily. The dynamic one has an -advantage over static one for being more resilient against external factors but -for the cost of increased complexity. Therefore, a more optimal choice would be -the dynamic MINIMUM_STAKE strategy. - -==== Undelegation - -The Instant Undelegation is associated with high-security risks and in the case -of a deliberate operators misbehavior can lead to sever owner stake -penalization. Therefore, it should be rejected. - -The Delayed Undelegation bares lower security risk and should be perceived as -the best choice. - -==== Penalisation - -Both Consequent and Misbehaving Penalisation strategies have an adequate -influence on the performance and the security of the solution. The Consequent -Penalisation tends to be more liberal and might lead to minor abuse but its -impact on the network throughput is minimal. The Misbehaving Penalisation is -more strict and might enforce more conservative behavior of the operators. - -The Inactive Penalisation should be rejected as it enables zero cost end of the -operation which might impact negatively on the network stability and performance. - - -=== Architecture - -Accordingly to the design strategy and the design requirements the design -architecture should be based on the following combinations of strategies: - -(optionally Atomic) Multi-Operating with Dynamic or Static MINIMUM_STAKE and -Delayed Undelegation with Consequent Penalisation - -Other strategies tend to be suboptimal from the perspective of both security and -network throughput requirements, or from implementation. - - -=== General requirements notes - -==== Slashing operator -Adding a slashing bound between an owner and an operator should create positive -feedback and decrease an operators motivation to misbehave. This can be done -either by defining an additional slashing address for the operator or by -enabling the operator to have its own stake. Therefore, the requirement from the -operator to not have any stake might be loosened. - -==== Operator and owner on the same address -If an operator would be allowed to have his own stake and to operate on it, then -it might be possible to allow an address to be both the operator and the owner. -This might be contradicted by the security and privacy argument as we want to -separate roles/addresses to protect owner keys from the exposure. - -== Open Questions - -How is this going to interact with RFC 4 (on secure upgrades)? - -Can we have different stake delegation contracts at the same time? - The -mechanics of proposed contracts might not be conflicting with each other and it -might be beneficial to have parallel contract types fulfilling the particular -needs of our users. - -=== Penalization -How to penalise misbehaviour? - -Should an _operator_ have an accountable address which will be slashed? - -=== Timeouts -What timeouts are reasonable? - -== Future work -Consider how the stake delegation will interact with ETH bonding (part of Keep, -but not the beacon). - -[bibliography] -== Related Links -- https://www.flowdock.com/app/cardforcoin/tech/threads/UQhnqrQAWk3azp2TO9UhOJQRMXp -- https://www.flowdock.com/app/cardforcoin/keep/threads/TA-Jwe9oMaOBAylc3yRJObc5Bq_ -- https://www.flowdock.com/app/cardforcoin/keep/threads/k6MV7jS9DEd0DnvOpkAt5SjsS9w -- https://www.flowdock.com/app/cardforcoin/tech/threads/-Lbr4JzmX0gY31CMDTRGnQUbbuw -- https://github.com/keep-network/keep-core/pull/121 -- https://github.com/keep-network/keep-core/blob/76e3e68430576c21ac76c0a56eec4a320a39a5e2/docs/random-beacon/delegation-notes.adoc -- https://www.flowdock.com/app/cardforcoin/keep/threads/kLxyy_0DH71UiQkTXHRQnaZyN_C diff --git a/docs-v1/rfc/rfc-4-secure-contract-upgrades.adoc b/docs-v1/rfc/rfc-4-secure-contract-upgrades.adoc deleted file mode 100644 index a271c49056..0000000000 --- a/docs-v1/rfc/rfc-4-secure-contract-upgrades.adoc +++ /dev/null @@ -1,89 +0,0 @@ -:toc: macro - -= RFC 4: Secure upgrades for contracts operating staked balances - -.SUPERSEDED -**** -IMPORTANT: This RFC has been superseded by an alternative described -in RFCs 9 and 11. It was never implemented as described. -**** - -:icons: font -:numbered: -toc::[] - -== Background - -Following best practices for ERC-20 Tokens, we have non-upgradable and -non-ownable Token and Token staking contracts, which means there is no -backdoor to modify the contract storage or change the implementation. -Amongst other things, these contracts only allow token transfers to be -executed by the token holders. Since token staking functionality might -need upgrading, it was decided to simply issue and deploy a new contract -and advise stakers to migrate their balances to it. - -A different upgrade approach taken from Open Zeppelin was implemented for -the rest of the contracts; this RFC states the pitfalls of the approach and -proposes alternative way similar to what we already have for Token staking -contracts. - - -=== Current Functionality - -Current upgrading functionality influenced by Open Zeppelin libraries makes -upgradable contract address and storage persistent and the logic can be -upgraded by the contract owner. They do so by updating the implementation -address in the persistent proxy contract. The method is also known as -"Eternal Storage". This was considered a good approach for all the -forthcoming Keep contracts including Group selection and Random beacon. -A concern has been raised during implementation of stake slashing -functionality where an upgradable contract such as Group Contract has to -be authorized to modify stake balances. Since the address and storage are -persistent in case of a compromised implementation all staked balances are -at risk. Imagine a deploy key that is used to update the implementation is -stolen, the hacker has full access to the contract storage immediately by -updating contract with his implementation. Besides if the contract address -was authorized to move stakers balances those will be lost as well. - - -=== Goal - -Minimize the risk of lost/stolen staked tokens in the case of a hacked or -bad implementation upgrade of the contracts that require full access to -modify balance of a staker. - -=== Implementation - -Each new contract that does "slashing/reward" changes on staked token -balances must be a non-upgradable and non-ownable one to minimize attack -surface. Functionality upgrades are only possible by deploying a new -implementation as a new contract. The address of this contract must be -re-authorized by a staker. Stakers do so by calling the `authorize(address)` -method on a staking contract. A client should only authorize official -contract addresses from the metacontract list maintained by Keep -organization along with the confirmation by two or more Keybase-proven -channels. - -The contracts with `authorize()` method should also include a "panic button" -- a method that cancels all authorizations in case of emergency. This -should be restricted to be called by a Keep organization account used to -deploy this contract. - - -=== Limitations - -Not particularly a limitation but a move from being able to do a seamless -and instant upgrade to a drawn-out one where stakers have to reauthorize -a newly deployed version. - -=== Proof of Concept - -The basis for the concept can be seen in the current Staking contracts -and TokenStaking.sol - - -[bibliography] -== Related Links - -- Discussion on Flowdock: -https://www.flowdock.com/app/cardforcoin/tech/threads/6_Abd7qxhJrSNhQSrDxwgyvL0Pd diff --git a/docs-v1/rfc/rfc-5-stake-delegation-specification.adoc b/docs-v1/rfc/rfc-5-stake-delegation-specification.adoc deleted file mode 100644 index d1c3b9d6c8..0000000000 --- a/docs-v1/rfc/rfc-5-stake-delegation-specification.adoc +++ /dev/null @@ -1,243 +0,0 @@ -:toc: macro - -= RFC 5: Stake delegation specification - -:icons: font -:numbered: -toc::[] - -== Proposal - -<> discusses the architectural -tradeoffs to be considered for the stake delegation design. That document -concludes with the preferred architectural approaches, and the remainder of this -section describes a subset of these. The approaches in RFC 3 that are not -detailed below are omitted in the interests of a simpler initial implementation, -but may be layered on in later RFCs. For now, this document focuses on a system -that uses _multi operation with static minimum stake and delayed undelegation -with consequent penalisation_. - -=== Goal - -The goal of this proposal is to specify a simple and secure stake delegation -mechanism. It should enable Keep users to have their wallets offline and their -stake operated by operators on their behalf. The Keep client software should -be able to run without exposing Keep operator's private key and should not -require any owner's keys at all. The stake delegation should also optimize -the network throughput without compromising the security of owners stake. - -=== Terminology - -owner:: The address of an owner of the staked tokens. - -operator:: The address of a party authorized to operate a stake on behalf of a - given _owner_. - -beneficiary:: The address where the rewards for participation are sent, earned by an - _operator_, on behalf of an _owner_. - -delegated stake:: An _owner_'s staked tokens, delegated to the _operator_ by the - _owner_. - -on-stake:: Refers to the type of operations performed by an _operator_ on a - _delegated stake_. - -operation:: A set of interactions with the system with a defined start and - finish, executed entirely by an _operator_, during which the operator does - tasks on behalf of all or part of a _delegated stake_. - -=== Design Requirements - -1. _operator_ can only have a _delegated stake_ from only one _owner_. -2. The end of an _on stake operation_ happens only after all rewards are -granted and all penalties are imposed. -3. Rewarding and penalizing happens as the last phase of all operations. - -== Roles - -In this proposal, we are specifying three roles: owner, operator, and beneficiary. -They are briefly characterized in this section. - -=== Owner - -The owner is the ultimate holder of the tokens. Before stake delegation, the -owner has full control over the tokens, and the tokens are returned to the owner -after stake delegation has finished. The owner's participation is not required -in the day-to-day operations on the stake, so cold storage can be accommodated -to the maximum extent. - -The owner can <>, -<> and -<>. - -=== Operator - -The operator handles the everyday operations on the delegated stake without -actually owning the staked tokens. While this enables third-party delegation -without, e.g., making it possible for the operator to simply transfer away -tokens, it should be noted that a malicious operator can exploit stake slashing -to destroy tokens and thus the entire staked amount is indeed at stake. - -The operator address is used to provide network functionality by -<>. - -The operator can unilaterally <> -and <>. - -=== Beneficiary - -The beneficiary collects <> earned from -<> and -<>. The beneficiary doesn't sign or publish -any protocol-relevant transactions, but any currency or tokens earned by the -operator will be transferred to the beneficiary. - -== Specification Features - -Following is a high-level description of each of the features in that sentence: - -Multi Operation:: - A feature that enables a virtually unlimited number of operations on a - delegated stake. It allows operators to operate on a delegated stake without - any limits (except the minimum stake requirements). - -Static Minimum Stake:: - A feature that determines the value of the minimum stake will be constant - through the network lifetime. It can only be changed during a hard-fork. - -Delayed Undelegation:: - A mechanism for revoking a delegation. Undelegation starts when an - undelegation request is submitted, and lasts through the undelegation - period. During this period, the operator has time to end all ongoing - operations. During the undelegation period, the delegated stake is locked - and no new operations are allowed. Already-started operations may be - continued. After the undelegation period timeout, the delegated stake is - released to the owner, and the bond between operator and owner is removed. - -Consequent Penalization:: - Is the way undelegation is penalized. When an undelegation happens during an - operation and the operation terminates successfully, then there is no - penalty. If the operation terminates unsuccessfully, then the penalties are - imposed. This the same way as standard penalization happens for an inactive - peer. - -== Specification - -=== Contract - -The contract should include the following information: - -* _owner_ address, -* _operator_ address, -* _beneficiary_ address, -* _bond_ indicator between an operator and an owner, -* amount of delegated _tokens_, -* _state_ of the agreement between an owner and an operator, -* agreement state _change_ time. - -The contract should also have the following discrete pieces of functionality: - <>, <>, - <>, <>, - and <>. - -=== Functionality - -[#delegating] -==== Delegating a stake - -1. The _owner_ chooses the number of tokens to delegate, _operator_, and -_beneficiary_ and creates a _delegation order_ containing this information. - -2. The contract receives the _delegation order_ and verifies the following (if -any condition is unfulfilled, processing aborts): - * _beneficiary_ address is set, - * _operator_ is not involved in another active delegating contract, - * amount of delegated tokens is lower or equal to the owner staked tokens. - -3. If all conditions are satisfied the contract processes the _delegation order_ -and sets the variables accordingly to the _delegation order_, and binds the -owner with the operator. The state of agreement between the owner and the -operator is set to `active`, and the agreement state change time is set to -current time.footnote:[Ability to increase the delegated stake can be -implemented via undelegating and delegating stake again with the new amount.] - -4. The _operator_ can now use this delegated stake for operating. - -[#undelegating] -==== Undelegating a stake - -1. The _owner_ or _operator_ chooses to undelegate the stake, and creates an -_undelegation order_. - -2. The contract receives the _undelegation order_ and verifies that the agreement exists. - -3. If the conditions are satisfied, the contract processes the -_undelegation order_ and sets the following: - * contract state is set to `undelegating`, - * contract state change time is set to current time. - -4. The _operator_ cannot enter new operations until the undelegated stake is -restored and the _owner_ cannot delegate the delegated stake to a new -_operator_. - -[#restoring] -==== Restoring undelegated stake - -1. After undelegating delay timeout since the _undelegation order_ has been -processed, the _owner_ or _operator_ creates a _stake restoration order_. - -2. The contract receives the _stake restoration order_ and verifies the -following: - * the agreement exists, - * the contract state is set to undelegating, - * undelegation timeout has passed. - -3. The contract processes the _stake restoration order_ and sets the following: - * returns delegated stake to the owner (minus any undelegation penalties if - applicable), - * removes the bond between the operator and the owner. - -4. The _operator_ is now free to start operating for a new _owner_. - -[#operating] -==== Operating on a stake - -1. When the _operator_ tries to join operation (e.g., present a ticket for -beacon group selection) they should create an _operation initialization order_, -signed by the _operator_. - -2. The _operation initialization order_ is published along with any other data -required to join the operation, after which the following should be checked: - * the agreement exists, - * the state of the agreement is `active`, - * the request is signed by the operator. - -3. If the checks pass, the operator may join the operations. - -[#rewarding] -==== Rewarding - -If the operator is awarded a _reward_ of currency, the reward should be paid -to beneficiary address. In this document, we are not specifying how rewarding -should be done. - -[#penalizing] -==== Penalizing - -1. If the operator is to be punished by stake slashing, the -_penalizing contract_ should call the _delegation contract_ with the _penalty_. -The _penalty_ should contain the following: - * the _penalty amount_, - * the _operator_ address. - -2. The _delegation contract_ should then check the _penalty amount_ is not -higher than the minimum stake. - -3. If the penalty is valid, the _delegation contract_ will subtract the -_penalty amount_ from the delegated stake. If the _penalty amount_ is higher -than the delegated stake then the delegated stake should be set to zero. - -[bibliography] -== Related Links -- <> -- https://www.flowdock.com/app/cardforcoin/keep/threads/XvKc8gLwZesycPdyeBYZL6Iyt3Z diff --git a/docs-v1/rfc/rfc-6-group-expiration-minimal-specification.adoc b/docs-v1/rfc/rfc-6-group-expiration-minimal-specification.adoc deleted file mode 100644 index 6a2f4d5a3d..0000000000 --- a/docs-v1/rfc/rfc-6-group-expiration-minimal-specification.adoc +++ /dev/null @@ -1,97 +0,0 @@ -:toc: macro - -= RFC 6: Group expiration specification - -:icons: font -:numbered: -toc::[] - -== Proposal -This document focuses on specifying a group expiration mechanism. The proposed -functionality enables a group to expire after a particular condition is met. -An expired group can not be chosen to perform new actions, but any ongoing group -actions will continue until finished. - -=== Goal -The goal is to provide a minimal set of functions necessary for implementing the -group expiration mechanism into the Keep network. The group expires when group -expiration timeout passes. - -=== Terminology - -work contract:: Referes to any contract performing a system action for which it - needs to have an active group assigned. - -== Specification - -=== Contract - -Group selection contract should include the following information: - -- active groups list (with group formation agreements), -- active groups counter, -- active groups threshold (which protects the network from expiring all groups), -- expired groups list, - -and (per group formation agreement): - -- group formation agreement identifier, -- group members identifiers, -- registration time when the group was created, -- timeout, after which the group expires, -- current state indicating if the group is active or expired. - -The contract should also have the following discrete pieces of functionality: -<>, and <>. - -=== Functionality - -[#registration] -==== Registration -When a group is formed, the group formation agreement is added to the active -groups list, the active groups counter is incremented, and the -agreement is filled with: - -- unique group formation agreement identifier, -- group members identifiers, -- registration time set to current block time, -- timeout evaluated as the time required to mark a group as expired, counted in - blocks, (it might be explicit or implicit), -- current agreement state set to _active_. - -[#selection] -==== Selection -When a group selection is invoked, the work contract (the one that is -starting the group selection) needs to call the group selection contract. When -called, the group selection contract selects at random potential group from the -active groups list and performs the <>. -And then the -<>. - -[#response] -===== Group information response -The group selection contract presents the selected group to the work contract. - -The work contract is obligated to forbid non-members from group work. - -[#verification] -===== Group status verification -If the number of active groups is below the _active groups threshold_ all -remaining groups on the _active groups list_ are treated as _active_. - -Otherwise, the following is performed. - -If the current block time is larger than the group registration time plus the -timeout then set the group agreement status to _expired_. Move the expired group -agreement from the _active groups list_ to the _expired groups list_ and -decrease the _active group counter_ by one. Then the next group is selected and -its status is verified until an active group is found or the number of active -groups falls below the _active groups threshold_. - -Expired groups need not be tracked for an unlimited time. They might be removed -when deemed unnecessary for current network operations. - -[bibliography] -== Related Links -- https://docs.keep.network/random-beacon/group-expiration/ -- https://www.flowdock.com/app/cardforcoin/keep/threads/NL6VK7goghV9QaWUXyFT_YgwV_M diff --git a/docs-v1/rfc/rfc-7-dkg-voting-update-specification.adoc b/docs-v1/rfc/rfc-7-dkg-voting-update-specification.adoc deleted file mode 100644 index e72096cd70..0000000000 --- a/docs-v1/rfc/rfc-7-dkg-voting-update-specification.adoc +++ /dev/null @@ -1,80 +0,0 @@ -:toc: macro - -= RFC 7: DKG voting update specification - -:icons: font -:numbered: -toc::[] - -== Proposal -The document specifies an update to the voting procedure of the Keep Distributed -Key Generation protocol. - -=== Goal -The goal of this proposal is to specify the first version of the DKG result -publication mechanism implementation based on result hash signatures. - -== Specification - -=== DKG Phase 13 - -===== Off-chain -Once the result has been determined, all participants evaluate the hash of their -preferred result, sign the hash and broadcast the hash and a signature over it -in the group broadcast channel. Each participant collects the signatures -matching their preferred result, stores them along with the signers' member -indices. - -If the signature of hash broadcasted off-chain is invalid, it should be rejected -and not published to the chain in the next phase. - -If multiple signatures from the same member on the same result are found, they -should all be filtered-out so that none of them is published to the chain in the -next phase. - -If multiple signatures from the same member on different results are found, they -should all be filtered-out so that none of them is published to the chain in the -next phase. - -=== DKG Phase 14 - -===== Off-chain -When a participant becomes eligible to submit the result (with supporting -signatures) on-chain they submit if they have at least the honest majority -(marked as `H` - constant for the given group size) of signatures for that -result (including their own). - -_First player_ is always eligible to submit the result. _Second player_ becomes -eligible after initial timeout (time necessary to perform DKG protocol plus step -time `T_dkg + T_step`) and remains eligible until the result is accepted by the -chain. In other words, _Nth player_ becomes eligible to submit the result after -`T_dkg + (N-1) * T_step` and remains eligible until the result is accepted by -the chain. If _first player_ is late and _second player_ tries to submit, -whichever gets mined first wins and subsequent submissions are disregarded -immediately to avoid burdening the loser with excess gas fees. - -===== On-chain -When the result is submitted on-chain along with the signatures, the contract -checks that there are at least `H` signatures or more, and that each signature -is valid for the submitted result and the corresponding member ID. Submissions -containing multiple signatures on the same result from the same member are -rejected. - -If the above checks pass, the result is considered canonical for the group. All -other group members should abort publishing their results and no new result -submissions will be accepted by the chain. - -If the above checks do not pass, the result is rejected. - -===== Off-chain -If the result has been rejected and _second player_ became eligible, -_second player_ can submit its result. Same checks are applied as for -_first player_. - -If no canonical result has been published until `T_dkg + N * T_step`, where `N` -is the group size, DKG operation is marked as failed. - -[bibliography] -== Related Links -- https://github.com/keep-network/keep-core/issues/625 -- https://github.com/keep-network/keep-core/issues/628 diff --git a/docs-v1/rfc/rfc-8-beacon-signature-share-verification.adoc b/docs-v1/rfc/rfc-8-beacon-signature-share-verification.adoc deleted file mode 100644 index f424e2cc0d..0000000000 --- a/docs-v1/rfc/rfc-8-beacon-signature-share-verification.adoc +++ /dev/null @@ -1,125 +0,0 @@ -:toc: macro - -= RFC 8: Beacon signature share verification - -:icons: font -:numbered: -toc::[] - -== Background - -Currently, broadcasting invalid shares -when generating a threshold signature -can serve as a DOS attack vector. -Without verification of signature shares, -a small number of colluding members -can greatly delay or prevent the entry from being generated. - -=== Terminology - -`P1`:: The generator point for the BLS elliptic curve - -`X_k`:: The group private key of `Group_k` - -`Y_k`:: The group public key: `Y_k = P1 * X_k` - -`Entry_e`:: The entry matching the entry identifier `e` - -`Input_e`:: The input for generating the new entry: -`Entry_e = Input_e * X` - -`x_i`:: The individual private key of `P_i` - -`y_i`:: The individual public key of `P_i`: `y_i = P1 * x_i` - -`Share_i`:: The signature share by `P_i`: `Share_i = Input_e * x_i` - -`N`:: The number of members in a group - -`H`:: The number of members required for a honest majority - -=== Invalid shares as DoS attack vector - -When beacon operators generate the threshold signature -to produce a new entry, -they use their individual private keys to sign the entry input -to create signature shares -which are then broadcast to other members in the group. -These signature shares are combined -to reconstruct the threshold signature, -which is then submitted as the next entry for the beacon. - -If one or more participants broadcast invalid signature shares, -they may significantly hinder or altogether prevent -the entry generation within the allotted time. -If an invalid share is included in the `H` signature shares -the threshold signature is reconstructed from, -the reconstruction will fail to produce a valid threshold signature. -If the received shares are not verified, -the only recourse is to try new combinations of signature shares -until a valid signature is produced. -With `m` invalid shares being broadcast, -trying all possible combinations takes _O(N^m)_ time: -first `choose(H+1, 1)` attempts -excluding each share on its own, -then `choose(H+2, 2)` attempts -to see if rejecting two shares leads to a valid signature, -then `choose(H+3, 3)` attempts excluding all combinations of 3 shares, -and so on for a total of `sum(i in [1 .. m], choose(H+i, i))` attempts. - -== Proposal - -The document specifies an update -to verify threshold signature shares for the random beacon -before reconstructing the threshold signature. - -As an optional feature for later, -operators who broadcast invalid shares can be punished -by publishing irrefutable proofs of misbehavior on-chain. - -=== Goal - -To eliminate an attack -where a beacon operator broadcasts invalid shares -to other members in the same signing group, -hindering or preventing the group -from reconstructing a valid threshold signature. - -=== Implementation - -When receiving signature shares from other members in the signing group, -the shares are verified using the senders' individual private keys -stored at the conclusion of the DKG. -Invalid signature shares are rejected. - -==== Verifying signature shares - -When `P_j` creates a signature share `Share_j` -as a member of `Group_k` producing a threshold signature for `Entry_e`, -the share must be broadcast to the other members -in a message containing: - -* the signature share `Share_j` -* the member index `j` of the sender `P_j`; - -When `P_i` receives a signature share `Share_j` broadcast by `P_j`, -the share can be verified by `blsVerify(Share_j, y_j, Input_e)`. -If `Share_j` is valid, -`P_i` can use it for reconstructing the threshold signature. -If `Share_j` is invalid, -`P_i` must not use it for reconstructing the entry. - -=== Limitations - -Operators can still broadcast invalid shares with inpunity, -as failing the share verification has no consequences to the sender. - -== Future Work - -It is possible to validate signature-shares on-chain -and thus punish operators who broadcast invalid shares. -This approach is explored in RFC 10. - -[bibliography] -== Related Links -- https://github.com/keep-network/keep-core/pull/628 diff --git a/docs-v1/rfc/rfc-9-upgradeable-contract-components.adoc b/docs-v1/rfc/rfc-9-upgradeable-contract-components.adoc deleted file mode 100644 index be2dd310d8..0000000000 --- a/docs-v1/rfc/rfc-9-upgradeable-contract-components.adoc +++ /dev/null @@ -1,405 +0,0 @@ -:toc: macro - -= RFC 9: Upgrading contracts by separate components - -:icons: font -:numbered: -toc::[] - -== Background - -Stakers in the Keep network use _work contracts_ to perform work for customers. -Work contracts make the off-chain work of stakers -available to on-chain applications -using a system of rewards and punishments to enforce correct behavior. - -Because work contracts must be able to penalize misbehaving stakers -by slashing their staked tokens, -it is important that they can be upgraded securely. -For an upgrade to be considered secure, -two things must be achieved: - -1. stakers must authorize any contracts that could slash their stakes -2. once authorized, contract code must be immutable - -Condition 1 is important to protect stakers -against errors and adversaries. -Upon staking their tokens, -each staker appoints an authorizer -who must approve of all contracts that could punish the staker. -This ensures that stakes cannot be stolen -even if the work contract upgrade scheme is thoroughly compromised, -as long as the individual authorizers reject bad work contracts. - -Condition 2 is a practical requirement to make condition 1 meaningful. -If an authorized contract's code can be changed later, -the authorizations provide no protection. -This means that contracts can only be upgraded by deploying a new version, -which the stakers then authorize individually. - -However, deploying a new contract on every upgrade -makes migrating between implementations difficult. -Common ways of upgrading contracts, -such as the "eternal storage" pattern -where the contract holds data in its nominal address -while delegating logic to a different, upgradeable contract address, -are incompatible with individual upgrade authorization. - -=== Current Functionality - -The current design for upgrading work contracts -is to deploy a new version on every upgrade, -and wait for stakers to start operating on it. -Older versions would by necessity keep existing -in parallel with newer ones, -and migrating state between versions -is difficult if not impossible. -For example, different versions of threshold BLS contracts, -even if the changes are as minor as adjusting hardcoded constants, -would create entirely separate random beacons. -It is possible that the difficulty of migration -would lead customers to prefer the old version with established state. - -== Proposal - -Customer continuity can be reconciled with staker sovereignty -by dividing work contracts into -_operator contracts_ which handle incentive-critical operations with stakers; -and _service contracts_ which use _operator contracts_ -to provide services to customers. -A single _service contract_ -can abstract over multiple different _operator contracts_, -permitting secure upgrades with reduced or minimal disruption to customers. - -=== Goal - -This RFC seeks to provide a method for upgrading contracts securely, -maintaining individual staker authorization for all contracts -so any contract touching staked tokens -must be pre-approved by the respective staker or their appointed agent. -The upgrade process should permit gradual improvements -without disrupting users or stakers, -and it should deal gracefully with major changes. - -=== Implementation - -For each service provided on the Keep network, -the components critical for correct incentives are identified -and separated from the rest of the service contract as a _operator contract_. -Operator contracts aim to be self-contained incentive-wise, -minimizing or eliminating the need for stakers to trust other contracts. - -Customer applications use a _service contract_ to perform work. -The _service contract_ provides a unified interface to customers, -handling the version management of _operator contracts_ -and any shared non-critical state between them. - -==== Operator contract - -The operator contracts handle all operations -that may have an impact on staked tokens. - -Each operator contract is an independent "microservice", -keeping its own state on security-critical data. -The operator contracts provide simplified functionality -that is stripped to the minimum necessary -for security and correct incentives. - -Each operator contract is associated with one or more service contracts -the operator contract provides functionality for. -Only these specified service contracts -may use the operator contract's interface; -operator contracts do not communicate directly -with other operator contracts, -customer applications, -or unassociated service contracts. - -When the interface is designed, -the service contract must be treated as untrusted -and the operator contract must maintain correctness -and the safety of the operators' stakes -regardless of the service contract input. -Where this cannot be guaranteed, -it must be clearly signaled off-chain to operators -so they can choose whether to opt in to providing those services. - -When an operator contract performs a service, -it is paid for the service provided. -The payment is distributed to contributing operators -according to the operator contract's own rules. - -If one or more participant operators misbehave -or fail to perform promised work, -the operator contract tells the staking contract to punish the guilty parties -and optionally reward a tattletale that proved the misbehavior. - -==== Service contract - -Service contracts use the basic functionality -performed by operator contracts, -to provide useful services to customers. - -Service contracts receive requests for services from customers, -and divide the provided service to operator contract and service contract components. -Elements that are critical for security and incentives -are delegated to an operator contract, -while other parts of the work are performed in the service contract. - -Service contracts can use -multiple different versions of operator contracts -to perform the operator contract functions. -The service contract keeps shared state which is not security-critical. - -==== Operator contract upgrades - -An operator contract is upgraded by deploying a new version, -and adding it to the available operator contracts of a service contract. -As stakers authorize the new operator contract, -the service contract can gradually migrate -to use the new operator contract over older versions. -Support for obsolete operator contracts can be withdrawn -when a sufficiently overwhelming supermajority of stakers -has authorized and begun to operate using the new version. - -Operator contracts can be upgraded -without losing service contract state, -but critical state is held within the operator contract -and cannot be migrated. - -If the operator contract's interface is changed, -the service contract should be updated as well. -If customer continuity is required, -the operator contract can support both versions of the interface. - -==== Service contract upgrades - -Because operator contracts are designed -to be independent of service contract security and correctness, -there is much more leeway to upgrade service contracts. - -Service contracts can be directly upgradeable, -e.g. with the eternal storage pattern; -they may be immutable, -only accepting new operator contract versions; -or they may implement a similar pattern -in the direction of customers, -unifying core functionality -between immutable public interface contracts. - -Because operator contracts can serve multiple service contracts, -immutable service contracts can be upgraded -by deploying the new service contract version, -along with a new operator contract version -which can serve both the new and the old service contract. -The old service contract can migrate work onto the new operator contract, -remaining perfectly functional while the new service contract is spun up. - -==== Staking contract upgrades - -Staking contracts can be upgraded -by deploying a new version and waiting for stakers to migrate -by withdrawing their stakes on the old contract -and staking them again on the new one. -Migrating between staking contracts requires -waiting the unstaking period -and suffering the associated opportunity cost, -but staking partial amounts can mitigate the impact -as overall network revenue is not expected to change. - -Each operator contract needs to identify -which staking contracts it accepts. -When a new staking contract is deployed, -all operator contracts need to be upgraded -to a version recognizing the new staking contract, -either exclusively or in addition to the old one. -When a sufficient amount of time has elapsed -and stakers have had the opportunity to migrate, -support for the old staking contract can be dropped. - -==== Security-critical service contracts - -In some situations it may not be possible to contain critical code -entirely within the operator contract. -If the service contract has to provide trusted input -that may impact operators' stakes, -the opt-in stake security can be maintained -if the service contract is immutable -and upgrades are performed by deploying new operator contracts. - -In these situations care should be taken to ensure -that operator contracts cannot interfere with each other. -As a general rule, -state shared between different operator contracts -should not be used to impact stakes. - -If a customer application provides the trusted input, -operators should have a method to opt in -to only serving those applications they have audited and found acceptable. - -=== Limitations - -Untrusted service contracts mean -that security-critical state must be kept in the operator contract. -If the network service has complex security needs, -the operator contract may have to implement most of the work logic. -If the service contract performs critical logic, -its upgrade flexibility is significantly limited. - -Security-critical state cannot be migrated between operator contracts; -a new operator contract has to start from a blank slate. -Inherently long-running operations -present a limit to how rapidly the system can be upgraded. - -The division of service contracts and operator contracts -doesn't map cleanly to situations -where the service to applications consists of providing _keeps_, -individual smart contracts deployed for individual groups of operators. - -=== Example: Random Beacon - -The random beacon generates random numbers in response to requests, -using BLS threshold signatures on some specific input. -The signatures are generated by signing groups -that have been created using random sortition -from all eligible and active stakers. -Rewards and punishments are used to incentivize correct behavior. - -To split the random beacon into a service contract-operator contract design, -the security-critical elements need to be identified. - -In this case the operator contract needs to handle -group creation and expiration, -BLS signature verification, -and incentives. - -Handling entry requests and pricing; -determining the signing input for generating new entries; -calling callbacks; -and requesting the creation of new groups -are responsibilities that are not critical for beacon integrity -from the perspective of the stakers. -These can be performed by the service contract -without individual staker authorization of upgrades. - -==== Operator contract - -The operator contract for the random beacon -provides the following interface to the service contract: - -`create_group(payment)`:: -Create a new group when requested by the service contract, -selecting members using pseudorandom sortition, -and performing DKG. -The operator contract does not accept input from the service contract, -but instead uses its own pseudorandom seed, -to ensure that group composition cannot be manipulated. -`payment` must exceed a minimum amount -and is used to cover gas fees and to reward stakers. - -`sign(entry_id, group_input, signing_input, payment)`:: -Use `group_input` to select a signing group, -and generate a valid BLS threshold signature for `signing_input`. -Once generated, use `payment` to reward stakers. -`payment` must exceed a set minimum value -that covers necessary gas fees. -When the entry is created, -the operator contract calls the service contract with the new entry, -using `entry_id` to identify the entry. - -Behind this interface, -the operator contract tracks its own groups, their members -and their threshold public keys. -The service contract trusts the operator contract -to only provide valid entries when given specific inputs. -Alternatively the operator contract could provide -the associated public key so the entry can be validated, -but even then the operator contract needs to be trusted -to provide a public key corresponding to a random valid group. - -==== Service contract - -The service contract for the random beacon -handles customer-facing features and ties the operator contracts together. -The interface of the service contract towards the operator contract is: - -`group_created(n_groups)`:: -The call to `create_group()` has finished -(successfully or unsuccessfully) -and expired groups have been removed. -The operator contract now has `n_groups` active. - -`entry_created(entry_id, entry)`:: -The previous call for the operator contract to `sign(entry_id, ...)` -completed successfully, -resulting in the new `entry`. - -The service contract keeps a list of operator contracts -along with the number of active groups in each. - -When receiving a request, -the service contract determines what values should be -the group selection input -and the signing input. -The group selection input is used to select an operator contract, -weighted by the number of active groups on each, -to serve the request. - -When the operator contract is determined, -the group selection input and signing input are passed to it -along with an appropriate payment. -When the operator contract returns a valid entry with `entry_created(...)`, -the service contract stores it and calls the customer-specified callback. - -If a new group should be created, -the service contract determines which operator contract should create one -(the most recent one, or a random one weighted by recent-ness), -and calls `create_group()` on the selected operator contract -with an appropriate payment. -Once the operator contract has finished DKG and expired old groups, -it returns the new number of active groups using `group_created(n_groups)`. - -Unlike the operator contract which needs to maintain integrity -for arbitrary, malicious inputs, -the service contract relies heavily on trusting the operator contracts. -This is acceptable because the operator contracts are known, unchangeable code, -and the service contract only has access to what customers have paid for entries; -boycotting a compromised or malfunctioning service contract -and deploying a new one -is sufficient to mitigate attacks or errors. - -== Future Work - -An exact architecture for service contract upgrades -is not specified. -The service contract upgrade process should be resilient to minor compromise -and relying on a global master key may be undesirable -as a single point of failure. - -For greater assurance towards customers, -the service contracts could be made immutable -in a manner similar to the operator contracts. -When a customer uses a specific service contract to request an entry, -they could trust that only that service contract -and its associated operator contracts -will be involved in the generation of their entry. -However, this would reduce the ability to maintain -a global "canonical" chain of entries, -each linked to the previous ones. - -Most currently envisioned services on the Keep network -consist of providing _keeps_ to customer applications. -The operator contract/service contract split -is less than ideal for this use-case, -and the random beacon could be rearchitected to follow the same pattern. -Each keep is a separate contract which inherits its logic from its factory, -but applications communicate directly with the keeps. -The role of the service contract would be limited -to managing different versions of keep factories, -with the rest of its functionality being subsumed by the application. - -[bibliography] -== Related Links - -- [System upgrade handling](https://github.com/keep-network/keep-core/issues/133) -- [Specify contract upgrade scheme](https://github.com/keep-network/keep-core/issues/725) -- [RFC 4: Secure upgrades for contracts operating staked balances](https://github.com/keep-network/keep-core/pull/446) diff --git a/docs-v1/rfc/rfc.adoc b/docs-v1/rfc/rfc.adoc deleted file mode 100644 index 558476903e..0000000000 --- a/docs-v1/rfc/rfc.adoc +++ /dev/null @@ -1,61 +0,0 @@ -:toc: macro - -= RFC ##: RFC Title (number should be unique with respect to pending and existing RFCs) - -:icons: font -:numbered: -toc::[] - -== Background - -Why do we want to do the thing this RFC describes? - -=== Current Functionality - - - If applicable, what is the existing functionality related to this feature? - - In particular if this is an enhancement to existing functionality, lay out - some context for how the existing functionality falls short. - -== Proposal - -Quick summary of the goal and outline of the proposal. - -=== Goal - -The goal of this proposal. What are we trying to achieve? Examples of desired -outcomes would be handy. - -=== Implementation - -How will we achieve it? Examples of how the implementation will be used could be -useful. Flow diagrams can also be useful here. If an RFC is meant to define -requirements rather than implementation, this section can be left for a future -RFC. - -=== Limitations - -What are the limitations of this approach? - -=== Proof of Concept - -If you have PoC code, refer to the relevant branch and give a brief summary. - -== Future Work (optional) - -If applicable, what future evolutions could you see this approach leading to? -Particularly if these possibilities influenced your thinking about the main -proposal, this is important. - -== Open Questions (optional) - -If any open questions are left that you haven't yet investigated, what are they? - -[bibliography] -== Related Links - -- Flowdock Links -- Other links -- If you have publications, you can include them in bibliography style. If you - start your bullet with an id in _triple_ square brackets (e.g. `+[[[AAKE]]]+`), - you can reference it in the content body using regular cross-reference syntax - (e.g. `+<>+`). diff --git a/docs-v1/run-random-beacon.adoc b/docs-v1/run-random-beacon.adoc deleted file mode 100644 index 34cb7fb715..0000000000 --- a/docs-v1/run-random-beacon.adoc +++ /dev/null @@ -1,563 +0,0 @@ -:toc: macro - -= Run Random Beacon - -:icons: font -:numbered: -toc::[] - -== System Considerations - -The Keep Network expects certain capabilites for each node running on the network. To help attain -these capabilities consider the following criteria: - -- It is paramount that Keep nodes remain available to the Keep Network. We strongly encourage a - stable and redundant internet connection. -- A connection to a production grade self-hosted or third party Ethereum node deployment. -- Persistent and redundant storage that will survive a VM or container rotation, and disk failure. -- Each random beacon client running on the network requires a unique Ethereum operator account. -- Each random beacon client running on the network requires a unique IP address or a unique - application port running under the same IP. -- Recommended machine types by provider: - -Your operating environment will ultimately dictate what machine type to go with. This is -particulary relevant if you're running a containerized solution where multiple applications -are sharing VM resources. The below types are sufficient for running at least one instance of the -Keep Random Beacon client. - -[%header,cols=2*] -|=== -|Cloud Provider -|Machine Type - -|Google Cloud -|n1-standard-2 - -|AWS -|t3.medium - -|Azure -|A2 v2 - -|Self-hosted -|2 vCPU / 4 GiB RAM / 1 GiB Persistent Storage -|=== - -== Gas Costs - -Random Beacon smart contracts reimburse the operator for successfully submitting relay entry -and DKG result but they do not reimburse for submitting a group selection ticket. Reimbursements -are sent to the beneficiary account and can be claimed along with rewards once the group expires. -It is expected that the operators have enough ETH on the accounts used by clients to submit the -required transactions and that the operator account balance is monitored and refilled as needed. -Bear in mind that the higher stake is, the operator is selected more frequently and is expected -to submit more transactions as a result. - -Below is the average gas cost of the most important transactions the client is submitting: - -[%header,cols=3*] -|=== -|TX -|Gas Cost -|Reimbursed - -|Submit group selection ticket -|140 000 -|No - -|Submit DKG result -|1 740 000 -|Yes - -|Submit relay entry -|280 000 -|Yes -|=== - -For example, if the operator has 10 x minimum stake, it can submit 10 tickets. If the operator has -been selected to the group with index 1, it is expected to submit DKG result and every relay entry -the group will produce. Assuming the group produces 100 entries, the cost for the operator is -`(10 * 140 000 + 1 740 000 + 100 * 280 000) * gas_price` ETH. It means that the operator needs to -have on their account: - -- For the gas price of 20 Gwei, at least 0.6228 ETH. -- For the gas price of 100 Gwei, at least 3.114 ETH. -- For the gas price of 800 Gwei, at least 24.912 ETH. - -It is paramount that the operator accounts have some safety margin and consider the current gas price -and stake when funding their accounts. - -== Configuration - -=== Network - -Default port mappings. - -[%header,cols=2*] -|=== -|Egress -|Port - -|Ethereum Network -|`8545` / `8546` - -|Keep Network -|`3919` -|=== - -[%header,cols=2*] -|=== -|Ingress -|Port - -|Keep Network -|`3919` -|=== - -If you set a different `port` in your keep-client configuration, or configure `peers` with -non-default ports configured, firewall rules will need to be adjusted accordingly. - -=== Application - -Application configurations are stored in a `.toml` file and passed to the application run command - with the `--config` flag. - -==== Sample - -[source,toml] ----- -# Ethereum host connection info. -[ethereum] - URL = "ws://127.0.0.1:8546" - URLRPC = "http://127.0.0.1:8545" - -# Keep operator Ethereum account. -[ethereum.account] - Address = "0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAA" - KeyFile = "/Users/someuser/ethereum/data/keystore/UTC--2018-03-11T01-37-33.202765887Z--AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAA" - -# Keep contract addresses configuration. -[ethereum.ContractAddresses] - # Hex-encoded address of KeepRandomBeaconOperator contract - KeepRandomBeaconOperator = "0xBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" - # Hex-encoded address of TokenStaking contract - TokenStaking = "0xCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" - # Hex-encoded address of KeepRandomBeaconService contract. Only needed - # in cases where the client's utility functions will be used (e.g., the - # relay subcommand). - KeepRandomBeaconService = "0xDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD" - -# Keep network configuration. -[LibP2P] - Peers = ["/ip4/127.0.0.1/tcp/3919/ipfs/njOXcNpVTweO3fmX72OTgDX9lfb1AYiiq4BN6Da1tFy9nT3sRT2h1", "/dns4/some-keep-host.com/tcp/3919/ipfs/njOXcNpVTweO3fmX72OTgDX9lfb1AYiiq4BN6Da1tFy9nT3sRT2h1"] - Port = 3919 - # Override the node's default addresses announced in the network - AnnouncedAddresses = ["/dns4/example.com/tcp/3919", "/ip4/80.70.60.50/tcp/3919"] - -# Storage is encrypted -[Storage] - DataDir = "/my/secure/location" ----- - -==== Parameters - -[%header,cols=4*] -|=== -|`ethereum` -|Description -|Default -|Required - -|`URL` -|The Ethereum host your keep-client will connect to. Websocket protocol/port. -|"" -|Yes - -|`URLRPC` -|The Ethereum host your keep-client will connect to. RPC protocol/port. -|"" -|Yes -|=== - -[%header,cols=4*] -|=== -|`ethereum.account` -|Description -|Default -|Required - -|`Address` -|The Keep operator Ethereum account address. -|"" -|Yes - -|`KeyFile` -|The local filesystem path to your Keep operator Ethereum account keyfile. -|"" -|Yes -|=== - -[%header,cols=4*] -|=== -|`ethereum.ContractAddresses` -|Description -|Default -|Required - -|`KeepRandomBeaconOperator` -|Hex-encoded address of the KeepRandomBeaconOperator Contract. -|"" -|Yes - -|`KeepRandomBeaconService` -|Hex-encoded address of the KeepRandomBeaconService Contract. -|"" -|Yes - -|`TokenStaking` -|Hex-encoded address of the TokenStaking Contract. -|"" -|Yes -|=== - -[%header,cols=4*] -|=== -|`LibP2P` -|Description -|Default -|Required - -|`Peers` -|Comma separated list of network peers to boostrap against. -|[""] -|Yes - -|`Port` -|The port to run your instance of Keep on. -|3919 -|Yes - -|`AnnouncedAddresses` -|Multiaddr formatted hostnames or addresses annouced to the -Keep Network. More on multiaddr format -https://docs.libp2p.io/reference/glossary/#multiaddr[in the libp2p -reference]. -|[""] -|No -|=== - -[%header,cols=4*] -|=== -|`Storage` -|Description -|Default -|Required - -|`DataDir` -|Location to store the Keep nodes group membership details. -|"" -|Yes -|=== - -== Build from Source - -See the link:development#building[building] section in our developer docs. - -== Docker - -=== Get Image - -https://hub.docker.com/r/thresholdnetwork/keep-client/ - -*Latest:* -`docker pull thresholdnetwork/keep-client` - -*Tag:* -`docker pull thresholdnetwork/keep-client:` - -=== Run Image -This is a sample run command for illustration purposes only. - -[source,bash] ----- -export KEEP_CLIENT_ETHEREUM_PASSWORD=$(cat .secrets/eth-account-password.txt) -export KEEP_CLIENT_CONFIG_DIR=$(pwd)/config -export KEEP_CLIENT_PERSISTENCE_DIR=$(pwd)/persistence - -docker run -d \ ---entrypoint /usr/local/bin/keep-client ---volume $KEEP_CLIENT_PERSISTENCE_DIR:/mnt/keep-client/persistence \ ---volume $KEEP_CLIENT_CONFIG_DIR:/mnt/keep-client/config \ ---env KEEP_ETHEREUM_PASSWORD=$KEEP_CLIENT_ETHEREUM_PASSWORD \ ---env LOG_LEVEL=debug \ ---log-opt max-size=100m \ ---log-opt max-file=3 \ --p 3919:3919 \ -thresholdnetwork/keep-client: --config /mnt/keep-client/config/keep-client-config.toml start ----- - -== Deployment Considerations - -=== Kubernetes - -At Keep we run on GCP + Kube. To accommodate the aforementioned system considerations we use the following pattern for each of our environments: - -- Regional Kube cluster. -- 5 beacon clients, each running minimum stake required by the network. -- A LoadBalancer Service for each client. -- A StatefulSet for each client. - -You can see our Ropsten Kube configurations link:../infrastructure/kube/keep-test[here] - -== Logging - -Below are some of the key things to look out for to make sure you're booted and connected to the -network: - -=== Configurable Values - -[source,bash] ----- -LOG_LEVEL=DEBUG -IPFS_LOGGING_FMT=nocolor -GOLOG_FILE=/var/log/keep/keep.log -GOLOG_TRACING_FILE=/var/log/keep/trace.json ----- - -=== Startup -``` -▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀ - ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ -▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ - -Trust math, not hardware. - ------------------------------------------------------------------------------------------------ -| Keep Random Beacon Node | -| | -| Port: 3919 | -| IPs : /ip4/127.0.0.1/tcp/3919/ipfs/16Uiu2HAmCcfVpHwfBKNFbQuhvGuFXHVLQ65gB4sJm7HyrcZuLttH | -| /ip4/10.102.0.112/tcp/3919/ipfs/16Uiu2HAmCcfVpHwfBKNFbQuhvGuFXHVLQ65gB4sJm7HyrcZuLttH | ------------------------------------------------------------------------------------------------ -``` - -**Bonus**: If you want to share your LibP2P address with others you can get it from the startup log. When sharing remember to substitute the `/ipv4/` address with the public facing IP of your client if you're running on a private machine, or replace the entire `/ipv4/` segment with a DNS entry if you're using a hostname. - -=== Peer Connections - -``` -21:19:47.129 DEBUG keep-net-w: connected to [1] peers:[16Uiu2HAm3eJtyFKAttzJ85NLMromHuRg4yyum3CREMf6CHBBV6KY] -``` - -== ETH Networks - -=== Mainnet - -==== Boostrap Peers - -[.small] -``` -"/dns4/bst-a01.core.keep.boar.network/tcp/3001/ipfs/16Uiu2HAkzYFHsqbwt64ZztWWK1hyeLntRNqWMYFiZjaKu1PZgikN", -"/dns4/bst-b01.core.keep.boar.network/tcp/3001/ipfs/16Uiu2HAkxLttmh3G8LYzAy1V1g1b3kdukzYskjpvv5DihY4wvx7D", -"/dns4/keep-boot-validator-0.prod-us-west-2.staked.cloud/tcp/3919/ipfs/16Uiu2HAmDnq9qZJH9zJJ3TR4pX1BkYHWtR2rVww24ttxQTiKhsaJ", -"/dns4/keep-boot-validator-1.prod-us-west-2.staked.cloud/tcp/3919/ipfs/16Uiu2HAmHbbMTDDsT2f6z8zMgDtJkTUDJQSYsQYUpaJjdMjiYNEf", -"/dns4/keep-boot-validator-2.prod-us-west-2.staked.cloud/tcp/3919/ipfs/16Uiu2HAmBXoNLLMYU9EcKYH6JN5tA498sXQHFWk4heK22RfXD7wC", -"/ip4/54.39.179.73/tcp/3919/ipfs/16Uiu2HAkyYtzNoWuF3ULaA7RMfVAxvfQQ9YRvRT3TK4tXmuZtaWi", -"/ip4/54.39.186.166/tcp/3919/ipfs/16Uiu2HAkzD5n4mtTSddzqVY3wPJZmtvWjARTSpr4JbDX9n9PDJRh", -"/ip4/54.39.179.134/tcp/3919/ipfs/16Uiu2HAkuxCuWA4zXnsj9R6A3b3a1TKUjQvBpAEaJ98KGdGue67p", -"/dns4/4d00662f-e56d-404a-803a-cac01ada3e15.keep.bison.run/tcp/3919/ipfs/16Uiu2HAmV3HqJjcbKMxHnDxDx4m2iEYynyYdsvU3VwaeE6Zra2P9", -"/dns4/ec1eb390-124c-4b1b-bcf7-c21709baf2b2.keep.herd.run/tcp/3919/ipfs/16Uiu2HAmVo51PqEZLADehZEbZnrp5A7qjRWFLj9E7DfwZKVhERFt", -"/dns4/2aa9b786-7360-4c22-ae73-bd95af9c11c5.keep.bison.run/tcp/3919/ipfs/16Uiu2HAm9g3QrQzSvJ8FAhgB1PmjMNgjPd3pDaJJqsdSisGsnaFe" -``` - -==== Contracts - -Contract addresses needed to boot the Random Beacon client: - -[%header,cols=2*] -|=== -|Token -| - -|TokenStaking -|`0x1293a54e160d1cd7075487898d65266081a15458` -|=== - -[%header,cols=2*] -|=== -|RandomBeacon -| - -|KeepRandomBeaconService -|`0x50510e691c90ea098e3fdd23c311731bf394aafd` - -|KeepRandomBeaconOperator -|`0xdf708431162ba247ddae362d2c919e0fbafcf9de` -|=== - -=== Testnet - -Keep uses the Ethereum Ropsten Testnet. - -==== Faucet - -The KEEP faucet will will issue a 300k KEEP token grant for the provided Ethereum account. You can -use the faucet from your web browser or via a terminal using curl. - -Faucet Endpoint: https://us-central1-keep-test-f3e0.cloudfunctions.net/keep-faucet-ropsten - -To use the faucet you need to pass your Ethereum account to the faucet endpoint with the parameter -`?account=`. - -Curl Example: -[source,bash] ----- -curl 'https://us-central1-keep-test-f3e0.cloudfunctions.net/keep-faucet-ropsten?account=0x0eC14BC7cCA82c942Cf276F6BbD0413216dDB2bE' ----- - -Browser Example: -``` -https://us-central1-keep-test-f3e0.cloudfunctions.net/keep-faucet-ropsten?account=0x0eC14BC7cCA82c942Cf276F6BbD0413216dDB2bE -``` - -Once you've got your KEEP token grant you can manage it with our https://dashboard.test.keep.network[token dashboard]. - -==== Bootstrap Peers - -Bootstrap peers will come and go on testnet. As long as at least one of your configured peers is -up, there is no need to worry. - -[.small] -``` -"/dns4/bootstrap-1.core.keep.test.boar.network/tcp/3001/ipfs/16Uiu2HAkuTUKNh6HkfvWBEkftZbqZHPHi3Kak5ZUygAxvsdQ2UgG", -"/dns4/bootstrap-3.test.keep.network/tcp/3919/ipfs/16Uiu2HAm8KJX32kr3eYUhDuzwTucSfAfspnjnXNf9veVhB12t6Vf", -"/dns4/bootstrap-2.test.keep.network/tcp/3919/ipfs/16Uiu2HAmNNuCp45z5bgB8KiTHv1vHTNAVbBgxxtTFGAndageo9Dp" -``` - -==== Contracts - -Contract addresses needed to boot the Random Beacon client: - -[%header,cols=2*] -|=== -|Token -| - -|KeepToken -|`0x29DDc999E81E585D500BcA2FD2A8bcA677680e72` - -|TokenStaking -|`0xaCb7e9405073a80E15a0B78D9E3F4ecCD8a3b68a` -|=== - -[%header,cols=2*] -|=== -|RandomBeacon -| - -|KeepRandomBeaconService -|`0xcafDc026D70A2748d80FE50dB795B8Aa54f09EB6` - -|KeepRandomBeaconOperator -|`0x2CaF79B969DCb90b3d5925095185e0ecF75958db` -|=== - - -== Metrics - -The client exposes the following metrics: - -- connected peers count, -- connected bootstraps count, -- Ethereum client connectivity status (if a simple read-only CALL can be executed). - -Metrics can be enabled in the configuration `.toml` file. It is possible to customize port at which -metrics endpoint is exposed as well as the frequency with which the metrics are collected. - -Exposed metrics contain the value and timestamp at which they were collected. - -Example metrics endpoint call result: -``` -$ curl localhost:9601/metrics -# TYPE connected_peers_count gauge -connected_peers_count 108 1623235129569 - -# TYPE connected_bootstrap_count gauge -connected_bootstrap_count 10 1623235129569 - -# TYPE eth_connectivity gauge -eth_connectivity 1 1623235129789 -``` - -== Diagnostics - -The client exposes the following diagnostics: - -- list of connected peers along with their network id and Ethereum operator address, -- information about the client's network id and Ethereum operator address. - -Diagnostics can be enabled in the configuration `.toml` file. It is possible to customize port at which -diagnostics endpoint is exposed. - -Example diagnostics endpoint call result: -``` -$ curl localhost:9501/diagnostics -{ - "client_info" { - "ethereum_address":"0xDcd4199e22d09248cA2583cBDD2759b2acD22381", - "network_id":"16Uiu2HAkzYFHsqbwt64ZztWWK1hyeLntRNqWMYFiZjaKu1PZgikN" - }, - "connected_peers": [ - {"ethereum_address":"0x3712C6fED51CECA83cA953f6FF3458f2339436b4","network_id":"16Uiu2HAkyYtzNoWuF3ULaA7RMfVAxvfQQ9YRvRT3TK4tXmuZtaWi"}, - {"ethereum_address":"0x4bFa10B1538E8E765E995688D8EEc39C717B6797","network_id":"16Uiu2HAm9d4MG4LNrwkFmugD2pX7frm6ZmA4vE3EFAEjk7yaoeLd"}, - {"ethereum_address":"0x650A9eD18Df873cad98C88dcaC8170531cAD2399","network_id":"16Uiu2HAkvjVWogUk2gq6VTNLQdFoSHXYpobJdZyuAYeoWD66e8BD"}, - ... - ] -} -``` - -== Staking - -=== Terminology - -address:: Hexadecimal string consisting of 40 characters prefixed with "0x" uniquely identifying Ethereum account; -derived from ECDSA public key of the party. Example address: `0xb2560a01e4b8b5cb0ac549fa39c7ae255d80e943`. - -owner:: The address owning KEEP tokens or KEEP token grant. The owner’s participation is not required in the day-to-day -operations on the stake, so cold storage can be accommodated to the maximum extent. - -operator:: The address of a party authorized to operate in the network on behalf of a given owner. The operator handles -the everyday operations on the delegated stake without actually owning the staked tokens. An operator can not simply -transfer away delegated tokens, however, it should be noted that operator's misbehaviour may result in slashing tokens -and thus the entire staked amount is indeed at stake. - -beneficiary:: the address where the rewards for participation and all reimbursements are sent, earned by an operator, -on behalf of an owner - -delegated stake:: an owner's staked tokens, delegated to the operator by the owner. Delegation enables KEEP owners to -have their wallets offline and their stake operated by operators on their behalf. - -operator contract:: Ethereum smart contract handling operations that may have an impact on staked tokens. - -authorizer:: the address appointed by owner to authorize operator contract on behalf of the owner. Operator contract -must be pre-approved by authorizer before the operator is eligible to use it and join the specific part of the network. - -=== Delegating tokens - -KEEP tokens are delegated by the owner. During the delegation, the owner needs to appoint an operator, beneficiary, -and authorizer. Owner may delegate owned tokens or tokens from a grant. Owner may decide to delegate just a portion -of owned tokens or just a part of tokens from a grant. Owner may delegate multiple times to different operators. -Tokens can be delegated using Tokens page in https://dashboard.test.keep.network[KEEP token dashboard] and a certain minimum stake defined by the system is required to be provided in the delegation. The more stake is delegated, the higher chance to be selected to relay group. - -Delegation takes immediate effect but can be cancelled within 12 hours without additional delay. After 12 hours -operator appointed during the delegation becomes eligible for work selection. - -=== Authorizations -Before operator is considered as eligible for work selection, authorizer appointed during the delegation needs to review -and authorize Keep Random Beacon smart contract. Smart contracts can be authorized using KEEP token dashboard. Authorized operator contracts may slash or seize tokens in case of operator's misbehavior. diff --git a/docs-v1/scripts/generate-pngs.sh b/docs-v1/scripts/generate-pngs.sh deleted file mode 100644 index 4c3efaf904..0000000000 --- a/docs-v1/scripts/generate-pngs.sh +++ /dev/null @@ -1,27 +0,0 @@ -tmp_dir=$1 -img_dir=$(pwd)/$2 -tikz_source=$(pwd)/$3 -target_basename=$4 - -mkdir -p $tmp_dir -cd $tmp_dir -echo "\documentclass{standalone}" > $target_basename.tex -echo "\usepackage{tikz}" >> $target_basename.tex -echo "\usepackage{hyperref}" >> $target_basename.tex -echo "\usepackage[utf8]{inputenc}" >> $target_basename.tex -echo "\usetikzlibrary{positioning}" >> $target_basename.tex -echo "\usetikzlibrary{arrows.meta}" >> $target_basename.tex -echo "\usetikzlibrary{shapes.symbols}" >> $target_basename.tex -echo "\usetikzlibrary{calc}" >> $target_basename.tex -echo "\tikzset{every node/.style={above},start state/.style={draw,circle,text width=0},state/.style={draw,circle,align=flush center,text width=2cm},decision/.style={draw,rectangle,align=flush center}, thread/.style={draw,signal,signal to=east,fill=white},nested state/.style={draw,circle,double,align=flush center}, nested decision/.style={draw,rectangle,double,align=flush center}, chain state/.style={draw,circle,dashed,align=flush center,text width=2cm}, chain decision/.style={draw,rectangle,dashed,align=flush center}, chain transition/.style={draw,dashed},nested chain decision/.style={draw,rectangle,double,dashed,align=flush center},>=Stealth }" >> $target_basename.tex -echo "\begin{document}" >> $target_basename.tex -echo "" >> $target_basename.tex -cat $tikz_source >> $target_basename.tex -echo "\end{document}" >> $target_basename.tex - -pdflatex -halt-on-error $target_basename.tex $target_basename.pdf - -mkdir -p $img_dir -echo "Generating $img_dir/$target_basename.png from $target_basename.pdf..." -pdftoppm $target_basename.pdf $img_dir/$target_basename -png -f 1 -singlefile -rx 300 -ry 300 -echo "Finished with exit status $?." diff --git a/docs-v1/scripts/package-lock.json b/docs-v1/scripts/package-lock.json deleted file mode 100644 index a848f68a82..0000000000 --- a/docs-v1/scripts/package-lock.json +++ /dev/null @@ -1,154 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "asciidoctor.js": { - "version": "1.5.6-rc.1", - "resolved": "https://registry.npmjs.org/asciidoctor.js/-/asciidoctor.js-1.5.6-rc.1.tgz", - "integrity": "sha512-PivEzkcEaoA3h3Q4hQ65UGre7zE+5PM0pC2Q2d/Cr/67dyiIr3Lv7Mwy9pLGMJLx6wo4IVvyK1P7cCzD9RQ6Ug==", - "requires": { - "opal-runtime": "1.0.2" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "complex.js": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.0.12.tgz", - "integrity": "sha512-oQX99fwL6LrTVg82gDY1dIWXy6qZRnRL35N+YhIX0N7tSwsa0KFy6IEMHTNuCW4mP7FS7MEqZ/2I/afzYwPldw==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==" - }, - "escape-latex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", - "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==" - }, - "fraction.js": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.13.tgz", - "integrity": "sha512-E1fz2Xs9ltlUp+qbiyx9wmt2n9dRzPsS11Jtdb8D2o+cC7wr9xkkKsVKJuBX0ST+LVS+LhLO+SbLJNtfWcJvXA==" - }, - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "javascript-natural-sort": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", - "integrity": "sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k=" - }, - "mathjs": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-7.5.1.tgz", - "integrity": "sha512-H2q/Dq0qxBLMw+G84SSXmGqo/znihuxviGgAQwAcyeFLwK2HksvSGNx4f3dllZF51bWOnu2op60VZxH2Sb51Pw==", - "requires": { - "complex.js": "^2.0.11", - "decimal.js": "^10.2.1", - "escape-latex": "^1.2.0", - "fraction.js": "^4.0.12", - "javascript-natural-sort": "^0.7.1", - "seed-random": "^2.2.0", - "tiny-emitter": "^2.1.0", - "typed-function": "^2.0.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "1.1.11" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } - }, - "opal-runtime": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/opal-runtime/-/opal-runtime-1.0.2.tgz", - "integrity": "sha512-gJiuaA4sWIIUXBzMMD0uxoN2rTkRDaQA2i1wanr5beFm+Nks7wE+C7w3N6NyKe7BatZbB9/9SMBV+DD/38iMPg==", - "requires": { - "glob": "6.0.4", - "xmlhttprequest": "1.8.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "seed-random": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz", - "integrity": "sha1-KpsZ4lCoFwmSMaW5mk2vgLf77VQ=" - }, - "tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" - }, - "typed-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-2.0.0.tgz", - "integrity": "sha512-Hhy1Iwo/e4AtLZNK10ewVVcP2UEs408DS35ubP825w/YgSBK1KVLwALvvIG4yX75QJrxjCpcWkzkVRB0BwwYlA==" - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" - } - } -} diff --git a/docs-v1/scripts/package.json b/docs-v1/scripts/package.json deleted file mode 100644 index 8cc47404d6..0000000000 --- a/docs-v1/scripts/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "dependencies": { - "asciidoctor.js": "1.5.6-rc.1", - "mathjs": "7.5.1" - } -} diff --git a/docs-v1/scripts/yellowpaper-probabilities.js b/docs-v1/scripts/yellowpaper-probabilities.js deleted file mode 100644 index b1bbe97d28..0000000000 --- a/docs-v1/scripts/yellowpaper-probabilities.js +++ /dev/null @@ -1,68 +0,0 @@ -const asciidoctor = require('asciidoctor.js')() -const math = require('mathjs') - -const adoc = asciidoctor.loadFile('../random-beacon.adoc') - -const varDefs = - adoc.findBy({ role: 'variables' })[0] - .rows - .body - .map(row => ({ variable: row[0].text.trim(), meaning: row[1].text.trim() })); -const derivedVarDefs = - adoc.findBy({ role: 'derived-variables' })[0] - .rows - .body - .map(row => ({ variable: row[0].text.trim(), meaning: row[2].text.trim() })); - -const variables = - varDefs.concat(derivedVarDefs) - .reduce((map, { variable, meaning }) => map.set(variable, meaning), new Map()) - -const probabilities = - adoc.findBy({ role: 'probabilities' })[0] - .rows - .body - .map(row => ({ label: row[0].text.trim(), formula: row[1].text.trim() })) - -function hgeo(N, K, n, k) { - return math.combinations(math.bignumber(K), math.bignumber(k)) - .mul(math.combinations(math.bignumber(N).minus(math.bignumber(K)), math.bignumber(n).minus(math.bignumber(k)))) - .div(math.combinations(math.bignumber(N), math.bignumber(n))); -} - -const C = 150000, - G = 1000, - g = 1000, - t = math.floor(g / 2) - 1, - M = 10000, - B = 14, - N = 8000000, - D = 75000, - R = 1, - B_s = 8000000; - -console.log("Given:"); - -for (variable of ['C', 'G', 'g', 't', 'M', 'B', 'N', 'D', 'R', 'B_s']) { - let extra = "" - if (variables.has(variable)) { - extra = "\t(" + variables.get(variable) + ")" - } - - console.log("\t" + variable + " = " + eval(variable) + extra); -} - -console.log("\nThe probability of:") - -probabilities.forEach(function({ label, formula }) { - const probabilityResult = math.bignumber(eval(formula)) - - const probabilityString = probabilityResult.toExponential(4, math.ROUND_DOWN ).toString() - - //console.log(math.bignumber(1).minus(probabilityResult).pow(N).toString()) - - console.log( - "\t" + label.split("\n").join("\n\t") + "\n\t\t", - probabilityString - ) -}) \ No newline at end of file diff --git a/docs-v1/status-reports/2020-11-11-retro-geth-hardfork.adoc b/docs-v1/status-reports/2020-11-11-retro-geth-hardfork.adoc deleted file mode 100644 index b82977e261..0000000000 --- a/docs-v1/status-reports/2020-11-11-retro-geth-hardfork.adoc +++ /dev/null @@ -1,125 +0,0 @@ -:toc: macro - -= Technical Status Report: 2020-11-11 Geth Hardfork Retrospective - -toc::[] - -This is a Keep-specific post-mortem on the impact of the geth hardfork that -occurred on 11 November 2020. A full post-mortem of the geth issue is -available -https://gist.github.com/karalabe/e1891c8a99fdc16c4e60d9713c35401f[on GitHub], -and an explanation of how the fork was triggered was posted to Twitter -https://twitter.com/jinglanW/status/1326651349912719360[by the Optimism -team]. - -[#timeline,%header] -.Incident timeline (Keep) -|=== -| Time | Event -| 08:43 UTC | Provider observes random beacon relay entry timeout on mainnet node -| 08:58 UTC | Keep on-call engineer starts investigating the root cause of the relay entry timeout -| 09:05 UTC | Fork is suggested due to no relay entry timeout observed on Etherscan -| 09:32 UTC | Advised by team, provider begins redirecting a node from their existing Ethereum node provider to Infura to test fork hypothesis -| 09:52 UTC | Provider reports node is seeing a signing process, but still not lining up with Etherscan -| 10:01 UTC | On-call engineer notes Infura outage flagged on the Infura status page -| 10:09 UTC | On-call engineer continues to observe inconsistencies on Etherscan -| 10:37 UTC | On-call engineer observes a relay entry timeout reporting bot submitting timeouts -| 10:47 UTC | On-call engineer notes 20 AWAITING_SIGNER_SETUP Bitcoin deposits and ~22 nodes disappeared from the main Keep network -| 10:51 UTC | On-call engineer escalates to project lead + head of engineering -| 12:19 UTC | Decision is made to disable tBTC dApp and Keep token dashboard -| 12:20 UTC | Decision is made to disable the Keep random beacon operator contract, shutting down the Keep random beacon -| 12:38 UTC | Keep random beacon operator contract is disabled at https://etherscan.io/tx/0x68da31c439fd057f044f510e83a09ec8968015e35a0fcf82c19eaca921b205f5 -|=== - -== Impact - -=== Random Beacon - -The random beacon had 3 timeouts due to a failure to respond with a random -number in time. Before a fourth timeout triggered, the random beacon operator -contract was disabled by unilateral action from the team. This action -immediately disables the token slashing capabilities of the operator -contract, and is the “panic button” functionality described in the -https://docs.keep.network/random-beacon/#_the_registry_and_panic_button[random -beacon specification]. - -By default, each timeout slashes the current minimum stake of tokens for each -slot in the group that has failed to provide the random beacon entry. Each -group includes between 33 and 64 slots, usually 64, with each operator able -to take up multiple slots depending on the group member choice. 32 of those -slots have to fail to provide a signature share in order for a group to fail. -A sufficient portion of the network was offline or on a forked chain that -this happened to 3 groups in a row. The total slashing was 153,600 KEEP -tokens. 151,219.2 KEEP tokens were burned (~0.01% of the total, fixed -supply), while 2380.8 KEEP was awarded to the account that reported the relay -entry timeout as a reward. - -Notably, the account that reported the relay entry timeout appeared to be a -bot attached to a smart contract that flash-loaned WETH and immediately -converted the KEEP to WETH on Uniswap for a total gain of ~1.71 ETH. Here are -the timeout transactions: - -* https://etherscan.io/tx/0x2ff7912c387fc0261f04ceabdbe110694fbdc98462f87428552edb909e668c6a -* https://etherscan.io/tx/0x368467abdb10891d6f6d06ccf37852b8e5b0ac76ac87f998c497370e277a7633 -* https://etherscan.io/tx/0xd59e74b7b201d8b544ec8b346fc1a55151cf15c6ac850bf4ffdb4a175de5db3c - -A total of 63 unique operators were slashed in varying amounts, across several staking providers and individuals. - -=== tBTC - -The impact to tBTC was limited to 22 deposits that started setup before the -fork and never finished. This is the state of a deposit right after a user -requests the deposit be created, and right before the network provides a -Bitcoin address to fund. The deposits never received an address due to the -network fork. This has a small cost, as the depositors can reclaim their -opening fee (~0.15 ETH) from signer bonds in scenarios where the signers fail -to provide an address. In this case the total cost across all deposits to -operators was ~3.3 ETH, split across the various operators the deposits used. - -Note that although tBTC uses the random beacon for additional randomness in -choosing operators, it is designed to operate even if the random beacon is -disabled, as occurred in this case. - -Though the impact to tBTC was limited, chain splits like this one always open -an opportunity for loss of funds, whether users are moving ERC-20s, NFTs, or -ETH. - -== Team Actions - -The Keep team does not operate nodes on the Keep network. Some team members -who have KEEP grants choose to stake with certain providers (and several team -members’ stakes were slashed in the beacon timeouts), the company does not -directly operate or have visibility into nodes. This means the actions the -Keep team takes are biased towards responsiveness with on-chain action, -helping providers better react to issues, and helping coordinate -inter-provider actions where necessary. Here are our primary takeaways from -this incident: - -* The team has already been working on a shared set of monitoring and alerting - recommendations for all operators, professional or personal. We are in the - final stages of reviewing these with larger node operators to verify that - they would generally catch and escalate issues that we have seen in the past, - including this one, with plenty of time to react.footnote:[These are - currently available at - https://docs.keep.network/monitoring-and-alerting.html.] -* The random beacon client does not clearly signal to an operator that a relay - request is in danger of timing out. The team will be exploring adding WARN - level logs as a relay request approaches timeout. In conjunction with the - monitoring and alerting recommendations, the intent is to provide a clear - escalation to operators with enough time to react to an approaching timeout. -* We are generally loath to use the ability to disable operator contracts, as - it can have an extremely disruptive impact to users of the those contracts - and is an irreversible action. Additionally, the capability to halt the - beacon is something that we are intending on transferring to a multisig, DAO, - or other decentralized mechanism in the future, which would make it much more - difficult to trigger in this kind of scenario. Nonetheless, the team is - studying whether it would have made sense to halt the random beacon earlier - than the point at which it was halted, and setting guidelines for future - action in a similar scenario. - -Lastly, the team is working on strategies for staking providers and -individual stakers to coordinate with each other in cases where network -failures cross node and network boundaries. There is currently space for ad -hoc coordination, but the Keep team is often an intermediary; future network -growth will likely mean the number of operators will make it an untenable -strategy moving forward. diff --git a/docs-v1/status-reports/tbtc-2020-09-15-to-2020-10-13.adoc b/docs-v1/status-reports/tbtc-2020-09-15-to-2020-10-13.adoc deleted file mode 100644 index 974d34430e..0000000000 --- a/docs-v1/status-reports/tbtc-2020-09-15-to-2020-10-13.adoc +++ /dev/null @@ -1,330 +0,0 @@ -:toc: macro - -= Technical Status Report: 1 month of tBTC rc.1 - -toc::[] - -On September 15th, 2020, the tBTC rc.1 contracts were deployed on Ethereum -mainnet. The 48 hours after the initial deploy were designed for testing and -setup by the development team, with an imposed supply cap of 2 TBTC. Once -that expired on September 17th, the supply cap went up to its first usage -level of 100 TBTC, and we announced the availability of tBTC in limited -fashion in the Keep Discord. - -On September 22nd, the supply cap automatically increased to 250 TBTC, and we -announced tBTC rc.1 broadly via the tBTC site and other channels. This status -report covers the time **from the contract deploy on September 15th to -October 13th ~17:00 UTC**, though most of the activity prior to the 22nd was -still fairly limited (7.02 TBTC total was minted prior to the 22nd) and the -system had not yet been broadly announced. - -== Understanding the System - -Our community is one of the most central pieces of Keep and tBTC's future: a -decentralized system with a centralized development team is, after all, not -particularly decentralized. As we like to say, a system is only as decentralized -as its most centralized component. The Keep community has done an incredible job -of putting together a host of useful tools to observe both the Keep and tBTC -ecosystems as part of the Playing for Keeps program that awards KEEP tokens to -great work that advances the projects and the community itself. - -Several of those tools were used to assemble this report. To that end, if -you're interested in tracking the tBTC system’s current and historical state, -you can look to these sites for information: - -* https://allthekeeps.com -* https://keepscan.com -* https://keepstats.org - -== Volume and Activity - -First, a quick look at the volume and activity in the system during the first -weeks of the release candidate: - -* **3,287.91 TBTC has been minted** since deployment. -* **2,774.91 TBTC has been redeemed**, meaning the corresponding BTC has been - transferred out of addresses controlled by tBTC signers and back to other - addresses on the Bitcoiin chain. -* **841 deposits** have been created in that time. - -tBTC deposits are backed by signer groups that put up ETH collateral to -guarantee their availability. This means system health is not only a function -of how many deposits are opened, but also how much bond is available to back -new deposits. Currently, the system has **~58,680 ETH** available to it, with -**29,830 ETH** bonded to existing deposits. The current supply cap is 750 BTC -and current minted amount is 513 TBTC, so the available ETH is more than -enough to accommodate the available value. - -== Governance Actions - -The team has only done one thing to change the network's characteristics: -shortly after the supply cap went up to 250 TBTC, we added two additional lot -sizes, 5 BTC and 10 BTC, for deposits. This lot size bump was made to -accommodate the relatively high gas prices that were at play at the time, -since opening a deposit has a fixed cost. Opening up larger lot sizes allows -for more cost-efficient movement of BTC into the system, while increasing the -value risk of single deposits (as each signing group is now responsible for -more BTC and puts up a correspondingly higher bond amount). - -372 of the deposits opened since then (not all of which were funded) were at -these higher lot sizes---a total of 55% of the deposits opened since the rc.1 -was released. - -== Observed Liquidations - -We observed 4 liquidations in the first month of the system, almost all in -the first week. Note that for these purposes, a failure is considered an -event that resulted in a liquidation or a seeming loss of BTC. Each of these -is detailed below under its respective cause. - -The tBTC system, even in its RC state, is unique in being decentralized while -still ensuring every TBTC corresponds to BTC available for redemption. It is -also unique in being designed to ensure that **a holder of TBTC can get back -an equivalent amount of BTC** in case of most system failures, at the cost of -increased risk for signers. - -This design decision has been borne out in the release candidate: though -there have been 4 deposits (0.5% of all deposits representing ~0.5% of the -total minted value in the system) that have faced issues, **in all cases the -depositor was able to retrieve their value in BTC**. Moreover, only a single -signer issue resulted in signer bond loss. While we would obviously have -preferred for there to have been no issues and no bond loss, mainnet is never -the same as testnet, and operating any system comes with some risk. - -=== Deposit State Transitions - -Two deposits, -https://allthekeeps.com/deposit/dp-0x6b6ec592fede474e108f8fe5333d1c34cbefaf74[one -on October 7th (0.01 BTC)] and -https://allthekeeps.com/deposit/dp-0x6a3f8a78d09fc1645abd19c74d63c99d6e51fd10[one -on September 27th (0.2 BTC)], were liquidated due to a missing state -transition. - -With help from the community, the team is helping to push deposits that are -in certain states that can result in liquidation to their "next" states. -While the dApp typically does this, users can occasionally abandon the dApp -mid-flow, and the signer client that handles key material does not currently -advance the deposit through these states automatically. These two deposits -both resulted from a failure to make such a state transition---the first -occurred a matter of hours before the solution to push these through was -enabled, and the second due to a bug in that solution. - -There is https://github.com/keep-network/keep-ecdsa/issues/574[work planned] -to make ECDSA clients take care of this in the short term. - -=== Missing Signer Backups - -On September 25th, -https://allthekeeps.com/deposit/dp-0x77bcd4ec2f0db39c71a229150ef15fdfb73da684[a -10 BTC deposit] was liquidated due to a failure by signers to provide the -signature for a redemption proof in time, used to move BTC back out of the -tBTC system to the BTC chain. One of the operators in question reached out to -us during the redemption signature time to indicate that they were observing -a lack of activity on their client. - -After investigating the situation on the network, we determined that one of -the operators in the signing group had experienced an unrecoverable loss of -their key share data due to a combination of insufficient backups and a -server change (unrelated to the client software). We coordinated a -liquidation of the funds that resulted in all signer bonds being returned to -the signers backing the deposit. The original depositor was able to recover -the 10 TBTC through this liquidation, for future redemption of a different -deposit, maintaining the system’s underlying guarantee that TBTC holders are -made whole. - -As a result, we also took several additional actions to reduce the likelihood -of this issue recurring: - -* We convinced the operator in question to move their operations to one of the - staking providers to achieve greater reliability. -* We reached out to remaining operators in the system to remind them that they - should have ongoing backups of key material as a regular part of their - operational plan. -* We added several more calls to action in our documentation to emphasize that - backups of key material are a baseline expectation for operators in the - system. - -=== Race Condition in the ECDSA Client - -On September 26th, -https://allthekeeps.com/deposit/dp-0x2cd0bb9e8d1eb1210506aa4cb28c115e201fe65d[a -10 BTC deposit] was liquidated due to a race condition in the ECDSA client, -triggered by a combination of events: - -* A duplicate `BondedECDSAKeepCreated` event was received by the ECDSA client on - three operators, all ~30s after the first event. We suspect a short-term - chain reorg was the cause. -* During the time since the first event was received, all 3 signers had - completed their Distributed Key Generation procedure, generated private - keyshares and a public key for the group corresponding to that event. -* During that same time, all three signers had also submitted transactions to - publish the public key to the `BondedECDSAKeep` contract. -* None of the three transactions had been confirmed on-chain. - -Due to how the client managed in-memory representations of bonded ECDSA -keeps, there was a window of time after key generation completed and before -the public key publish transaction confirmed where a duplicate event could -cause a second key generation to trigger normally. As a result, in the above -scenario, all three signers performed a second key generation and submitted a -second key to the chain. The on-chain contract rightly rejected this second -key; however, due to a combination of circumstances on the client, the second -key overwrote the first key on the system’s persistent storage and both key -generation cycles were considered successful. - -Once key generation completes, the client spins up an event watcher -monitoring for signature requests from the chainーthis is the mechanism used -to respond to redemption requests. In this case, each of the 3 signers for -the deposit spun up two event watchers, one corresponding to each key. When -the redemption signature request came up, both watchers saw it and attempted -to participate in a signing exchange on the network. Due to the nature of the -protocol, having 6 signers with two different sets of key shares trying to -perform a single signature resulted in repeated failure of the signature -protocol. Thus, the redemption signature could not be provided. - -Once the deposit was liquidated, approximately 1/3 of each signer’s bond was -returned to them. The depositor was made whole in TBTC, as with the previous -instance, maintaining the system’s guarantees to depositors. The team -confirmed that the key shares that reached persistent storage were for the -key that did not receive the BTC, thus the underlying BTC was lost. This -makes it impossible for the signers to recover more than the already-returned -bonds. - -Several changes were made as a result of this incident: - -* The same day as the incident response, a PR fixing the underlying race - condition was merged and a release tagged and built with these changes. All - operators were notified of the client upgrade and the underlying potential - bond loss. -* Within a week, the tooling was completed to investigate the underlying key - shares. Though the result was not sufficient to recover the BTC, the - tooling forms the backbone of future key recovery needs. The intent is for - key recovery to be an unusual but well-supported part of client operations, - since it is the mechanism through which operators are generally able to - recover any value lost to liquidations. -* Release 1.4.0 of the client was shipped this week shortly, adding additional - snapshotting of key material so that even if there is a different - possibility of overwriting key material, all key shares of all key - generations will have been captured in a separate directory without the - possibility of overwriting. - -== Other Failure Types - -A few other failure types were observed on mainnet, none of which resulted in -liquidation, covered in summary form below: - -* **Depositors failing to fund deposits they have opened**. This results in a - loss to the depositors of the opening fee for the deposit. Signer bonds are - held for a short duration (3 hours) and can then be released by the - signers. A number of these have been observed on-chain. -* **Depositors funding deposits incorrectly (by sending less than the required - amount of BTC to the signer group)**. None of these were observed on-chain - during the first month; however, in these cases the underlying BTC can be - recovered with some coordination, provided a cooperative signer group. - There is ongoing work to automate this coordination in the default case. -* **Depositors failing to prove funding in time**. A BTC funding transaction - must be proven to have 6 confirmations within 3 hours of the deposit’s - having a public key, or the deposit can be closed by the signers. A proof - can fail to be submitted on time if a BTC transaction is mined too slowly - and the depositor does not increase their fee, or if the transaction has - its confirmations but the depositor never submits the proof to the chain. - One of these was observed during the first month; as with incorrect - funding, the underlying BTC is recoverable via coordination in these cases. - As with incorrect funding, there is ongoing work to automate this - coordination in the default case. -* **Relay maintainer running out of gas**. The cross-chain nature of tBTC - requires an SPV relay, which enables Ethereum contracts to confirm that a - Bitcoin transaction exists on the Bitcoin chain and has been confirmed a - certain number of times. Without this component, funding and redemption - proofs cannot be submitted to tBTC, leading to the system's - deposit/redemption flow stalling out. Bitcoin can still flow, and any - unproven funds are still recoverable as with most other states the system - can enter, but obviously this is not ideal. The underlying causes for this - particular issue are still under investigation---a balance check - notification and a page for the insufficient funds issue on the maintainer - both failed to fire. Fortunately, the team at - https://strudel.finance[strudel.finance] noticed this issue shortly after - it occurred, and started feeding the relay updates---first manually, and - then automatically. The tBTC system (and strudel.finance’s system that also - relies on the relay) both ran normally during this time. You can also read - their - https://medium.com/@strudelfinance/trustless-bridges-collaborating-on-block-relay-9a4b8855623c[blog - post on the incident]. -+ -Generally the community acts as the "notifier of last resort" for the team, -and much of the team keeps a close eye on Keep Discord mentions as a -result. Thanks to the fact that strudel.finance started feeding the relay, -no one reached out to the team until the Strudel team did. Unfortunately -they reached out on the https://chat.tbtc.network[tBTC Discord server] -rather than the Keep one, which is new and which the team hasn't been -monitoring as closely. We independently discovered the issue on our end and -fixed it, but we have also begun monitoring the tBTC Discord more closely -as a result. - -== Community Participation - -As mentioned above, the community plays a large part in operating the tBTC -system successfully and correctlyーthe team largely doesn’t mint TBTC, largely -doesn’t operate nodes on the network, and largely doesn’t bond ETH. As such, -TBTC in circulation and signer nodes in operation are largely out of our -control, and we rely on and encourage community feedback and communication to -help guide both the development of the project and the discovery of -low-likelihood or unusual issues. - -We wanted to call out the specific contributions that have come in from various -parts of the community, generally rewarded through the Playing for Keeps -program: - -* **Running scripts**: several community members run additional scripts to - monitor and move system state between deposits where reasonable. Redundancy is - good in these cases, and protects against single points of failure. -* **Building explorers**: as linked at the start of this report, a handful of - community members have assembled different views on different aspects of the - Keep and tBTC systems. The results have been great tools that work fast and - provide a tremendous amount of useful information about the network. The team - uses some of these tools ourselves in cases where they provide different views - than the tools we’ve built. -* **Updating the SPV relay**: The folks at strudel.finance kept the relay - running in a situation where our own maintainer account was low on balance - (see <> for more). We’re now working on a collaboration - with them to incentivize more folks to help keep the relay up-to-date, since - it is fundamentally a public good and our central maintenance of it was by - circumstance rather than by design. - -== Conclusion and Next Steps - -The first month of tBTC’s existence has seen relatively few major issues. The -two user-impacting issues that were observed were seen in the first week of the -system, and have resulted in added resilience to the ECDSA client and better -communication to the community about baseline expectations for operating a -client in the network. We have heard of no crashes in the client software, and -had several teams reach out to remark on the overall stability of the client. - -There are several short- and mid-term client improvements in the works that were -already on the roadmap and would have helped in the first month, or that are a -direct result of the observed behavior in the first month. Here are a few -examples: - -* **Fund recovery automation** to make coordination of fund recovery in cases of - funding issues automatic. -* **tBTC-specific behaviors in the ECDSA client** to prevent state-transition - related issues. This is being handled through out-of-band scripts at the - moment, but integrating it natively into the ECDSA client will make it a - direct responsibility of the signers. -* **Support for non-disk-based persistent storage** to allow key shares to be - stored in e.g. encrypted S3 buckets or other forms of durable, managed - persistent storage that require less ongoing backup overhead. -* **Considering reduction of lot sizes** to decrease per-deposit risk. Lot size - decisions balance per-deposit risk against minting efficiency (since deposits - have a fixed overhead cost for opening new lots) and other incentive - components (such as the Keep staking rewards mechanism). -* **Decentralizing maintenance of the Bitcoin difficulty relay on Ethereum** by - incentivizing difficulty relay maintenance, in collaboration with other teams - using it such as the strudel.finance team. - -The tBTC rc.1 graduated supply cap seems to have clearly communicated to signers -and users both that confidence in the system should increase with time, -something that has been borne out in practice. We continue to be satisfied that -no user funds have ever been at risk, and that the mechanisms for user fund -recovery in cases of unexpected failures have worked exactly as designed. - -Here’s to many more months and years of decentralized BTC earnings on DeFi 🚀 diff --git a/docs/development/README.adoc b/docs/development/README.adoc index 42285e7f16..e556878d1b 100644 --- a/docs/development/README.adoc +++ b/docs/development/README.adoc @@ -216,7 +216,7 @@ There are two primary languages in the T code right now: Go:: Go code largely adheres to community practices where they have been decided. - Divergences and additional tidbits are listed in the link:../../docs-v1/development/go-guidelines.adoc[Go + Divergences and additional tidbits are listed in the link:go-guidelines.adoc[Go Guidelines] document. Solidity:: diff --git a/docs-v1/development/go-guidelines.adoc b/docs/development/go-guidelines.adoc similarity index 100% rename from docs-v1/development/go-guidelines.adoc rename to docs/development/go-guidelines.adoc diff --git a/docs/retired-components.md b/docs/retired-components.md index b76241103a..6cd6d31f30 100644 --- a/docs/retired-components.md +++ b/docs/retired-components.md @@ -3,12 +3,15 @@ KEEP-era staking and distribution surfaces have been retired in favor of the Threshold Network T token and the current contracts under `solidity/`. -This repository no longer carries the following legacy components: +This repository no longer carries the following legacy components. Paths +prefixed with `solidity/` below refer to the +[`threshold-network/keep-core-v1`](https://github.com/threshold-network/keep-core-v1) +repository, where the legacy v1 random beacon sources now live: -- `solidity-v1/contracts/TokenStakingEscrow.sol` +- `solidity/contracts/TokenStakingEscrow.sol` (in `keep-core-v1`) - `token-stakedrop/` -- `solidity-v1/scripts/withdraw-old-rewards.js` -- `solidity-v1/dashboard/` +- `solidity/scripts/withdraw-old-rewards.js` (in `keep-core-v1`; previously removed there) +- `solidity/dashboard/` (in `keep-core-v1`; previously removed there) - KEEP token dashboard Kubernetes manifests under `infrastructure/kube/keep-*` - `scripts/start_dashboard.sh` @@ -19,6 +22,6 @@ contained a committed mainnet private key (since rotated and no longer active), and the retired staking escrow had no remaining ETH, KEEP, or T balance on Ethereum mainnet when checked before removal. -Historical documents under `docs-v1/` may still mention these components for -release history and archival context. They should not be used as operational -runbooks for current Threshold Network deployments. +Historical documents under the `docs/` tree of `keep-core-v1` may still mention +these components for release history and archival context. They should not be +used as operational runbooks for current Threshold Network deployments. diff --git a/scripts/install-v1.sh b/scripts/install-v1.sh deleted file mode 100755 index 0bdbacc3ad..0000000000 --- a/scripts/install-v1.sh +++ /dev/null @@ -1,85 +0,0 @@ -#!/bin/bash -set -euo pipefail - -LOG_START='\n\e[1;36m' # new line + bold + color -LOG_END='\n\e[0m' # new line + reset color -DONE_START='\n\e[1;32m' # new line + bold + green -DONE_END='\n\n\e[0m' # new line + reset - -KEEP_CORE_PATH=$PWD -KEEP_CORE_SOL_PATH="$KEEP_CORE_PATH/solidity-v1" - -# Defaults, can be overwritten by env variables/input parameters -NETWORK_DEFAULT="local" -KEEP_ETHEREUM_PASSWORD=${KEEP_ETHEREUM_PASSWORD:-"password"} -CONTRACT_OWNER_ETH_ACCOUNT_PRIVATE_KEY=${CONTRACT_OWNER_ETH_ACCOUNT_PRIVATE_KEY:-""} - -help() -{ - echo -e "\nUsage: ENV_VAR(S) $0"\ - "--network "\ - echo -e "\nEnvironment variables:\n" - echo -e "\tKEEP_ETHEREUM_PASSWORD: The password to unlock local Ethereum accounts to set up delegations."\ - "Required only for 'local' network. Default value is 'password'" - echo -e "\tCONTRACT_OWNER_ETH_ACCOUNT_PRIVATE_KEY: Contracts owner private key on Ethereum. Required for non-local network only" - echo -e "\nCommand line arguments:\n" - echo -e "\t--network: Ethereum network for keep-core client."\ - "Available networks and settings are specified in the 'truffle-config.js'" - exit 1 # Exit script after printing help -} - -# Transform long options to short ones -for arg in "$@"; do - shift - case "$arg" in - "--network") set -- "$@" "-n" ;; - "--help") set -- "$@" "-h" ;; - *) set -- "$@" "$arg" - esac -done - -# Parse short options -OPTIND=1 -while getopts "n:h" opt -do - case "$opt" in - n ) network="$OPTARG" ;; - h ) help ;; - ? ) help ;; # Print help in case parameter is non-existent - esac -done -shift $(expr $OPTIND - 1) # remove options from positional parameters - -# Overwrite default properties -NETWORK=${network:-$NETWORK_DEFAULT} - -# Run script -printf "${LOG_START}Starting installation...${LOG_END}" - -printf "Network: $NETWORK" - -cd $KEEP_CORE_SOL_PATH - -printf "${LOG_START}Installing NPM dependencies...${LOG_END}" -npm install - -if [ "$NETWORK" == "local" ]; then - printf "${LOG_START}Unlocking ethereum accounts...${LOG_END}" - KEEP_ETHEREUM_PASSWORD=$KEEP_ETHEREUM_PASSWORD \ - npx truffle exec scripts/unlock-eth-accounts.js --network $NETWORK -fi - -printf "${LOG_START}Migrating contracts...${LOG_END}" -rm -rf build/ - -CONTRACT_OWNER_ETH_ACCOUNT_PRIVATE_KEY=$CONTRACT_OWNER_ETH_ACCOUNT_PRIVATE_KEY \ - npx truffle migrate --reset --network $NETWORK - -printf "${LOG_START}Copying contract artifacts...${LOG_END}" -rm -rf artifacts -cp -r build/contracts artifacts -npm link - -printf "${LOG_START}Initializing contracts...${LOG_END}" - -printf "${DONE_START}Installation completed!${DONE_END}" diff --git a/scripts/macos-setup.sh b/scripts/macos-setup.sh index 3a27fddcd6..7d0f1fb490 100755 --- a/scripts/macos-setup.sh +++ b/scripts/macos-setup.sh @@ -28,9 +28,8 @@ brew list jq &>/dev/null || brew install jq echo "Installing pre-commit and specified hooks..." pre-commit install --install-hooks -echo "Installing solidity npm and requirements..." +echo "Installing npm..." brew list npm &>/dev/null || brew install npm -cd ../solidity-v1 && npm install && cd ../scripts if ! [ -x "$(command -v protoc-gen-go)" ]; then echo 'WARNING: protoc-gen-go command is not available' diff --git a/solidity-v1/.babelrc b/solidity-v1/.babelrc deleted file mode 100644 index ce6eb60be7..0000000000 --- a/solidity-v1/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["es2015", "stage-2", "stage-3"] -} diff --git a/solidity-v1/.eslintrc b/solidity-v1/.eslintrc deleted file mode 100644 index 338dcbc646..0000000000 --- a/solidity-v1/.eslintrc +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": ["eslint-config-keep", "prettier"], - "parserOptions": { - "ecmaVersion": 2017, - "sourceType": "module" - }, - "env": { - "es6": true, - "mocha": true - }, - "rules": { - "new-cap": "off" - } -} - diff --git a/solidity-v1/.soliumrc.json b/solidity-v1/.soliumrc.json deleted file mode 100644 index 954839637f..0000000000 --- a/solidity-v1/.soliumrc.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "extends": "keep", - "plugins": [ - "security" - ], - "rules": { - "security/no-block-members": [ - "off", - [ - "timestamp" - ] - ], - "indentation": "off", - "security/no-call-value": "off", - "security/no-inline-assembly": "off" - } -} diff --git a/solidity-v1/Makefile b/solidity-v1/Makefile deleted file mode 100644 index f4fd71eec2..0000000000 --- a/solidity-v1/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -SHELL = /bin/bash - -.PHONY: clean docs venv - -clean: - rm -rf docs/output - rm -rf docs/contracts - rm -rf docs/doxity/pages/docs - -venv: - python3 -m venv ~/venv - source ~/venv/bin/activate - pip3 install -r requirements.txt - -docs: venv - bash scripts/docs.sh \ No newline at end of file diff --git a/solidity-v1/README.md b/solidity-v1/README.md deleted file mode 100644 index 855b58b061..0000000000 --- a/solidity-v1/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Keep Network v1 Smart Contracts (Legacy) - -This directory contains the legacy v1 random beacon Solidity contracts. -They are preserved for reference and are no longer actively developed. - -Current v2 contracts live in [`../solidity/random-beacon/`](../solidity/random-beacon/) -and [`../solidity/ecdsa/`](../solidity/ecdsa/). diff --git a/solidity-v1/contracts/.gitignore b/solidity-v1/contracts/.gitignore deleted file mode 100644 index 456411964e..0000000000 --- a/solidity-v1/contracts/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.abi diff --git a/solidity-v1/contracts/AdaptiveStakingPolicy.sol b/solidity-v1/contracts/AdaptiveStakingPolicy.sol deleted file mode 100644 index b966577c3b..0000000000 --- a/solidity-v1/contracts/AdaptiveStakingPolicy.sol +++ /dev/null @@ -1,98 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "./libraries/grant/UnlockingSchedule.sol"; -import "./GrantStakingPolicy.sol"; -import "./TokenStaking.sol"; - -/// @title AdaptiveStakingPolicy -/// @notice A staking policy which allows the grantee -/// to always stake a certain multiple of the defined minimum stake, -/// or the unlocked amount at a specified time in the future, -/// if it is greater. -/// -/// When creating a policy, -/// the minimum stake multiplier and stakeahead time can be customized, -/// and whether the cliff is considered in the stakeahead -/// can also be chosen. -contract AdaptiveStakingPolicy is GrantStakingPolicy { - using SafeMath for uint256; - using UnlockingSchedule for uint256; - uint256 minimumStake; - uint256 stakeaheadTime; - bool useCliff; - - constructor( - // Address of the staking contract, - // from which the minimum stake is fetched at the time of creation. - address _stakingContract, - // Multiplier for the minimum stake; - // with a minimumMultiplier = 5 - // the policy permits staking 5 times the minimum stake. - // If the multiplier is 0, - // only the unlocked amount, - // including stakeahead if applicable, - // can be staked. - uint256 minimumMultiplier, - // Stakeahead time in seconds; - // the policy permits staking the amount that will be unlocked - // `stakeaheadTime` seconds in the future. - // For example, on a 12-month grant - // a stakeahead time of 7,884,000 (3 months in seconds) - // means that 25% of the grant will be unlocked within the stakeahead - // and thus be stakeable on top of the unlocked amount. - // On a 24-month grant the same stakeahead results in - // 12.5% of the grant being added to the unlocked amount. - // With a stakeahead of 0, - // only the unlocked amount can be staked. - uint256 _stakeaheadTime, - // Whether the cliff is used when calculating stakeahead. - // If `useCliff = true`, - // a 12-month grant with a 6-month cliff and 3-month stakeahead - // will only permit the minimum until 3 months, - // when the current time plus stakeahead reaches the cliff. - // If the cliff is not used, - // the grantee could instead stake 25% right away. - bool _useCliff - ) public { - minimumStake = TokenStaking(_stakingContract).minimumStake().mul( - minimumMultiplier - ); - stakeaheadTime = _stakeaheadTime; - useCliff = _useCliff; - } - - function getStakeableAmount( - uint256 _now, - uint256 grantedAmount, - uint256 duration, - uint256 start, - uint256 cliff, - uint256 withdrawn - ) public view returns (uint256) { - uint256 unlocked = - _now.add(stakeaheadTime).getUnlockedAmount( - grantedAmount, - duration, - start, - (useCliff ? cliff : 0) - ); - uint256 remainingInGrant = grantedAmount.sub(withdrawn); - uint256 unlockedInGrant = unlocked.sub(withdrawn); - - // Less than minimum stake remaining - // -> may stake what is remaining in grant - if (remainingInGrant < minimumStake) { - return remainingInGrant; - } - // At least minimum stake remaining in grant, - // but unlocked amount is less than the minimum stake - // -> may stake the minimum stake - if (unlockedInGrant < minimumStake) { - return minimumStake; - } - // More than minimum stake unlocked in grant - // -> may stake the unlocked amount - return unlockedInGrant; - } -} diff --git a/solidity-v1/contracts/Authorizations.sol b/solidity-v1/contracts/Authorizations.sol deleted file mode 100644 index b1afd404bb..0000000000 --- a/solidity-v1/contracts/Authorizations.sol +++ /dev/null @@ -1,171 +0,0 @@ -/** -▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀ - ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ -▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ - - Trust math, not hardware. -*/ - -pragma solidity 0.5.17; - -import "./KeepRegistry.sol"; - -/// @title AuthorityDelegator -/// @notice An operator contract can delegate authority to other operator -/// contracts by implementing the AuthorityDelegator interface. -/// -/// To delegate authority, -/// the recipient of delegated authority must call `claimDelegatedAuthority`, -/// specifying the contract it wants delegated authority from. -/// The staking contract calls `delegator.__isRecognized(recipient)` -/// and if the call returns `true`, -/// the named delegator contract is set as the recipient's authority delegator. -/// Any future checks of registry approval or per-operator authorization -/// will transparently mirror the delegator's status. -/// -/// Authority can be delegated recursively; -/// an operator contract receiving delegated authority -/// can recognize other operator contracts as recipients of its authority. -interface AuthorityDelegator { - function __isRecognized(address delegatedAuthorityRecipient) - external - returns (bool); -} - -/// @title AuthorityVerifier -/// @notice An operator contract can delegate authority to other operator -/// contracts. Entry in the registry is not updated and source contract remains -/// listed there as authorized. This interface is a verifier that support verification -/// of contract authorization in case of authority delegation from the source contract. -interface AuthorityVerifier { - /// @notice Returns true if the given operator contract has been approved - /// for use. The function never reverts. - function isApprovedOperatorContract(address _operatorContract) - external - view - returns (bool); -} - -contract Authorizations is AuthorityVerifier { - // Authorized operator contracts. - mapping(address => mapping(address => bool)) internal authorizations; - - // Granters of delegated authority to operator contracts. - // E.g. keep factories granting delegated authority to keeps. - // `delegatedAuthority[keep] = factory` - mapping(address => address) internal delegatedAuthority; - - // Registry contract with a list of approved operator contracts and upgraders. - KeepRegistry internal registry; - - modifier onlyApprovedOperatorContract(address operatorContract) { - require( - isApprovedOperatorContract(operatorContract), - "Operator contract unapproved" - ); - _; - } - - constructor(KeepRegistry _registry) public { - registry = _registry; - } - - /// @notice Gets the authorizer for the specified operator address. - /// @return Authorizer address. - function authorizerOf(address _operator) public view returns (address); - - /// @notice Authorizes operator contract to access staked token balance of - /// the provided operator. Can only be executed by stake operator authorizer. - /// Contracts using delegated authority - /// cannot be authorized with `authorizeOperatorContract`. - /// Instead, authorize `getAuthoritySource(_operatorContract)`. - /// @param _operator address of stake operator. - /// @param _operatorContract address of operator contract. - function authorizeOperatorContract( - address _operator, - address _operatorContract - ) public onlyApprovedOperatorContract(_operatorContract) { - require( - authorizerOf(_operator) == msg.sender, - "Not operator authorizer" - ); - require( - getAuthoritySource(_operatorContract) == _operatorContract, - "Delegated authority used" - ); - authorizations[_operatorContract][_operator] = true; - } - - /// @notice Checks if operator contract has access to the staked token balance of - /// the provided operator. - /// @param _operator address of stake operator. - /// @param _operatorContract address of operator contract. - function isAuthorizedForOperator( - address _operator, - address _operatorContract - ) public view returns (bool) { - return authorizations[getAuthoritySource(_operatorContract)][_operator]; - } - - /// @notice Grant the sender the same authority as `delegatedAuthoritySource` - /// @dev If `delegatedAuthoritySource` is an approved operator contract - /// and recognizes the claimant, this relationship will be recorded in - /// `delegatedAuthority`. Later, the claimant can slash, seize, place locks etc. - /// on operators that have authorized the `delegatedAuthoritySource`. - /// If the `delegatedAuthoritySource` is disabled with the panic button, - /// any recipients of delegated authority from it will also be disabled. - function claimDelegatedAuthority(address delegatedAuthoritySource) - public - onlyApprovedOperatorContract(delegatedAuthoritySource) - { - require( - AuthorityDelegator(delegatedAuthoritySource).__isRecognized( - msg.sender - ), - "Unrecognized claimant" - ); - delegatedAuthority[msg.sender] = delegatedAuthoritySource; - } - - /// @notice Checks if the operator contract is authorized in the registry. - /// If the contract uses delegated authority it checks authorization of the - /// source contract. - /// @param _operatorContract address of operator contract. - /// @return True if operator contract is approved, false if operator contract - /// has not been approved or if it was disabled by the panic button. - function isApprovedOperatorContract(address _operatorContract) - public - view - returns (bool) - { - return - registry.isApprovedOperatorContract( - getAuthoritySource(_operatorContract) - ); - } - - /// @notice Get the source of the operator contract's authority. - /// If the contract uses delegated authority, - /// returns the original source of the delegated authority. - /// If the contract doesn't use delegated authority, - /// returns the contract itself. - /// Authorize `getAuthoritySource(operatorContract)` - /// to grant `operatorContract` the authority to penalize an operator. - function getAuthoritySource(address operatorContract) - public - view - returns (address) - { - address delegatedAuthoritySource = delegatedAuthority[operatorContract]; - if (delegatedAuthoritySource == address(0)) { - return operatorContract; - } - return getAuthoritySource(delegatedAuthoritySource); - } -} diff --git a/solidity-v1/contracts/BeaconBackportRewards.sol b/solidity-v1/contracts/BeaconBackportRewards.sol deleted file mode 100644 index 7c54ee5124..0000000000 --- a/solidity-v1/contracts/BeaconBackportRewards.sol +++ /dev/null @@ -1,148 +0,0 @@ -/** -▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀ - ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ -▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ - - Trust math, not hardware. -*/ - -pragma solidity ^0.5.17; - -import "./Rewards.sol"; -import "./KeepRandomBeaconOperator.sol"; -import "./TokenStaking.sol"; - -/// @title KEEP Random Beacon Signer Subsidy Rewards for the May release. -/// @notice Contract distributing KEEP rewards to Random Beacon signers from -/// May KeepRandomBeaconOperator contract: -/// https://etherscan.io/address/0x70F2202D85a4F0Cad36e978976f84E982920A624 -/// -/// We use a separate contract for those rewards as the previous version of -/// KeepRandomBeaconOperator did not have all the functions BeaconRewards uses. -/// -/// Groups from May release of KeepRandomBeaconOperator contract can claim their -/// rewards at any time. -contract BeaconBackportRewards is Rewards { - // Beacon genesis date, 2020-05-11, is the interval start. - // https://etherscan.io/tx/0x5c0387a2402be57dae95d5f5c3745afb3a770462df13fceccf3967a1eecf6136 - uint256 internal constant beaconIntervalStart = 1589155200; - - // We are going to have one interval, with a weight of 100%. - uint256[] internal beaconIntervalWeight = [100]; - - // 136 days between the genesis of the old and the new random beacon - // contract versions: - // https://etherscan.io/tx/0x5c0387a2402be57dae95d5f5c3745afb3a770462df13fceccf3967a1eecf6136 - // https://etherscan.io/tx/0xe2e8ab5631473a3d7d8122ce4853c38f5cc7d3dcbfab3607f6b27a7ef3b86da2 - uint256 internal constant beaconTermLength = 136 days; - - // There were three beacon groups created during those 135 days: - // 0x2e490c9c6d822341a23a2c37c203cff8530345ce59c8f3d218cd7f2a21bf5ac51c6f...827, - // 0x065d0e58684df0fc3fad2155e07fb1861b521679f267e440028ec1237a8be58e0e2f...49f, - // 0x118e601ef5f594cd29053ee47490edbaae895109704af19d57114c4a77fa73041d44...652. - // - // We hardcode this number because the previous KeepRandomBeaconOperator - // contract version had no easy way to get the number of all groups created. - uint256 internal constant numberOfCreatedGroups = 3; - - // We allocate all rewards to those groups. - uint256 internal constant minimumBeaconGroupsPerInterval = - numberOfCreatedGroups; - - KeepRandomBeaconOperator operatorContract; - TokenStaking tokenStaking; - - constructor( - address _token, - address _operatorContract, - address _stakingContract - ) - public - Rewards( - _token, - beaconIntervalStart, - beaconIntervalWeight, - beaconTermLength, - minimumBeaconGroupsPerInterval - ) - { - operatorContract = KeepRandomBeaconOperator(_operatorContract); - tokenStaking = TokenStaking(_stakingContract); - } - - /// @notice Sends the reward for a group to the group member beneficiaries. - /// @param groupIndex Index of the group to receive a reward. - function receiveReward(uint256 groupIndex) public { - receiveReward(bytes32(groupIndex)); - } - - function _getKeepCount() internal view returns (uint256) { - return numberOfCreatedGroups; - } - - function _getKeepAtIndex(uint256 i) internal view returns (bytes32) { - return bytes32(i); - } - - function _getCreationTime(bytes32) internal view returns (uint256) { - // Assign each group to the starting timestamp of its interval - return startOf(0); - } - - function _isClosed(bytes32) internal view returns (bool) { - // All groups within the eligible range are considered happily closed. - return true; - } - - function _isTerminated(bytes32 groupIndexBytes) - internal - view - returns (bool) - { - return false; - } - - function _recognizedByFactory(bytes32 groupIndexBytes) - internal - view - returns (bool) - { - return numberOfCreatedGroups > uint256(groupIndexBytes); - } - - function _distributeReward(bytes32 groupIndexBytes, uint256 _value) - internal - { - bytes memory groupPubkey = - operatorContract.getGroupPublicKey(uint256(groupIndexBytes)); - address[] memory members = - operatorContract.getGroupMembers(groupPubkey); - - uint256 memberCount = members.length; - uint256 dividend = _value.div(memberCount); - - // Only pay other members if dividend is nonzero. - if (dividend > 0) { - for (uint256 i = 0; i < memberCount - 1; i++) { - token.safeTransfer( - tokenStaking.beneficiaryOf(members[i]), - dividend - ); - } - } - - // Transfer of dividend for the last member. Remainder might be equal to - // zero in case of even distribution or some small number. - uint256 remainder = _value.mod(memberCount); - token.safeTransfer( - tokenStaking.beneficiaryOf(members[memberCount - 1]), - dividend.add(remainder) - ); - } -} diff --git a/solidity-v1/contracts/BeaconRewards.sol b/solidity-v1/contracts/BeaconRewards.sol deleted file mode 100644 index 67ab530ac7..0000000000 --- a/solidity-v1/contracts/BeaconRewards.sol +++ /dev/null @@ -1,239 +0,0 @@ -/** -▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀ - ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ -▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ - - Trust math, not hardware. -*/ - -pragma solidity ^0.5.17; - -import "./Rewards.sol"; -import "./KeepRandomBeaconOperator.sol"; -import "./TokenStaking.sol"; - -/// @title KEEP Random Beacon Signer Subsidy Rewards -/// @notice Contract distributing KEEP rewards to Random Beacon signers based -/// on the defined reward schedule. -/// -/// The amount of KEEP to be distributed is determined by funding the contract, -/// and additional KEEP can be added at any time. -/// -/// When an interval is over, it will be allocated a percentage of the remaining -/// unallocated rewards based on its weight, and adjusted by the number of groups -/// created in the interval if the quota is not met. -/// -/// The adjustment for not meeting the group quota is a percentage that equals -/// the percentage of the quota that was met; if the number of groups created is -/// 80% of the quota then 80% of the base reward will be allocated for the -/// interval. -/// -/// Any unallocated rewards will stay in the unallocated rewards pool, -/// to be allocated for future intervals. Intervals past the initially defined -/// schedule have a weight of 100%, meaning that all remaining unallocated -/// rewards will be allocated to the interval. -/// -/// Groups can receive rewards once the interval they were created in is over, -/// and the group has been marked as stale. -/// There is no time limit to receiving rewards, nor is there need to wait for -/// all groups from the interval to be marked as stale. -/// Calling `receiveReward` automatically allocates the rewards for the interval -/// the specified group was created in and all previous intervals. -/// -/// If a group is terminated, that fact can be reported to the reward contract. -/// Reporting a terminated group returns its allocated reward to the pool of -/// unallocated rewards. -contract BeaconRewards is Rewards { - // Weights of the 24 reward intervals assigned over - // 24 * beaconTermLength days. - uint256[] internal beaconIntervalWeights = [ - 4, - 8, - 10, - 12, - 15, - 15, - 15, - 15, - 15, - 15, - 15, - 15, - 15, - 15, - 15, - 15, - 15, - 15, - 15, - 15, - 15, - 15, - 15, - 15 - ]; - - // Beacon genesis date, 2020-09-24, is the first interval start. - // https://etherscan.io/tx/0xe2e8ab5631473a3d7d8122ce4853c38f5cc7d3dcbfab3607f6b27a7ef3b86da2 - uint256 internal constant beaconFirstIntervalStart = 1600905600; - - // Each interval is 30 days long. - uint256 internal constant beaconTermLength = 30 days; - - // There has to be at least 2 groups per interval to meet the group quota - // and distribute the full reward for the given interval. - uint256 internal constant minimumBeaconGroupsPerInterval = 2; - - KeepRandomBeaconOperator operatorContract; - TokenStaking tokenStaking; - - constructor( - address _token, - address _operatorContract, - address _stakingContract - ) - public - Rewards( - _token, - beaconFirstIntervalStart, - beaconIntervalWeights, - beaconTermLength, - minimumBeaconGroupsPerInterval - ) - { - operatorContract = KeepRandomBeaconOperator(_operatorContract); - tokenStaking = TokenStaking(_stakingContract); - } - - /// @notice Sends the reward for a group to the group member beneficiaries. - /// @param groupIndex Index of the group to receive a reward. - function receiveReward(uint256 groupIndex) public { - receiveReward(bytes32(groupIndex)); - } - - /// @notice Stakers can receive KEEP rewards from multiple groups of their choice - /// in one transaction to reduce total cost comparing to single calls for rewards. - /// It is a caller responsibility to determine the cost and consumed gas when - /// receiving rewards from multiple groups. - /// @param groupIndices An array of group indices. - function receiveRewards(uint256[] memory groupIndices) public { - uint256 len = groupIndices.length; - bytes32[] memory bytes32identifiers = new bytes32[](len); - for (uint256 i = 0; i < groupIndices.length; i++) { - bytes32identifiers[i] = bytes32(groupIndices[i]); - } - receiveRewards(bytes32identifiers); - } - - /// @notice Checks if the group is eligible to receive a reward. - /// Group is eligible to receive a reward if it has been marked as stale - /// and rewards has not been claimed yet. - /// @param groupIndex Index of the group to check. - function eligibleForReward(uint256 groupIndex) public view returns (bool) { - return eligibleForReward(bytes32(groupIndex)); - } - - /// @notice Report that the group was terminated, and return its allocated - /// rewards to the unallocated pool. - /// @param groupIndex Index of the terminated group. - function reportTermination(uint256 groupIndex) public { - reportTermination(bytes32(groupIndex)); - } - - /// @notice Report about the terminated groups in batch. All the allocated - /// rewards in these groups will be returned to the unallocated pool. - /// @param groupIndices An array of group indices. - function reportTerminations(uint256[] memory groupIndices) public { - uint256 len = groupIndices.length; - bytes32[] memory bytes32identifiers = new bytes32[](len); - for (uint256 i = 0; i < groupIndices.length; i++) { - bytes32identifiers[i] = bytes32(groupIndices[i]); - } - reportTerminations(bytes32identifiers); - } - - /// @notice Checks if the group is terminated and thus its rewards can be - /// returned to the unallocated pool by calling `reportTermination`. - /// @param groupIndex Index of the potentially terminated group. - function isTerminated(uint256 groupIndex) public view returns (bool) { - return eligibleButTerminated(bytes32(groupIndex)); - } - - function _getKeepCount() internal view returns (uint256) { - return operatorContract.getNumberOfCreatedGroups(); - } - - function _getKeepAtIndex(uint256 i) internal view returns (bytes32) { - return bytes32(i); - } - - function _getCreationTime(bytes32 groupIndexBytes) - internal - view - returns (uint256) - { - return - operatorContract.getGroupRegistrationTime(uint256(groupIndexBytes)); - } - - function _isClosed(bytes32 groupIndexBytes) internal view returns (bool) { - if (_isTerminated(groupIndexBytes)) { - return false; - } - bytes memory groupPubkey = - operatorContract.getGroupPublicKey(uint256(groupIndexBytes)); - return operatorContract.isStaleGroup(groupPubkey); - } - - function _isTerminated(bytes32 groupIndexBytes) - internal - view - returns (bool) - { - return operatorContract.isGroupTerminated(uint256(groupIndexBytes)); - } - - function _recognizedByFactory(bytes32 groupIndexBytes) - internal - view - returns (bool) - { - return _getKeepCount() > uint256(groupIndexBytes); - } - - function _distributeReward(bytes32 groupIndexBytes, uint256 _value) - internal - { - bytes memory groupPubkey = - operatorContract.getGroupPublicKey(uint256(groupIndexBytes)); - address[] memory members = - operatorContract.getGroupMembers(groupPubkey); - - uint256 memberCount = members.length; - uint256 dividend = _value.div(memberCount); - - // Only pay other members if dividend is nonzero. - if (dividend > 0) { - for (uint256 i = 0; i < memberCount - 1; i++) { - token.safeTransfer( - tokenStaking.beneficiaryOf(members[i]), - dividend - ); - } - } - - // Transfer of dividend for the last member. Remainder might be equal to - // zero in case of even distribution or some small number. - uint256 remainder = _value.mod(memberCount); - token.safeTransfer( - tokenStaking.beneficiaryOf(members[memberCount - 1]), - dividend.add(remainder) - ); - } -} diff --git a/solidity-v1/contracts/Escrow.sol b/solidity-v1/contracts/Escrow.sol deleted file mode 100644 index 2bbc53acf7..0000000000 --- a/solidity-v1/contracts/Escrow.sol +++ /dev/null @@ -1,45 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol"; - -// @title Escrow -// @notice A token holder contract allowing contract owner to set beneficiary of -// all tokens held by the contract and allowing the beneficiary to withdraw -// the tokens. -contract Escrow is Ownable { - using SafeERC20 for IERC20; - - event BeneficiaryUpdated(address beneficiary); - event TokensWithdrawn(address beneficiary, uint256 amount); - - IERC20 public token; - address public beneficiary; - - constructor(IERC20 _token) public { - token = _token; - } - - // @notice Sets the provided address as a beneficiary allowing it to - // withdraw all tokens from escrow. This function can be called only - // by escrow owner. - function setBeneficiary(address _beneficiary) public onlyOwner { - beneficiary = _beneficiary; - emit BeneficiaryUpdated(beneficiary); - } - - // @notice Withdraws all tokens from escrow to the beneficiary. - // If the beneficiary is not set, caller is not the beneficiary, or there - // are no tokens in escrow, function fails. - function withdraw() public { - require(beneficiary != address(0), "Beneficiary not assigned"); - require(msg.sender == beneficiary, "Caller is not the beneficiary"); - - uint256 amount = token.balanceOf(address(this)); - require(amount > 0, "No tokens to withdraw"); - - token.safeTransfer(beneficiary, amount); - emit TokensWithdrawn(beneficiary, amount); - } -} diff --git a/solidity-v1/contracts/GasPriceOracle.sol b/solidity-v1/contracts/GasPriceOracle.sol deleted file mode 100644 index 6ce17d1b69..0000000000 --- a/solidity-v1/contracts/GasPriceOracle.sol +++ /dev/null @@ -1,103 +0,0 @@ -/** -▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀ - ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ -▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ - - Trust math, not hardware. -*/ - -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; - -import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; - -/// @dev Interface expected to be implemented by contracts added as a gas price -/// oracle consumers. Consumers are notified by GasPriceOracle every time gas -/// price change is finalized by calling their refreshGasPrice function. Each -/// consumer may decide to pull the new value from the oracle immediatelly or -/// at the moment right for the consumer. -/// Consumers must be trusted contracts whose refreshGasPrice must always -/// succeed and never consume excessive gas. -interface GasPriceOracleConsumer { - function refreshGasPrice() external; -} - -/// @notice Oracle presenting the current gas price. The oracle is manually -/// updated by its owner. -contract GasPriceOracle is Ownable { - using SafeMath for uint256; - - event GasPriceUpdated(uint256 newValue); - - uint256 public constant governanceDelay = 1 hours; - - uint256 public gasPrice; - - uint256 public newGasPrice; - uint256 public gasPriceChangeInitiated; - - address[] public consumerContracts; - - modifier onlyAfterGovernanceDelay { - require(gasPriceChangeInitiated > 0, "Change not initiated"); - require( - block.timestamp.sub(gasPriceChangeInitiated) >= governanceDelay, - "Governance delay has not elapsed" - ); - _; - } - - /// @notice Initialize the gas price update. Change is finalized after - /// the governance delay elapses. - /// @param _newGasPrice New gas price in wei. - function beginGasPriceUpdate(uint256 _newGasPrice) public onlyOwner { - newGasPrice = _newGasPrice; - gasPriceChangeInitiated = block.timestamp; - } - - /// @notice Finalizes the gas price update. Finalization may happen only - /// after the governance delay elapses. - function finalizeGasPriceUpdate() public onlyAfterGovernanceDelay { - gasPrice = newGasPrice; - - newGasPrice = 0; - gasPriceChangeInitiated = 0; - - emit GasPriceUpdated(gasPrice); - - for (uint256 i = 0; i < consumerContracts.length; i++) { - GasPriceOracleConsumer(consumerContracts[i]).refreshGasPrice(); - } - } - - /// @notice Adds a new consumer contract to the oracle. Consumer contract is - /// expected to implement GasPriceOracleConsumer interface and receives - /// a notifcation every time gas price update is finalized. - /// @param consumerContract The new consumer contract to add to the oracle. - function addConsumerContract(address consumerContract) public onlyOwner { - consumerContracts.push(consumerContract); - } - - /// @notice Removes consumer contract from the oracle by its index. - /// @param index Index of the consumer contract to be removed. - function removeConsumerContract(uint256 index) public onlyOwner { - require(index < consumerContracts.length, "Invalid index"); - consumerContracts[index] = consumerContracts[ - consumerContracts.length - 1 - ]; - consumerContracts.length--; - } - - /// @notice Returns all consumer contracts currently registered in the - /// oracle. - function getConsumerContracts() public view returns (address[] memory) { - return consumerContracts; - } -} diff --git a/solidity-v1/contracts/GrantStakingPolicy.sol b/solidity-v1/contracts/GrantStakingPolicy.sol deleted file mode 100644 index df77589c3c..0000000000 --- a/solidity-v1/contracts/GrantStakingPolicy.sol +++ /dev/null @@ -1,15 +0,0 @@ -pragma solidity 0.5.17; - -/// @title GrantStakingPolicy -/// @notice A staking policy defines the function `getStakeableAmount` -/// which calculates how many tokens may be staked from a token grant. -contract GrantStakingPolicy { - function getStakeableAmount( - uint256 _now, - uint256 grantedAmount, - uint256 duration, - uint256 start, - uint256 cliff, - uint256 withdrawn - ) public view returns (uint256); -} diff --git a/solidity-v1/contracts/GuaranteedMinimumStakingPolicy.sol b/solidity-v1/contracts/GuaranteedMinimumStakingPolicy.sol deleted file mode 100644 index e87a4ff0c4..0000000000 --- a/solidity-v1/contracts/GuaranteedMinimumStakingPolicy.sol +++ /dev/null @@ -1,64 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "./libraries/grant/UnlockingSchedule.sol"; -import "./GrantStakingPolicy.sol"; -import "./TokenStaking.sol"; - -/// @title GuaranteedMinimumStakingPolicy -/// @notice A staking policy which allows the grantee -/// to always stake the defined minimum stake, -/// or the unlocked amount if greater. -/// -/// This is necessary for staking revocable token grants safely. -/// If the entire revocable grant can be staked, -/// the yet-to-be-unlocked amount becomes ineffective as collateral -/// if the grant is revoked. -/// To avoid this issue, -/// only the unlocked amount can be staked. -/// -/// However, grants that feature a cliff pose a problem -/// as no tokens are unlocked until the cliff is reached. -/// Small grants may also take a long time -/// to unlock enough tokens to be able to stake. -/// To permit all grants to stake from the beginning, -/// the policy defines a minimum which can always be staked -/// even if the grant doesn't have enough unlocked tokens. -contract GuaranteedMinimumStakingPolicy is GrantStakingPolicy { - using SafeMath for uint256; - using UnlockingSchedule for uint256; - uint256 minimumStake; - - constructor(address _stakingContract) public { - minimumStake = TokenStaking(_stakingContract).minimumStake(); - } - - function getStakeableAmount( - uint256 _now, - uint256 grantedAmount, - uint256 duration, - uint256 start, - uint256 cliff, - uint256 withdrawn - ) public view returns (uint256) { - uint256 unlocked = - _now.getUnlockedAmount(grantedAmount, duration, start, cliff); - uint256 remainingInGrant = grantedAmount.sub(withdrawn); - uint256 unlockedInGrant = unlocked.sub(withdrawn); - - // Less than minimum stake remaining - // -> may stake what is remaining in grant - if (remainingInGrant < minimumStake) { - return remainingInGrant; - } - // At least minimum stake remaining in grant, - // but unlocked amount is less than the minimum stake - // -> may stake the minimum stake - if (unlockedInGrant < minimumStake) { - return minimumStake; - } - // More than minimum stake unlocked in grant - // -> may stake the unlocked amount - return unlockedInGrant; - } -} diff --git a/solidity-v1/contracts/IRandomBeacon.sol b/solidity-v1/contracts/IRandomBeacon.sol deleted file mode 100644 index 482892837b..0000000000 --- a/solidity-v1/contracts/IRandomBeacon.sol +++ /dev/null @@ -1,106 +0,0 @@ -/** -▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀ - ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ -▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ - - Trust math, not hardware. -*/ - -pragma solidity 0.5.17; - -/// @title Keep Random Beacon -/// -/// @notice Keep Random Beacon generates verifiable randomness that is resistant -/// to bad actors both in the relay network and on the anchoring blockchain. -interface IRandomBeacon { - /// @notice Event emitted for each new relay entry generated. It contains - /// request ID allowing to associate the generated relay entry with relay - /// request created previously with `requestRelayEntry` function. Event is - /// emitted no matter if callback was executed or not. - /// - /// @param requestId Relay request ID for which entry was generated. - /// @param entry Generated relay entry. - event RelayEntryGenerated(uint256 requestId, uint256 entry); - - /// @notice Provides the customer with an estimated entry fee in wei to use - /// in the request. The fee estimate is only valid for the transaction it is - /// called in, so the customer must make the request immediately after - /// obtaining the estimate. Insufficient payment will lead to the request - /// being rejected and the transaction reverted. - /// - /// The customer may decide to provide more ether for an entry fee than - /// estimated by this function. This is especially helpful when callback gas - /// cost fluctuates. Any surplus between the passed fee and the actual cost - /// of producing an entry and executing a callback is returned back to the - /// customer. - /// @param callbackGas Gas required for the callback. - function entryFeeEstimate(uint256 callbackGas) - external - view - returns (uint256); - - /// @notice Submits a request to generate a new relay entry. Executes - /// callback on the provided callback contract with the generated entry and - /// emits `RelayEntryGenerated(uint256 requestId, uint256 entry)` event. - /// Callback contract has to declare public `__beaconCallback(uint256)` - /// function that is going to be executed with the result, once ready. - /// It is recommended to implement `IRandomBeaconConsumer` interface to - /// ensure the correct callback function signature. - /// - /// @dev Beacon does not support concurrent relay requests. No new requests - /// should be made while the beacon is already processing another request. - /// Requests made while the beacon is busy will be rejected and the - /// transaction reverted. - /// - /// @param callbackContract Callback contract address. Callback is called - /// once a new relay entry has been generated. Must declare public - /// `__beaconCallback(uint256)` function. It is recommended to implement - /// `IRandomBeaconConsumer` interface to ensure the correct callback function - /// signature. - /// @param callbackGas Gas required for the callback. - /// The customer needs to ensure they provide a sufficient callback gas - /// to cover the gas fee of executing the callback. Any surplus is returned - /// to the customer. If the callback gas amount turns to be not enough to - /// execute the callback, callback execution is skipped. - /// @return An uint256 representing uniquely generated relay request ID - function requestRelayEntry(address callbackContract, uint256 callbackGas) - external - payable - returns (uint256); - - /// @notice Submits a request to generate a new relay entry. Emits - /// `RelayEntryGenerated(uint256 requestId, uint256 entry)` event for the - /// generated entry. - /// - /// @dev Beacon does not support concurrent relay requests. No new requests - /// should be made while the beacon is already processing another request. - /// Requests made while the beacon is busy will be rejected and the - /// transaction reverted. - /// - /// @return An uint256 representing uniquely generated relay request ID - function requestRelayEntry() external payable returns (uint256); -} - -/// @title Keep Random Beacon Consumer -/// -/// @notice Receives Keep Random Beacon relay entries with `__beaconCallback` -/// function. Contract implementing this interface does not have to be the one -/// requesting relay entry but it is the one receiving the requested relay entry -/// once it is produced. -/// -/// @dev Use this interface to indicate the contract receives relay entries from -/// the beacon and to ensure the correctness of callback function signature. -interface IRandomBeaconConsumer { - /// @notice Receives relay entry produced by Keep Random Beacon. This function - /// should be called only by Keep Random Beacon. - /// - /// @param relayEntry Relay entry (random number) produced by Keep Random - /// Beacon. - function __beaconCallback(uint256 relayEntry) external; -} diff --git a/solidity-v1/contracts/KeepRandomBeaconOperator.sol b/solidity-v1/contracts/KeepRandomBeaconOperator.sol deleted file mode 100644 index 3d2c3dec39..0000000000 --- a/solidity-v1/contracts/KeepRandomBeaconOperator.sol +++ /dev/null @@ -1,827 +0,0 @@ -/** -▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀ - ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ -▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ - - Trust math, not hardware. -*/ - -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol"; -import "./TokenStaking.sol"; -import "./KeepRegistry.sol"; -import "./GasPriceOracle.sol"; -import "./cryptography/BLS.sol"; -import "./utils/AddressArrayUtils.sol"; -import "./utils/PercentUtils.sol"; -import "./libraries/operator/GroupSelection.sol"; -import "./libraries/operator/Groups.sol"; -import "./libraries/operator/DKGResultVerification.sol"; -import "./libraries/operator/Reimbursements.sol"; -import "./libraries/operator/DelayFactor.sol"; - -interface ServiceContract { - function entryCreated( - uint256 requestId, - bytes calldata entry, - address payable submitter - ) external; - - function fundRequestSubsidyFeePool() external payable; - - function fundDkgFeePool() external payable; - - function callbackSurplusRecipient(uint256 requestId) - external - view - returns (address payable); -} - -/// @title KeepRandomBeaconOperator -/// @notice Keep client facing contract for random beacon security-critical operations. -/// Handles group creation and expiration, BLS signature verification and incentives. -/// The contract is not upgradeable. New functionality can be implemented by deploying -/// new versions following Keep client update and re-authorization by the stakers. -contract KeepRandomBeaconOperator is ReentrancyGuard, GasPriceOracleConsumer { - using SafeMath for uint256; - using PercentUtils for uint256; - using AddressArrayUtils for address[]; - using GroupSelection for GroupSelection.Storage; - using Groups for Groups.Storage; - using DKGResultVerification for DKGResultVerification.Storage; - - event OnGroupRegistered(bytes groupPubKey); - event DkgResultSubmittedEvent( - uint256 memberIndex, - bytes groupPubKey, - bytes misbehaved - ); - event RelayEntryRequested(bytes previousEntry, bytes groupPublicKey); - event RelayEntrySubmitted(); - event GroupSelectionStarted(uint256 newEntry); - event GroupMemberRewardsWithdrawn( - address indexed beneficiary, - address operator, - uint256 amount, - uint256 groupIndex - ); - event RelayEntryTimeoutReported(uint256 indexed groupIndex); - event UnauthorizedSigningReported(uint256 indexed groupIndex); - - GroupSelection.Storage groupSelection; - Groups.Storage groups; - DKGResultVerification.Storage dkgResultVerification; - - address[] internal serviceContracts; - - KeepRegistry internal registry; - - TokenStaking internal stakingContract; - - GasPriceOracle internal gasPriceOracle; - - /// @dev Each signing group member reward expressed in wei. - uint256 public groupMemberBaseReward = 1000000 * 1e9; // 1M Gwei - - /// @dev Gas price ceiling value used to calculate the gas price for reimbursement - /// next to the actual gas price from the transaction. We use gas price - /// ceiling to defend against malicious miner-submitters who can manipulate - /// transaction gas price. - uint256 public gasPriceCeiling = 60 * 1e9; // (60 Gwei = 60 * 10^9 wei) - - /// @dev Size of a group in the threshold relay. - uint256 public groupSize = 64; - - /// @dev Minimum number of group members needed to interact according to the - /// protocol to produce a relay entry. - uint256 public groupThreshold = 33; - - /// @dev Time in blocks after which the next group member is eligible - /// to submit the result. - uint256 public resultPublicationBlockStep = 6; - - /// @dev Timeout in blocks for a relay entry to appear on the chain. Blocks - /// are counted from the moment relay request occur. - /// - /// Timeout is never shorter than the time needed by clients to generate - /// relay entry and the time it takes for the last group member to become - /// eligible to submit the result plus at least one block to submit it. - uint256 public relayEntryTimeout = - groupSize.mul(resultPublicationBlockStep); - - /// @dev Gas required to verify BLS signature and produce successful relay - /// entry. Excludes callback and DKG gas. The worst case (most expensive) - /// scenario. - uint256 public entryVerificationGasEstimate = 280000; - - /// @dev Gas required to submit DKG result. Excludes initiation of group selection. - uint256 public dkgGasEstimate = 1740000; - - /// @dev Gas required to trigger DKG (starting group selection). - uint256 public groupSelectionGasEstimate = 200000; - - /// @dev Reimbursement for the submitter of the DKG result. This value is set - /// when a new DKG request comes to the operator contract. - /// - /// When submitting DKG result, the submitter is reimbursed with the actual cost - /// and some part of the fee stored in this field may be returned to the service - /// contract. - uint256 public dkgSubmitterReimbursementFee; - - /// @dev Seed value used for the genesis group selection. - /// https://www.wolframalpha.com/input/?i=pi+to+78+digits - uint256 internal constant _genesisGroupSeed = - 31415926535897932384626433832795028841971693993751058209749445923078164062862; - - /// @dev Service contract that triggered current group selection. - ServiceContract internal groupSelectionStarterContract; - - // current relay request data - uint256 internal currentRequestId; - uint256 public currentRequestStartBlock; - uint256 public currentRequestGroupIndex; - bytes public currentRequestPreviousEntry; - uint256 internal currentRequestEntryVerificationAndProfitFee; - uint256 internal currentRequestCallbackFee; - address internal currentRequestServiceContract; - - constructor( - address _serviceContract, - address _tokenStaking, - address _keepRegistry, - address _gasPriceOracle - ) public { - serviceContracts.push(_serviceContract); - - stakingContract = TokenStaking(_tokenStaking); - registry = KeepRegistry(_keepRegistry); - gasPriceOracle = GasPriceOracle(_gasPriceOracle); - - groups.stakingContract = stakingContract; - groups.groupActiveTime = (86400 * 14) / 15; // 14 days equivalent in 15s blocks - groups.relayEntryTimeout = relayEntryTimeout; - - // There are 78 blocks to submit group selection tickets. To minimize - // the submitter's cost by minimizing the number of redundant tickets - // that are not selected into the group, the following approach is - // recommended: - // - // Tickets are submitted in 11 rounds, each round taking 6 blocks. - // As the basic principle, the number of leading zeros in the ticket - // value is subtracted from the number of rounds to determine the round - // the ticket should be submitted in: - // - in round 0, tickets with 11 or more leading zeros are submitted - // - in round 1, tickets with 10 or more leading zeros are submitted - // (...) - // - in round 11, tickets with no leading zeros are submitted. - // - // In each round, group member candidate needs to monitor tickets - // submitted by other candidates and compare them against tickets of - // the candidate not yet submitted to determine if continuing with - // ticket submission still makes sense. - // - // After 66 blocks, there is a 12 blocks mining lag allowing all - // outstanding ticket submissions to have a higher chance of being - // mined before the deadline. - groupSelection.ticketSubmissionTimeout = 6 * 11 + 12; - - groupSelection.groupSize = groupSize; - - dkgResultVerification.timeDKG = 5 * (1 + 5) + 2 * (1 + 10) + 20; - dkgResultVerification - .resultPublicationBlockStep = resultPublicationBlockStep; - dkgResultVerification.groupSize = groupSize; - dkgResultVerification.signatureThreshold = - groupThreshold + - (groupSize - groupThreshold) / - 2; - } - - /// @notice Triggers group selection if there are no active groups. - function genesis() public payable { - // If we run into a very unlikely situation when there are no active - // groups on the contract because of slashing and groups terminated - // or because beacon has not been used for a very long time and all - // groups expired, we first want to make a cleanup. - groups.expireOldGroups(); - require(numberOfGroups() == 0, "Groups exist"); - // Cleanup after potential failed DKG - groupSelection.finish(); - // Set latest added service contract as a group selection starter to receive any DKG fee surplus. - groupSelectionStarterContract = ServiceContract( - serviceContracts[serviceContracts.length.sub(1)] - ); - startGroupSelection(_genesisGroupSeed, msg.value); - } - - modifier onlyServiceContract() { - require( - serviceContracts.contains(msg.sender), - "Caller is not a service contract" - ); - _; - } - - /// @notice Adds service contract - /// @param serviceContract Address of the service contract. - function addServiceContract(address serviceContract) public { - require( - registry.serviceContractUpgraderFor(address(this)) == msg.sender, - "Not authorized" - ); - - serviceContracts.push(serviceContract); - } - - /// @notice Pulls the most recent gas price from gas price oracle. - function refreshGasPrice() public { - gasPriceCeiling = gasPriceOracle.gasPrice(); - } - - /// @notice Triggers the selection process of a new candidate group. - /// @param _newEntry New random beacon value that stakers will use to - /// generate their tickets. - /// @param submitter Operator of this contract. - function createGroup(uint256 _newEntry, address payable submitter) - public - payable - onlyServiceContract - { - uint256 groupSelectionStartFee = - groupSelectionGasEstimate.mul(gasPriceCeiling); - - groupSelectionStarterContract = ServiceContract(msg.sender); - startGroupSelection(_newEntry, msg.value.sub(groupSelectionStartFee)); - - // reimbursing a submitter that triggered group selection - (bool success, ) = - stakingContract.beneficiaryOf(submitter).call.value( - groupSelectionStartFee - )(""); - require(success, "Group selection reimbursement failed"); - } - - /// @notice Checks if it is possible to fire a new group selection. - /// Triggering new group selection is only possible when there is no - /// pending group selection or when the pending group selection timed out. - function isGroupSelectionPossible() public view returns (bool) { - if (!groupSelection.inProgress) { - return true; - } - - // dkgTimeout is the time after key generation protocol is expected to - // be complete plus the expected time to submit the result. - uint256 dkgTimeout = - groupSelection.ticketSubmissionStartBlock + - groupSelection.ticketSubmissionTimeout + - dkgResultVerification.timeDKG + - groupSize * - resultPublicationBlockStep; - - return block.number > dkgTimeout; - } - - /// @notice Submits ticket to request to participate in a new candidate group. - /// @param ticket Bytes representation of a ticket that holds the following: - /// - ticketValue: first 8 bytes of a result of keccak256 cryptography hash - /// function on the combination of the group selection seed (previous - /// beacon output), staker-specific value (address) and virtual staker index. - /// - stakerValue: a staker-specific value which is the address of the staker. - /// - virtualStakerIndex: 4-bytes number within a range of 1 to staker's weight; - /// has to be unique for all tickets submitted by the given staker for the - /// current candidate group selection. - function submitTicket(bytes32 ticket) public { - uint256 stakingWeight = - stakingContract.eligibleStake(msg.sender, address(this)).div( - groupSelection.minimumStake - ); - groupSelection.submitTicket(ticket, stakingWeight); - } - - /// @notice Gets the timeout in blocks after which group candidate ticket - /// submission is finished. - function ticketSubmissionTimeout() public view returns (uint256) { - return groupSelection.ticketSubmissionTimeout; - } - - /// @notice Gets the submitted group candidate tickets so far. - function submittedTickets() public view returns (uint64[] memory) { - return groupSelection.tickets; - } - - /// @notice Gets selected participants in ascending order of their tickets. - function selectedParticipants() public view returns (address[] memory) { - return groupSelection.selectedParticipants(); - } - - /// @notice Submits result of DKG protocol. It is on-chain part of phase 14 of - /// the protocol. - /// @param submitterMemberIndex Claimed submitter candidate group member index - /// @param groupPubKey Generated candidate group public key - /// @param misbehaved Bytes array of misbehaved (disqualified or inactive) - /// group members indexes in ascending order; Indexes reflect positions of - /// members in the group as outputted by the group selection protocol. - /// @param signatures Concatenation of signatures from members supporting the - /// result. - /// @param signingMembersIndexes Indices of members corresponding to each - /// signature. - function submitDkgResult( - uint256 submitterMemberIndex, - bytes memory groupPubKey, - bytes memory misbehaved, - bytes memory signatures, - uint256[] memory signingMembersIndexes - ) public nonReentrant { - address[] memory members = selectedParticipants(); - - dkgResultVerification.verify( - submitterMemberIndex, - groupPubKey, - misbehaved, - signatures, - signingMembersIndexes, - members, - groupSelection.ticketSubmissionStartBlock + - groupSelection.ticketSubmissionTimeout - ); - - groups.setGroupMembers(groupPubKey, members, misbehaved); - groups.addGroup(groupPubKey); - reimburseDkgSubmitter(); - emit DkgResultSubmittedEvent( - submitterMemberIndex, - groupPubKey, - misbehaved - ); - groupSelection.finish(); - } - - /// @notice Creates a request to generate a new relay entry, which will include - /// a random number (by signing the previous entry's random number). - /// @param requestId Request Id trackable by service contract - /// @param previousEntry Previous relay entry - function sign(uint256 requestId, bytes memory previousEntry) - public - payable - onlyServiceContract - { - uint256 entryVerificationAndProfitFee = - groupProfitFee().add(entryVerificationFee()); - require( - msg.value >= entryVerificationAndProfitFee, - "Insufficient new entry fee" - ); - uint256 callbackFee = msg.value.sub(entryVerificationAndProfitFee); - signRelayEntry( - requestId, - previousEntry, - msg.sender, - entryVerificationAndProfitFee, - callbackFee - ); - } - - /// @notice Creates a new relay entry and stores the associated data on the chain. - /// @param _groupSignature Group BLS signature over the concatenation of the - /// previous entry and seed. - function relayEntry(bytes memory _groupSignature) public nonReentrant { - require(isEntryInProgress(), "Entry was submitted"); - require(!hasEntryTimedOut(), "Entry timed out"); - - bytes memory groupPubKey = - groups.getGroupPublicKey(currentRequestGroupIndex); - - require( - BLS.verify( - groupPubKey, - currentRequestPreviousEntry, - _groupSignature - ), - "Invalid signature" - ); - - emit RelayEntrySubmitted(); - - // Spend no more than groupSelectionGasEstimate + 40000 gas max - // This will prevent relayEntry failure in case the service contract is compromised - currentRequestServiceContract.call.gas( - groupSelectionGasEstimate.add(40000) - )( - abi.encodeWithSignature( - "entryCreated(uint256,bytes,address)", - currentRequestId, - _groupSignature, - msg.sender - ) - ); - - if (currentRequestCallbackFee > 0) { - executeCallback(uint256(keccak256(_groupSignature))); - } - - (uint256 groupMemberReward, uint256 submitterReward, uint256 subsidy) = - newEntryRewardsBreakdown(); - groups.addGroupMemberReward(groupPubKey, groupMemberReward); - - stakingContract.beneficiaryOf(msg.sender).call.value(submitterReward)( - "" - ); - - if (subsidy > 0) { - currentRequestServiceContract.call.gas(35000).value(subsidy)( - abi.encodeWithSignature("fundRequestSubsidyFeePool()") - ); - } - - currentRequestStartBlock = 0; - } - - /// @notice Returns true if generation of a new relay entry is currently in - /// progress. - function isEntryInProgress() public view returns (bool) { - return currentRequestStartBlock != 0; - } - - /// @notice Function used to inform about the fact the currently ongoing - /// new relay entry generation operation timed out. As a result, the group - /// which was supposed to produce a new relay entry is immediately - /// terminated and a new group is selected to produce a new relay entry. - /// All members of the group are punished by seizing minimum stake of - /// their tokens. The submitter of the transaction is rewarded with a - /// tattletale reward which is limited to min(1, 20 / group_size) of the - /// maximum tattletale reward. - function reportRelayEntryTimeout() public { - require(hasEntryTimedOut(), "Entry did not time out"); - groups.reportRelayEntryTimeout(currentRequestGroupIndex, groupSize); - currentRequestStartBlock = 0; - - // We could terminate the last active group. If that's the case, - // do not try to execute signing again because there is no group - // which can handle it. - if (numberOfGroups() > 0) { - signRelayEntry( - currentRequestId, - currentRequestPreviousEntry, - currentRequestServiceContract, - currentRequestEntryVerificationAndProfitFee, - currentRequestCallbackFee - ); - } - - emit RelayEntryTimeoutReported(currentRequestGroupIndex); - } - - /// @notice Gets group profit fee expressed in wei. - function groupProfitFee() public view returns (uint256) { - return groupMemberBaseReward.mul(groupSize); - } - - /// @notice Checks if the specified account has enough active stake to become - /// network operator and that this contract has been authorized for potential - /// slashing. - /// - /// Having the required minimum of active stake makes the operator eligible - /// to join the network. If the active stake is not currently undelegating, - /// operator is also eligible for work selection. - /// - /// @param staker Staker's address - /// @return True if has enough active stake to participate in the network, - /// false otherwise. - function hasMinimumStake(address staker) public view returns (bool) { - return stakingContract.hasMinimumStake(staker, address(this)); - } - - /// @notice Checks if group with the given public key is registered. - function isGroupRegistered(bytes memory groupPubKey) - public - view - returns (bool) - { - return groups.isGroupRegistered(groupPubKey); - } - - /// @notice Checks if a group with the given public key is a stale group. - /// Stale group is an expired group which is no longer performing any - /// operations. It is important to understand that an expired group may - /// still perform some operations for which it was selected when it was still - /// active. We consider a group to be stale when it's expired and when its - /// expiration time and potentially executed operation timeout are both in - /// the past. - function isStaleGroup(bytes memory groupPubKey) public view returns (bool) { - return groups.isStaleGroup(groupPubKey); - } - - /// @notice Gets the number of active groups as currently marked in the - /// contract. This is the state from when the expired groups were last updated - /// without accounting for recent expirations. - /// - /// @dev Even if numberOfGroups() > 0, it is still possible requesting for - /// a new relay entry will revert with "no active groups" failure message. - /// This function returns the number of active groups as they are currently - /// marked on-chain. However, during relay request, before group selection, - /// we run group expiration and it may happen that some groups seen as active - /// turns out to be expired. - function numberOfGroups() public view returns (uint256) { - return groups.numberOfGroups(); - } - - /// @notice Returns accumulated group member rewards for provided group. - function getGroupMemberRewards(bytes memory groupPubKey) - public - view - returns (uint256) - { - return groups.groupMemberRewards[groupPubKey]; - } - - /// @notice Return whether the given operator has withdrawn their rewards - /// from the given group. - function hasWithdrawnRewards(address operator, uint256 groupIndex) - public - view - returns (bool) - { - return groups.hasWithdrawnRewards(operator, groupIndex); - } - - /// @notice Withdraws accumulated group member rewards for operator - /// using the provided group index. - /// Once the accumulated reward is withdrawn from the selected group, - /// the operator is flagged as withdrawn. - /// Rewards can be withdrawn only from stale group. - /// @param operator Operator address - /// @param groupIndex Group index - function withdrawGroupMemberRewards(address operator, uint256 groupIndex) - public - nonReentrant - { - uint256 accumulatedRewards = - groups.withdrawFromGroup(operator, groupIndex); - (bool success, ) = - stakingContract.beneficiaryOf(operator).call.value( - accumulatedRewards - )(""); - if (success) { - emit GroupMemberRewardsWithdrawn( - stakingContract.beneficiaryOf(operator), - operator, - accumulatedRewards, - groupIndex - ); - } - } - - /// @notice Gets the index of the first active group. - function getFirstActiveGroupIndex() public view returns (uint256) { - return groups.expiredGroupOffset; - } - - /// @notice Gets public key of the group with the given index. - function getGroupPublicKey(uint256 groupIndex) - public - view - returns (bytes memory) - { - return groups.getGroupPublicKey(groupIndex); - } - - /// @notice Returns fee for entry verification in wei. Does not include group - /// profit fee, DKG contribution or callback fee. - function entryVerificationFee() public view returns (uint256) { - return entryVerificationGasEstimate.mul(gasPriceCeiling); - } - - /// @notice Returns fee for group creation in wei. Includes the cost of DKG - /// and the cost of triggering group selection. - function groupCreationFee() public view returns (uint256) { - return - dkgGasEstimate.add(groupSelectionGasEstimate).mul(gasPriceCeiling); - } - - /// @notice Returns members of the given group by group public key. - function getGroupMembers(bytes memory groupPubKey) - public - view - returns (address[] memory members) - { - return groups.getGroupMembers(groupPubKey); - } - - function getNumberOfCreatedGroups() public view returns (uint256) { - return groups.groups.length; - } - - function getGroupRegistrationTime(uint256 groupIndex) - public - view - returns (uint256) - { - return groups.getGroupRegistrationTime(groupIndex); - } - - function isGroupTerminated(uint256 groupIndex) public view returns (bool) { - return groups.isGroupTerminated(groupIndex); - } - - /// @notice Reports unauthorized signing for the provided group. Must provide - /// a valid signature of the tattletale address as a message. Successful signature - /// verification means the private key has been leaked and all group members - /// should be punished by seizing their tokens. The submitter of this proof is - /// rewarded with 5% of the total seized amount scaled by the reward adjustment - /// parameter and the rest 95% is burned. - function reportUnauthorizedSigning( - uint256 groupIndex, - bytes memory signedMsgSender - ) public { - groups.reportUnauthorizedSigning( - groupIndex, - signedMsgSender, - stakingContract.minimumStake() - ); - emit UnauthorizedSigningReported(groupIndex); - } - - function startGroupSelection(uint256 _newEntry, uint256 _payment) internal { - require( - _payment >= gasPriceCeiling.mul(dkgGasEstimate), - "Insufficient DKG fee" - ); - - require(isGroupSelectionPossible(), "Group selection in progress"); - - // If previous group selection failed and there is reimbursement left - // return it to the DKG fee pool. - if (dkgSubmitterReimbursementFee > 0) { - uint256 surplus = dkgSubmitterReimbursementFee; - dkgSubmitterReimbursementFee = 0; - ServiceContract(groupSelectionStarterContract).fundDkgFeePool.value( - surplus - )(); - } - - groupSelection.minimumStake = stakingContract.minimumStake(); - groupSelection.start(_newEntry); - emit GroupSelectionStarted(_newEntry); - dkgSubmitterReimbursementFee = _payment; - } - - /// @notice Compare the reimbursement fee calculated based on the current - /// transaction gas price and the current price feed estimate with the DKG - /// reimbursement fee calculated and paid at the moment when the DKG was - /// requested. If there is any surplus, it will be returned to the DKG fee - /// pool of the service contract which triggered the DKG. - function reimburseDkgSubmitter() internal { - uint256 gasPrice = gasPriceCeiling; - // We need to check if tx.gasprice is non-zero as a workaround to a bug - // in go-ethereum: - // https://github.com/ethereum/go-ethereum/pull/20189 - if (tx.gasprice > 0 && tx.gasprice < gasPriceCeiling) { - gasPrice = tx.gasprice; - } - - uint256 reimbursementFee = dkgGasEstimate.mul(gasPrice); - address payable beneficiary = stakingContract.beneficiaryOf(msg.sender); - - if (reimbursementFee < dkgSubmitterReimbursementFee) { - uint256 surplus = - dkgSubmitterReimbursementFee.sub(reimbursementFee); - dkgSubmitterReimbursementFee = 0; - // Reimburse submitter with actual DKG cost. - beneficiary.call.value(reimbursementFee)(""); - - // Return surplus to the contract that started DKG. - groupSelectionStarterContract.fundDkgFeePool.value(surplus)(); - } else { - // If submitter used higher gas price reimburse only - // dkgSubmitterReimbursementFee max. - reimbursementFee = dkgSubmitterReimbursementFee; - dkgSubmitterReimbursementFee = 0; - beneficiary.call.value(reimbursementFee)(""); - } - } - - function signRelayEntry( - uint256 requestId, - bytes memory previousEntry, - address serviceContract, - uint256 entryVerificationAndProfitFee, - uint256 callbackFee - ) internal { - require(!isEntryInProgress(), "Beacon is busy"); - - uint256 groupIndex = - groups.selectGroup(uint256(keccak256(previousEntry))); - - currentRequestId = requestId; - currentRequestStartBlock = block.number; - currentRequestEntryVerificationAndProfitFee = entryVerificationAndProfitFee; - currentRequestCallbackFee = callbackFee; - currentRequestGroupIndex = groupIndex; - currentRequestPreviousEntry = previousEntry; - currentRequestServiceContract = serviceContract; - - bytes memory groupPubKey = groups.getGroupPublicKey(groupIndex); - emit RelayEntryRequested(previousEntry, groupPubKey); - } - - /// @notice Executes customer specified callback for the relay entry request. - /// @param entry The generated random number. - function executeCallback(uint256 entry) internal { - // Make sure not to spend more than what was received from the service - // contract for the callback - uint256 gasLimit = currentRequestCallbackFee.div(gasPriceCeiling); - - // Make sure not to spend more than 2 million gas on a callback. - // This is to protect members from relay entry failure and potential - // slashing in case of any changes in .call() gas limit. - gasLimit = gasLimit > 2000000 ? 2000000 : gasLimit; - - bytes memory callbackSurplusRecipientData; - (, callbackSurplusRecipientData) = currentRequestServiceContract - .call - .gas(40000)( - abi.encodeWithSignature( - "callbackSurplusRecipient(uint256)", - currentRequestId - ) - ); - - uint256 gasBeforeCallback = gasleft(); - currentRequestServiceContract.call.gas(gasLimit)( - abi.encodeWithSignature( - "executeCallback(uint256,uint256)", - currentRequestId, - entry - ) - ); - - uint256 gasAfterCallback = gasleft(); - uint256 gasSpent = gasBeforeCallback.sub(gasAfterCallback); - - Reimbursements.reimburseCallback( - stakingContract, - gasPriceCeiling, - gasLimit, - gasSpent, - currentRequestCallbackFee, - callbackSurplusRecipientData - ); - } - - /// @notice Get rewards breakdown in wei for successful entry for the - /// current signing request. - function newEntryRewardsBreakdown() - internal - view - returns ( - uint256 groupMemberReward, - uint256 submitterReward, - uint256 subsidy - ) - { - uint256 decimals = 1e16; // Adding 16 decimals to perform float division. - - uint256 delayFactor = - DelayFactor.calculate(currentRequestStartBlock, relayEntryTimeout); - groupMemberReward = groupMemberBaseReward.mul(delayFactor).div( - decimals - ); - - // delay penalty = base reward * (1 - delay factor) - uint256 groupMemberDelayPenalty = - groupMemberBaseReward.mul(decimals.sub(delayFactor)); - - // The submitter reward consists of: - // The callback gas expenditure (reimbursed by the service contract) - // The entry verification fee to cover the cost of verifying the submission, - // paid regardless of their gas expenditure - // Submitter extra reward - 5% of the delay penalties of the entire group - uint256 submitterExtraReward = - groupMemberDelayPenalty.mul(groupSize).percent(5).div(decimals); - uint256 entryVerificationFee = - currentRequestEntryVerificationAndProfitFee.sub(groupProfitFee()); - submitterReward = entryVerificationFee.add(submitterExtraReward); - - // Rewards not paid out to the operators are paid out to requesters to subsidize new requests. - subsidy = groupProfitFee().sub(groupMemberReward.mul(groupSize)).sub( - submitterExtraReward - ); - } - - /// @notice Returns true if the currently ongoing new relay entry generation - /// operation timed out. There is a certain timeout for a new relay entry - /// to be produced, see `relayEntryTimeout` value. - function hasEntryTimedOut() internal view returns (bool) { - return - currentRequestStartBlock != 0 && - block.number > currentRequestStartBlock + relayEntryTimeout; - } -} diff --git a/solidity-v1/contracts/KeepRandomBeaconService.sol b/solidity-v1/contracts/KeepRandomBeaconService.sol deleted file mode 100644 index 083bb145c4..0000000000 --- a/solidity-v1/contracts/KeepRandomBeaconService.sol +++ /dev/null @@ -1,304 +0,0 @@ -/** -▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀ - ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ -▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ - - Trust math, not hardware. -*/ - -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "@openzeppelin/upgrades/contracts/upgradeability/Proxy.sol"; - -/// @title Keep Random Beacon service -/// @notice A proxy contract to provide upgradable Random Beacon functionality. -/// All calls to this proxy contract are delegated to the implementation contract. -contract KeepRandomBeaconService is Proxy { - using SafeMath for uint256; - - /// @dev Storage slot with the admin of the contract. - /// This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1. - /// It is validated in the constructor. - bytes32 internal constant ADMIN_SLOT = - 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; - - /// @dev Storage slot with the address of the current implementation. - /// This is the keccak-256 hash of "eip1967.proxy.implementation" - /// subtracted by 1. It is validated in the constructor. - bytes32 internal constant IMPLEMENTATION_SLOT = - 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - /// @dev Storage slot with the upgrade time delay. Upgrade time delay - /// defines a period for implementation upgrade. This is the keccak-256 - /// hash of "network.keep.randombeacon.proxy.upgradeTimeDelay" - /// subtracted by 1. It is validated in the constructor. - bytes32 internal constant UPGRADE_TIME_DELAY_SLOT = - 0x73bbd307af06a74c12a4f925288c98f759a1ee8fee7eae47a0c215cb63ef2c6b; - - /// @dev Storage slot with the new implementation address. This is the - /// keccak-256 hash of "network.keep.randombeacon.proxy.upgradeImplementation" - /// subtracted by 1. It is validated in the constructor. - bytes32 internal constant UPGRADE_IMPLEMENTATION_SLOT = - 0x3c3c1acab6a17c8ef7a1d07995c8ed2942488afd9e13cf89bd5c6e4828160276; - - /// @dev Storage slot with the implementation address upgrade initiation. - /// This is the keccak-256 hash of "network.keep.randombeacon.proxy.upgradeInitiatedTimestamp" - /// subtracted by 1. It is validated in the constructor. - bytes32 internal constant UPGRADE_INIT_TIMESTAMP_SLOT = - 0xb49edbaf3913780c2ef1ff781deec1eb653eab7236ff107428d60052d0f0d18d; - - /// @notice Implementation initialization data to be used on the second step - /// of upgrade. - /// @dev Mapping is stored at the position calculated with keccak256 of the - /// new implementation address. Hence, it should be protected from clashing - /// with implementation's fields. - mapping(address => bytes) public initializationData; - - event UpgradeStarted(address implementation, uint256 timestamp); - event UpgradeCompleted(address implementation); - - constructor(address _implementation, bytes memory _data) public { - assertSlot(IMPLEMENTATION_SLOT, "eip1967.proxy.implementation"); - assertSlot(ADMIN_SLOT, "eip1967.proxy.admin"); - assertSlot( - UPGRADE_TIME_DELAY_SLOT, - "network.keep.randombeacon.proxy.upgradeTimeDelay" - ); - assertSlot( - UPGRADE_IMPLEMENTATION_SLOT, - "network.keep.randombeacon.proxy.upgradeImplementation" - ); - assertSlot( - UPGRADE_INIT_TIMESTAMP_SLOT, - "network.keep.randombeacon.proxy.upgradeInitiatedTimestamp" - ); - - require( - _implementation != address(0), - "Implementation address can't be zero." - ); - - if (_data.length > 0) { - initializeImplementation(_implementation, _data); - } - - setImplementation(_implementation); - - setUpgradeTimeDelay(1 days); - - setAdmin(msg.sender); - } - - /// @notice Starts upgrade of the current vendor implementation. - /// @dev It is the first part of the two-step implementation address update - /// process. The function emits an event containing the new value and current - /// block timestamp. - /// @param _newImplementation Address of the new vendor implementation contract. - /// @param _data Delegate call data for implementation initialization. - function upgradeTo(address _newImplementation, bytes memory _data) - public - onlyAdmin - { - address currentImplementation = _implementation(); - require( - _newImplementation != address(0), - "Implementation address can't be zero." - ); - require( - _newImplementation != currentImplementation, - "Implementation address must be different from the current one." - ); - - initializationData[_newImplementation] = _data; - - setNewImplementation(_newImplementation); - - /* solium-disable-next-line security/no-block-members */ - setUpgradeInitiatedTimestamp(block.timestamp); - - /* solium-disable-next-line security/no-block-members */ - emit UpgradeStarted(_newImplementation, block.timestamp); - } - - /// @notice Finalizes implementation address upgrade. - /// @dev It is the second part of the two-step implementation address update - /// process. The function emits an event containing the new implementation - /// address. It can be called after upgrade time delay period has passed since - /// upgrade initiation. - function completeUpgrade() public onlyAdmin { - require(upgradeInitiatedTimestamp() > 0, "Upgrade not initiated"); - - require( - /* solium-disable-next-line security/no-block-members */ - block.timestamp.sub(upgradeInitiatedTimestamp()) >= - upgradeTimeDelay(), - "Timer not elapsed" - ); - - address newImplementation = newImplementation(); - - setImplementation(newImplementation); - - bytes memory data = initializationData[newImplementation]; - if (data.length > 0) { - initializeImplementation(newImplementation, data); - } - - setUpgradeInitiatedTimestamp(0); - - emit UpgradeCompleted(newImplementation); - } - - /// @dev Gets the address of the current implementation. - /// @return address of the current implementation. - function implementation() public view returns (address) { - return _implementation(); - } - - /// @notice The admin slot. - /// @return The contract owner's address. - function admin() public view returns (address adm) { - bytes32 slot = ADMIN_SLOT; - /* solium-disable-next-line */ - assembly { - adm := sload(slot) - } - } - - /// @notice Sets the address of the proxy admin. - /// @dev Function can be called only by the current admin. - /// @param _newAdmin Address of the new proxy admin. - function updateAdmin(address _newAdmin) public onlyAdmin { - setAdmin(_newAdmin); - } - - function upgradeTimeDelay() - public - view - returns (uint256 _upgradeTimeDelay) - { - bytes32 position = UPGRADE_TIME_DELAY_SLOT; - /* solium-disable-next-line */ - assembly { - _upgradeTimeDelay := sload(position) - } - } - - function newImplementation() - public - view - returns (address _newImplementation) - { - bytes32 position = UPGRADE_IMPLEMENTATION_SLOT; - /* solium-disable-next-line */ - assembly { - _newImplementation := sload(position) - } - } - - function upgradeInitiatedTimestamp() - public - view - returns (uint256 _upgradeInitiatedTimestamp) - { - bytes32 position = UPGRADE_INIT_TIMESTAMP_SLOT; - /* solium-disable-next-line */ - assembly { - _upgradeInitiatedTimestamp := sload(position) - } - } - - /// @notice Initializes implementation contract. - /// @dev Delegates a call to the implementation with provided data. It is - /// expected that data contains details of function to be called. - /// @param _implementation Address of the new vendor implementation contract. - /// @param _data Delegate call data for implementation initialization. - function initializeImplementation( - address _implementation, - bytes memory _data - ) internal { - (bool success, bytes memory returnData) = - _implementation.delegatecall(_data); - - require(success, string(returnData)); - } - - /// @notice Asserts correct slot for provided key. - /// @dev To avoid clashing with implementation's fields the proxy contract - /// defines its' fields on specific slots. Slot is calculated as hash of a - /// string subtracted by 1 to reduce chances of a possible attack. - /// For details see EIP-1967. - function assertSlot(bytes32 slot, bytes memory key) internal pure { - assert(slot == bytes32(uint256(keccak256(key)) - 1)); - } - - /// @notice Returns the current implementation. Implements function from `Proxy` - /// contract. - /// @return Address of the current implementation - function _implementation() internal view returns (address impl) { - bytes32 slot = IMPLEMENTATION_SLOT; - /* solium-disable-next-line */ - assembly { - impl := sload(slot) - } - } - - /// @notice Sets the address of the current implementation. - /// @param _implementation address representing the new implementation to be set. - function setImplementation(address _implementation) internal { - bytes32 slot = IMPLEMENTATION_SLOT; - /* solium-disable-next-line */ - assembly { - sstore(slot, _implementation) - } - } - - function setUpgradeTimeDelay(uint256 _upgradeTimeDelay) internal { - bytes32 position = UPGRADE_TIME_DELAY_SLOT; - /* solium-disable-next-line */ - assembly { - sstore(position, _upgradeTimeDelay) - } - } - - function setNewImplementation(address _newImplementation) internal { - bytes32 position = UPGRADE_IMPLEMENTATION_SLOT; - /* solium-disable-next-line */ - assembly { - sstore(position, _newImplementation) - } - } - - function setUpgradeInitiatedTimestamp(uint256 _upgradeInitiatedTimestamp) - internal - { - bytes32 position = UPGRADE_INIT_TIMESTAMP_SLOT; - /* solium-disable-next-line */ - assembly { - sstore(position, _upgradeInitiatedTimestamp) - } - } - - /// @notice Sets the address of the proxy admin. - /// @param _newAdmin Address of the new proxy admin. - function setAdmin(address _newAdmin) internal { - bytes32 slot = ADMIN_SLOT; - /* solium-disable-next-line */ - assembly { - sstore(slot, _newAdmin) - } - } - - /// @notice Throws if called by any account other than the contract owner. - modifier onlyAdmin() { - require(msg.sender == admin(), "Caller is not the admin"); - _; - } -} diff --git a/solidity-v1/contracts/KeepRandomBeaconServiceImplV1.sol b/solidity-v1/contracts/KeepRandomBeaconServiceImplV1.sol deleted file mode 100644 index 6bb1f77673..0000000000 --- a/solidity-v1/contracts/KeepRandomBeaconServiceImplV1.sol +++ /dev/null @@ -1,540 +0,0 @@ -/** -▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀ - ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ -▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ - - Trust math, not hardware. -*/ - -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol"; -import "./utils/AddressArrayUtils.sol"; -import "./utils/PercentUtils.sol"; -import "./KeepRegistry.sol"; -import "./IRandomBeacon.sol"; - -interface OperatorContract { - function entryVerificationFee() external view returns (uint256); - - function groupCreationFee() external view returns (uint256); - - function groupProfitFee() external view returns (uint256); - - function gasPriceCeiling() external view returns (uint256); - - function sign(uint256 requestId, bytes calldata previousEntry) - external - payable; - - function numberOfGroups() external view returns (uint256); - - function createGroup(uint256 newEntry, address payable submitter) - external - payable; - - function isGroupSelectionPossible() external view returns (bool); -} - -/// @title KeepRandomBeaconServiceImplV1 -/// @notice Initial version of service contract that works under Keep Random -/// Beacon proxy and allows upgradability. The purpose of the contract is to have -/// up-to-date logic for threshold random number generation. Updated contracts -/// must inherit from this contract and have to be initialized under updated version -/// name. -/// @dev Warning: you can't set constants directly in the contract and must use -/// initialize() please see openzeppelin upgradeable contracts approach for more -/// info. -contract KeepRandomBeaconServiceImplV1 is ReentrancyGuard, IRandomBeacon { - using SafeMath for uint256; - using PercentUtils for uint256; - using AddressArrayUtils for address[]; - - event RelayEntryRequested(uint256 requestId); - - /// @dev Fraction in % of the estimated cost of DKG that is included - /// in relay request fee. - uint256 internal _dkgContributionMargin; - - /// @dev Every relay request payment includes DKG contribution that is added to - /// the DKG fee pool, once the pool value reaches the required minimum, a new - /// relay entry will trigger the creation of a new group. Expressed in wei. - uint256 internal _dkgFeePool; - - /// @dev Rewards not paid out to the operators are sent to request subsidy pool to - /// subsidize new requests: 1% of the subsidy pool is returned to the requester's - /// surplus address. Expressed in wei. - uint256 internal _requestSubsidyFeePool; - - /// @dev Each service contract tracks its own requests and these are independent - /// from operator contracts which track signing requests instead. - uint256 internal _requestCounter; - - /// @dev Previous entry value produced by the beacon. - bytes internal _previousEntry; - - /// @dev The cost of executing executeCallback() code of this contract, includes - /// everything but the logic of the external contract called. - /// The value is used to estimate the cost of executing a callback and is - /// used for calculating callback call surplus reimbursement for requestor. - /// - /// This value has to be updated in case of EVM opcode price change, but since - /// upgrading service contract is easy, it is not a worrisome problem. - uint256 internal _baseCallbackGas; - - struct Callback { - address callbackContract; - uint256 callbackFee; - uint256 callbackGas; - address payable surplusRecipient; - } - - mapping(uint256 => Callback) internal _callbacks; - - /// @dev KeepRegistry contract with a list of approved operator contracts and upgraders. - address internal _registry; - - address[] internal _operatorContracts; - - /// @dev Mapping to store new implementation versions that inherit from this contract. - mapping(string => bool) internal _initialized; - - /// @dev Seed used as the first random beacon value. - /// It's a G1 point G * PI = - /// G * 31415926535897932384626433832795028841971693993751058209749445923078164062862 - /// Where G is the generator of G1 abstract cyclic group. - bytes internal constant _beaconSeed = - hex"15c30f4b6cf6dbbcbdcc10fe22f54c8170aea44e198139b776d512d8f027319a1b9e8bfaf1383978231ce98e42bafc8129f473fc993cf60ce327f7d223460663"; - - /// @dev Throws if called by any account other than the operator contract - /// upgrader authorized for this service contract. - modifier onlyOperatorContractUpgrader() { - address operatorContractUpgrader = - KeepRegistry(_registry).operatorContractUpgraderFor(address(this)); - require( - operatorContractUpgrader == msg.sender, - "Caller is not operator contract upgrader" - ); - _; - } - - constructor() public { - _initialized["KeepRandomBeaconServiceImplV1"] = true; - } - - /// @notice Initialize Keep Random Beacon service contract implementation. - /// @param dkgContributionMargin Fraction in % of the estimated cost of DKG that is included in relay - /// request fee. - /// @param registry KeepRegistry contract linked to this contract. - function initialize(uint256 dkgContributionMargin, address registry) - public - { - require(!initialized(), "Contract is already initialized."); - require(registry != address(0), "Incorrect registry address"); - - _initialized["KeepRandomBeaconServiceImplV1"] = true; - _dkgContributionMargin = dkgContributionMargin; - _previousEntry = _beaconSeed; - _registry = registry; - _baseCallbackGas = 10226; - } - - /// @notice Checks if this contract is initialized. - function initialized() public view returns (bool) { - return _initialized["KeepRandomBeaconServiceImplV1"]; - } - - /// @notice Adds operator contract - /// @param operatorContract Address of the operator contract. - function addOperatorContract(address operatorContract) - public - onlyOperatorContractUpgrader - { - require( - KeepRegistry(_registry).isApprovedOperatorContract( - operatorContract - ), - "Operator contract is not approved" - ); - _operatorContracts.push(operatorContract); - } - - /// @notice Removes operator contract - /// @param operatorContract Address of the operator contract. - function removeOperatorContract(address operatorContract) - public - onlyOperatorContractUpgrader - { - _operatorContracts.removeAddress(operatorContract); - } - - /// @notice Add funds to DKG fee pool. - function fundDkgFeePool() public payable { - _dkgFeePool += msg.value; - } - - /// @notice Add funds to request subsidy fee pool. - function fundRequestSubsidyFeePool() public payable { - _requestSubsidyFeePool += msg.value; - } - - /// @notice Selects an operator contract from the available list using modulo - /// operation with seed value weighted by the number of active groups on each - /// operator contract. - /// @param seed Cryptographically generated random value. - /// @return Address of operator contract. - function selectOperatorContract(uint256 seed) - public - view - returns (address) - { - uint256 totalNumberOfGroups; - - uint256 approvedContractsCounter; - address[] memory approvedContracts = - new address[](_operatorContracts.length); - - for (uint256 i = 0; i < _operatorContracts.length; i++) { - if ( - KeepRegistry(_registry).isApprovedOperatorContract( - _operatorContracts[i] - ) - ) { - totalNumberOfGroups += OperatorContract(_operatorContracts[i]) - .numberOfGroups(); - approvedContracts[ - approvedContractsCounter - ] = _operatorContracts[i]; - approvedContractsCounter++; - } - } - - require( - totalNumberOfGroups > 0, - "Total number of groups must be greater than zero." - ); - - uint256 selectedIndex = seed % totalNumberOfGroups; - - uint256 selectedContract; - uint256 indexByGroupCount; - - for (uint256 i = 0; i < approvedContractsCounter; i++) { - indexByGroupCount += OperatorContract(approvedContracts[i]) - .numberOfGroups(); - if (selectedIndex < indexByGroupCount) { - return approvedContracts[selectedContract]; - } - selectedContract++; - } - - return approvedContracts[selectedContract]; - } - - /// @notice Creates a request to generate a new relay entry, which will include - /// a random number (by signing the previous entry's random number). - /// @return An uint256 representing uniquely generated entry Id. - function requestRelayEntry() public payable returns (uint256) { - return requestRelayEntry(address(0), 0); - } - - /// @notice Creates a request to generate a new relay entry (random number). - /// @param callbackContract Callback contract address. Callback is called - /// once a new relay entry has been generated. Callback contract must - /// declare public `__beaconCallback(uint256)` function that is going to be - /// executed with the result, once ready. - /// @param callbackGas Gas required for the callback (2 million gas max). - /// The customer needs to ensure they provide a sufficient callback gas - /// to cover the gas fee of executing the callback. Any surplus is returned - /// to the customer. If the callback gas amount turns to be not enough to - /// execute the callback, callback execution is skipped. - /// @return An uint256 representing uniquely generated relay request ID. It - /// is also returned as part of the event. - function requestRelayEntry(address callbackContract, uint256 callbackGas) - public - payable - nonReentrant - returns (uint256) - { - require( - callbackGas <= 2000000, - "Callback gas exceeds 2000000 gas limit" - ); - - require( - msg.value >= entryFeeEstimate(callbackGas), - "Payment is less than required minimum." - ); - - ( - uint256 entryVerificationFee, - uint256 dkgContributionFee, - uint256 groupProfitFee, - uint256 gasPriceCeiling - ) = entryFeeBreakdown(); - - uint256 callbackFee = - msg.value.sub(entryVerificationFee).sub(dkgContributionFee).sub( - groupProfitFee - ); - - _dkgFeePool += dkgContributionFee; - - OperatorContract operatorContract = - OperatorContract( - selectOperatorContract(uint256(keccak256(_previousEntry))) - ); - - uint256 selectedOperatorContractFee = - operatorContract.groupProfitFee().add( - operatorContract.entryVerificationFee() - ); - - _requestCounter++; - uint256 requestId = _requestCounter; - - operatorContract.sign.value( - selectedOperatorContractFee.add(callbackFee) - )(requestId, _previousEntry); - - // If selected operator contract is cheaper than expected return the - // surplus to the subsidy fee pool. - // We do that instead of returning the surplus to the requestor to have - // a consistent beacon pricing for customers without fluctuations caused - // by different operator contracts being selected. - uint256 surplus = - entryVerificationFee.add(groupProfitFee).sub( - selectedOperatorContractFee - ); - _requestSubsidyFeePool = _requestSubsidyFeePool.add(surplus); - - if (callbackContract != address(0)) { - _callbacks[requestId] = Callback( - callbackContract, - callbackFee, - callbackGas, - msg.sender - ); - } - - // Send 1% of the request subsidy pool to the requestor. - if (_requestSubsidyFeePool >= 100) { - uint256 amount = _requestSubsidyFeePool.percent(1); - _requestSubsidyFeePool -= amount; - (bool success, ) = msg.sender.call.value(amount)(""); - require(success, "Failed send subsidy fee"); - } - - emit RelayEntryRequested(requestId); - return requestId; - } - - /// @notice Store valid entry returned by operator contract and call customer - /// specified callback if required. - /// @param requestId Request id tracked internally by this contract. - /// @param entry The generated random number. - /// @param submitter Relay entry submitter. - function entryCreated( - uint256 requestId, - bytes memory entry, - address payable submitter - ) public { - require( - _operatorContracts.contains(msg.sender), - "Only authorized operator contract can call relay entry." - ); - - _previousEntry = entry; - uint256 entryAsNumber = uint256(keccak256(entry)); - emit RelayEntryGenerated(requestId, entryAsNumber); - - createGroupIfApplicable(entryAsNumber, submitter); - } - - /// @notice Executes customer specified callback for the relay entry request. - /// @param requestId Request id tracked internally by this contract. - /// @param entry The generated random number. - function executeCallback(uint256 requestId, uint256 entry) public { - require( - _operatorContracts.contains(msg.sender), - "Only authorized operator contract can call execute callback." - ); - - require( - _callbacks[requestId].callbackContract != address(0), - "Callback contract not found" - ); - - _callbacks[requestId].callbackContract.call( - abi.encodeWithSignature("__beaconCallback(uint256)", entry) - ); - - delete _callbacks[requestId]; - } - - /// @notice Get base callback gas required for relay entry callback. - function baseCallbackGas() public view returns (uint256) { - return _baseCallbackGas; - } - - /// @notice Get the entry fee estimate in wei for relay entry request. - /// @param callbackGas Gas required for the callback. - function entryFeeEstimate(uint256 callbackGas) - public - view - returns (uint256) - { - require( - callbackGas <= 2000000, - "Callback gas exceeds 2000000 gas limit" - ); - - ( - uint256 entryVerificationFee, - uint256 dkgContributionFee, - uint256 groupProfitFee, - uint256 gasPriceCeiling - ) = entryFeeBreakdown(); - - return - entryVerificationFee - .add(dkgContributionFee) - .add(groupProfitFee) - .add(callbackFee(callbackGas, gasPriceCeiling)); - } - - /// @notice Get the entry fee breakdown in wei for relay entry request. - function entryFeeBreakdown() - public - view - returns ( - uint256 entryVerificationFee, - uint256 dkgContributionFee, - uint256 groupProfitFee, - uint256 gasPriceCeiling - ) - { - // Select the most expensive entry verification from all the operator contracts - // and the highest group profit fee from all the operator contracts. We do not - // know what is going to be the gas price at the moment of submitting an entry, - // thus we can't calculate at this point which contract is the most expensive - // based on the entry verification gas and group profit fee. Hence, we need to - // select maximum of both those values separately. - for (uint256 i = 0; i < _operatorContracts.length; i++) { - OperatorContract operator = OperatorContract(_operatorContracts[i]); - - if (operator.numberOfGroups() > 0) { - uint256 operatorBid = operator.entryVerificationFee(); - if (operatorBid > entryVerificationFee) { - entryVerificationFee = operatorBid; - } - - operatorBid = operator.groupProfitFee(); - if (operatorBid > groupProfitFee) { - groupProfitFee = operatorBid; - } - - operatorBid = operator.gasPriceCeiling(); - if (operatorBid > gasPriceCeiling) { - gasPriceCeiling = operatorBid; - } - } - } - - // Use DKG gas estimate from the latest operator contract since it will be used for the next group creation. - address latestOperatorContract = - _operatorContracts[_operatorContracts.length.sub(1)]; - uint256 groupCreationFee = - OperatorContract(latestOperatorContract).groupCreationFee(); - - return ( - entryVerificationFee, - groupCreationFee.percent(_dkgContributionMargin), - groupProfitFee, - gasPriceCeiling - ); - } - - /// @notice Returns DKG contribution margin - a fraction in % of the - /// estimated cost of DKG that is included in relay request fee. - function dkgContributionMargin() public view returns (uint256) { - return _dkgContributionMargin; - } - - /// @notice Returns the current DKG fee pool value. - /// Every relay request payment includes DKG contribution that is added to - /// the DKG fee pool, once the pool value reaches the required minimum, a new - /// relay entry will trigger the creation of a new group. Expressed in wei. - function dkgFeePool() public view returns (uint256) { - return _dkgFeePool; - } - - /// @notice Returns the current value of request subsidy pool. - /// Rewards not paid out to the operators are sent to request subsidy pool to - /// subsidize new requests: 1% of the subsidy pool is returned to the requester's - /// surplus address. Expressed in wei. - function requestSubsidyFeePool() public view returns (uint256) { - return _requestSubsidyFeePool; - } - - /// @notice Returns callback surplus recipient for the provided request id. - function callbackSurplusRecipient(uint256 requestId) - public - view - returns (address payable) - { - return _callbacks[requestId].surplusRecipient; - } - - /// @notice Gets version of the current implementation. - function version() public pure returns (string memory) { - return "V1"; - } - - /// @notice Triggers the selection process of a new candidate group if the - /// DKG fee pool equals or exceeds DKG cost estimate. - /// @param entry The generated random number. - /// @param submitter Relay entry submitter - operator. - function createGroupIfApplicable(uint256 entry, address payable submitter) - internal - { - address latestOperatorContract = - _operatorContracts[_operatorContracts.length.sub(1)]; - uint256 groupCreationFee = - OperatorContract(latestOperatorContract).groupCreationFee(); - - if ( - _dkgFeePool >= groupCreationFee && - OperatorContract(latestOperatorContract).isGroupSelectionPossible() - ) { - OperatorContract(latestOperatorContract).createGroup.value( - groupCreationFee - )(entry, submitter); - _dkgFeePool = _dkgFeePool.sub(groupCreationFee); - } - } - - /// @notice Get the minimum payment in wei for relay entry callback. - /// @param _callbackGas Gas required for the callback. - function callbackFee(uint256 _callbackGas, uint256 _gasPriceCeiling) - internal - view - returns (uint256) - { - // gas for the callback itself plus additional operational costs of - // executing the callback - uint256 callbackGas = - _callbackGas == 0 ? 0 : _callbackGas.add(_baseCallbackGas); - // We take the gas price from the price feed to not let malicious - // miner-requestors manipulate the gas price when requesting relay entry - // and underpricing expensive callbacks. - return callbackGas.mul(_gasPriceCeiling); - } -} diff --git a/solidity-v1/contracts/KeepRegistry.sol b/solidity-v1/contracts/KeepRegistry.sol deleted file mode 100644 index 8646970f6f..0000000000 --- a/solidity-v1/contracts/KeepRegistry.sol +++ /dev/null @@ -1,235 +0,0 @@ -pragma solidity 0.5.17; - -/// @title KeepRegistry -/// @notice Governance owned registry of approved contracts and roles. -contract KeepRegistry { - enum ContractStatus {New, Approved, Disabled} - - // Governance role is to enable recovery from key compromise by rekeying - // other roles. Also, it can disable operator contract panic buttons - // permanently. - address public governance; - - // Registry Keeper maintains approved operator contracts. Each operator - // contract must be approved before it can be authorized by a staker or - // used by a service contract. - address public registryKeeper; - - // Each operator contract has a Panic Button which can disable malicious - // or malfunctioning contract that have been previously approved by the - // Registry Keeper. - // - // New operator contract added to the registry has a default panic button - // value assigned (defaultPanicButton). Panic button for each operator - // contract can be later updated by Governance to individual value. - // - // It is possible to disable panic button for individual contract by - // setting the panic button to zero address. In such case, operator contract - // can not be disabled and is permanently approved in the registry. - mapping(address => address) public panicButtons; - - // Default panic button for each new operator contract added to the - // registry. Can be later updated for each contract. - address public defaultPanicButton; - - // Each service contract has a Operator Contract Upgrader whose purpose - // is to manage operator contracts for that specific service contract. - // The Operator Contract Upgrader can add new operator contracts to the - // service contract’s operator contract list, and deprecate old ones. - mapping(address => address) public operatorContractUpgraders; - - // Operator contract may have a Service Contract Upgrader whose purpose is - // to manage service contracts for that specific operator contract. - // Service Contract Upgrader can add and remove service contracts - // from the list of service contracts approved to work with the operator - // contract. List of service contracts is maintained in the operator - // contract and is optional - not every operator contract needs to have - // a list of service contracts it wants to cooperate with. - mapping(address => address) public serviceContractUpgraders; - - // The registry of operator contracts - mapping(address => ContractStatus) public operatorContracts; - - event OperatorContractApproved(address operatorContract); - event OperatorContractDisabled(address operatorContract); - - event GovernanceUpdated(address governance); - event RegistryKeeperUpdated(address registryKeeper); - event DefaultPanicButtonUpdated(address defaultPanicButton); - event OperatorContractPanicButtonDisabled(address operatorContract); - event OperatorContractPanicButtonUpdated( - address operatorContract, - address panicButton - ); - event OperatorContractUpgraderUpdated( - address serviceContract, - address upgrader - ); - event ServiceContractUpgraderUpdated( - address operatorContract, - address keeper - ); - - modifier onlyGovernance() { - require(governance == msg.sender, "Not authorized"); - _; - } - - modifier onlyRegistryKeeper() { - require(registryKeeper == msg.sender, "Not authorized"); - _; - } - - modifier onlyPanicButton(address _operatorContract) { - address panicButton = panicButtons[_operatorContract]; - require(panicButton != address(0), "Panic button disabled"); - require(panicButton == msg.sender, "Not authorized"); - _; - } - - modifier onlyForNewContract(address _operatorContract) { - require( - isNewOperatorContract(_operatorContract), - "Not a new operator contract" - ); - _; - } - - modifier onlyForApprovedContract(address _operatorContract) { - require( - isApprovedOperatorContract(_operatorContract), - "Not an approved operator contract" - ); - _; - } - - constructor() public { - governance = msg.sender; - registryKeeper = msg.sender; - defaultPanicButton = msg.sender; - } - - function setGovernance(address _governance) public onlyGovernance { - governance = _governance; - emit GovernanceUpdated(governance); - } - - function setRegistryKeeper(address _registryKeeper) public onlyGovernance { - registryKeeper = _registryKeeper; - emit RegistryKeeperUpdated(registryKeeper); - } - - function setDefaultPanicButton(address _panicButton) public onlyGovernance { - defaultPanicButton = _panicButton; - emit DefaultPanicButtonUpdated(defaultPanicButton); - } - - function setOperatorContractPanicButton( - address _operatorContract, - address _panicButton - ) public onlyForApprovedContract(_operatorContract) onlyGovernance { - require( - panicButtons[_operatorContract] != address(0), - "Disabled panic button cannot be updated" - ); - require( - _panicButton != address(0), - "Panic button must be non-zero address" - ); - - panicButtons[_operatorContract] = _panicButton; - - emit OperatorContractPanicButtonUpdated( - _operatorContract, - _panicButton - ); - } - - function disableOperatorContractPanicButton(address _operatorContract) - public - onlyForApprovedContract(_operatorContract) - onlyGovernance - { - require( - panicButtons[_operatorContract] != address(0), - "Panic button already disabled" - ); - - panicButtons[_operatorContract] = address(0); - - emit OperatorContractPanicButtonDisabled(_operatorContract); - } - - function setOperatorContractUpgrader( - address _serviceContract, - address _operatorContractUpgrader - ) public onlyGovernance { - operatorContractUpgraders[_serviceContract] = _operatorContractUpgrader; - emit OperatorContractUpgraderUpdated( - _serviceContract, - _operatorContractUpgrader - ); - } - - function setServiceContractUpgrader( - address _operatorContract, - address _serviceContractUpgrader - ) public onlyGovernance { - serviceContractUpgraders[_operatorContract] = _serviceContractUpgrader; - emit ServiceContractUpgraderUpdated( - _operatorContract, - _serviceContractUpgrader - ); - } - - function approveOperatorContract(address operatorContract) - public - onlyForNewContract(operatorContract) - onlyRegistryKeeper - { - operatorContracts[operatorContract] = ContractStatus.Approved; - panicButtons[operatorContract] = defaultPanicButton; - emit OperatorContractApproved(operatorContract); - } - - function disableOperatorContract(address operatorContract) - public - onlyForApprovedContract(operatorContract) - onlyPanicButton(operatorContract) - { - operatorContracts[operatorContract] = ContractStatus.Disabled; - emit OperatorContractDisabled(operatorContract); - } - - function isNewOperatorContract(address operatorContract) - public - view - returns (bool) - { - return operatorContracts[operatorContract] == ContractStatus.New; - } - - function isApprovedOperatorContract(address operatorContract) - public - view - returns (bool) - { - return operatorContracts[operatorContract] == ContractStatus.Approved; - } - - function operatorContractUpgraderFor(address _serviceContract) - public - view - returns (address) - { - return operatorContractUpgraders[_serviceContract]; - } - - function serviceContractUpgraderFor(address _operatorContract) - public - view - returns (address) - { - return serviceContractUpgraders[_operatorContract]; - } -} diff --git a/solidity-v1/contracts/KeepToken.sol b/solidity-v1/contracts/KeepToken.sol deleted file mode 100644 index 514f856976..0000000000 --- a/solidity-v1/contracts/KeepToken.sol +++ /dev/null @@ -1,51 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol"; - -/// @dev Interface of recipient contract for approveAndCall pattern. -interface tokenRecipient { - function receiveApproval( - address _from, - uint256 _value, - address _token, - bytes calldata _extraData - ) external; -} - -/// @title KEEP Token -/// @dev Standard ERC20Burnable token -contract KeepToken is ERC20Burnable, ERC20Detailed { - string public constant NAME = "KEEP Token"; - string public constant SYMBOL = "KEEP"; - uint8 public constant DECIMALS = 18; // The number of digits after the decimal place when displaying token values on-screen. - uint256 public constant INITIAL_SUPPLY = 10**27; // 1 billion tokens, 18 decimal places. - - /// @dev Gives msg.sender all of existing tokens. - constructor() public ERC20Detailed(NAME, SYMBOL, DECIMALS) { - _mint(msg.sender, INITIAL_SUPPLY); - } - - /// @notice Set allowance for other address and notify. - /// Allows `_spender` to spend no more than `_value` tokens - /// on your behalf and then ping the contract about it. - /// @param _spender The address authorized to spend. - /// @param _value The max amount they can spend. - /// @param _extraData Extra information to send to the approved contract. - function approveAndCall( - address _spender, - uint256 _value, - bytes memory _extraData - ) public returns (bool success) { - tokenRecipient spender = tokenRecipient(_spender); - if (approve(_spender, _value)) { - spender.receiveApproval( - msg.sender, - _value, - address(this), - _extraData - ); - return true; - } - } -} diff --git a/solidity-v1/contracts/ManagedGrant.sol b/solidity-v1/contracts/ManagedGrant.sol deleted file mode 100644 index 0f744fc996..0000000000 --- a/solidity-v1/contracts/ManagedGrant.sol +++ /dev/null @@ -1,192 +0,0 @@ -pragma solidity ^0.5.4; - -import "openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol"; -import "./TokenGrant.sol"; - -/// @title ManagedGrant -/// @notice A managed grant acts as the grantee towards the token grant contract, -/// proxying instructions from the actual grantee. -/// The address used by the actual grantee -/// to issue instructions and withdraw tokens -/// can be reassigned with the consent of the grant manager. -contract ManagedGrant { - using SafeERC20 for ERC20Burnable; - - ERC20Burnable public token; - TokenGrant public tokenGrant; - address public grantManager; - uint256 public grantId; - address public grantee; - address public requestedNewGrantee; - - event GranteeReassignmentRequested(address newGrantee); - event GranteeReassignmentConfirmed(address oldGrantee, address newGrantee); - event GranteeReassignmentCancelled(address cancelledRequestedGrantee); - event GranteeReassignmentChanged( - address previouslyRequestedGrantee, - address newRequestedGrantee - ); - event TokensWithdrawn(address destination, uint256 amount); - - constructor( - address _tokenAddress, - address _tokenGrant, - address _grantManager, - uint256 _grantId, - address _grantee - ) public { - token = ERC20Burnable(_tokenAddress); - tokenGrant = TokenGrant(_tokenGrant); - grantManager = _grantManager; - grantId = _grantId; - grantee = _grantee; - } - - /// @notice Request a reassignment of the grantee address. - /// Can only be called by the grantee. - /// @param _newGrantee The requested new grantee. - function requestGranteeReassignment(address _newGrantee) - public - onlyGrantee - noRequestedReassignment - { - _setRequestedNewGrantee(_newGrantee); - emit GranteeReassignmentRequested(_newGrantee); - } - - /// @notice Cancel a pending grantee reassignment request. - /// Can only be called by the grantee. - function cancelReassignmentRequest() - public - onlyGrantee - withRequestedReassignment - { - address cancelledGrantee = requestedNewGrantee; - requestedNewGrantee = address(0); - emit GranteeReassignmentCancelled(cancelledGrantee); - } - - /// @notice Change a pending reassignment request to a different grantee. - /// Can only be called by the grantee. - /// @param _newGrantee The address of the new requested grantee. - function changeReassignmentRequest(address _newGrantee) - public - onlyGrantee - withRequestedReassignment - { - address previouslyRequestedGrantee = requestedNewGrantee; - require( - previouslyRequestedGrantee != _newGrantee, - "Unchanged reassignment request" - ); - _setRequestedNewGrantee(_newGrantee); - emit GranteeReassignmentChanged( - previouslyRequestedGrantee, - _newGrantee - ); - } - - /// @notice Confirm a grantee reassignment request and set the new grantee as the grantee. - /// Can only be called by the grant manager. - /// @param _newGrantee The address of the new grantee. - /// Must match the currently requested new grantee. - function confirmGranteeReassignment(address _newGrantee) - public - onlyManager - withRequestedReassignment - { - address oldGrantee = grantee; - require( - requestedNewGrantee == _newGrantee, - "Reassignment address mismatch" - ); - grantee = requestedNewGrantee; - requestedNewGrantee = address(0); - emit GranteeReassignmentConfirmed(oldGrantee, _newGrantee); - } - - /// @notice Withdraw all unlocked tokens from the grant. - function withdraw() public onlyGrantee { - require( - requestedNewGrantee == address(0), - "Can not withdraw with pending reassignment" - ); - tokenGrant.withdraw(grantId); - uint256 amount = token.balanceOf(address(this)); - token.safeTransfer(grantee, amount); - emit TokensWithdrawn(grantee, amount); - } - - /// @notice Stake tokens from the grant. - /// @param _stakingContract The contract to stake the tokens on. - /// @param _amount The amount of tokens to stake. - /// @param _extraData Data for the stake delegation. - /// This byte array must have the following values concatenated: - /// beneficiary address (20 bytes) - /// operator address (20 bytes) - /// authorizer address (20 bytes) - function stake( - address _stakingContract, - uint256 _amount, - bytes memory _extraData - ) public onlyGrantee { - tokenGrant.stake(grantId, _stakingContract, _amount, _extraData); - } - - /// @notice Cancel delegating tokens to the given operator. - function cancelStake(address _operator) public onlyGranteeOr(_operator) { - tokenGrant.cancelStake(_operator); - } - - /// @notice Begin undelegating tokens from the given operator. - function undelegate(address _operator) public onlyGranteeOr(_operator) { - tokenGrant.undelegate(_operator); - } - - /// @notice Recover tokens previously staked and delegated to the operator. - function recoverStake(address _operator) public { - tokenGrant.recoverStake(_operator); - } - - function _setRequestedNewGrantee(address _newGrantee) internal { - require(_newGrantee != address(0), "Invalid new grantee address"); - require(_newGrantee != grantee, "New grantee same as current grantee"); - - requestedNewGrantee = _newGrantee; - } - - modifier withRequestedReassignment { - require(requestedNewGrantee != address(0), "No reassignment requested"); - _; - } - - modifier noRequestedReassignment { - require( - requestedNewGrantee == address(0), - "Reassignment already requested" - ); - _; - } - - modifier onlyGrantee { - require(msg.sender == grantee, "Only grantee may perform this action"); - _; - } - - modifier onlyGranteeOr(address _operator) { - require( - msg.sender == grantee || msg.sender == _operator, - "Only grantee or operator may perform this action" - ); - _; - } - - modifier onlyManager { - require( - msg.sender == grantManager, - "Only grantManager may perform this action" - ); - _; - } -} diff --git a/solidity-v1/contracts/ManagedGrantFactory.sol b/solidity-v1/contracts/ManagedGrantFactory.sol deleted file mode 100644 index bbc7adbba0..0000000000 --- a/solidity-v1/contracts/ManagedGrantFactory.sol +++ /dev/null @@ -1,172 +0,0 @@ -pragma solidity ^0.5.4; - -import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol"; - -import "./utils/BytesLib.sol"; - -import "./KeepToken.sol"; -import "./ManagedGrant.sol"; -import "./TokenGrant.sol"; -import "./GrantStakingPolicy.sol"; - -/// @title ManagedGrantFactory -/// @notice Creates managed grants that permit grantee reassignment -/// and use pre-defined staking policies. -contract ManagedGrantFactory { - using SafeERC20 for KeepToken; - using BytesLib for bytes; - using BytesLib for address; - - KeepToken public token; - TokenGrant public tokenGrant; - - struct Params { - address grantCreator; - address grantee; - uint256 amount; - uint256 duration; - uint256 start; - uint256 cliffDuration; - bool revocable; - address policy; - } - - event ManagedGrantCreated(address grantAddress, address indexed grantee); - - constructor(address _tokenAddress, address _tokenGrant) public { - token = KeepToken(_tokenAddress); - tokenGrant = TokenGrant(_tokenGrant); - } - - /// @notice Create a managed grant - /// with the parameters specified in `_extraData`. - /// @dev Requires no setup beforehand, - /// but only provides the managed grant address through an event. - /// The sender of the tokens is assigned as the grant manager. - /// @param _from The owner of the tokens who approved them to transfer. - /// @param _amount Approved amount for the transfer to create the grant. - /// @param _token Address of the token contract; - /// must match the token specified when the factory was created. - /// @param _extraData The following values encoded with `abi.encode`: - /// grantee (address) Address of the grantee. - /// duration (uint256) Duration in seconds of the unlocking period. - /// start (uint256) Timestamp at which unlocking will start. - /// cliffDuration (uint256) Duration in seconds of the cliff before which no tokens will unlock. - /// revocable (bool) Whether the token grant is revocable or not. - /// policy (address) Address of the staking policy to be used. - function receiveApproval( - address _from, - uint256 _amount, - address _token, - bytes memory _extraData - ) public { - require(KeepToken(_token) == token, "Invalid token contract"); - ( - address _grantee, - uint256 _duration, - uint256 _start, - uint256 _cliffDuration, - bool _revocable, - address _policy - ) = - abi.decode( - _extraData, - (address, uint256, uint256, uint256, bool, address) - ); - Params memory params = - Params( - _from, - _grantee, - _amount, - _duration, - _start, - _cliffDuration, - _revocable, - _policy - ); - _createGrant(params); - } - - /// @notice Create a managed grant with the given parameters. - /// @dev At least `amount` tokens to be approved for the factory beforehand. - /// The grant will use the staking policy specified for its type - /// (revocable or non-revocable) - /// when the factory was created. - /// The msg.sender is assigned as the grant manager. - /// @param grantee The initial grantee. - /// @param amount The number of tokens to grant. - /// @param duration Duration in seconds of the unlocking period. - /// @param start Timestamp at which unlocking will start. - /// @param cliffDuration Duration in seconds of the cliff before which no tokens will unlock. - /// @param revocable Whether the token grant is revocable or not. - /// @param policy Address of the staking policy to be used. - /// @return The address of the managed grant. - function createManagedGrant( - address grantee, - uint256 amount, - uint256 duration, - uint256 start, - uint256 cliffDuration, - bool revocable, - address policy - ) public returns (address _managedGrant) { - Params memory params = - Params( - msg.sender, - grantee, - amount, - duration, - start, - cliffDuration, - revocable, - policy - ); - return _createGrant(params); - } - - function _createGrant(Params memory params) - internal - returns (address _managedGrant) - { - require(params.grantee != address(0), "Grantee address can't be zero."); - require( - params.cliffDuration <= params.duration, - "Unlocking cliff duration must be less or equal total unlocking duration." - ); - - token.safeTransferFrom( - params.grantCreator, - address(this), - params.amount - ); - - // Grant ID is predictable in advance - uint256 grantId = tokenGrant.numGrants(); - - ManagedGrant managedGrant = - new ManagedGrant( - address(token), - address(tokenGrant), - params.grantCreator, - grantId, - params.grantee - ); - _managedGrant = address(managedGrant); - - bytes memory grantData = - abi.encode( - params.grantCreator, - _managedGrant, - params.duration, - params.start, - params.cliffDuration, - params.revocable, - params.policy - ); - - token.approveAndCall(address(tokenGrant), params.amount, grantData); - - emit ManagedGrantCreated(_managedGrant, params.grantee); - return _managedGrant; - } -} diff --git a/solidity-v1/contracts/Migrations.sol b/solidity-v1/contracts/Migrations.sol deleted file mode 100644 index 9a8ac21ad0..0000000000 --- a/solidity-v1/contracts/Migrations.sol +++ /dev/null @@ -1,23 +0,0 @@ -pragma solidity 0.5.17; - -contract Migrations { - address public owner; - uint256 public last_completed_migration; - - modifier restricted() { - if (msg.sender == owner) _; - } - - constructor() public { - owner = msg.sender; - } - - function setCompleted(uint256 completed) public restricted { - last_completed_migration = completed; - } - - function upgrade(address new_address) public restricted { - Migrations upgraded = Migrations(new_address); - upgraded.setCompleted(last_completed_migration); - } -} diff --git a/solidity-v1/contracts/PermissiveStakingPolicy.sol b/solidity-v1/contracts/PermissiveStakingPolicy.sol deleted file mode 100644 index 6241bb6385..0000000000 --- a/solidity-v1/contracts/PermissiveStakingPolicy.sol +++ /dev/null @@ -1,23 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "./GrantStakingPolicy.sol"; - -/// @title PermissiveStakingPolicy -/// @notice A staking policy which allows the grantee to stake the entire grant, -/// regardless of its unlocking status. -contract PermissiveStakingPolicy is GrantStakingPolicy { - using SafeMath for uint256; - - function getStakeableAmount( - uint256 _now, - uint256 grantedAmount, - uint256 duration, - uint256 start, - uint256 cliff, - uint256 withdrawn - ) public view returns (uint256) { - // Can always stake the entire remaining amount. - return grantedAmount.sub(withdrawn); - } -} diff --git a/solidity-v1/contracts/PhasedEscrow.sol b/solidity-v1/contracts/PhasedEscrow.sol deleted file mode 100644 index 7d7f88e3bc..0000000000 --- a/solidity-v1/contracts/PhasedEscrow.sol +++ /dev/null @@ -1,283 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol"; - -import "./Escrow.sol"; - -interface IBeneficiaryContract { - function __escrowSentTokens(uint256 amount) external; -} - -/// @title PhasedEscrow -/// @notice A token holder contract allowing contract owner to set beneficiary of -/// tokens held by the contract and allowing the owner to withdraw the -/// tokens to that beneficiary in phases. -contract PhasedEscrow is Ownable { - using SafeERC20 for IERC20; - - event BeneficiaryUpdated(address beneficiary); - event TokensWithdrawn(address beneficiary, uint256 amount); - - IERC20 public token; - IBeneficiaryContract public beneficiary; - - constructor(IERC20 _token) public { - token = _token; - } - - /// @notice Sets the provided address as a beneficiary allowing it to - /// withdraw all tokens from escrow. This function can be called only - /// by escrow owner. - function setBeneficiary(IBeneficiaryContract _beneficiary) - external - onlyOwner - { - beneficiary = _beneficiary; - emit BeneficiaryUpdated(address(beneficiary)); - } - - /// @notice Withdraws the specified number of tokens from escrow to the - /// beneficiary. If the beneficiary is not set, or there are - /// insufficient tokens in escrow, the function fails. - function withdraw(uint256 amount) external onlyOwner { - require(address(beneficiary) != address(0), "Beneficiary not assigned"); - - uint256 balance = token.balanceOf(address(this)); - require(amount <= balance, "Not enough tokens for withdrawal"); - - token.safeTransfer(address(beneficiary), amount); - emit TokensWithdrawn(address(beneficiary), amount); - - beneficiary.__escrowSentTokens(amount); - } - - /// @notice Funds the escrow by transferring all of the approved tokens - /// to the escrow. - function receiveApproval( - address _from, - uint256 _value, - address _token, - bytes memory - ) public { - require(IERC20(_token) == token, "Unsupported token"); - token.safeTransferFrom(_from, address(this), _value); - } - - /// @notice Withdraws all funds from a non-phased Escrow passed as - /// a parameter. For this function to succeed, this PhasedEscrow - /// has to be set as a beneficiary of the non-phased Escrow. - function withdrawFromEscrow(Escrow _escrow) public { - _escrow.withdraw(); - } -} - -/// @title BatchedPhasedEscrow -/// @notice A token holder contract allowing contract owner to approve a set of -/// beneficiaries of tokens held by the contract, to appoint a separate -/// drawee role, and allowing that drawee to withdraw tokens to approved -/// beneficiaries in phases. -contract BatchedPhasedEscrow is Ownable { - using SafeERC20 for IERC20; - - event BeneficiaryApproved(address beneficiary); - event TokensWithdrawn(address beneficiary, uint256 amount); - event DraweeRoleTransferred(address oldDrawee, address newDrawee); - - IERC20 public token; - address public drawee; - mapping(address => bool) private approvedBeneficiaries; - - modifier onlyDrawee() { - require(drawee == msg.sender, "Caller is not the drawee"); - _; - } - - constructor(IERC20 _token) public { - token = _token; - drawee = msg.sender; - } - - /// @notice Approves the provided address as a beneficiary of tokens held by - /// the escrow. Can be called only by escrow owner. - function approveBeneficiary(IBeneficiaryContract _beneficiary) - external - onlyOwner - { - address beneficiaryAddress = address(_beneficiary); - require( - beneficiaryAddress != address(0), - "Beneficiary can not be zero address" - ); - approvedBeneficiaries[beneficiaryAddress] = true; - emit BeneficiaryApproved(beneficiaryAddress); - } - - /// @notice Returns `true` if the given address has been approved as a - /// beneficiary of the escrow, `false` otherwise. - function isBeneficiaryApproved(IBeneficiaryContract _beneficiary) - public - view - returns (bool) - { - return approvedBeneficiaries[address(_beneficiary)]; - } - - /// @notice Transfers the role of drawee to another address. Can be called - /// only by the contract owner. - function setDrawee(address newDrawee) public onlyOwner { - require(newDrawee != address(0), "New drawee can not be zero address"); - emit DraweeRoleTransferred(drawee, newDrawee); - drawee = newDrawee; - } - - /// @notice Funds the escrow by transferring all of the approved tokens - /// to the escrow. - function receiveApproval( - address _from, - uint256 _value, - address _token, - bytes memory - ) public { - require(IERC20(_token) == token, "Unsupported token"); - token.safeTransferFrom(_from, address(this), _value); - } - - /// @notice Withdraws tokens from escrow to selected beneficiaries, - /// transferring to each beneficiary the amount of tokens specified - /// as a parameter. Only beneficiaries previously approved by escrow - /// owner can receive funds. - function batchedWithdraw( - IBeneficiaryContract[] memory beneficiaries, - uint256[] memory amounts - ) public onlyDrawee { - require( - beneficiaries.length == amounts.length, - "Mismatched arrays length" - ); - - for (uint256 i = 0; i < beneficiaries.length; i++) { - IBeneficiaryContract beneficiary = beneficiaries[i]; - require( - isBeneficiaryApproved(beneficiary), - "Beneficiary was not approved" - ); - withdraw(beneficiary, amounts[i]); - } - } - - function withdraw(IBeneficiaryContract beneficiary, uint256 amount) - private - { - token.safeTransfer(address(beneficiary), amount); - emit TokensWithdrawn(address(beneficiary), amount); - beneficiary.__escrowSentTokens(amount); - } -} - -// Interface representing staking pool rewards contract such as CurveRewards -// contract deployed for Keep (0xAF379f0228ad0d46bB7B4f38f9dc9bCC1ad0360c) or -// LPRewards contract from keep-ecdsa repository deployed for Uniswap. -interface IStakingPoolRewards { - function notifyRewardAmount(uint256 amount) external; -} - -/// @title PlainTransferEscrowBeneficiary -/// @notice PlainTransferEscrowBeneficiary is a beneficiary contract that can -/// receive a withdrawal order from PhasedEscrow and BatchedPhasedEscrow -/// contracts. It immediately sends the received tokens to the recipient -/// set by the beneficiary deployer. -/// The recipient does not have to implement any custom functions, it can -/// be a smart contract or EOA - beneficiary is executing a plain ERC20 -/// transfer. -contract PlainTransferEscrowBeneficiary is Ownable, IBeneficiaryContract { - using SafeERC20 for IERC20; - - IERC20 public token; - address public recipient; - - constructor(IERC20 _token, address _recipient) public { - token = _token; - recipient = _recipient; - } - - function __escrowSentTokens(uint256 amount) external onlyOwner { - token.safeTransfer(recipient, amount); - } -} - -/// @title StakingPoolRewardsEscrowBeneficiary -/// @notice A beneficiary contract that can receive a withdrawal phase from a -/// PhasedEscrow contract. Immediately stakes the received tokens on a -/// designated IStakingPoolRewards contract. -contract StakingPoolRewardsEscrowBeneficiary is Ownable, IBeneficiaryContract { - IERC20 public token; - IStakingPoolRewards public rewards; - - constructor(IERC20 _token, IStakingPoolRewards _rewards) public { - token = _token; - rewards = _rewards; - } - - function __escrowSentTokens(uint256 amount) external onlyOwner { - token.approve(address(rewards), amount); - rewards.notifyRewardAmount(amount); - } -} - -/// @dev Interface of recipient contract for approveAndCall pattern. -interface IStakerRewards { - function receiveApproval( - address _from, - uint256 _value, - address _token, - bytes calldata _extraData - ) external; -} - -/// @title StakerRewardsBeneficiary -/// @notice An abstract beneficiary contract that can receive a withdrawal phase -/// from a PhasedEscrow contract. The received tokens are immediately -/// funded for a designated rewards escrow beneficiary contract. -contract StakerRewardsBeneficiary is Ownable { - IERC20 public token; - IStakerRewards public stakerRewards; - - constructor(IERC20 _token, IStakerRewards _stakerRewards) public { - token = _token; - stakerRewards = _stakerRewards; - } - - function __escrowSentTokens(uint256 amount) external onlyOwner { - bool success = token.approve(address(stakerRewards), amount); - require(success, "Token transfer approval failed"); - - stakerRewards.receiveApproval( - address(this), - amount, - address(token), - "" - ); - } -} - -/// @title BeaconBackportRewardsEscrowBeneficiary -/// @notice Transfer the received tokens to a designated -/// BeaconBackportRewardsEscrowBeneficiary contract. -contract BeaconBackportRewardsEscrowBeneficiary is StakerRewardsBeneficiary { - constructor(IERC20 _token, IStakerRewards _stakerRewards) - public - StakerRewardsBeneficiary(_token, _stakerRewards) - {} -} - -/// @title BeaconRewardsEscrowBeneficiary -/// @notice Transfer the received tokens to a designated -/// BeaconRewardsEscrowBeneficiary contract. -contract BeaconRewardsEscrowBeneficiary is StakerRewardsBeneficiary { - constructor(IERC20 _token, IStakerRewards _stakerRewards) - public - StakerRewardsBeneficiary(_token, _stakerRewards) - {} -} diff --git a/solidity-v1/contracts/Rewards.sol b/solidity-v1/contracts/Rewards.sol deleted file mode 100644 index 3c5647e304..0000000000 --- a/solidity-v1/contracts/Rewards.sol +++ /dev/null @@ -1,731 +0,0 @@ -/** -▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀ - ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ -▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ - - Trust math, not hardware. -*/ - -pragma solidity ^0.5.17; - -import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol"; -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "openzeppelin-solidity/contracts/math/Math.sol"; - -import "./KeepToken.sol"; - -/// @title KEEP Signer Subsidy Rewards -/// @notice A contract for distributing KEEP token rewards to keeps. -/// When a reward contract is created, the creator defines a reward schedule -/// consisting of one or more reward intervals and their interval weights, -/// the length of reward intervals, and the quota of how many keeps must be -/// created in an interval for the full reward for that interval to be paid out. -/// -/// The amount of KEEP to be distributed is determined by funding the contract, -/// and additional KEEP can be added at any time. -/// The reward contract is funded with `approveAndCall` with no extra data, -/// but it also collects any KEEP mistakenly sent to it in any other way. -/// -/// An interval is defined by the timestamps [startOf, endOf); -/// a keep created at the time `startOf(i)` belongs to interval `i` -/// and one created at `endOf(i)` belongs to `i+1`. -/// -/// When an interval is over, it will be allocated a percentage of the remaining -/// unallocated rewards based on its weight, and adjusted by the number of keeps -/// created in the interval if the quota is not met. -/// -/// The adjustment for not meeting the keep quota is a percentage that equals -/// the percentage of the quota that was met; if the number of keeps created is -/// 80% of the quota then 80% of the base reward will be allocated for the -/// interval. -/// -/// Any unallocated rewards will stay in the unallocated rewards pool, -/// to be allocated for future intervals. Intervals past the initially defined -/// schedule have a weight of 100%, meaning that all remaining unallocated -/// rewards will be allocated to the interval. -/// -/// Keeps of the appropriate type can receive rewards once the interval they -/// were created in is over, and the keep has closed happily. -/// There is no time limit to receiving rewards, nor is there need to wait for -/// all keeps from the interval to close. -/// Calling `receiveReward` automatically allocates the rewards for the interval -/// the specified keep was created in and all previous intervals. -/// -/// If a keep is terminated, that fact can be reported to the reward contract. -/// Reporting a terminated keep returns its allocated reward to the pool of -/// unallocated rewards. -/// -/// @dev A concrete implementation of the abstract rewards contract must specify -/// functions for accessing information about keeps and paying out rewards. -/// For the purpose of rewards, Random Beacon signing groups count as "keeps" -/// and the beacon operator contract acts as the "factory". -contract Rewards is Ownable { - using SafeMath for uint256; - using SafeERC20 for KeepToken; - - KeepToken public token; - - // Array representing the percentage of unallocated rewards - // available for each reward interval. - uint256[] public intervalWeights; // percent array - // Length of one interval in seconds (timestamp diff). - uint256 public termLength; - // The number of keeps required in an interval - // for the full reward to be allocated to the interval. - uint256 public minimumKeepsPerInterval; - - // Total number of KEEP tokens to distribute by this contract. - // Includes those already dispensed. - uint256 public totalRewards; - // Rewards that haven't been allocated to finished intervals. - uint256 public unallocatedRewards; - // Rewards that have been dispensed from this contract as signer rewards. - // `token.balanceOf(address(this))` should always equal - // `totalRewards.sub(dispensedRewards)` - uint256 public dispensedRewards; - // The following invariant should always hold: - // token.balanceOf(address(this)) >= totalRewards.sub(dispensedRewards) - - // Timestamp of first interval beginning. - // Interval 0 covers everything before `firstIntervalStart` - // and the first `termLength` after `firstIntervalStart`. - uint256 public firstIntervalStart; - // Mapping of interval number to tokens allocated for the interval. - uint256[] internal intervalAllocations; - - // mapping of keeps to booleans. - // True if the keep has been used to claim a reward. - mapping(bytes32 => bool) internal claimed; - // Mapping of interval to number of keeps created in/before the interval - mapping(uint256 => uint256) internal keepsByInterval; - // Mapping of interval to number of keeps whose rewards have been paid out, - // or reallocated because the keep closed unhappily - mapping(uint256 => uint256) public intervalKeepsProcessed; - - // Indicates whether the contract has been properly funded. Rewards can not - // be allocated before the first funding and the owner of the - // contract is responsible for marking it as already funded. Further funding - // of the contract is possible with no owner's intervention. - bool public funded = false; - - // Owner of the contract may initiate an upgrade to a new rewards contract - // but the pending and past intervals must have their rewards allocated - // before any KEEP tokens are transferred out from this contract. - uint256 public upgradeInitiatedTimestamp; - uint256 public upgradeFinalizedTimestamp; - address public newRewardsContract; - - event RewardReceived(bytes32 keep, uint256 amount); - event UpgradeInitiated(address newRewardsContract); - event UpgradeFinalized(uint256 amountTransferred); - - constructor( - address _token, - uint256 _firstIntervalStart, - uint256[] memory _intervalWeights, - uint256 _termLength, - uint256 _minimumKeepsPerInterval - ) public { - token = KeepToken(_token); - firstIntervalStart = _firstIntervalStart; - intervalWeights = _intervalWeights; - termLength = _termLength; - minimumKeepsPerInterval = _minimumKeepsPerInterval; - } - - /// @notice Funds the rewards contract. - /// @dev Adds the received amount of tokens to `totalRewards` and - /// `unallocatedRewards`. May be called at any time, even after allocating - /// some intervals. - /// If the contract has been upgraded, - /// the funding will be transferred to the new contract instead. - /// Changes to `unallocatedRewards` will take effect on subsequent interval - /// allocations. Intended to be used with `approveAndCall`. - /// If the reward contract has received tokens outside `approveAndCall`, - /// this collects them as well. - /// The following invariant should hold right after calling this function: - /// token.balanceOf(address(this)) == totalRewards.sub(dispensedRewards). - /// @param _from The original sender of the tokens. - /// Must have approved at least `_value` tokens for the rewards contract. - /// @param _value The amount of tokens to fund. - /// @param _token The token to fund the rewards in. - /// Must match the one specified in the rewards contract. - function receiveApproval( - address _from, - uint256 _value, - address _token, - bytes memory - ) public { - require(IERC20(_token) == token, "Unsupported token"); - - token.safeTransferFrom(_from, address(this), _value); - - uint256 currentBalance = token.balanceOf(address(this)); - uint256 beforeBalance = totalRewards.sub(dispensedRewards); - require( - currentBalance >= beforeBalance, - "Reward contract has lost tokens" - ); - - uint256 addedBalance = currentBalance.sub(beforeBalance); - - totalRewards = totalRewards.add(addedBalance); - deallocate(addedBalance); - } - - function markAsFunded() public onlyOwner { - funded = true; - } - - /// @notice Stakers can receive KEEP rewards from multiple keeps of their choice - /// in one transaction to reduce total cost comparing to single calls for rewards. - /// It is a caller responsibility to determine the cost and consumed gas when - /// receiving rewards from multiple keeps. - /// @param keepIdentifiers An array of keep identifiers. - function receiveRewards(bytes32[] memory keepIdentifiers) public { - for (uint256 i = 0; i < keepIdentifiers.length; i++) { - receiveReward(keepIdentifiers[i]); - } - } - - /// @notice Sends the reward for a keep to the keep members. - /// @param keepIdentifier A unique identifier for the keep, - /// e.g. address or number converted to a `bytes32`. - function receiveReward(bytes32 keepIdentifier) - public - factoryMustRecognize(keepIdentifier) - rewardsNotClaimed(keepIdentifier) - mustBeClosed(keepIdentifier) - { - _processKeep(true, keepIdentifier); - } - - /// @notice Report about the terminated keeps in batch. All the allocated - /// rewards in these keeps will be returned to the unallocated pool. - /// @param keepIdentifiers An array of keep identifiers. - function reportTerminations(bytes32[] memory keepIdentifiers) public { - for (uint256 i = 0; i < keepIdentifiers.length; i++) { - reportTermination(keepIdentifiers[i]); - } - } - - /// @notice Report that the keep was terminated, and return its allocated - /// rewards to the unallocated pool. - /// @param keepIdentifier The terminated keep. - function reportTermination(bytes32 keepIdentifier) - public - factoryMustRecognize(keepIdentifier) - rewardsNotClaimed(keepIdentifier) - mustBeTerminated(keepIdentifier) - { - _processKeep(false, keepIdentifier); - } - - /// @notice Checks if a keep is eligible to receive rewards. - /// @dev Keeps that close dishonorably or early are not eligible for rewards. - /// @param _keep The keep to check. - /// @return True if the keep is eligible, false otherwise - function eligibleForReward(bytes32 _keep) public view returns (bool) { - return - _recognizedByFactory(_keep) && - _isClosed(_keep) && - !rewardClaimed(_keep); - } - - /// @notice Checks if a keep is terminated and thus its rewards can be - /// returned to the unallocated pool. - /// @param _keep The keep to check. - /// @return True if the keep is terminated, false otherwise - function eligibleButTerminated(bytes32 _keep) public view returns (bool) { - return _recognizedByFactory(_keep) && _isTerminated(_keep); - } - - /// @notice Return the interval number the provided timestamp falls within. - /// @dev If the timestamp is before `firstIntervalStart`, the interval is 0. - /// @param timestamp The timestamp whose interval is queried. - /// @return The interval of the timestamp. - function intervalOf(uint256 timestamp) public view returns (uint256) { - uint256 _firstIntervalStart = firstIntervalStart; - uint256 _termLength = termLength; - - if (timestamp < _firstIntervalStart) { - return 0; - } - - uint256 difference = timestamp.sub(_firstIntervalStart); - uint256 interval = difference.div(_termLength); - - return interval; - } - - /// @notice Return the timestamp corresponding to the start of the interval. - /// @dev The start of an interval is inclusive; - /// a keep created at the timestamp `startOf(i)` is in interval `i`. - /// @param interval The interval whose start is queried. - /// @return The start timestamp of the interval. - function startOf(uint256 interval) public view returns (uint256) { - return firstIntervalStart.add(interval.mul(termLength)); - } - - /// @notice Return the timestamp corresponding to the end of the interval. - /// @dev The end of an interval is exclusive; - /// a keep created at the timestamp `endOf(i)` is in interval `i+1`. - /// @param interval The interval whose end is queried. - /// @return The end timestamp of the interval. - function endOf(uint256 interval) public view returns (uint256) { - return startOf(interval.add(1)); - } - - /// @notice Return whether the given interval is finished. - /// @param interval The interval. - /// @return Whether the interval is finished. - function isFinished(uint256 interval) public view returns (bool) { - return block.timestamp >= endOf(interval); - } - - /// @notice Return whether the given keep has already claimed rewards - /// or had its rewards reallocated due to termination. - /// @param _keep The identifier of the keep. - /// @return True if rewards have been paid out for the keep, - /// or its termination has been reported. - /// False otherwise. - function rewardClaimed(bytes32 _keep) public view returns (bool) { - return claimed[_keep]; - } - - /// @notice Return the number of keeps created in the specified interval. - /// @param interval The interval. - /// @return Number of keeps created in the interval. - function keepsInInterval(uint256 interval) public returns (uint256) { - return (_getEndpoint(interval).sub(_getPreviousEndpoint(interval))); - } - - /// @notice Return the percentage of remaining unallocated rewards - /// that is to be allocated to the specified interval. - /// @param interval The interval. - /// @return The percentage weight of the interval. - function getIntervalWeight(uint256 interval) public view returns (uint256) { - if (interval < intervalWeights.length) { - return intervalWeights[interval]; - } else { - return intervalWeights[intervalWeights.length - 1]; - } - } - - /// @notice Get the number of intervals with explicitly specified weights. - /// All subsequent intervals will have an implicit weight of 100. - /// @return The number of explicitly specified intervals. - function getIntervalCount() public view returns (uint256) { - return intervalWeights.length; - } - - /// @notice Allocate rewards for unallocated intervals up to and including - /// the given interval. - /// @dev The given interval must be finished and unallocated. - /// To allocate rewards correctly, any earlier intervals that are still - /// unallocated will be allocated before the given interval. - /// With reasonable interval lengths this should not pose a problem, - /// and if allocating a later interval results in an out-of-gas issue, - /// forcing the allocation of an earlier interval should fix it. - /// @param interval The interval to allocate. - function allocateRewards(uint256 interval) - public - mustBeFinished(interval) - mustBeFunded - { - uint256 allocatedIntervals = intervalAllocations.length; - require(!(interval < allocatedIntervals), "Interval already allocated"); - // Allocate previous intervals first - if (interval > allocatedIntervals) { - allocateRewards(interval.sub(1)); - } - uint256 totalAllocation = _adjustedAllocation(interval); - unallocatedRewards = unallocatedRewards.sub(totalAllocation); - intervalAllocations.push(totalAllocation); - } - - /// @notice Get the total amount of tokens - /// allocated for all keeps in the specified interval. - /// @dev This function returns correct results for any allocated interval. - /// Dividing the allocated rewards by the number of keeps in the interval - /// will give the correct reward for a keep in the interval. - /// However, if a keep in the interval is terminated - /// its reward will be returned to the pool of unallocated tokens. - /// This will not be reflected in the return value of this function. - /// @param interval A previously allocated interval. - /// @return The total number of tokens allocated for keeps in the interval. - function getAllocatedRewards(uint256 interval) - public - view - returns (uint256) - { - require( - interval < intervalAllocations.length, - "Interval not allocated yet" - ); - return intervalAllocations[interval]; - } - - /// @notice Return whether the specified interval has been allocated. - /// @param interval The interval. - /// @return Whether the interval has been allocated yet. - function isAllocated(uint256 interval) public view returns (bool) { - uint256 allocatedIntervals = intervalAllocations.length; - return (interval < allocatedIntervals); - } - - /// @notice Initiates the process of upgrading to another rewards contract. - /// @param _newRewardsContract The address of a new rewards contract. - function initiateRewardsUpgrade(address _newRewardsContract) - public - onlyOwner - { - upgradeInitiatedTimestamp = block.timestamp; - newRewardsContract = _newRewardsContract; - emit UpgradeInitiated(newRewardsContract); - } - - /// @notice Finalizes the process of upgrading to another rewards contract - /// by allocating all past intervals and then, transferring the - /// not-yet-allocated tokens to a new rewards contract. - /// Can be called only when the interval during which the upgrade was - /// initiated ended. - /// Before finalizing the upgrade, make sure all terminated groups are - /// reported. - function finalizeRewardsUpgrade() public onlyOwner { - require(upgradeInitiatedTimestamp != 0, "Upgrade not initiated"); - - uint256 currentInterval = intervalOf(block.timestamp); - uint256 upgradeInitiatedInterval = - intervalOf(upgradeInitiatedTimestamp); - - require( - currentInterval > upgradeInitiatedInterval, - "Interval at which the upgrade was initiated hasn't ended yet" - ); - - // ensure all past intervals are allocated - if (!isAllocated(currentInterval.sub(1))) { - allocateRewards(currentInterval.sub(1)); - } - - // transfer the unallocated KEEP to the new rewards contract and update - // this contract's balances - uint256 amountToTransfer = unallocatedRewards; - - totalRewards = totalRewards.sub(amountToTransfer); - unallocatedRewards = 0; - - emit UpgradeFinalized(amountToTransfer); - - bool success = - token.approveAndCall( - newRewardsContract, - amountToTransfer, - bytes("") - ); - require(success, "Upgrade finalization failed"); - - upgradeInitiatedTimestamp = 0; - upgradeFinalizedTimestamp = block.timestamp; - } - - /// @notice Return the number of keeps created before `intervalEndpoint` - /// @dev Wraps the binary search of `_find` - /// with a number of checks for edge cases. - function _findEndpoint(uint256 intervalEndpoint) - internal - view - returns (uint256) - { - require( - intervalEndpoint <= block.timestamp, - "interval hasn't ended yet" - ); - uint256 keepCount = _getKeepCount(); - // no keeps created yet -> return 0 - if (keepCount == 0) { - return 0; - } - - uint256 lb = 0; // lower bound, inclusive - uint256 timestampLB = _getCreationTime(_getKeepAtIndex(lb)); - // all keeps created after the interval -> return 0 - if (timestampLB >= intervalEndpoint) { - return 0; - } - - uint256 ub = keepCount.sub(1); // upper bound, inclusive - uint256 timestampUB = _getCreationTime(_getKeepAtIndex(ub)); - // all keeps created in or before the interval -> return keep count - if (timestampUB < intervalEndpoint) { - return keepCount; - } - - // The above cases also cover the case - // where only 1 keep has been created; - // lb == ub - // if it was created after the interval, return 0 - // otherwise, return 1 - - return _find(lb, timestampLB, ub, timestampUB, intervalEndpoint); - } - - /// @notice Return the number of keeps created before `targetTime`, - /// with specified upper and lower bounds. - /// @dev Binary search assumes the following invariants: - /// lower bound >= 0, lbTime < targetTime - /// upper bound < keepCount, ubTime >= targetTime - /// @param _lb The lower bound of the search (inclusive) - /// @param _lbTime The creation time of keep number `lb` - /// @param _ub The upper bound of the search (inclusive) - /// @param _ubTime The creation time of keep number `ub` - /// @param targetTime The target time - function _find( - uint256 _lb, - uint256 _lbTime, - uint256 _ub, - uint256 _ubTime, - uint256 targetTime - ) internal view returns (uint256) { - uint256 lb = _lb; - uint256 lbTime = _lbTime; - uint256 ub = _ub; - uint256 ubTime = _ubTime; - uint256 len = ub.sub(lb); - while (len > 1) { - // upper bound >= lower bound + 2 - // mid > lower bound - uint256 mid = lb.add(len.div(2)); - uint256 midTime = _getCreationTime(_getKeepAtIndex(mid)); - - if (midTime >= targetTime) { - ub = mid; - ubTime = midTime; - } else { - lb = mid; - lbTime = midTime; - } - len = ub.sub(lb); - } - return ub; - } - - /// @notice Return the endpoint index of the interval, - /// i.e. the number of keeps created in and before the interval. - /// The interval must have ended; otherwise the endpoint might still change. - /// @dev Uses a locally cached result, and stores the result if it isn't - /// cached yet. All keeps created before the initiation fall in interval 0. - /// @param interval The number of the interval. - /// @return endpoint The number of keeps the factory had created - /// before the end of the interval. - function _getEndpoint(uint256 interval) - internal - mustBeFinished(interval) - returns (uint256 endpoint) - { - // Get the endpoint from local cache; - // might not be recorded yet - uint256 maybeEndpoint = keepsByInterval[interval]; - - // Either the endpoint is zero - // (no keeps created by the end of the interval) - // or the endpoint isn't cached yet - if (maybeEndpoint == 0) { - // Check what the real endpoint is - // if the actual value is 0, this call short-circuits - // so we don't need to special-case the zero - uint256 realEndpoint = _findEndpoint(endOf(interval)); - // We didn't have the correct value cached, - // so store it - if (realEndpoint != 0) { - keepsByInterval[interval] = realEndpoint; - } - endpoint = realEndpoint; - } else { - endpoint = maybeEndpoint; - } - return endpoint; - } - - /// @notice Get the endpoint of the previous interval. - /// @dev Like _getEndpoint, gracefully handles the beginning of interval 0. - /// @param interval The interval. - /// @return The number of keeps created by the end of the preceding interval. - function _getPreviousEndpoint(uint256 interval) internal returns (uint256) { - if (interval == 0) { - return 0; - } else { - return _getEndpoint(interval.sub(1)); - } - } - - /// @notice Calculate the reward allocation for an interval - /// without adjusting for the number of keeps in the interval. - /// @param interval The next interval to be allocated. - /// Results for other intervals will not be accurate. - /// @return The base reward allocation for the interval. - function _baseAllocation(uint256 interval) internal view returns (uint256) { - uint256 _unallocatedRewards = unallocatedRewards; - uint256 weightPercentage = getIntervalWeight(interval); - return _unallocatedRewards.mul(weightPercentage).div(100); - } - - /// @notice Calculate the reward allocation for an interval - /// after adjusting for the number of keeps in the interval. - /// @dev An interval with at least `minimumKeepsPerInterval` keeps - /// will have the full reward allocated to it. - /// An interval with fewer keeps will only be allocated a fraction of the - /// base reward equaling the fraction of the quota that was met. - /// The reward allocated for each keep in the interval is constant - /// regardless of the number of keeps in the interval until the quota is - /// met, and further increases in the number of keeps will lead to the same - /// allocation being shared among more of them. Each keep in an interval is - /// allocated the same reward. If the number of keeps in an interval meets - /// the quota, but the base allocation isn't divisible by the number of - /// keeps, the remainder will remain unallocated. - /// Allocations for an already allocated interval, or when all prior - /// intervals haven't been allocated yet, will produce incorrect results. - /// @param interval The next interval to be allocated. - /// @return The amount of tokens to allocate as rewards for the interval. - function _adjustedAllocation(uint256 interval) internal returns (uint256) { - uint256 __baseAllocation = _baseAllocation(interval); - if (__baseAllocation == 0) { - return 0; - } - uint256 keepCount = keepsInInterval(interval); - uint256 adjustmentCount = Math.max(keepCount, minimumKeepsPerInterval); - if (adjustmentCount == 0) { - return 0; - } - // Rewards divide equally among keeps - return __baseAllocation.mul(keepCount).div(adjustmentCount); - } - - /// @notice Process the rewards for the given keep, allocating finished - /// intervals as necessary, and then either paying out the rewards to the - /// keep's members or returning them to the unallocated pool, depending on - /// the keep's eligibility. - /// @param eligible Whether the keep is eligible for rewards or not. - /// @param keepIdentifier The specified keep. - function _processKeep(bool eligible, bytes32 keepIdentifier) internal { - uint256 creationTime = _getCreationTime(keepIdentifier); - uint256 interval = intervalOf(creationTime); - if (!isAllocated(interval)) { - allocateRewards(interval); - } - uint256 allocation = intervalAllocations[interval]; - uint256 _keepsInInterval = keepsInInterval(interval); - uint256 perKeepReward = allocation.div(_keepsInInterval); - claimed[keepIdentifier] = true; - intervalKeepsProcessed[interval] = intervalKeepsProcessed[interval].add( - 1 - ); - - if (eligible) { - dispensedRewards = dispensedRewards.add(perKeepReward); - _distributeReward(keepIdentifier, perKeepReward); - emit RewardReceived(keepIdentifier, perKeepReward); - } else { - // Return the reward to the unallocated pool - deallocate(perKeepReward); - } - } - - /// @notice Return the given amount to the unallocated pool. - /// If the contract has been upgraded, - /// the deallocated amount will be sent to the new contract. - /// @param amount The amount to deallocate - function deallocate(uint256 amount) internal { - if (upgradeFinalizedTimestamp != 0) { - bool success = - token.approveAndCall(newRewardsContract, amount, bytes("")); - if (!success) { - unallocatedRewards = unallocatedRewards.add(amount); - } - } else { - unallocatedRewards = unallocatedRewards.add(amount); - } - } - - /// @notice Get the total number of keeps ever created by the factory, - /// including closed and terminated keeps. - /// @return The number of keeps. - function _getKeepCount() internal view returns (uint256); - - /// @notice Get the identifier of the keep at the given index, - /// when all keeps created by the factory are ordered by creation time. - /// @param index The index of the queried keep. - /// @return The `bytes32` identifier of the keep at the given index. - /// @dev Implementation is not required to check if a keep with the given - /// index exists. - function _getKeepAtIndex(uint256 index) internal view returns (bytes32); - - /// @notice Get the creation time of the given keep. - /// @param _keep The identifier of the keep. - /// @return The creation timestamp of the keep. - /// @dev If the idenfifier is invalid or not recognized by factory, function - /// may revert or return 0. - function _getCreationTime(bytes32 _keep) internal view returns (uint256); - - /// @notice Is the given keep closed. - /// @param _keep The identifier of the keep. - /// @return True if the keep is closed, false otherwise. - /// If the identifier is invalid, may return false or an error. - function _isClosed(bytes32 _keep) internal view returns (bool); - - /// @notice Is the given keep terminated. - /// @param _keep The identifier of the keep. - /// @return True if the keep is terminated, false otherwise. - /// If the identifier is invalid, may return false or an error. - function _isTerminated(bytes32 _keep) internal view returns (bool); - - /// @notice Does the given `bytes32` identifier match a valid keep. - /// @param _keep A possible keep identifier. - /// @return True if the identifier matches a keep created by the factory. - /// For any other identifier, must return false and not an error. - function _recognizedByFactory(bytes32 _keep) internal view returns (bool); - - /// @notice Pay the given amount of tokens to members of the keep. - /// @param _keep The keep whose members to reward. - /// @param amount The total amount of tokens to distribute to the members. - function _distributeReward(bytes32 _keep, uint256 amount) internal; - - modifier rewardsNotClaimed(bytes32 _keep) { - require(!rewardClaimed(_keep), "Rewards already claimed"); - _; - } - - modifier mustBeFinished(uint256 interval) { - require(isFinished(interval), "Interval hasn't ended yet"); - _; - } - - modifier mustBeClosed(bytes32 _keep) { - require(_isClosed(_keep), "Keep is not closed"); - _; - } - - modifier mustBeTerminated(bytes32 _keep) { - require(_isTerminated(_keep), "Keep is not terminated"); - _; - } - - modifier factoryMustRecognize(bytes32 _keep) { - require(_recognizedByFactory(_keep), "Keep not recognized by factory"); - _; - } - - modifier mustBeFunded() { - require(funded, "Contract has not been funded yet"); - _; - } -} diff --git a/solidity-v1/contracts/StakeDelegatable.sol b/solidity-v1/contracts/StakeDelegatable.sol deleted file mode 100644 index 0152885a87..0000000000 --- a/solidity-v1/contracts/StakeDelegatable.sol +++ /dev/null @@ -1,61 +0,0 @@ -/** -▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀ - ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ -▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ - - Trust math, not hardware. -*/ - -pragma solidity 0.5.17; - -import "./utils/OperatorParams.sol"; - -/// @title Stake Delegatable -/// @notice A base contract to allow stake delegation for staking contracts. -contract StakeDelegatable { - using OperatorParams for uint256; - - mapping(address => Operator) internal operators; - - struct Operator { - uint256 packedParams; - address owner; - address payable beneficiary; - address authorizer; - } - - /// @notice Gets the stake balance of the specified address. - /// @param _address The address to query the balance of. - /// @return An uint256 representing the amount staked by the passed address. - function balanceOf(address _address) public view returns (uint256 balance) { - return operators[_address].packedParams.getAmount(); - } - - /// @notice Gets the stake owner for the specified operator address. - /// @return Stake owner address. - function ownerOf(address _operator) public view returns (address) { - return operators[_operator].owner; - } - - /// @notice Gets the beneficiary for the specified operator address. - /// @return Beneficiary address. - function beneficiaryOf(address _operator) - public - view - returns (address payable) - { - return operators[_operator].beneficiary; - } - - /// @notice Gets the authorizer for the specified operator address. - /// @return Authorizer address. - function authorizerOf(address _operator) public view returns (address) { - return operators[_operator].authorizer; - } -} diff --git a/solidity-v1/contracts/StakingPortBacker.sol b/solidity-v1/contracts/StakingPortBacker.sol deleted file mode 100644 index 71368c1adc..0000000000 --- a/solidity-v1/contracts/StakingPortBacker.sol +++ /dev/null @@ -1,290 +0,0 @@ -/** -▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀ - ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ -▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ - - Trust math, not hardware. -*/ - -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol"; -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; - -import "./KeepToken.sol"; -import "./TokenGrant.sol"; -import "./StakeDelegatable.sol"; -import "./TokenStaking.sol"; -import "./libraries/RolesLookup.sol"; -import "./utils/BytesLib.sol"; -import "./TokenSender.sol"; - -/// @title StakingPortBacker -/// @notice Provides additional liquidity from the primary token supply for -/// token owners staking on the previous staking contract version and letting -/// them to stake on the new staking contract version without having to wait -/// for the entire undelegation period to unlock their tokens. -/// -/// It lets the Keep team to make an amount of KEEP tokens available to -/// temporarily stake on behalf of a token owner, provided that they have those -/// same tokens currently locked up in the old staking contract. Undelegation of -/// all tokens in the new staking contract would be blocked until the -/// temporarily-staked tokens provided by the Keep team are repaid by the token -/// owner. -/// -/// The expected mode of usage for users who have already staked on the old -/// contract is to: -/// 1. Copy stake. -/// 2. Undelegate from the old staking contract. -/// 3. Operate as normal on the new staking contract. -/// 4. Once the old staking contract's undelegated balance is available for -/// recovery, recover it and use the recovered tokens to repay the -/// StakingPortBacker contract. -contract StakingPortBacker is Ownable { - using SafeERC20 for IERC20; - using SafeMath for uint256; - using BytesLib for bytes; - using RolesLookup for address payable; - - event StakeCopied( - address indexed owner, - address indexed operator, - uint256 value - ); - event StakePaidBack(address indexed owner, address indexed operator); - event TokensWithdrawn(uint256 amount); - - /// @notice The maximum allowed time for the token owner to repay the - /// delegation backed by tokens from this contract. After this time, the - /// owner of the contract can undelegate and recover not paid back - /// delegations. - uint256 public constant maxAllowedBackingDuration = 7776000; // ~3 months - - IERC20 public keepToken; - TokenGrant internal tokenGrant; - StakeDelegatable public oldStakingContract; - TokenStaking public newStakingContract; - - struct CopiedStake { - address owner; - uint256 amount; - uint256 timestamp; - bool paidBack; - } - - mapping(address => bool) public allowedOperators; // operator -> allowed to copy? - mapping(address => CopiedStake) public copiedStakes; // operator -> copied stake info - - constructor( - IERC20 _keepToken, - TokenGrant _tokenGrant, - StakeDelegatable _oldStakingContract, - TokenStaking _newStakingContract - ) public { - keepToken = _keepToken; - tokenGrant = _tokenGrant; - oldStakingContract = _oldStakingContract; - newStakingContract = _newStakingContract; - } - - /// @notice Lets the owner of the contract to register operator from staking - /// relationships that will be allowed to use the token supply provided by - /// this contract. - /// @dev The reason for explicitly listing which relationships are allowed - /// to use the supply is to avoid a situation when someone stakes on the old - /// contract later, after deploying the new staking contract version, just - /// to drain the supply from this contract. - /// @param operator The operator from the staking relationship on the old - /// staking contract that will be allowed to use the token supply provided - /// by this contract. - function allowOperator(address operator) public onlyOwner { - allowedOperators[operator] = true; - } - - /// @notice Lets the owner of the contract to register operators from - /// staking relationships that will be allowed to use the token supply - /// provided by this contract. - /// @dev The reason for explicitly listing which relationships are allowed - /// to use the supply is to avoid a situation when someone stakes on the old - /// contract later, after deploying the new staking contract version, just - /// to drain the supply from this contract. - /// @param operators Array of operator addresses from the staking - /// relationships on the old staking contract that will be allowed to use - /// the token supply provided by this contract. - function allowOperators(address[] memory operators) public onlyOwner { - for (uint256 i = 0; i < operators.length; i++) { - allowOperator(operators[i]); - } - } - - /// @notice Copies staking relationship from the old token staking contract - /// to the new staking contract. Only the owner of the relationship can copy - /// it to the new staking contract, the relationship can only be copied once, - /// and undelegation must not be complete on that relationship. - /// Operator, beneficiary, authorizer, and stake amount will be the same - /// as in the original delegation. Until the delegation is repaid, this - /// contract is the owner of the delegation on the new staking contract. - /// @param operator The operator from the staking relationship on the old - /// staking contract that should be copied to the new staking contract. - function copyStake(address operator) public { - uint256 oldStakeBalance = oldStakingContract.balanceOf(operator); - require(oldStakeBalance > 0, "No stake on the old staking contract"); - require(copiedStakes[operator].amount == 0, "Stake already copied"); - require(allowedOperators[operator], "Operator not allowed"); - - // Get the delegation data from the old TokenStaking contract. - (address delegationOwner, bytes memory delegationData) = - getDelegation(operator); - - if (delegationOwner != msg.sender) { - // Sender is not the owner of the relationship, but it is possible - // it is grantee or managed grantee. We can't rely on - // TokenGrant.granteesToOperators because we need to ensure the - // relationship between msg.sender and the specific staking contract - // (the instance from which we are migrating). The only option is to - // use TokenGrant.grantStakes. - (uint256 grantId, address stakingContract, address grantee) = - getGrantDelegation(operator); - require( - stakingContract == address(oldStakingContract), - "Unexpected grant staking contract" - ); - require( - msg.sender == grantee || - msg.sender.isManagedGranteeForGrant(grantId, tokenGrant), - "Not authorized" - ); - } - - copiedStakes[operator] = CopiedStake( - msg.sender, - oldStakeBalance, - block.timestamp, - false - ); - - TokenSender(address(keepToken)).approveAndCall( - address(newStakingContract), - oldStakeBalance, - delegationData - ); - - emit StakeCopied(msg.sender, operator, oldStakeBalance); - } - - /// @notice Used by the original staking relationship owner to pay back for - /// the delegation. Once the delegation is paid back, the staking relationship - /// ownership on the new staking contract is transferred to the owner of the - /// delegation in the old staking contract version. - /// @param from The owner of the tokens who approved them to transfer. - /// It has to be the owner of the original relationship. - /// @param value Approved amount for the transfer. It has to be the same - /// as the amount of tokens in the original staking relationship at the - /// moment when this relationship was copied to the new staking contract. - /// @param token KEEP token contract address. - /// @param extraData ABI-encoded operator address from the staking - /// relationship that is repaid. - function receiveApproval( - address from, - uint256 value, - address token, - bytes memory extraData - ) public { - require(token == address(keepToken), "Not a KEEP token"); - require(extraData.length == 32, "Corrupted input data"); - address operator = abi.decode(extraData, (address)); - - CopiedStake memory stake = copiedStakes[operator]; - require(stake.amount > 0, "Stake not copied for the operator"); - require(!stake.paidBack, "Already paid back"); - require(from == stake.owner, "Not authorized to pay back"); - require(value == stake.amount, "Unexpected amount"); - - // Transfer tokens to this contract. - keepToken.safeTransferFrom(from, address(this), value); - copiedStakes[operator].paidBack = true; - - newStakingContract.transferStakeOwnership(operator, stake.owner); - - emit StakePaidBack(stake.owner, operator); - } - - /// @notice Undelegates stake on the new staking contract from the provided - /// operator. - /// @param operator The operator address. - function undelegate(address operator) public { - CopiedStake memory stake = copiedStakes[operator]; - require( - stake.owner == msg.sender || operator == msg.sender, - "Not authorized" - ); - newStakingContract.undelegate(operator); - } - - /// @notice Force-undelegates stake on the new staking contract from the - /// provided operator. Used by the owner of this contract to undelegate - /// stake if the delegation has not been paid back on time. - /// @param operator The operator address. - function forceUndelegate(address operator) public onlyOwner { - CopiedStake memory stake = copiedStakes[operator]; - require( - stake.timestamp.add(maxAllowedBackingDuration) < block.timestamp, - "Maximum allowed backing duration not exceeded yet" - ); - newStakingContract.undelegate(operator); - } - - /// @notice Recovers stake on the new staking contract from the provided - /// operator. - /// @param operator The operator address. - function recoverStake(address operator) public { - newStakingContract.recoverStake(operator); - } - - /// @notice Allows the contract owner to withdraw tokens from the balance - /// the contract has available to back stake copying. - /// @param amount The amount of tokens that should be withdrawn. - function withdraw(uint256 amount) public onlyOwner { - keepToken.safeTransfer(owner(), amount); - emit TokensWithdrawn(amount); - } - - function getDelegation(address operator) - internal - view - returns (address delegationOwner, bytes memory delegationData) - { - delegationOwner = oldStakingContract.ownerOf(operator); - address beneficiary = oldStakingContract.beneficiaryOf(operator); - address authorizer = oldStakingContract.authorizerOf(operator); - delegationData = abi.encodePacked(beneficiary, operator, authorizer); - } - - function getGrantDelegation(address operator) - internal - view - returns ( - uint256 grantId, - address stakingContract, - address grantee - ) - { - // Preliminary check for user's convenience. For non-existing delegations - // getGrantStakeDetails reverts with no clear message. - require( - address(tokenGrant.grantStakes(operator)) != address(0), - "No grant delegated for the operator" - ); - (grantId, , stakingContract) = tokenGrant.getGrantStakeDetails( - operator - ); - (, , , , , grantee) = tokenGrant.getGrant(grantId); - } -} diff --git a/solidity-v1/contracts/TokenGrant.sol b/solidity-v1/contracts/TokenGrant.sol deleted file mode 100644 index 60edbe32c0..0000000000 --- a/solidity-v1/contracts/TokenGrant.sol +++ /dev/null @@ -1,596 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol"; -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "./libraries/grant/UnlockingSchedule.sol"; -import "./utils/BytesLib.sol"; -import "./utils/AddressArrayUtils.sol"; -import "./TokenStaking.sol"; -import "./TokenGrantStake.sol"; -import "./GrantStakingPolicy.sol"; - -/// @title TokenGrant -/// @notice A token grant contract for a specified standard ERC20Burnable token. -/// Has additional functionality to stake delegate/undelegate token grants. -/// Tokens are granted to the grantee via unlocking scheme and can be -/// withdrawn gradually based on the unlocking schedule cliff and unlocking duration. -/// Optionally grant can be revoked by the token grant manager. -contract TokenGrant { - using SafeMath for uint256; - using UnlockingSchedule for uint256; - using SafeERC20 for ERC20Burnable; - using BytesLib for bytes; - using AddressArrayUtils for address[]; - - event TokenGrantCreated(uint256 id); - event TokenGrantWithdrawn(uint256 indexed grantId, uint256 amount); - event TokenGrantStaked( - uint256 indexed grantId, - uint256 amount, - address operator - ); - event TokenGrantRevoked(uint256 id); - - event StakingContractAuthorized( - address indexed grantManager, - address stakingContract - ); - - struct Grant { - address grantManager; // Token grant manager. - address grantee; // Address to which granted tokens are going to be withdrawn. - uint256 revokedAt; // Timestamp at which grant was revoked by the grant manager. - uint256 revokedAmount; // The number of tokens revoked from the grantee. - uint256 revokedWithdrawn; // The number of tokens returned to the grant creator. - bool revocable; // Whether grant manager can revoke the grant. - uint256 amount; // Amount of tokens to be granted. - uint256 duration; // Duration in seconds of the period in which the granted tokens will unlock. - uint256 start; // Timestamp at which the linear unlocking schedule will start. - uint256 cliff; // Timestamp before which no tokens will be unlocked. - uint256 withdrawn; // Amount that was withdrawn to the grantee. - uint256 staked; // Amount that was staked by the grantee. - GrantStakingPolicy stakingPolicy; - } - - uint256 public numGrants; - - ERC20Burnable public token; - - // Staking contracts authorized by the given grant manager. - // grant manager -> staking contract -> authorized? - mapping(address => mapping(address => bool)) internal stakingContracts; - - // Token grants. - mapping(uint256 => Grant) public grants; - - // Token grants stakes. - mapping(address => TokenGrantStake) public grantStakes; - - // Mapping of token grant IDs per particular address - // involved in a grant as a grantee or as a grant manager. - mapping(address => uint256[]) public grantIndices; - - // Token grants balances. Sum of all granted tokens to a grantee. - // This includes granted tokens that are already unlocked and - // available to be withdrawn to the grantee - mapping(address => uint256) public balances; - - // Mapping of operator addresses per particular grantee address. - mapping(address => address[]) public granteesToOperators; - - /// @notice Creates a token grant contract for a provided Standard ERC20Burnable token. - /// @param _tokenAddress address of a token that will be linked to this contract. - constructor(address _tokenAddress) public { - require(_tokenAddress != address(0x0), "Token address can't be zero."); - token = ERC20Burnable(_tokenAddress); - } - - /// @notice Used by grant manager to authorize staking contract with the given - /// address. - function authorizeStakingContract(address _stakingContract) public { - require( - _stakingContract != address(0x0), - "Staking contract address can't be zero" - ); - stakingContracts[msg.sender][_stakingContract] = true; - emit StakingContractAuthorized(msg.sender, _stakingContract); - } - - /// @notice Gets the amount of granted tokens to the specified address. - /// @param _owner The address to query the grants balance of. - /// @return An uint256 representing the grants balance owned by the passed address. - function balanceOf(address _owner) public view returns (uint256 balance) { - return balances[_owner]; - } - - /// @notice Gets the stake balance of the specified address. - /// @param _address The address to query the balance of. - /// @return An uint256 representing the amount staked by the passed address. - function stakeBalanceOf(address _address) - public - view - returns (uint256 balance) - { - for (uint256 i = 0; i < grantIndices[_address].length; i++) { - uint256 id = grantIndices[_address][i]; - balance += grants[id].staked; - } - return balance; - } - - /// @notice Gets grant by ID. Returns only basic grant data. - /// If you need unlocking schedule for the grant you must call `getGrantUnlockingSchedule()` - /// This is to avoid Ethereum `Stack too deep` issue described here: - /// https://forum.ethereum.org/discussion/2400/error-stack-too-deep-try-removing-local-variables - /// @param _id ID of the token grant. - /// @return amount The amount of tokens the grant provides. - /// @return withdrawn The amount of tokens that have already been withdrawn - /// from the grant. - /// @return staked The amount of tokens that have been staked from the grant. - /// @return revoked A boolean indicating whether the grant has been revoked, - /// which is to say that it is no longer unlocking. - /// @return grantee The grantee of grant. - function getGrant(uint256 _id) - public - view - returns ( - uint256 amount, - uint256 withdrawn, - uint256 staked, - uint256 revokedAmount, - uint256 revokedAt, - address grantee - ) - { - return ( - grants[_id].amount, - grants[_id].withdrawn, - grants[_id].staked, - grants[_id].revokedAmount, - grants[_id].revokedAt, - grants[_id].grantee - ); - } - - /// @notice Gets grant unlocking schedule by grant ID. - /// @param _id ID of the token grant. - /// @return grantManager The address designated as the manager of the grant, - /// which is the only address that can revoke this grant. - /// @return duration The duration, in seconds, during which the tokens will - /// unlocking linearly. - /// @return start The start time, as a timestamp comparing to `now`. - /// @return cliff The timestamp, before which none of the tokens in the grant - /// will be unlocked, and after which a linear amount based on - /// the time elapsed since the start will be unlocked. - /// @return policy The address of the grant's staking policy. - function getGrantUnlockingSchedule(uint256 _id) - public - view - returns ( - address grantManager, - uint256 duration, - uint256 start, - uint256 cliff, - address policy - ) - { - return ( - grants[_id].grantManager, - grants[_id].duration, - grants[_id].start, - grants[_id].cliff, - address(grants[_id].stakingPolicy) - ); - } - - /// @notice Gets grant ids of the specified address. - /// @param _granteeOrGrantManager The address to query. - /// @return An uint256 array of grant IDs. - function getGrants(address _granteeOrGrantManager) - public - view - returns (uint256[] memory) - { - return grantIndices[_granteeOrGrantManager]; - } - - /// @notice Gets operator addresses of the specified grantee address. - /// @param grantee The grantee address. - /// @return An array of all operators for a given grantee. - function getGranteeOperators(address grantee) - public - view - returns (address[] memory) - { - return granteesToOperators[grantee]; - } - - /// @notice Gets grant stake details of the given operator. - /// @param operator The operator address. - /// @return grantId ID of the token grant. - /// @return amount The amount of tokens the given operator delegated. - /// @return stakingContract The address of staking contract. - function getGrantStakeDetails(address operator) - public - view - returns ( - uint256 grantId, - uint256 amount, - address stakingContract - ) - { - return grantStakes[operator].getDetails(); - } - - /// @notice Receives approval of token transfer and creates a token grant with a unlocking - /// schedule where balance withdrawn to the grantee gradually in a linear fashion until - /// start + duration. By then all of the balance will have unlocked. - /// @param _from The owner of the tokens who approved them to transfer. - /// @param _amount Approved amount for the transfer to create token grant. - /// @param _token Token contract address. - /// @param _extraData This byte array must have the following values ABI encoded: - /// grantManager (address) Address of the grant manager. - /// grantee (address) Address of the grantee. - /// duration (uint256) Duration in seconds of the unlocking period. - /// start (uint256) Timestamp at which unlocking will start. - /// cliffDuration (uint256) Duration in seconds of the cliff; - /// no tokens will be unlocked until the time `start + cliff`. - /// revocable (bool) Whether the token grant is revocable or not (1 or 0). - /// stakingPolicy (address) Address of the staking policy for the grant. - function receiveApproval( - address _from, - uint256 _amount, - address _token, - bytes memory _extraData - ) public { - require( - ERC20Burnable(_token) == token, - "Token contract must be the same one linked to this contract." - ); - require( - _amount <= token.balanceOf(_from), - "Sender must have enough amount." - ); - ( - address _grantManager, - address _grantee, - uint256 _duration, - uint256 _start, - uint256 _cliffDuration, - bool _revocable, - address _stakingPolicy - ) = - abi.decode( - _extraData, - (address, address, uint256, uint256, uint256, bool, address) - ); - - require(_grantee != address(0), "Grantee address can't be zero."); - require( - _cliffDuration <= _duration, - "Unlocking cliff duration must be less or equal total unlocking duration." - ); - - require(_stakingPolicy != address(0), "Staking policy can't be zero."); - - uint256 id = numGrants++; - grants[id] = Grant( - _grantManager, - _grantee, - 0, - 0, - 0, - _revocable, - _amount, - _duration, - _start, - _start.add(_cliffDuration), - 0, - 0, - GrantStakingPolicy(_stakingPolicy) - ); - - // Maintain a record to make it easier to query grants by grant manager. - grantIndices[_from].push(id); - - // Maintain a record to make it easier to query grants by grantee. - grantIndices[_grantee].push(id); - - token.safeTransferFrom(_from, address(this), _amount); - - // Maintain a record of the unlocked amount - balances[_grantee] = balances[_grantee].add(_amount); - emit TokenGrantCreated(id); - } - - /// @notice Withdraws Token grant amount to grantee. - /// @dev Transfers unlocked tokens of the token grant to grantee. - /// @param _id Grant ID. - function withdraw(uint256 _id) public { - uint256 amount = withdrawable(_id); - require( - amount > 0, - "Grant available to withdraw amount should be greater than zero." - ); - - // Update withdrawn amount. - grants[_id].withdrawn = grants[_id].withdrawn.add(amount); - - // Update grantee grants balance. - balances[grants[_id].grantee] = balances[grants[_id].grantee].sub( - amount - ); - - // Transfer tokens from this contract balance to the grantee token balance. - token.safeTransfer(grants[_id].grantee, amount); - - emit TokenGrantWithdrawn(_id, amount); - } - - /// @notice Calculates and returns unlocked grant amount. - /// @dev Calculates token grant amount that has already unlocked, - /// including any tokens that have already been withdrawn by the grantee as well - /// as any tokens that are available to withdraw but have not yet been withdrawn. - /// @param _id Grant ID. - function unlockedAmount(uint256 _id) public view returns (uint256) { - Grant storage grant = grants[_id]; - return - (grant.revokedAt != 0) // Grant revoked -> return what is remaining - ? grant.amount.sub(grant.revokedAmount) // Not revoked -> calculate the unlocked amount normally - : now.getUnlockedAmount( - grant.amount, - grant.duration, - grant.start, - grant.cliff - ); - } - - /// @notice Calculates withdrawable granted amount. - /// @dev Calculates the amount that has already unlocked but hasn't been withdrawn yet. - /// @param _id Grant ID. - function withdrawable(uint256 _id) public view returns (uint256) { - uint256 unlocked = unlockedAmount(_id); - uint256 withdrawn = grants[_id].withdrawn; - uint256 staked = grants[_id].staked; - - if (withdrawn.add(staked) >= unlocked) { - return 0; - } else { - return unlocked.sub(withdrawn).sub(staked); - } - } - - /// @notice Allows the grant manager to revoke the grant. - /// @dev Granted tokens that are already unlocked (releasable amount) - /// remain in the grant so grantee can still withdraw them - /// the rest are revoked and withdrawable by token grant manager. - /// @param _id Grant ID. - function revoke(uint256 _id) public { - require( - grants[_id].grantManager == msg.sender, - "Only grant manager can revoke." - ); - require( - grants[_id].revocable, - "Grant must be revocable in the first place." - ); - require( - grants[_id].revokedAt == 0, - "Grant must not be already revoked." - ); - - uint256 unlockedAmount = unlockedAmount(_id); - uint256 revokedAmount = grants[_id].amount.sub(unlockedAmount); - grants[_id].revokedAt = now; - grants[_id].revokedAmount = revokedAmount; - - // Update grantee's grants balance. - balances[grants[_id].grantee] = balances[grants[_id].grantee].sub( - revokedAmount - ); - emit TokenGrantRevoked(_id); - } - - /// @notice Allows the grant manager to withdraw revoked tokens. - /// @dev Will withdraw as many of the revoked tokens as possible - /// without pushing the grant contract into a token deficit. - /// If the grantee has staked more tokens than the unlocked amount, - /// those tokens will remain in the grant until undelegated and returned, - /// after which they can be withdrawn by calling `withdrawRevoked` again. - /// @param _id Grant ID. - function withdrawRevoked(uint256 _id) public { - Grant storage grant = grants[_id]; - require( - grant.grantManager == msg.sender, - "Only grant manager can withdraw revoked tokens." - ); - uint256 revoked = grant.revokedAmount; - uint256 revokedWithdrawn = grant.revokedWithdrawn; - require(revokedWithdrawn < revoked, "All revoked tokens withdrawn."); - - uint256 revokedRemaining = revoked.sub(revokedWithdrawn); - - uint256 totalAmount = grant.amount; - uint256 staked = grant.staked; - uint256 granteeWithdrawn = grant.withdrawn; - uint256 remainingPresentInGrant = - totalAmount.sub(staked).sub(revokedWithdrawn).sub(granteeWithdrawn); - - require(remainingPresentInGrant > 0, "No revoked tokens withdrawable."); - - uint256 amountToWithdraw = - remainingPresentInGrant < revokedRemaining - ? remainingPresentInGrant - : revokedRemaining; - token.safeTransfer(msg.sender, amountToWithdraw); - grant.revokedWithdrawn += amountToWithdraw; - } - - /// @notice Stake token grant. - /// @dev Stakable token grant amount is determined - /// by the grant's staking policy. - /// @param _id Grant Id. - /// @param _stakingContract Address of the staking contract. - /// @param _amount Amount to stake. - /// @param _extraData Data for stake delegation. This byte array must have - /// the following values concatenated: - /// - Beneficiary address (20 bytes) - /// - Operator address (20 bytes) - /// - Authorizer address (20 bytes) - function stake( - uint256 _id, - address _stakingContract, - uint256 _amount, - bytes memory _extraData - ) public { - require( - grants[_id].grantee == msg.sender, - "Only grantee of the grant can stake it." - ); - require(grants[_id].revokedAt == 0, "Revoked grant can not be staked"); - require( - stakingContracts[grants[_id].grantManager][_stakingContract], - "Provided staking contract is not authorized." - ); - - // Expecting 60 bytes _extraData for stake delegation. - require( - _extraData.length == 60, - "Stake delegation data must be provided." - ); - address operator = _extraData.toAddress(20); - - // Calculate available amount. Amount of unlocked tokens minus what user already withdrawn and staked. - require( - _amount <= availableToStake(_id), - "Must have available granted amount to stake." - ); - - // Keep staking record. - TokenGrantStake grantStake = - new TokenGrantStake(address(token), _id, _stakingContract); - grantStakes[operator] = grantStake; - granteesToOperators[grants[_id].grantee].push(operator); - grants[_id].staked += _amount; - - token.transfer(address(grantStake), _amount); - - // Staking contract expects 40 bytes _extraData for stake delegation. - // 20 bytes beneficiary's address + 20 bytes operator's address. - grantStake.stake(_amount, _extraData); - emit TokenGrantStaked(_id, _amount, operator); - } - - /// @notice Returns the amount of tokens available for staking from the grant. - /// The stakeable amount is determined by the staking policy of the grant. - /// If the grantee has withdrawn some tokens - /// or the policy returns an erroneously high value, - /// the stakeable amount is limited to the number of tokens remaining. - /// @param _grantId Identifier of the grant - function availableToStake(uint256 _grantId) public view returns (uint256) { - Grant storage grant = grants[_grantId]; - // Revoked grants cannot be staked. - // If the grant isn't revoked, the number of revoked tokens is 0. - if (grant.revokedAt != 0) { - return 0; - } - uint256 amount = grant.amount; - uint256 withdrawn = grant.withdrawn; - uint256 remaining = amount.sub(withdrawn); - uint256 stakeable = - grant.stakingPolicy.getStakeableAmount( - now, - amount, - grant.duration, - grant.start, - grant.cliff, - withdrawn - ); - // Clamp the stakeable amount to what is left in the grant - // in the case of a malfunctioning staking policy. - if (stakeable > remaining) { - stakeable = remaining; - } - - return stakeable.sub(grant.staked); - } - - /// @notice Cancels delegation within the operator initialization period - /// without being subjected to the stake lockup for the undelegation period. - /// This can be used to undo mistaken delegation to the wrong operator address. - /// @param _operator Address of the stake operator. - function cancelStake(address _operator) public { - TokenGrantStake grantStake = grantStakes[_operator]; - uint256 grantId = grantStake.getGrantId(); - require( - msg.sender == _operator || msg.sender == grants[grantId].grantee, - "Only operator or grantee can cancel the delegation." - ); - - uint256 returned = grantStake.cancelStake(); - grants[grantId].staked = grants[grantId].staked.sub(returned); - } - - /// @notice Undelegate the token grant. - /// @param _operator Operator of the stake. - function undelegate(address _operator) public { - TokenGrantStake grantStake = grantStakes[_operator]; - uint256 grantId = grantStake.getGrantId(); - require( - msg.sender == _operator || msg.sender == grants[grantId].grantee, - "Only operator or grantee can undelegate." - ); - - grantStake.undelegate(); - } - - /// @notice Force cancellation of a revoked grant's stake. - /// Can be used by the grant manager - /// to immediately withdraw tokens back into the grant, - /// from an operator still within the initialization period. - /// These tokens can then be withdrawn - /// if some revoked tokens haven't been withdrawn yet. - function cancelRevokedStake(address _operator) public { - TokenGrantStake grantStake = grantStakes[_operator]; - uint256 grantId = grantStake.getGrantId(); - require(grants[grantId].revokedAt != 0, "Grant must be revoked"); - require( - msg.sender == grants[grantId].grantManager, - "Only grant manager can force cancellation of revoked grant stake." - ); - - uint256 returned = grantStake.cancelStake(); - grants[grantId].staked = grants[grantId].staked.sub(returned); - } - - /// @notice Force undelegation of a revoked grant's stake. - /// @dev Can be called by the grant manager once the grant is revoked. - /// Has to be done this way, instead of undelegating all operators when the - /// grant is revoked, because the latter method is vulnerable to DoS via - /// out-of-gas. - function undelegateRevoked(address _operator) public { - TokenGrantStake grantStake = grantStakes[_operator]; - uint256 grantId = grantStake.getGrantId(); - require(grants[grantId].revokedAt != 0, "Grant must be revoked"); - require( - msg.sender == grants[grantId].grantManager, - "Only grant manager can force undelegation of revoked grant stake" - ); - - grantStake.undelegate(); - } - - /// @notice Recover stake of the token grant. - /// Recovers the tokens correctly - /// even if they were earlier recovered directly in the staking contract. - /// @param _operator Operator of the stake. - function recoverStake(address _operator) public { - TokenGrantStake grantStake = grantStakes[_operator]; - uint256 returned = grantStake.recoverStake(); - uint256 grantId = grantStake.getGrantId(); - grants[grantId].staked = grants[grantId].staked.sub(returned); - - delete grantStakes[_operator]; - } -} diff --git a/solidity-v1/contracts/TokenGrantStake.sol b/solidity-v1/contracts/TokenGrantStake.sol deleted file mode 100644 index 8a80b18ef7..0000000000 --- a/solidity-v1/contracts/TokenGrantStake.sol +++ /dev/null @@ -1,109 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol"; -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "./TokenStaking.sol"; -import "./TokenSender.sol"; -import "./utils/BytesLib.sol"; - -/// @dev Interface of sender contract for approveAndCall pattern. -interface tokenSender { - function approveAndCall( - address _spender, - uint256 _value, - bytes calldata _extraData - ) external; -} - -contract TokenGrantStake { - using SafeMath for uint256; - using BytesLib for bytes; - - ERC20Burnable token; - TokenStaking tokenStaking; - - address tokenGrant; // Address of the master grant contract. - - uint256 grantId; // ID of the grant for this stake. - uint256 amount; // Amount of staked tokens. - address operator; // Operator of the stake. - - constructor( - address _tokenAddress, - uint256 _grantId, - address _tokenStaking - ) public { - require(_tokenAddress != address(0x0), "Token address can't be zero."); - require( - _tokenStaking != address(0x0), - "Staking contract address can't be zero." - ); - - token = ERC20Burnable(_tokenAddress); - tokenGrant = msg.sender; - grantId = _grantId; - tokenStaking = TokenStaking(_tokenStaking); - } - - function stake(uint256 _amount, bytes memory _extraData) public onlyGrant { - amount = _amount; - operator = _extraData.toAddress(20); - tokenSender(address(token)).approveAndCall( - address(tokenStaking), - _amount, - _extraData - ); - } - - function getGrantId() public view onlyGrant returns (uint256) { - return grantId; - } - - function getAmount() public view onlyGrant returns (uint256) { - return amount; - } - - function getStakingContract() public view onlyGrant returns (address) { - return address(tokenStaking); - } - - function getDetails() - public - view - onlyGrant - returns ( - uint256 _grantId, - uint256 _amount, - address _tokenStaking - ) - { - return (grantId, amount, address(tokenStaking)); - } - - function cancelStake() public onlyGrant returns (uint256) { - tokenStaking.cancelStake(operator); - return returnTokens(); - } - - function undelegate() public onlyGrant { - tokenStaking.undelegate(operator); - } - - function recoverStake() public onlyGrant returns (uint256) { - tokenStaking.recoverStake(operator); - return returnTokens(); - } - - function returnTokens() internal returns (uint256) { - uint256 returnedAmount = token.balanceOf(address(this)); - amount -= returnedAmount; - token.transfer(tokenGrant, returnedAmount); - return returnedAmount; - } - - modifier onlyGrant { - require(msg.sender == tokenGrant, "For token grant contract only"); - _; - } -} diff --git a/solidity-v1/contracts/TokenSender.sol b/solidity-v1/contracts/TokenSender.sol deleted file mode 100644 index 3c635d78d2..0000000000 --- a/solidity-v1/contracts/TokenSender.sol +++ /dev/null @@ -1,10 +0,0 @@ -pragma solidity 0.5.17; - -/// @dev Interface of sender contract for approveAndCall pattern. -interface TokenSender { - function approveAndCall( - address _spender, - uint256 _value, - bytes calldata _extraData - ) external; -} diff --git a/solidity-v1/contracts/TokenStaking.sol b/solidity-v1/contracts/TokenStaking.sol deleted file mode 100644 index 43ffa9613f..0000000000 --- a/solidity-v1/contracts/TokenStaking.sol +++ /dev/null @@ -1,702 +0,0 @@ -/** -▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀ - ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ -▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ - - Trust math, not hardware. -*/ - -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol"; -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "./StakeDelegatable.sol"; -import "./libraries/staking/MinimumStakeSchedule.sol"; -import "./libraries/staking/GrantStaking.sol"; -import "./libraries/staking/Locks.sol"; -import "./libraries/staking/TopUps.sol"; -import "./utils/PercentUtils.sol"; -import "./utils/BytesLib.sol"; -import "./Authorizations.sol"; - -/// @title TokenStaking -/// @notice A token staking contract for a specified standard ERC20Burnable token. -/// A holder of the specified token can stake delegate its tokens to this contract -/// and recover the stake after undelegation period is over. -contract TokenStaking is Authorizations, StakeDelegatable { - using BytesLib for bytes; - using SafeMath for uint256; - using PercentUtils for uint256; - using SafeERC20 for ERC20Burnable; - using GrantStaking for GrantStaking.Storage; - using Locks for Locks.Storage; - using TopUps for TopUps.Storage; - - event StakeDelegated(address indexed owner, address indexed operator); - event OperatorStaked( - address indexed operator, - address indexed beneficiary, - address indexed authorizer, - uint256 value - ); - event StakeOwnershipTransferred( - address indexed operator, - address indexed newOwner - ); - event TopUpInitiated(address indexed operator, uint256 topUp); - event TopUpCompleted(address indexed operator, uint256 newAmount); - event Undelegated(address indexed operator, uint256 undelegatedAt); - event RecoveredStake(address operator); - event TokensSlashed(address indexed operator, uint256 amount); - event TokensSeized(address indexed operator, uint256 amount); - event StakeLocked( - address indexed operator, - address lockCreator, - uint256 until - ); - event LockReleased(address indexed operator, address lockCreator); - event ExpiredLockReleased(address indexed operator, address lockCreator); - - uint256 public deployedAt; - uint256 public initializationPeriod; // varies between mainnet and testnet - - ERC20Burnable internal token; - TokenGrant internal tokenGrant; - - GrantStaking.Storage internal grantStaking; - Locks.Storage internal locks; - TopUps.Storage internal topUps; - - uint256 internal constant twoWeeks = 1209600; // [sec] - uint256 internal constant twoMonths = 5184000; // [sec] - - // 2020-04-28; the date of deploying KEEP token. - // TX: 0xea22d72bc7de4c82798df7194734024a1f2fd57b173d0e065864ff4e9d3dc014 - uint256 internal constant minimumStakeScheduleStart = 1588042366; - - /// @notice Creates a token staking contract for a provided Standard ERC20Burnable token. - /// @param _token KEEP token contract. - /// @param _tokenGrant KEEP token grant contract. - /// @param _registry Keep contract registry contract. - /// @param _initializationPeriod To avoid certain attacks on work selection, recently created - /// operators must wait for a specific period of time before being eligible for work selection. - constructor( - ERC20Burnable _token, - TokenGrant _tokenGrant, - KeepRegistry _registry, - uint256 _initializationPeriod - ) public Authorizations(_registry) { - token = _token; - tokenGrant = _tokenGrant; - registry = _registry; - initializationPeriod = _initializationPeriod; - deployedAt = block.timestamp; - } - - /// @notice Returns minimum amount of KEEP that allows sMPC cluster client to - /// participate in the Keep network. Expressed as number with 18-decimal places. - /// Initial minimum stake is higher than the final and lowered periodically based - /// on the amount of steps and the length of the minimum stake schedule in seconds. - function minimumStake() public view returns (uint256) { - return MinimumStakeSchedule.current(minimumStakeScheduleStart); - } - - /// @notice Returns the current value of the undelegation period. - /// The staking contract guarantees that an undelegated operator’s stakes - /// will stay locked for a period of time after undelegation, and thus - /// available as collateral for any work the operator is engaged in. - /// The undelegation period is two weeks for the first two months and - /// two months after that. - function undelegationPeriod() public view returns (uint256) { - return - block.timestamp < deployedAt.add(twoMonths) ? twoWeeks : twoMonths; - } - - /// @notice Receives approval of token transfer and stakes the approved - /// amount or adds the approved amount to an existing delegation (a “top-up”). - /// In case of a top-up, it is expected that the operator stake is not - /// undelegated and that the top-up is performed from the same source of - /// tokens as the initial delegation. That is, if the tokens were delegated - /// from a grant, top-up has to be performed from the same grant. If the - /// delegation was done using liquid tokens, only liquid tokens from the - /// same owner can be used to top-up the stake. - /// Top-up can not be cancelled so it is important to be careful with the - /// amount of KEEP added to the stake. - /// @dev Requires that the provided token contract be the same one linked to - /// this contract. - /// @param _from The owner of the tokens who approved them to transfer. - /// @param _value Approved amount for the transfer and stake. - /// @param _token Token contract address. - /// @param _extraData Data for stake delegation. This byte array must have - /// the following values concatenated: - /// - Beneficiary address (20 bytes), ignored for a top-up - /// - Operator address (20 bytes) - /// - Authorizer address (20 bytes), ignored for a top-up - function receiveApproval( - address _from, - uint256 _value, - address _token, - bytes memory _extraData - ) public { - require(ERC20Burnable(_token) == token, "Unrecognized token"); - require(_extraData.length >= 60, "Corrupted delegation data"); - - // Transfer tokens to this contract. - token.safeTransferFrom(_from, address(this), _value); - - address operator = _extraData.toAddress(20); - // See if there is an existing delegation for this operator... - if (operators[operator].packedParams.getCreationTimestamp() == 0) { - // If there is no existing delegation, delegate tokens using - // beneficiary and authorizer passed in _extraData. - delegate(_from, _value, operator, _extraData); - } else { - // If there is an existing delegation, top-up the stake. - topUp(_from, _value, operator); - } - } - - /// @notice Commits pending top-up for the provided operator. If the top-up - /// did not pass the initialization period, the function fails. - /// @param _operator The operator with a pending top-up that is getting - /// committed. - function commitTopUp(address _operator) public { - operators[_operator].packedParams = topUps.commit( - _operator, - operators[_operator].packedParams, - initializationPeriod - ); - } - - /// @notice Cancels stake of tokens within the operator initialization period - /// without being subjected to the token lockup for the undelegation period. - /// This can be used to undo mistaken delegation to the wrong operator address. - /// @param _operator Address of the stake operator. - function cancelStake(address _operator) public { - address owner = operators[_operator].owner; - require( - msg.sender == owner || - msg.sender == _operator || - grantStaking.canUndelegate(_operator, tokenGrant), - "Not authorized" - ); - uint256 operatorParams = operators[_operator].packedParams; - - require(!_isInitialized(operatorParams), "Initialized stake"); - - uint256 amount = operatorParams.getAmount(); - operators[_operator].packedParams = operatorParams.setAmount(0); - - transferOrDeposit(owner, amount); - } - - /// @notice Undelegates staked tokens. You will be able to recover your stake by calling - /// `recoverStake()` with operator address once undelegation period is over. - /// @param _operator Address of the stake operator. - function undelegate(address _operator) public { - undelegateAt(_operator, block.timestamp); - } - - /// @notice Set an undelegation time for staked tokens. - /// Undelegation will begin at the specified timestamp. - /// You will be able to recover your stake by calling - /// `recoverStake()` with operator address once undelegation period is over. - /// @param _operator Address of the stake operator. - /// @param _undelegationTimestamp The timestamp undelegation is to start at. - function undelegateAt(address _operator, uint256 _undelegationTimestamp) - public - { - require( - msg.sender == _operator || - msg.sender == operators[_operator].owner || - grantStaking.canUndelegate(_operator, tokenGrant), - "Not authorized" - ); - uint256 oldParams = operators[_operator].packedParams; - require( - _undelegationTimestamp >= block.timestamp && - _undelegationTimestamp > - oldParams.getCreationTimestamp().add(initializationPeriod), - "Invalid timestamp" - ); - uint256 existingUndelegationTimestamp = - oldParams.getUndelegationTimestamp(); - require( - // Undelegation not in progress OR - existingUndelegationTimestamp == 0 || - // Undelegating sooner than previously set time OR - existingUndelegationTimestamp > _undelegationTimestamp || - // We have already checked above that msg.sender is owner, grantee, - // or operator. Only owner and grantee are eligible to postpone the - // delegation so it is enough if we exclude operator here. - msg.sender != _operator, - "Operator may not postpone" - ); - operators[_operator].packedParams = oldParams.setUndelegationTimestamp( - _undelegationTimestamp - ); - emit Undelegated(_operator, _undelegationTimestamp); - } - - /// @notice Recovers staked tokens and transfers them back to the owner. - /// Recovering tokens can only be performed when the operator finished - /// undelegating. - /// @param _operator Operator address. - function recoverStake(address _operator) public { - uint256 operatorParams = operators[_operator].packedParams; - require( - operatorParams.getUndelegationTimestamp() != 0, - "Not undelegated" - ); - require(_isUndelegatingFinished(operatorParams), "Still undelegating"); - require(!isStakeLocked(_operator), "Locked stake"); - - uint256 amount = operatorParams.getAmount(); - - // If there is a pending top-up, force-commit it before returning tokens. - amount = amount.add(topUps.cancel(_operator)); - - operators[_operator].packedParams = operatorParams.setAmount(0); - transferOrDeposit(operators[_operator].owner, amount); - - emit RecoveredStake(_operator); - } - - /// @notice Gets stake delegation info for the given operator. - /// @param _operator Operator address. - /// @return amount The amount of tokens the given operator delegated. - /// @return createdAt The time when the stake has been delegated. - /// @return undelegatedAt The time when undelegation has been requested. - /// If undelegation has not been requested, 0 is returned. - function getDelegationInfo(address _operator) - public - view - returns ( - uint256 amount, - uint256 createdAt, - uint256 undelegatedAt - ) - { - return operators[_operator].packedParams.unpack(); - } - - /// @notice Locks given operator stake for the specified duration. - /// Locked stake may not be recovered until the lock expires or is released, - /// even if the normal undelegation period has passed. - /// Only previously authorized operator contract can lock the stake. - /// @param operator Operator address. - /// @param duration Lock duration in seconds. - function lockStake(address operator, uint256 duration) - public - onlyApprovedOperatorContract(msg.sender) - { - require( - isAuthorizedForOperator(operator, msg.sender), - "Not authorized" - ); - - uint256 operatorParams = operators[operator].packedParams; - - require(_isInitialized(operatorParams), "Inactive stake"); - require(!_isUndelegating(operatorParams), "Undelegating stake"); - - locks.lockStake(operator, duration); - } - - /// @notice Removes a lock the caller had previously placed on the operator. - /// @dev Only for operator contracts. - /// To remove expired or disabled locks, use `releaseExpiredLocks`. - /// The authorization check ensures that the caller must have been able - /// to place a lock on the operator sometime in the past. - /// We don't need to check for current approval status of the caller - /// because unlocking stake cannot harm the operator - /// nor interfere with other operator contracts. - /// Therefore even disabled operator contracts may freely unlock stake. - /// @param operator Operator address. - function unlockStake(address operator) public { - require( - isAuthorizedForOperator(operator, msg.sender), - "Not authorized" - ); - locks.releaseLock(operator); - } - - /// @notice Removes the lock of the specified operator contract - /// if the lock has expired or the contract has been disabled. - /// @dev Necessary for removing locks placed by contracts - /// that have been disabled by the panic button. - /// Also applicable to prevent inadvertent DoS of `recoverStake` - /// if too many operator contracts have failed to clean up their locks. - function releaseExpiredLock(address operator, address operatorContract) - public - { - locks.releaseExpiredLock(operator, operatorContract, address(this)); - } - - /// @notice Check whether the operator has any active locks - /// that haven't expired yet - /// and whose creators aren't disabled by the panic button. - function isStakeLocked(address operator) public view returns (bool) { - return locks.isStakeLocked(operator, address(this)); - } - - /// @notice Get the locks placed on the operator. - /// @return creators The addresses of operator contracts - /// that have placed a lock on the operator. - /// @return expirations The expiration times - /// of the locks placed on the operator. - function getLocks(address operator) - public - view - returns (address[] memory creators, uint256[] memory expirations) - { - return locks.getLocks(operator); - } - - /// @notice Slash provided token amount from every member in the misbehaved - /// operators array and burn 100% of all the tokens. - /// @param amountToSlash Token amount to slash from every misbehaved operator. - /// @param misbehavedOperators Array of addresses to seize the tokens from. - function slash(uint256 amountToSlash, address[] memory misbehavedOperators) - public - onlyApprovedOperatorContract(msg.sender) - { - uint256 totalAmountToBurn; - address authoritySource = getAuthoritySource(msg.sender); - for (uint256 i = 0; i < misbehavedOperators.length; i++) { - address operator = misbehavedOperators[i]; - require( - authorizations[authoritySource][operator], - "Not authorized" - ); - - uint256 operatorParams = operators[operator].packedParams; - require(_isInitialized(operatorParams), "Inactive stake"); - - require( - !_isStakeReleased(operator, operatorParams, msg.sender), - "Stake is released" - ); - - uint256 currentAmount = operatorParams.getAmount(); - - if (currentAmount < amountToSlash) { - totalAmountToBurn = totalAmountToBurn.add(currentAmount); - operators[operator].packedParams = operatorParams.setAmount(0); - emit TokensSlashed(operator, currentAmount); - } else { - totalAmountToBurn = totalAmountToBurn.add(amountToSlash); - operators[operator].packedParams = operatorParams.setAmount( - currentAmount.sub(amountToSlash) - ); - emit TokensSlashed(operator, amountToSlash); - } - } - - token.burn(totalAmountToBurn); - } - - /// @notice Seize provided token amount from every member in the misbehaved - /// operators array. The tattletale is rewarded with 5% of the total seized - /// amount scaled by the reward adjustment parameter and the rest 95% is burned. - /// @param amountToSeize Token amount to seize from every misbehaved operator. - /// @param rewardMultiplier Reward adjustment in percentage. Min 1% and 100% max. - /// @param tattletale Address to receive the 5% reward. - /// @param misbehavedOperators Array of addresses to seize the tokens from. - function seize( - uint256 amountToSeize, - uint256 rewardMultiplier, - address tattletale, - address[] memory misbehavedOperators - ) public onlyApprovedOperatorContract(msg.sender) { - uint256 totalAmountToBurn; - address authoritySource = getAuthoritySource(msg.sender); - for (uint256 i = 0; i < misbehavedOperators.length; i++) { - address operator = misbehavedOperators[i]; - require( - authorizations[authoritySource][operator], - "Not authorized" - ); - - uint256 operatorParams = operators[operator].packedParams; - require(_isInitialized(operatorParams), "Inactive stake"); - - require( - !_isStakeReleased(operator, operatorParams, msg.sender), - "Stake is released" - ); - - uint256 currentAmount = operatorParams.getAmount(); - - if (currentAmount < amountToSeize) { - totalAmountToBurn = totalAmountToBurn.add(currentAmount); - operators[operator].packedParams = operatorParams.setAmount(0); - emit TokensSeized(operator, currentAmount); - } else { - totalAmountToBurn = totalAmountToBurn.add(amountToSeize); - operators[operator].packedParams = operatorParams.setAmount( - currentAmount.sub(amountToSeize) - ); - emit TokensSeized(operator, amountToSeize); - } - } - - uint256 tattletaleReward = - (totalAmountToBurn.percent(5)).percent(rewardMultiplier); - - token.safeTransfer(tattletale, tattletaleReward); - token.burn(totalAmountToBurn.sub(tattletaleReward)); - } - - /// @notice Allows the current staking relationship owner to transfer the - /// ownership to someone else. - /// @param operator Address of the stake operator. - /// @param newOwner Address of the new staking relationship owner. - function transferStakeOwnership(address operator, address newOwner) public { - require(msg.sender == operators[operator].owner, "Not authorized"); - operators[operator].owner = newOwner; - emit StakeOwnershipTransferred(operator, newOwner); - } - - /// @notice Gets the eligible stake balance of the specified address. - /// An eligible stake is a stake that passed the initialization period - /// and is not currently undelegating. Also, the operator had to approve - /// the specified operator contract. - /// - /// Operator with a minimum required amount of eligible stake can join the - /// network and participate in new work selection. - /// - /// @param _operator address of stake operator. - /// @param _operatorContract address of operator contract. - /// @return an uint256 representing the eligible stake balance. - function eligibleStake(address _operator, address _operatorContract) - public - view - returns (uint256 balance) - { - uint256 operatorParams = operators[_operator].packedParams; - // To be eligible for work selection, the operator must: - // - have the operator contract authorized - // - have the stake initialized - // - must not be undelegating; keep in mind the `undelegatedAt` may be - // set to a time in the future, to schedule undelegation in advance. - // In this case the operator is still eligible until the timestamp - // `undelegatedAt`. - if ( - isAuthorizedForOperator(_operator, _operatorContract) && - _isInitialized(operatorParams) && - !_isUndelegating(operatorParams) - ) { - balance = operatorParams.getAmount(); - } - } - - /// @notice Gets the active stake balance of the specified address. - /// An active stake is a stake that passed the initialization period, - /// and may be in the process of undelegation - /// but has not been released yet, - /// either because the undelegation period is not over, - /// or because the operator contract has an active lock on the operator. - /// Also, the operator had to approve the specified operator contract. - /// - /// The difference between eligible stake is that active stake does not make - /// the operator eligible for work selection but it may be still finishing - /// earlier work until the stake is released. - /// Operator with a minimum required - /// amount of active stake can join the network but cannot be selected to any - /// new work. - /// - /// @param _operator address of stake operator. - /// @param _operatorContract address of operator contract. - /// @return an uint256 representing the eligible stake balance. - function activeStake(address _operator, address _operatorContract) - public - view - returns (uint256 balance) - { - uint256 operatorParams = operators[_operator].packedParams; - if ( - isAuthorizedForOperator(_operator, _operatorContract) && - _isInitialized(operatorParams) && - !_isStakeReleased(_operator, operatorParams, _operatorContract) - ) { - balance = operatorParams.getAmount(); - } - } - - /// @notice Checks if the specified account has enough active stake to become - /// network operator and that the specified operator contract has been - /// authorized for potential slashing. - /// - /// Having the required minimum of active stake makes the operator eligible - /// to join the network. If the active stake is not currently undelegating, - /// operator is also eligible for work selection. - /// - /// @param staker Staker's address - /// @param operatorContract Operator contract's address - /// @return True if has enough active stake to participate in the network, - /// false otherwise. - function hasMinimumStake(address staker, address operatorContract) - public - view - returns (bool) - { - return activeStake(staker, operatorContract) >= minimumStake(); - } - - /// @notice Delegates tokens to a new operator using beneficiary and - /// authorizer passed in _extraData parameter. - /// @param _from The owner of the tokens who approved them to transfer. - /// @param _value Approved amount for the transfer and stake. - /// @param _operator The new operator address. - /// @param _extraData Data for stake delegation as passed to receiveApproval. - function delegate( - address _from, - uint256 _value, - address _operator, - bytes memory _extraData - ) internal { - require(_value >= minimumStake(), "Less than the minimum stake"); - - address payable beneficiary = address(uint160(_extraData.toAddress(0))); - address authorizer = _extraData.toAddress(40); - - operators[_operator] = Operator( - OperatorParams.pack(_value, block.timestamp, 0), - _from, - beneficiary, - authorizer - ); - - grantStaking.tryCapturingDelegationData( - tokenGrant, - _operator - ); - - emit StakeDelegated(_from, _operator); - emit OperatorStaked(_operator, beneficiary, authorizer, _value); - } - - /// @notice Performs top-up to an existing operator. Tokens added during - /// stake initialization period are immediatelly added to the stake and - /// stake initialization timer is reset to the current block. Tokens added - /// in a top-up after the stake initialization period is over are not - /// included in the operator stake until the initialization period for - /// a top-up passes and top-up is committed. Operator must not have the stake - /// undelegated. It is expected that the top-up is done from the same source - /// of tokens as the initial delegation. That is, if the tokens were - /// delegated from a grant, top-up has to be performed from the same grant. - /// If the delegation was done using liquid tokens, only liquid tokens from - /// the same owner can be used to top-up the stake. - /// Top-up can not be cancelled so it is important to be careful with the - /// amount of KEEP added to the stake. - /// @param _from The owner of the tokens who approved them to transfer. - /// @param _value Approved amount for the transfer and top-up to - /// an existing stake. - /// @param _operator The new operator address. - function topUp( - address _from, - uint256 _value, - address _operator - ) internal { - // Top-up comes from a grant if it's been initiated from TokenGrantStake. - bool isFromGrant = address(tokenGrant.grantStakes(_operator)) == _from; - - if (grantStaking.hasGrantDelegated(_operator)) { - // Operator has grant delegated. We need to see if the top-up - // is performed also from a grant. - require(isFromGrant, "Must be from a grant"); - // If it is from a grant, we need to make sure it's from the same - // grant as the original delegation. We do not want to mix unlocking - // schedules. - uint256 previousGrantId = - grantStaking.getGrantForOperator(_operator); - (, uint256 grantId) = - grantStaking.tryCapturingDelegationData( - tokenGrant, - _operator - ); - require(grantId == previousGrantId, "Not the same grant"); - } else { - // Operator has no grant delegated. We need to see if the top-up - // is performed from liquid tokens of the same owner. - require(!isFromGrant, "Must not be from a grant"); - require(operators[_operator].owner == _from, "Not the same owner"); - } - - uint256 operatorParams = operators[_operator].packedParams; - if (!_isInitialized(operatorParams)) { - // If the stake is not yet initialized, we add tokens immediately - // but we also reset stake initialization time counter. - operators[_operator].packedParams = topUps.instantComplete( - _value, - _operator, - operatorParams - ); - } else { - // If the stake is initialized, we do NOT add tokens immediately. - // We initiate the top-up and will add tokens to the stake only - // after the initialization period for a top-up passes. - topUps.initiate(_value, _operator, operatorParams); - } - } - - /// @notice Is the operator with the given params initialized - function _isInitialized(uint256 _operatorParams) - internal - view - returns (bool) - { - return - block.timestamp > - _operatorParams.getCreationTimestamp().add(initializationPeriod); - } - - /// @notice Is the operator with the given params undelegating - function _isUndelegating(uint256 _operatorParams) - internal - view - returns (bool) - { - uint256 undelegatedAt = _operatorParams.getUndelegationTimestamp(); - return (undelegatedAt != 0) && (block.timestamp > undelegatedAt); - } - - /// @notice Has the operator with the given params finished undelegating - function _isUndelegatingFinished(uint256 _operatorParams) - internal - view - returns (bool) - { - uint256 undelegatedAt = _operatorParams.getUndelegationTimestamp(); - return - (undelegatedAt != 0) && - (block.timestamp > undelegatedAt.add(undelegationPeriod())); - } - - /// @notice Get whether the operator's stake is released - /// as far as the operator contract is concerned. - /// If the operator contract has a lock on the operator, - /// the operator's stake is be released when the lock expires. - /// Otherwise the stake is released when the operator finishes undelegating. - function _isStakeReleased( - address _operator, - uint256 _operatorParams, - address _operatorContract - ) internal view returns (bool) { - return - _isUndelegatingFinished(_operatorParams) && - locks.isStakeReleased(_operator, _operatorContract); - } - - function transferOrDeposit(address _owner, uint256 _amount) internal { - token.safeTransfer(_owner, _amount); - } -} diff --git a/solidity-v1/contracts/cryptography/AltBn128.sol b/solidity-v1/contracts/cryptography/AltBn128.sol deleted file mode 100644 index f5e4109660..0000000000 --- a/solidity-v1/contracts/cryptography/AltBn128.sol +++ /dev/null @@ -1,587 +0,0 @@ -pragma solidity 0.5.17; - -import "../utils/ModUtils.sol"; - -/** - * @title Operations on alt_bn128 - * @dev Implementations of common elliptic curve operations on Ethereum's - * (poorly named) alt_bn128 curve. Whenever possible, use post-Byzantium - * pre-compiled contracts to offset gas costs. Note that these pre-compiles - * might not be available on all (eg private) chains. - */ -library AltBn128 { - using ModUtils for uint256; - - // G1Point implements a point in G1 group. - struct G1Point { - uint256 x; - uint256 y; - } - - // gfP2 implements a field of size p² as a quadratic extension of the base field. - struct gfP2 { - uint256 x; - uint256 y; - } - - // G2Point implements a point in G2 group. - struct G2Point { - gfP2 x; - gfP2 y; - } - - // p is a prime over which we form a basic field - // Taken from go-ethereum/crypto/bn256/cloudflare/constants.go - uint256 constant p = - 21888242871839275222246405745257275088696311157297823662689037894645226208583; - - function getP() internal pure returns (uint256) { - return p; - } - - /** - * @dev Gets generator of G1 group. - * Taken from go-ethereum/crypto/bn256/cloudflare/curve.go - */ - uint256 constant g1x = 1; - uint256 constant g1y = 2; - - function g1() internal pure returns (G1Point memory) { - return G1Point(g1x, g1y); - } - - /** - * @dev Gets generator of G2 group. - * Taken from go-ethereum/crypto/bn256/cloudflare/twist.go - */ - uint256 constant g2xx = - 11559732032986387107991004021392285783925812861821192530917403151452391805634; - uint256 constant g2xy = - 10857046999023057135944570762232829481370756359578518086990519993285655852781; - uint256 constant g2yx = - 4082367875863433681332203403145435568316851327593401208105741076214120093531; - uint256 constant g2yy = - 8495653923123431417604973247489272438418190587263600148770280649306958101930; - - function g2() internal pure returns (G2Point memory) { - return G2Point(gfP2(g2xx, g2xy), gfP2(g2yx, g2yy)); - } - - /** - * @dev Gets twist curve B constant. - * Taken from go-ethereum/crypto/bn256/cloudflare/twist.go - */ - uint256 constant twistBx = - 266929791119991161246907387137283842545076965332900288569378510910307636690; - uint256 constant twistBy = - 19485874751759354771024239261021720505790618469301721065564631296452457478373; - - function twistB() private pure returns (gfP2 memory) { - return gfP2(twistBx, twistBy); - } - - /** - * @dev Gets root of the point where x and y are equal. - */ - uint256 constant hexRootX = - 21573744529824266246521972077326577680729363968861965890554801909984373949499; - uint256 constant hexRootY = - 16854739155576650954933913186877292401521110422362946064090026408937773542853; - - function hexRoot() private pure returns (gfP2 memory) { - return gfP2(hexRootX, hexRootY); - } - - /** - * @dev g1YFromX computes a Y value for a G1 point based on an X value. - * This computation is simply evaluating the curve equation for Y on a - * given X, and allows a point on the curve to be represented by just - * an X value + a sign bit. - */ - function g1YFromX(uint256 x) internal view returns (uint256) { - return ((x.modExp(3, p) + 3) % p).modSqrt(p); - } - - /** - * @dev g2YFromX computes a Y value for a G2 point based on an X value. - * This computation is simply evaluating the curve equation for Y on a - * given X, and allows a point on the curve to be represented by just - * an X value + a sign bit. - */ - function g2YFromX(gfP2 memory _x) internal pure returns (gfP2 memory y) { - (uint256 xx, uint256 xy) = _gfP2CubeAddTwistB(_x.x, _x.y); - - // Using formula y = x ^ (p^2 + 15) / 32 from - // https://github.com/ethereum/beacon_chain/blob/master/beacon_chain/utils/bls.py - // (p^2 + 15) / 32 results into a big 512bit value, so breaking it to two uint256 as (a * a + b) - uint256 a = - 3869331240733915743250440106392954448556483137451914450067252501901456824595; - uint256 b = - 146360017852723390495514512480590656176144969185739259173561346299185050597; - - (uint256 xbx, uint256 xby) = _gfP2Pow(xx, xy, b); - (uint256 yax, uint256 yay) = _gfP2Pow(xx, xy, a); - (uint256 ya2x, uint256 ya2y) = _gfP2Pow(yax, yay, a); - (y.x, y.y) = _gfP2Multiply(ya2x, ya2y, xbx, xby); - - // Multiply y by hexRoot constant to find correct y. - while (!_g2X2y(xx, xy, y.x, y.y)) { - (y.x, y.y) = _gfP2Multiply(y.x, y.y, hexRootX, hexRootY); - } - } - - /** - * @dev Hash a byte array message, m, and map it deterministically to a - * point on G1. Note that this approach was chosen for its simplicity / - * lower gas cost on the EVM, rather than good distribution of points on - * G1. - */ - function g1HashToPoint(bytes memory m) - internal - view - returns (G1Point memory) - { - bytes32 h = sha256(m); - uint256 x = uint256(h) % p; - uint256 y; - - while (true) { - y = g1YFromX(x); - if (y > 0) { - return G1Point(x, y); - } - x += 1; - } - } - - /** - * @dev Calculates whether the provided number is even or odd. - * @return 0x01 if y is an even number and 0x00 if it's odd. - */ - function parity(uint256 value) private pure returns (bytes1) { - return bytes32(value)[31] & 0x01; - } - - /** - * @dev Compress a point on G1 to a single uint256 for serialization. - */ - function g1Compress(G1Point memory point) internal pure returns (bytes32) { - bytes32 m = bytes32(point.x); - - bytes1 leadM = m[0] | (parity(point.y) << 7); - uint256 mask = 0xff << (31 * 8); - m = (m & ~bytes32(mask)) | (leadM >> 0); - - return m; - } - - /** - * @dev Compress a point on G2 to a pair of uint256 for serialization. - */ - function g2Compress(G2Point memory point) - internal - pure - returns (bytes memory) - { - bytes32 m = bytes32(point.x.x); - - bytes1 leadM = m[0] | (parity(point.y.x) << 7); - uint256 mask = 0xff << (31 * 8); - m = (m & ~bytes32(mask)) | (leadM >> 0); - - return abi.encodePacked(m, bytes32(point.x.y)); - } - - /** - * @dev Decompress a point on G1 from a single uint256. - */ - function g1Decompress(bytes32 m) internal view returns (G1Point memory) { - bytes32 mX = bytes32(0); - bytes1 leadX = m[0] & 0x7f; - uint256 mask = 0xff << (31 * 8); - mX = (m & ~bytes32(mask)) | (leadX >> 0); - - uint256 x = uint256(mX); - uint256 y = g1YFromX(x); - - if (parity(y) != (m[0] & 0x80) >> 7) { - y = p - y; - } - - require(isG1PointOnCurve(G1Point(x, y)), "Malformed bn256.G1 point."); - - return G1Point(x, y); - } - - /** - * @dev Unmarshals a point on G1 from bytes in an uncompressed form. - */ - function g1Unmarshal(bytes memory m) - internal - pure - returns (G1Point memory) - { - require(m.length == 64, "Invalid G1 bytes length"); - - bytes32 x; - bytes32 y; - - /* solium-disable-next-line */ - assembly { - x := mload(add(m, 0x20)) - y := mload(add(m, 0x40)) - } - - return G1Point(uint256(x), uint256(y)); - } - - /** - * @dev Marshals a point on G1 to bytes form. - */ - function g1Marshal(G1Point memory point) - internal - pure - returns (bytes memory) - { - bytes memory m = new bytes(64); - bytes32 x = bytes32(point.x); - bytes32 y = bytes32(point.y); - - /* solium-disable-next-line */ - assembly { - mstore(add(m, 32), x) - mstore(add(m, 64), y) - } - - return m; - } - - /** - * @dev Unmarshals a point on G2 from bytes in an uncompressed form. - */ - function g2Unmarshal(bytes memory m) - internal - pure - returns (G2Point memory) - { - require(m.length == 128, "Invalid G2 bytes length"); - - uint256 xx; - uint256 xy; - uint256 yx; - uint256 yy; - - /* solium-disable-next-line */ - assembly { - xx := mload(add(m, 0x20)) - xy := mload(add(m, 0x40)) - yx := mload(add(m, 0x60)) - yy := mload(add(m, 0x80)) - } - - return G2Point(gfP2(xx, xy), gfP2(yx, yy)); - } - - /** - * @dev Decompress a point on G2 from a pair of uint256. - */ - function g2Decompress(bytes memory m) - internal - pure - returns (G2Point memory) - { - require(m.length == 64, "Invalid G2 compressed bytes length"); - - bytes32 x1; - bytes32 x2; - uint256 temp; - - // Extract two bytes32 from bytes array - /* solium-disable-next-line */ - assembly { - temp := add(m, 32) - x1 := mload(temp) - temp := add(m, 64) - x2 := mload(temp) - } - - bytes32 mX = bytes32(0); - bytes1 leadX = x1[0] & 0x7f; - uint256 mask = 0xff << (31 * 8); - mX = (x1 & ~bytes32(mask)) | (leadX >> 0); - - gfP2 memory x = gfP2(uint256(mX), uint256(x2)); - gfP2 memory y = g2YFromX(x); - - if (parity(y.x) != (m[0] & 0x80) >> 7) { - y.x = p - y.x; - y.y = p - y.y; - } - - return G2Point(x, y); - } - - /** - * @dev Wrap the point addition pre-compile introduced in Byzantium. Return - * the sum of two points on G1. Revert if the provided points aren't on the - * curve. - */ - function g1Add(G1Point memory a, G1Point memory b) - internal - view - returns (G1Point memory c) - { - /* solium-disable-next-line */ - assembly { - let arg := mload(0x40) - mstore(arg, mload(a)) - mstore(add(arg, 0x20), mload(add(a, 0x20))) - mstore(add(arg, 0x40), mload(b)) - mstore(add(arg, 0x60), mload(add(b, 0x20))) - // 0x60 is the ECADD precompile address - if iszero(staticcall(not(0), 0x06, arg, 0x80, c, 0x40)) { - revert(0, 0) - } - } - } - - /** - * @dev Return the sum of two gfP2 field elements. - */ - function gfP2Add(gfP2 memory a, gfP2 memory b) - internal - pure - returns (gfP2 memory) - { - return gfP2(addmod(a.x, b.x, p), addmod(a.y, b.y, p)); - } - - /** - * @dev Return multiplication of two gfP2 field elements. - */ - function gfP2Multiply(gfP2 memory a, gfP2 memory b) - internal - pure - returns (gfP2 memory) - { - return - gfP2( - addmod(mulmod(a.x, b.y, p), mulmod(b.x, a.y, p), p), - addmod(mulmod(a.y, b.y, p), p - mulmod(a.x, b.x, p), p) - ); - } - - /** - * @dev Return gfP2 element to the power of the provided exponent. - */ - function gfP2Pow(gfP2 memory _a, uint256 _exp) - internal - pure - returns (gfP2 memory result) - { - (uint256 x, uint256 y) = _gfP2Pow(_a.x, _a.y, _exp); - return gfP2(x, y); - } - - function gfP2Square(gfP2 memory a) internal pure returns (gfP2 memory) { - return gfP2Multiply(a, a); - } - - function gfP2Cube(gfP2 memory a) internal pure returns (gfP2 memory) { - return gfP2Multiply(a, gfP2Square(a)); - } - - function gfP2CubeAddTwistB(gfP2 memory a) - internal - pure - returns (gfP2 memory) - { - (uint256 x, uint256 y) = _gfP2CubeAddTwistB(a.x, a.y); - return gfP2(x, y); - } - - /** - * @dev Return true if G2 point's y^2 equals x. - */ - function g2X2y(gfP2 memory x, gfP2 memory y) internal pure returns (bool) { - gfP2 memory y2; - y2 = gfP2Square(y); - - return (y2.x == x.x && y2.y == x.y); - } - - /** - * @dev Return true if G1 point is on the curve. - */ - function isG1PointOnCurve(G1Point memory point) - internal - view - returns (bool) - { - return point.y.modExp(2, p) == (point.x.modExp(3, p) + 3) % p; - } - - /** - * @dev Return true if G2 point is on the curve. - */ - function isG2PointOnCurve(G2Point memory point) - internal - pure - returns (bool) - { - (uint256 y2x, uint256 y2y) = _gfP2Square(point.y.x, point.y.y); - (uint256 x3x, uint256 x3y) = _gfP2CubeAddTwistB(point.x.x, point.x.y); - - return (y2x == x3x && y2y == x3y); - } - - /** - * @dev Wrap the scalar point multiplication pre-compile introduced in - * Byzantium. The result of a point from G1 multiplied by a scalar should - * match the point added to itself the same number of times. Revert if the - * provided point isn't on the curve. - */ - function scalarMultiply(G1Point memory p_1, uint256 scalar) - internal - view - returns (G1Point memory p_2) - { - assembly { - let arg := mload(0x40) - mstore(arg, mload(p_1)) - mstore(add(arg, 0x20), mload(add(p_1, 0x20))) - mstore(add(arg, 0x40), scalar) - // 0x07 is the ECMUL precompile address - if iszero(staticcall(not(0), 0x07, arg, 0x60, p_2, 0x40)) { - revert(0, 0) - } - } - } - - /** - * @dev Wrap the pairing check pre-compile introduced in Byzantium. Return - * the result of a pairing check of 2 pairs (G1 p1, G2 p2) (G1 p3, G2 p4) - */ - function pairing( - G1Point memory p1, - G2Point memory p2, - G1Point memory p3, - G2Point memory p4 - ) internal view returns (bool result) { - uint256 _c; - /* solium-disable-next-line */ - assembly { - let c := mload(0x40) - let arg := add(c, 0x20) - - mstore(arg, mload(p1)) - mstore(add(arg, 0x20), mload(add(p1, 0x20))) - - let p2x := mload(p2) - mstore(add(arg, 0x40), mload(p2x)) - mstore(add(arg, 0x60), mload(add(p2x, 0x20))) - - let p2y := mload(add(p2, 0x20)) - mstore(add(arg, 0x80), mload(p2y)) - mstore(add(arg, 0xa0), mload(add(p2y, 0x20))) - - mstore(add(arg, 0xc0), mload(p3)) - mstore(add(arg, 0xe0), mload(add(p3, 0x20))) - - let p4x := mload(p4) - mstore(add(arg, 0x100), mload(p4x)) - mstore(add(arg, 0x120), mload(add(p4x, 0x20))) - - let p4y := mload(add(p4, 0x20)) - mstore(add(arg, 0x140), mload(p4y)) - mstore(add(arg, 0x160), mload(add(p4y, 0x20))) - - // call(gasLimit, to, value, inputOffset, inputSize, outputOffset, outputSize) - if iszero(staticcall(not(0), 0x08, arg, 0x180, c, 0x20)) { - revert(0, 0) - } - _c := mload(c) - } - return _c != 0; - } - - function _gfP2Add( - uint256 ax, - uint256 ay, - uint256 bx, - uint256 by - ) private pure returns (uint256 x, uint256 y) { - x = addmod(ax, bx, p); - y = addmod(ay, by, p); - } - - function _gfP2Multiply( - uint256 ax, - uint256 ay, - uint256 bx, - uint256 by - ) private pure returns (uint256 x, uint256 y) { - x = addmod(mulmod(ax, by, p), mulmod(bx, ay, p), p); - y = addmod(mulmod(ay, by, p), p - mulmod(ax, bx, p), p); - } - - function _gfP2CubeAddTwistB(uint256 ax, uint256 ay) - private - pure - returns (uint256 x, uint256 y) - { - (uint256 a3x, uint256 a3y) = _gfP2Cube(ax, ay); - return _gfP2Add(a3x, a3y, twistBx, twistBy); - } - - function _gfP2Pow( - uint256 _ax, - uint256 _ay, - uint256 _exp - ) private pure returns (uint256 x, uint256 y) { - uint256 exp = _exp; - x = 0; - y = 1; - uint256 ax = _ax; - uint256 ay = _ay; - - // Reduce exp dividing by 2 gradually to 0 while computing final - // result only when exp is an odd number. - while (exp > 0) { - if (parity(exp) == 0x01) { - (x, y) = _gfP2Multiply(x, y, ax, ay); - } - - exp = exp / 2; - (ax, ay) = _gfP2Multiply(ax, ay, ax, ay); - } - } - - function _gfP2Square(uint256 _ax, uint256 _ay) - private - pure - returns (uint256 x, uint256 y) - { - return _gfP2Multiply(_ax, _ay, _ax, _ay); - } - - function _gfP2Cube(uint256 _ax, uint256 _ay) - private - pure - returns (uint256 x, uint256 y) - { - (uint256 _bx, uint256 _by) = _gfP2Square(_ax, _ay); - return _gfP2Multiply(_ax, _ay, _bx, _by); - } - - function _g2X2y( - uint256 xx, - uint256 xy, - uint256 yx, - uint256 yy - ) private pure returns (bool) { - (uint256 y2x, uint256 y2y) = _gfP2Square(yx, yy); - - return (y2x == xx && y2y == xy); - } -} diff --git a/solidity-v1/contracts/cryptography/BLS.sol b/solidity-v1/contracts/cryptography/BLS.sol deleted file mode 100644 index 3d26c70c84..0000000000 --- a/solidity-v1/contracts/cryptography/BLS.sol +++ /dev/null @@ -1,63 +0,0 @@ -pragma solidity 0.5.17; - -import "./AltBn128.sol"; - -/** - * @title BLS signatures verification - * @dev Library for verification of 2-pairing-check BLS signatures, including - * basic, aggregated, or reconstructed threshold BLS signatures, generated - * using the AltBn128 curve. - */ -library BLS { - /** - * @dev Creates a signature over message using the provided secret key. - */ - function sign(bytes memory message, uint256 secretKey) - public - view - returns (bytes memory) - { - AltBn128.G1Point memory p_1 = AltBn128.g1HashToPoint(message); - AltBn128.G1Point memory p_2 = AltBn128.scalarMultiply(p_1, secretKey); - - return AltBn128.g1Marshal(p_2); - } - - /** - * @dev Verify performs the pairing operation to check if the signature - * is correct for the provided message and the corresponding public key. - * Public key must be a valid point on G2 curve in an uncompressed format. - * Message must be a valid point on G1 curve in an uncompressed format. - * Signature must be a valid point on G1 curve in an uncompressed format. - */ - function verify( - bytes memory publicKey, - bytes memory message, - bytes memory signature - ) public view returns (bool) { - AltBn128.G1Point memory _signature = AltBn128.g1Unmarshal(signature); - - return - AltBn128.pairing( - AltBn128.G1Point(_signature.x, AltBn128.getP() - _signature.y), - AltBn128.g2(), - AltBn128.g1Unmarshal(message), - AltBn128.g2Unmarshal(publicKey) - ); - } - - /** - * @dev VerifyBytes wraps the functionality of BLS.verify, but hashes a message - * to a point on G1 and marshal to bytes first to allow raw bytes verification. - */ - function verifyBytes( - bytes memory publicKey, - bytes memory message, - bytes memory signature - ) public view returns (bool) { - AltBn128.G1Point memory point = AltBn128.g1HashToPoint(message); - bytes memory messageAsPoint = AltBn128.g1Marshal(point); - - return verify(publicKey, messageAsPoint, signature); - } -} diff --git a/solidity-v1/contracts/examples/CallbackContract.sol b/solidity-v1/contracts/examples/CallbackContract.sol deleted file mode 100644 index a198fe40fe..0000000000 --- a/solidity-v1/contracts/examples/CallbackContract.sol +++ /dev/null @@ -1,19 +0,0 @@ -pragma solidity 0.5.17; - -import "../IRandomBeacon.sol"; - -/** - * @title CallbackContract - * @dev Example callback contract for Random Beacon. - */ -contract CallbackContract is IRandomBeaconConsumer { - uint256 internal _lastEntry; - - function __beaconCallback(uint256 entry) public { - _lastEntry = entry; - } - - function lastEntry() public view returns (uint256) { - return _lastEntry; - } -} diff --git a/solidity-v1/contracts/examples/KeepRandomBeaconServiceUpgradeExample.sol b/solidity-v1/contracts/examples/KeepRandomBeaconServiceUpgradeExample.sol deleted file mode 100644 index 40e05a7aeb..0000000000 --- a/solidity-v1/contracts/examples/KeepRandomBeaconServiceUpgradeExample.sol +++ /dev/null @@ -1,56 +0,0 @@ -pragma solidity 0.5.17; - -import "../KeepRandomBeaconServiceImplV1.sol"; - -/** - * @title KeepRandomBeaconServiceUpgradeExample - * @dev Example version of a new implementation contract to test upgradability - * under Keep Random Beacon proxy. - */ -contract KeepRandomBeaconServiceUpgradeExample is - KeepRandomBeaconServiceImplV1 -{ - uint256 internal _newVar; - - constructor() public { - _initialized["KeepRandomBeaconImplV2"] = true; - } - - /** - * @dev Example of overriding existing function. - * Reference http://solidity.readthedocs.io/en/develop/contracts.html#inheritance - * >Functions can be overridden by another function with the same name and the - * same number/types of inputs. - */ - function initialize(uint256 dkgContributionMargin, address registry) - public - { - require(!initialized(), "Contract is already initialized."); - require(registry != address(0), "Incorrect registry address"); - _initialized["KeepRandomBeaconImplV2"] = true; - // Example of adding new data to the existing storage. - _newVar = 1234; - - // silence solc warnings, it's just an example - dkgContributionMargin; - registry; - } - - /** - * @dev Example of overriding initialized function. - */ - function initialized() public view returns (bool) { - return _initialized["KeepRandomBeaconImplV2"]; - } - - /** - * @dev Example of adding a new function. - */ - function getNewVar() public view returns (uint256) { - return _newVar; - } - - function version() public pure returns (string memory) { - return "V2"; - } -} diff --git a/solidity-v1/contracts/geyser/IStaking.sol b/solidity-v1/contracts/geyser/IStaking.sol deleted file mode 100644 index 57eca911f9..0000000000 --- a/solidity-v1/contracts/geyser/IStaking.sol +++ /dev/null @@ -1,47 +0,0 @@ -/** - This code is copied from: - https://github.com/ampleforth/token-geyser/tree/d8352f62a0432494c39416d090e68582e13b2b22/contracts - */ -pragma solidity 0.5.17; - -/** - * @title Staking interface, as defined by EIP-900. - * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-900.md - */ -contract IStaking { - event Staked( - address indexed user, - uint256 amount, - uint256 total, - bytes data - ); - event Unstaked( - address indexed user, - uint256 amount, - uint256 total, - bytes data - ); - - function stake(uint256 amount, bytes calldata data) external; - - function stakeFor( - address user, - uint256 amount, - bytes calldata data - ) external; - - function unstake(uint256 amount, bytes calldata data) external; - - function token() external view returns (address); - - /** - * @return False. This application does not support staking history. - */ - function supportsHistory() external pure returns (bool) { - return false; - } - - function totalStakedFor(address addr) public view returns (uint256); - - function totalStaked() public view returns (uint256); -} diff --git a/solidity-v1/contracts/geyser/KeepTokenGeyser.sol b/solidity-v1/contracts/geyser/KeepTokenGeyser.sol deleted file mode 100644 index b2005d0af2..0000000000 --- a/solidity-v1/contracts/geyser/KeepTokenGeyser.sol +++ /dev/null @@ -1,101 +0,0 @@ -pragma solidity 0.5.17; - -import "./TokenGeyser.sol"; -import "../KeepToken.sol"; -import {IStakerRewards, StakerRewardsBeneficiary} from "../PhasedEscrow.sol"; - -import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol"; - -/// @title KEEP Token Geyser -/// @dev A smart-contract based mechanism to distribute tokens over time, based -/// on implementation of ampleforth's TokenGeyser contract (see: [token-geyser]). -/// -/// Token that users stake is any ERC20 token defined on contract deployment. -/// Users are rewarded in distribution tokens, which in this case will be KEEP. -/// -/// Account holding Reward Distribution role locks tokens for distribution. -/// The role can be transferred to any account or contract (e.g. Escrow) by the -/// contract owner. -/// -/// [token-geyser]: https://github.com/ampleforth/token-geyser/ -contract KeepTokenGeyser is TokenGeyser, IStakerRewards { - event DurationSecUpdated(uint256 oldDurationSec, uint256 newDurationSec); - - uint256 public durationSec; - - /// @param _stakingToken The token users deposit as a stake. - /// @param _distributionToken The token users are rewarded in and receive it - /// as they unstake. - /// @param _maxUnlockSchedules Max number of unlock stages, to guard against - /// hitting gas limit. - /// @param _startBonus Starting time bonus, BONUS_DECIMALS fixed point. - /// e.g. 25% means user gets 25% of max distribution tokens. - /// @param _bonusPeriodSec Length of time for bonus to increase linearly to max. - /// @param _initialSharesPerToken Number of shares to mint per staking token - /// on first stake. - /// @param _durationSec Length of time to linear unlock the rewards tokens. - constructor( - IERC20 _stakingToken, - KeepToken _distributionToken, - uint256 _maxUnlockSchedules, - uint256 _startBonus, - uint256 _bonusPeriodSec, - uint256 _initialSharesPerToken, - uint256 _durationSec - ) - public - TokenGeyser( - _stakingToken, - _distributionToken, - _maxUnlockSchedules, - _startBonus, - _bonusPeriodSec, - _initialSharesPerToken - ) - { - durationSec = _durationSec; - } - - /// @notice Receives an approval of token transfer and locks the approved - /// amount for rewards. - /// @dev Requires the provided token contract to be the same as the distribution - /// token supported by this contract. - /// @param _from The owner of the tokens who approved them to stake. - /// @param _value Approved amount of tokens for the transfer. - /// @param _token Token contract address. - /// @param _extraData Ignored. - function receiveApproval( - address _from, - uint256 _value, - address _token, - bytes calldata _extraData - ) external { - require( - KeepToken(_token) == getDistributionToken(), - "Token is not supported distribution token" - ); - - lockTokens(_value, durationSec); - } - - function setDurationSec(uint256 _newDurationSec) external onlyOwner { - require( - _newDurationSec > 0, - "New duration has to be greater than zero" - ); - - emit DurationSecUpdated(durationSec, _newDurationSec); - - durationSec = _newDurationSec; - } -} - -/// @title KeepTokenGeyserRewardsEscrowBeneficiary -/// @notice Intermediate contract used to transfer tokens from PhasedEscrow to a -/// designated KeepTokenGeyser contract. -contract KeepTokenGeyserRewardsEscrowBeneficiary is StakerRewardsBeneficiary { - constructor(IERC20 _token, IStakerRewards _stakerRewards) - public - StakerRewardsBeneficiary(_token, _stakerRewards) - {} -} diff --git a/solidity-v1/contracts/geyser/KeepVault.sol b/solidity-v1/contracts/geyser/KeepVault.sol deleted file mode 100644 index 864138ba50..0000000000 --- a/solidity-v1/contracts/geyser/KeepVault.sol +++ /dev/null @@ -1,39 +0,0 @@ -pragma solidity 0.5.17; - -import "./KeepTokenGeyser.sol"; -import "../KeepToken.sol"; - -/// @title KEEP Vault -/// @dev A smart-contract based mechanism to distribute tokens over time. -/// It accepts KEEP token as stake and distributes KEEP as rewards for staking. -contract KeepVault is KeepTokenGeyser { - /// @param _keepToken KEEP token contract address. It is a token that is accepted - /// as user's stake and that will be distributed as rewards. - /// @param _maxUnlockSchedules Max number of unlock stages, to guard against - /// hitting gas limit. - /// @param _startBonus Starting time bonus, BONUS_DECIMALS fixed point. - /// e.g. 25% means user gets 25% of max distribution tokens. - /// @param _bonusPeriodSec Length of time for bonus to increase linearly to max. - /// @param _initialSharesPerToken Number of shares to mint per staking token - /// on first stake. - /// @param _durationSec Length of time to linear unlock the rewards tokens. - constructor( - KeepToken _keepToken, - uint256 _maxUnlockSchedules, - uint256 _startBonus, - uint256 _bonusPeriodSec, - uint256 _initialSharesPerToken, - uint256 _durationSec - ) - public - KeepTokenGeyser( - _keepToken, - _keepToken, - _maxUnlockSchedules, - _startBonus, - _bonusPeriodSec, - _initialSharesPerToken, - _durationSec - ) - {} -} diff --git a/solidity-v1/contracts/geyser/TokenGeyser.sol b/solidity-v1/contracts/geyser/TokenGeyser.sol deleted file mode 100644 index a6ef505c8a..0000000000 --- a/solidity-v1/contracts/geyser/TokenGeyser.sol +++ /dev/null @@ -1,687 +0,0 @@ -/** - This code is copied from: - https://github.com/ampleforth/token-geyser/tree/d8352f62a0432494c39416d090e68582e13b2b22/contracts - with some modifications: - - updated pragma to reflect the one used by the project, - - aligned functions ordering to meet project's linting requirements, - - defined a separate role for rewards tokens locking. -*/ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol"; -import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; - -import "./IStaking.sol"; -import "./TokenPool.sol"; - -/** - * @title Token Geyser - * @dev A smart-contract based mechanism to distribute tokens over time, inspired loosely by - * Compound and Uniswap. - * - * Distribution tokens are added to a locked pool in the contract and become unlocked over time - * according to a once-configurable unlock schedule. Once unlocked, they are available to be - * claimed by users. - * - * A user may deposit tokens to accrue ownership share over the unlocked pool. This owner share - * is a function of the number of tokens deposited as well as the length of time deposited. - * Specifically, a user's share of the currently-unlocked pool equals their "deposit-seconds" - * divided by the global "deposit-seconds". This aligns the new token distribution with long - * term supporters of the project, addressing one of the major drawbacks of simple airdrops. - * - * More background and motivation available at: - * https://github.com/ampleforth/RFCs/blob/master/RFCs/rfc-1.md - */ -contract TokenGeyser is IStaking, Ownable { - using SafeMath for uint256; - - event Staked( - address indexed user, - uint256 amount, - uint256 total, - bytes data - ); - event Unstaked( - address indexed user, - uint256 amount, - uint256 total, - bytes data - ); - event TokensClaimed(address indexed user, uint256 amount); - event TokensLocked(uint256 amount, uint256 durationSec, uint256 total); - // amount: Unlocked tokens, total: Total locked tokens - event TokensUnlocked(uint256 amount, uint256 total); - event RewardDistributionRoleTransferred( - address oldRewardDistribution, - address newRewardDistribution - ); - - TokenPool private _stakingPool; - TokenPool private _unlockedPool; - TokenPool private _lockedPool; - - // Address that is expected to fund the contract with tokens to distribute. - address public rewardDistribution; - - // - // Time-bonus params - // - uint256 public constant BONUS_DECIMALS = 2; - uint256 public startBonus = 0; - uint256 public bonusPeriodSec = 0; - - // - // Global accounting state - // - uint256 public totalLockedShares = 0; - uint256 public totalStakingShares = 0; - uint256 private _totalStakingShareSeconds = 0; - uint256 private _lastAccountingTimestampSec = now; - uint256 private _maxUnlockSchedules = 0; - uint256 private _initialSharesPerToken = 0; - - // - // User accounting state - // - // Represents a single stake for a user. A user may have multiple. - struct Stake { - uint256 stakingShares; - uint256 timestampSec; - } - - // Caches aggregated values from the User->Stake[] map to save computation. - // If lastAccountingTimestampSec is 0, there's no entry for that user. - struct UserTotals { - uint256 stakingShares; - uint256 stakingShareSeconds; - uint256 lastAccountingTimestampSec; - } - - // Aggregated staking values per user - mapping(address => UserTotals) private _userTotals; - - // The collection of stakes for each user. Ordered by timestamp, earliest to latest. - mapping(address => Stake[]) private _userStakes; - - // - // Locked/Unlocked Accounting state - // - struct UnlockSchedule { - uint256 initialLockedShares; - uint256 unlockedShares; - uint256 lastUnlockTimestampSec; - uint256 endAtSec; - uint256 durationSec; - } - - UnlockSchedule[] public unlockSchedules; - - /** - * @param stakingToken The token users deposit as stake. - * @param distributionToken The token users receive as they unstake. - * @param maxUnlockSchedules Max number of unlock stages, to guard against hitting gas limit. - * @param startBonus_ Starting time bonus, BONUS_DECIMALS fixed point. - * e.g. 25% means user gets 25% of max distribution tokens. - * @param bonusPeriodSec_ Length of time for bonus to increase linearly to max. - * @param initialSharesPerToken Number of shares to mint per staking token on first stake. - */ - constructor( - IERC20 stakingToken, - IERC20 distributionToken, - uint256 maxUnlockSchedules, - uint256 startBonus_, - uint256 bonusPeriodSec_, - uint256 initialSharesPerToken - ) public { - // The start bonus must be some fraction of the max. (i.e. <= 100%) - require( - startBonus_ <= 10**BONUS_DECIMALS, - "TokenGeyser: start bonus too high" - ); - // If no period is desired, instead set startBonus = 100% - // and bonusPeriod to a small value like 1sec. - require(bonusPeriodSec_ != 0, "TokenGeyser: bonus period is zero"); - require( - initialSharesPerToken > 0, - "TokenGeyser: initialSharesPerToken is zero" - ); - - _stakingPool = new TokenPool(stakingToken); - _unlockedPool = new TokenPool(distributionToken); - _lockedPool = new TokenPool(distributionToken); - startBonus = startBonus_; - bonusPeriodSec = bonusPeriodSec_; - _maxUnlockSchedules = maxUnlockSchedules; - _initialSharesPerToken = initialSharesPerToken; - rewardDistribution = owner(); // By default owner is expected to fund the contract. - } - - /** - * @dev Transfers amount of deposit tokens from the user. - * @param amount Number of deposit tokens to stake. - * @param data Not used. - */ - function stake(uint256 amount, bytes calldata data) external { - _stakeFor(msg.sender, msg.sender, amount); - } - - /** - * @dev Transfers amount of deposit tokens from the caller on behalf of user. - * @param user User address who gains credit for this stake operation. - * @param amount Number of deposit tokens to stake. - * @param data Not used. - */ - function stakeFor( - address user, - uint256 amount, - bytes calldata data - ) external onlyOwner { - _stakeFor(msg.sender, user, amount); - } - - /** - * @dev Unstakes a certain amount of previously deposited tokens. User also receives their - * alotted number of distribution tokens. - * @param amount Number of deposit tokens to unstake / withdraw. - * @param data Not used. - */ - function unstake(uint256 amount, bytes calldata data) external { - _unstake(amount); - } - - /** - * @dev Note that this application has a staking token as well as a distribution token, which - * may be different. This function is required by EIP-900. - * @return The deposit token used for staking. - */ - function token() external view returns (address) { - return address(getStakingToken()); - } - - /** - * @dev Transfers reward distribution role to a new address. - * Can only be called by the owner. - * @param newRewardDistribution New reward distribution address. - */ - function setRewardDistribution(address newRewardDistribution) - external - onlyOwner - { - require( - newRewardDistribution != address(0), - "New reward distribution is the zero address" - ); - - emit RewardDistributionRoleTransferred( - rewardDistribution, - newRewardDistribution - ); - - rewardDistribution = newRewardDistribution; - } - - /** - * @dev This function allows the reward distribution to add more locked distribution tokens, along - * with the associated "unlock schedule". These locked tokens immediately begin unlocking - * linearly over the duration of durationSec timeframe. - * @param amount Number of distribution tokens to lock. These are transferred from the caller. - * @param durationSec Length of time to linear unlock the tokens. - */ - function lockTokens(uint256 amount, uint256 durationSec) - public - onlyRewardDistribution - { - require( - unlockSchedules.length < _maxUnlockSchedules, - "TokenGeyser: reached maximum unlock schedules" - ); - - // Update lockedTokens amount before using it in computations after. - updateAccounting(); - - uint256 lockedTokens = totalLocked(); - uint256 mintedLockedShares = - (lockedTokens > 0) - ? totalLockedShares.mul(amount).div(lockedTokens) - : amount.mul(_initialSharesPerToken); - - UnlockSchedule memory schedule; - schedule.initialLockedShares = mintedLockedShares; - schedule.lastUnlockTimestampSec = now; - schedule.endAtSec = now.add(durationSec); - schedule.durationSec = durationSec; - unlockSchedules.push(schedule); - - totalLockedShares = totalLockedShares.add(mintedLockedShares); - - require( - _lockedPool.token().transferFrom( - msg.sender, - address(_lockedPool), - amount - ), - "TokenGeyser: transfer into locked pool failed" - ); - emit TokensLocked(amount, durationSec, totalLocked()); - } - - /** - * @param amount Number of deposit tokens to unstake / withdraw. - * @return The total number of distribution tokens that would be rewarded. - */ - function unstakeQuery(uint256 amount) public returns (uint256) { - return _unstake(amount); - } - - /** - * @return The token users deposit as stake. - */ - function getStakingToken() public view returns (IERC20) { - return _stakingPool.token(); - } - - /** - * @return The token users receive as they unstake. - */ - function getDistributionToken() public view returns (IERC20) { - assert(_unlockedPool.token() == _lockedPool.token()); - return _unlockedPool.token(); - } - - /** - * @param addr The user to look up staking information for. - * @return The number of staking tokens deposited for addr. - */ - function totalStakedFor(address addr) public view returns (uint256) { - return - totalStakingShares > 0 - ? totalStaked().mul(_userTotals[addr].stakingShares).div( - totalStakingShares - ) - : 0; - } - - /** - * @return The total number of deposit tokens staked globally, by all users. - */ - function totalStaked() public view returns (uint256) { - return _stakingPool.balance(); - } - - /** - * @dev A globally callable function to update the accounting state of the system. - * Global state and state for the caller are updated. - * @return [0] balance of the locked pool - * @return [1] balance of the unlocked pool - * @return [2] caller's staking share seconds - * @return [3] global staking share seconds - * @return [4] Rewards caller has accumulated, optimistically assumes max time-bonus. - * @return [5] block timestamp - */ - function updateAccounting() - public - returns ( - uint256, - uint256, - uint256, - uint256, - uint256, - uint256 - ) - { - unlockTokens(); - - // Global accounting - uint256 newStakingShareSeconds = - now.sub(_lastAccountingTimestampSec).mul(totalStakingShares); - _totalStakingShareSeconds = _totalStakingShareSeconds.add( - newStakingShareSeconds - ); - _lastAccountingTimestampSec = now; - - // User Accounting - UserTotals storage totals = _userTotals[msg.sender]; - uint256 newUserStakingShareSeconds = - now.sub(totals.lastAccountingTimestampSec).mul( - totals.stakingShares - ); - totals.stakingShareSeconds = totals.stakingShareSeconds.add( - newUserStakingShareSeconds - ); - totals.lastAccountingTimestampSec = now; - - uint256 totalUserRewards = - (_totalStakingShareSeconds > 0) - ? totalUnlocked().mul(totals.stakingShareSeconds).div( - _totalStakingShareSeconds - ) - : 0; - - return ( - totalLocked(), - totalUnlocked(), - totals.stakingShareSeconds, - _totalStakingShareSeconds, - totalUserRewards, - now - ); - } - - /** - * @return Total number of locked distribution tokens. - */ - function totalLocked() public view returns (uint256) { - return _lockedPool.balance(); - } - - /** - * @return Total number of unlocked distribution tokens. - */ - function totalUnlocked() public view returns (uint256) { - return _unlockedPool.balance(); - } - - /** - * @return Number of unlock schedules. - */ - function unlockScheduleCount() public view returns (uint256) { - return unlockSchedules.length; - } - - /** - * @dev Moves distribution tokens from the locked pool to the unlocked pool, according to the - * previously defined unlock schedules. Publicly callable. - * @return Number of newly unlocked distribution tokens. - */ - function unlockTokens() public returns (uint256) { - uint256 unlockedTokens = 0; - uint256 lockedTokens = totalLocked(); - - if (totalLockedShares == 0) { - unlockedTokens = lockedTokens; - } else { - uint256 unlockedShares = 0; - for (uint256 s = 0; s < unlockSchedules.length; s++) { - unlockedShares = unlockedShares.add(unlockScheduleShares(s)); - } - unlockedTokens = unlockedShares.mul(lockedTokens).div( - totalLockedShares - ); - totalLockedShares = totalLockedShares.sub(unlockedShares); - } - - if (unlockedTokens > 0) { - require( - _lockedPool.transfer(address(_unlockedPool), unlockedTokens), - "TokenGeyser: transfer out of locked pool failed" - ); - emit TokensUnlocked(unlockedTokens, totalLocked()); - } - - return unlockedTokens; - } - - /** - * @dev Lets the owner rescue funds air-dropped to the staking pool. - * @param tokenToRescue Address of the token to be rescued. - * @param to Address to which the rescued funds are to be sent. - * @param amount Amount of tokens to be rescued. - * @return Transfer success. - */ - function rescueFundsFromStakingPool( - address tokenToRescue, - address to, - uint256 amount - ) public onlyOwner returns (bool) { - return _stakingPool.rescueFunds(tokenToRescue, to, amount); - } - - /** - * @dev Private implementation of staking methods. - * @param staker User address who deposits tokens to stake. - * @param beneficiary User address who gains credit for this stake operation. - * @param amount Number of deposit tokens to stake. - */ - function _stakeFor( - address staker, - address beneficiary, - uint256 amount - ) private { - require(amount > 0, "TokenGeyser: stake amount is zero"); - require( - beneficiary != address(0), - "TokenGeyser: beneficiary is zero address" - ); - require( - totalStakingShares == 0 || totalStaked() > 0, - "TokenGeyser: Invalid state. Staking shares exist, but no staking tokens do" - ); - - uint256 mintedStakingShares = - (totalStakingShares > 0) - ? totalStakingShares.mul(amount).div(totalStaked()) - : amount.mul(_initialSharesPerToken); - require( - mintedStakingShares > 0, - "TokenGeyser: Stake amount is too small" - ); - - updateAccounting(); - - // 1. User Accounting - UserTotals storage totals = _userTotals[beneficiary]; - totals.stakingShares = totals.stakingShares.add(mintedStakingShares); - totals.lastAccountingTimestampSec = now; - - Stake memory newStake = Stake(mintedStakingShares, now); - _userStakes[beneficiary].push(newStake); - - // 2. Global Accounting - totalStakingShares = totalStakingShares.add(mintedStakingShares); - // Already set in updateAccounting() - // _lastAccountingTimestampSec = now; - - // interactions - require( - _stakingPool.token().transferFrom( - staker, - address(_stakingPool), - amount - ), - "TokenGeyser: transfer into staking pool failed" - ); - - emit Staked(beneficiary, amount, totalStakedFor(beneficiary), ""); - } - - /** - * @dev Unstakes a certain amount of previously deposited tokens. User also receives their - * alotted number of distribution tokens. - * @param amount Number of deposit tokens to unstake / withdraw. - * @return The total number of distribution tokens rewarded. - */ - function _unstake(uint256 amount) private returns (uint256) { - updateAccounting(); - - // checks - require(amount > 0, "TokenGeyser: unstake amount is zero"); - require( - totalStakedFor(msg.sender) >= amount, - "TokenGeyser: unstake amount is greater than total user stakes" - ); - uint256 stakingSharesToBurn = - totalStakingShares.mul(amount).div(totalStaked()); - require( - stakingSharesToBurn > 0, - "TokenGeyser: Unable to unstake amount this small" - ); - - // 1. User Accounting - UserTotals storage totals = _userTotals[msg.sender]; - Stake[] storage accountStakes = _userStakes[msg.sender]; - - // Redeem from most recent stake and go backwards in time. - uint256 stakingShareSecondsToBurn = 0; - uint256 sharesLeftToBurn = stakingSharesToBurn; - uint256 rewardAmount = 0; - while (sharesLeftToBurn > 0) { - Stake storage lastStake = accountStakes[accountStakes.length - 1]; - uint256 stakeTimeSec = now.sub(lastStake.timestampSec); - uint256 newStakingShareSecondsToBurn = 0; - if (lastStake.stakingShares <= sharesLeftToBurn) { - // fully redeem a past stake - newStakingShareSecondsToBurn = lastStake.stakingShares.mul( - stakeTimeSec - ); - rewardAmount = computeNewReward( - rewardAmount, - newStakingShareSecondsToBurn, - stakeTimeSec - ); - stakingShareSecondsToBurn = stakingShareSecondsToBurn.add( - newStakingShareSecondsToBurn - ); - sharesLeftToBurn = sharesLeftToBurn.sub( - lastStake.stakingShares - ); - accountStakes.length--; - } else { - // partially redeem a past stake - newStakingShareSecondsToBurn = sharesLeftToBurn.mul( - stakeTimeSec - ); - rewardAmount = computeNewReward( - rewardAmount, - newStakingShareSecondsToBurn, - stakeTimeSec - ); - stakingShareSecondsToBurn = stakingShareSecondsToBurn.add( - newStakingShareSecondsToBurn - ); - lastStake.stakingShares = lastStake.stakingShares.sub( - sharesLeftToBurn - ); - sharesLeftToBurn = 0; - } - } - totals.stakingShareSeconds = totals.stakingShareSeconds.sub( - stakingShareSecondsToBurn - ); - totals.stakingShares = totals.stakingShares.sub(stakingSharesToBurn); - // Already set in updateAccounting - // totals.lastAccountingTimestampSec = now; - - // 2. Global Accounting - _totalStakingShareSeconds = _totalStakingShareSeconds.sub( - stakingShareSecondsToBurn - ); - totalStakingShares = totalStakingShares.sub(stakingSharesToBurn); - // Already set in updateAccounting - // _lastAccountingTimestampSec = now; - - // interactions - require( - _stakingPool.transfer(msg.sender, amount), - "TokenGeyser: transfer out of staking pool failed" - ); - require( - _unlockedPool.transfer(msg.sender, rewardAmount), - "TokenGeyser: transfer out of unlocked pool failed" - ); - - emit Unstaked(msg.sender, amount, totalStakedFor(msg.sender), ""); - emit TokensClaimed(msg.sender, rewardAmount); - - require( - totalStakingShares == 0 || totalStaked() > 0, - "TokenGeyser: Error unstaking. Staking shares exist, but no staking tokens do" - ); - return rewardAmount; - } - - /** - * @dev Applies an additional time-bonus to a distribution amount. This is necessary to - * encourage long-term deposits instead of constant unstake/restakes. - * The bonus-multiplier is the result of a linear function that starts at startBonus and - * ends at 100% over bonusPeriodSec, then stays at 100% thereafter. - * @param currentRewardTokens The current number of distribution tokens already alotted for this - * unstake op. Any bonuses are already applied. - * @param stakingShareSeconds The stakingShare-seconds that are being burned for new - * distribution tokens. - * @param stakeTimeSec Length of time for which the tokens were staked. Needed to calculate - * the time-bonus. - * @return Updated amount of distribution tokens to award, with any bonus included on the - * newly added tokens. - */ - function computeNewReward( - uint256 currentRewardTokens, - uint256 stakingShareSeconds, - uint256 stakeTimeSec - ) private view returns (uint256) { - uint256 newRewardTokens = - totalUnlocked().mul(stakingShareSeconds).div( - _totalStakingShareSeconds - ); - - if (stakeTimeSec >= bonusPeriodSec) { - return currentRewardTokens.add(newRewardTokens); - } - - uint256 oneHundredPct = 10**BONUS_DECIMALS; - uint256 bonusedReward = - startBonus - .add( - oneHundredPct.sub(startBonus).mul(stakeTimeSec).div( - bonusPeriodSec - ) - ) - .mul(newRewardTokens) - .div(oneHundredPct); - return currentRewardTokens.add(bonusedReward); - } - - /** - * @dev Returns the number of unlockable shares from a given schedule. The returned value - * depends on the time since the last unlock. This function updates schedule accounting, - * but does not actually transfer any tokens. - * @param s Index of the unlock schedule. - * @return The number of unlocked shares. - */ - function unlockScheduleShares(uint256 s) private returns (uint256) { - UnlockSchedule storage schedule = unlockSchedules[s]; - - if (schedule.unlockedShares >= schedule.initialLockedShares) { - return 0; - } - - uint256 sharesToUnlock = 0; - // Special case to handle any leftover dust from integer division - if (now >= schedule.endAtSec) { - sharesToUnlock = ( - schedule.initialLockedShares.sub(schedule.unlockedShares) - ); - schedule.lastUnlockTimestampSec = schedule.endAtSec; - } else { - sharesToUnlock = now - .sub(schedule.lastUnlockTimestampSec) - .mul(schedule.initialLockedShares) - .div(schedule.durationSec); - schedule.lastUnlockTimestampSec = now; - } - - schedule.unlockedShares = schedule.unlockedShares.add(sharesToUnlock); - return sharesToUnlock; - } - - /** - * @dev Throws if called by any account other than the reward distribution. - */ - modifier onlyRewardDistribution() { - require( - rewardDistribution == msg.sender, - "Caller is not the reward distribution" - ); - _; - } -} diff --git a/solidity-v1/contracts/geyser/TokenPool.sol b/solidity-v1/contracts/geyser/TokenPool.sol deleted file mode 100644 index 8c3a1c9d58..0000000000 --- a/solidity-v1/contracts/geyser/TokenPool.sol +++ /dev/null @@ -1,46 +0,0 @@ -/** - This code is copied from: - https://github.com/ampleforth/token-geyser/tree/d8352f62a0432494c39416d090e68582e13b2b22/contracts - */ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol"; - -/** - * @title A simple holder of tokens. - * This is a simple contract to hold tokens. It's useful in the case where a separate contract - * needs to hold multiple distinct pools of the same token. - */ -contract TokenPool is Ownable { - IERC20 public token; - - constructor(IERC20 _token) public { - token = _token; - } - - function transfer(address to, uint256 value) - external - onlyOwner - returns (bool) - { - return token.transfer(to, value); - } - - function rescueFunds( - address tokenToRescue, - address to, - uint256 amount - ) external onlyOwner returns (bool) { - require( - address(token) != tokenToRescue, - "TokenPool: Cannot claim token held by the contract" - ); - - return IERC20(tokenToRescue).transfer(to, amount); - } - - function balance() public view returns (uint256) { - return token.balanceOf(address(this)); - } -} diff --git a/solidity-v1/contracts/libraries/RolesLookup.sol b/solidity-v1/contracts/libraries/RolesLookup.sol deleted file mode 100644 index ccdf8abbb8..0000000000 --- a/solidity-v1/contracts/libraries/RolesLookup.sol +++ /dev/null @@ -1,92 +0,0 @@ -pragma solidity 0.5.17; - -import "../utils/AddressArrayUtils.sol"; -import "../StakeDelegatable.sol"; -import "../TokenGrant.sol"; -import "../ManagedGrant.sol"; - -/// @title Roles Lookup -/// @notice Library facilitating lookup of roles in stake delegation setup. -library RolesLookup { - using AddressArrayUtils for address[]; - - /// @notice Returns true if the tokenOwner delegated tokens to operator - /// using the provided stakeDelegatable contract. Othwerwise, returns false. - /// This function works only for the case when tokenOwner own those tokens - /// and those are not tokens from a grant. - function isTokenOwnerForOperator( - address tokenOwner, - address operator, - StakeDelegatable stakeDelegatable - ) internal view returns (bool) { - return stakeDelegatable.ownerOf(operator) == tokenOwner; - } - - /// @notice Returns true if the grantee delegated tokens to operator - /// with the provided tokenGrant contract. Otherwise, returns false. - /// This function works only for the case when tokens were generated from - /// a non-managed grant, that is, the grantee is a non-contract address to - /// which the delegated tokens were granted. - /// @dev This function does not validate the staking reltionship on - /// a particular staking contract. It only checks whether the grantee - /// staked at least one time with the given operator. If you are interested - /// in a particular token staking contract, you need to perform additional - /// check. - function isGranteeForOperator( - address grantee, - address operator, - TokenGrant tokenGrant - ) internal view returns (bool) { - address[] memory operators = tokenGrant.getGranteeOperators(grantee); - return operators.contains(operator); - } - - /// @notice Returns true if the grantee from the given managed grant contract - /// delegated tokens to operator with the provided tokenGrant contract. - /// Otherwise, returns false. In case the grantee declared by the managed - /// grant contract does not match the provided grantee, function reverts. - /// This function works only for cases when grantee, from TokenGrant's - /// perspective, is a smart contract exposing grantee() function returning - /// the final grantee. One possibility is the ManagedGrant contract. - /// @dev This function does not validate the staking reltionship on - /// a particular staking contract. It only checks whether the grantee - /// staked at least one time with the given operator. If you are interested - /// in a particular token staking contract, you need to perform additional - /// check. - function isManagedGranteeForOperator( - address grantee, - address operator, - address managedGrantContract, - TokenGrant tokenGrant - ) internal view returns (bool) { - require( - ManagedGrant(managedGrantContract).grantee() == grantee, - "Not a grantee of the provided contract" - ); - - address[] memory operators = - tokenGrant.getGranteeOperators(managedGrantContract); - return operators.contains(operator); - } - - /// @notice Returns true if grant with the given ID has been created with - /// managed grant pointing currently to the grantee passed as a parameter. - /// @dev The function does not revert if grant has not been created with - /// a managed grantee. This function is not a view because it uses low-level - /// call to check if the grant has been created with a managed grant. - /// It does not however modify any state. - function isManagedGranteeForGrant( - address grantee, - uint256 grantId, - TokenGrant tokenGrant - ) internal returns (bool) { - (, , , , , address managedGrant) = tokenGrant.getGrant(grantId); - (, bytes memory result) = - managedGrant.call(abi.encodeWithSignature("grantee()")); - if (result.length == 0) { - return false; - } - address managedGrantee = abi.decode(result, (address)); - return grantee == managedGrantee; - } -} diff --git a/solidity-v1/contracts/libraries/grant/UnlockingSchedule.sol b/solidity-v1/contracts/libraries/grant/UnlockingSchedule.sol deleted file mode 100644 index 3907ec0c1f..0000000000 --- a/solidity-v1/contracts/libraries/grant/UnlockingSchedule.sol +++ /dev/null @@ -1,29 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; - -library UnlockingSchedule { - using SafeMath for uint256; - - function getUnlockedAmount( - uint256 _now, - uint256 grantedAmount, - uint256 duration, - uint256 start, - uint256 cliff - ) internal pure returns (uint256) { - bool cliffNotReached = _now < cliff; - if (cliffNotReached) { - return 0; - } - - uint256 timeElapsed = _now.sub(start); - - bool unlockingPeriodFinished = timeElapsed >= duration; - if (unlockingPeriodFinished) { - return grantedAmount; - } - - return grantedAmount.mul(timeElapsed).div(duration); - } -} diff --git a/solidity-v1/contracts/libraries/operator/DKGResultVerification.sol b/solidity-v1/contracts/libraries/operator/DKGResultVerification.sol deleted file mode 100644 index f720628167..0000000000 --- a/solidity-v1/contracts/libraries/operator/DKGResultVerification.sol +++ /dev/null @@ -1,118 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/cryptography/ECDSA.sol"; -import "../../utils/BytesLib.sol"; -import "./GroupSelection.sol"; - -library DKGResultVerification { - using BytesLib for bytes; - using ECDSA for bytes32; - using GroupSelection for GroupSelection.Storage; - - struct Storage { - // Time in blocks after which DKG result is complete and ready to be - // published by clients. - uint256 timeDKG; - // Time in blocks after which the next group member is eligible - // to submit DKG result. - uint256 resultPublicationBlockStep; - // Size of a group in the threshold relay. - uint256 groupSize; - // The minimum number of signatures required to support DKG result. - // This number needs to be at least the same as the signing threshold - // and it is recommended to make it higher than the signing threshold - // to keep a safety margin for misbehaving members. - uint256 signatureThreshold; - } - - /// @notice Verifies the submitted DKG result against supporting member - /// signatures and if the submitter is eligible to submit at the current - /// block. Every signature supporting the result has to be from a unique - /// group member. - /// - /// @param submitterMemberIndex Claimed submitter candidate group member index - /// @param groupPubKey Generated candidate group public key - /// @param misbehaved Bytes array of misbehaved (disqualified or inactive) - /// group members indexes; Indexes reflect positions of members in the group, - /// as outputted by the group selection protocol. - /// @param signatures Concatenation of signatures from members supporting the - /// result. - /// @param signingMemberIndices Indices of members corresponding to each - /// signature. Indices have to be unique. - /// @param members Addresses of candidate group members as outputted by the - /// group selection protocol. - /// @param groupSelectionEndBlock Block height at which the group selection - /// protocol ended. - function verify( - Storage storage self, - uint256 submitterMemberIndex, - bytes memory groupPubKey, - bytes memory misbehaved, - bytes memory signatures, - uint256[] memory signingMemberIndices, - address[] memory members, - uint256 groupSelectionEndBlock - ) public view { - require(submitterMemberIndex > 0, "Invalid submitter index"); - require( - members[submitterMemberIndex - 1] == msg.sender, - "Unexpected submitter index" - ); - - uint256 T_init = groupSelectionEndBlock + self.timeDKG; - require( - block.number >= - (T_init + - (submitterMemberIndex - 1) * - self.resultPublicationBlockStep), - "Submitter not eligible" - ); - - require(groupPubKey.length == 128, "Malformed group public key"); - - require( - misbehaved.length <= self.groupSize - self.signatureThreshold, - "Malformed misbehaved bytes" - ); - - uint256 signaturesCount = signatures.length / 65; - require(signatures.length >= 65, "Too short signatures array"); - require(signatures.length % 65 == 0, "Malformed signatures array"); - require( - signaturesCount == signingMemberIndices.length, - "Unexpected signatures count" - ); - require( - signaturesCount >= self.signatureThreshold, - "Too few signatures" - ); - require(signaturesCount <= self.groupSize, "Too many signatures"); - - bytes32 resultHash = - keccak256(abi.encodePacked(groupPubKey, misbehaved)); - - bytes memory current; // Current signature to be checked. - - bool[] memory usedMemberIndices = new bool[](self.groupSize); - - for (uint256 i = 0; i < signaturesCount; i++) { - uint256 memberIndex = signingMemberIndices[i]; - require(memberIndex > 0, "Invalid index"); - require(memberIndex <= members.length, "Index out of range"); - - require( - !usedMemberIndices[memberIndex - 1], - "Duplicate member index" - ); - usedMemberIndices[memberIndex - 1] = true; - - current = signatures.slice(65 * i, 65); - address recoveredAddress = - resultHash.toEthSignedMessageHash().recover(current); - require( - members[memberIndex - 1] == recoveredAddress, - "Invalid signature" - ); - } - } -} diff --git a/solidity-v1/contracts/libraries/operator/DelayFactor.sol b/solidity-v1/contracts/libraries/operator/DelayFactor.sol deleted file mode 100644 index 4696eaa191..0000000000 --- a/solidity-v1/contracts/libraries/operator/DelayFactor.sol +++ /dev/null @@ -1,50 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; - -library DelayFactor { - using SafeMath for uint256; - - /// @notice Gets delay factor for rewards calculation. - /// @return Integer representing floating-point number with 16 decimals places. - function calculate( - uint256 currentRequestStartBlock, - uint256 relayEntryTimeout - ) public view returns (uint256 delayFactor) { - uint256 decimals = 1e16; // Adding 16 decimals to perform float division. - - // T_deadline is the earliest block when no submissions are accepted - // and an entry timed out. The last block the entry can be published in is - // currentRequestStartBlock + relayEntryTimeout - // and submission are no longer accepted from block - // currentRequestStartBlock + relayEntryTimeout + 1. - uint256 deadlineBlock = - currentRequestStartBlock.add(relayEntryTimeout).add(1); - - // T_begin is the earliest block the result can be published in. - // Relay entry can be generated instantly after relay request is - // registered on-chain so a new entry can be published at the next - // block the earliest. - uint256 submissionStartBlock = currentRequestStartBlock.add(1); - - // Use submissionStartBlock block as entryReceivedBlock if entry submitted earlier than expected. - uint256 entryReceivedBlock = - block.number <= submissionStartBlock - ? submissionStartBlock - : block.number; - - // T_remaining = T_deadline - T_received - uint256 remainingBlocks = deadlineBlock.sub(entryReceivedBlock); - - // T_deadline - T_begin - uint256 submissionWindow = deadlineBlock.sub(submissionStartBlock); - - // delay factor = [ T_remaining / (T_deadline - T_begin)]^2 - // - // Since we add 16 decimal places to perform float division, we do: - // delay factor = [ T_temaining * decimals / (T_deadline - T_begin)]^2 / decimals = - // = [T_remaining / (T_deadline - T_begin) ]^2 * decimals - delayFactor = ((remainingBlocks.mul(decimals).div(submissionWindow))**2) - .div(decimals); - } -} diff --git a/solidity-v1/contracts/libraries/operator/GroupSelection.sol b/solidity-v1/contracts/libraries/operator/GroupSelection.sol deleted file mode 100644 index 99bf43065c..0000000000 --- a/solidity-v1/contracts/libraries/operator/GroupSelection.sol +++ /dev/null @@ -1,400 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "../../utils/BytesLib.sol"; - -/// @title Group Selection -/// @notice The group selection protocol is an interactive method of selecting -/// candidate group from the set of all stakers given a pseudorandom seed value. -/// -/// The protocol produces a representative result, where each staker's profit is -/// proportional to the number of tokens they have staked. Produced candidate -/// groups are of constant size. -/// -/// Group selection protocol accepts seed as an input - a pseudorandom value -/// used to construct candidate tickets. Each candidate group member can -/// submit their tickets. The maximum number of tickets one can submit depends -/// on their staking weight - relation of the minimum stake to the candidate's -/// stake. -/// -/// There is a certain timeout, expressed in blocks, when tickets can be -/// submitted. Each ticket is a mix of staker's address, virtual staker index -/// and group selection seed. Candidate group members are selected based on -/// the best tickets submitted. There has to be a minimum number of tickets -/// submitted, equal to the candidate group size so that the protocol can -/// complete successfully. -library GroupSelection { - using SafeMath for uint256; - using BytesLib for bytes; - - struct Storage { - // Tickets submitted by member candidates during the current group - // selection execution and accepted by the protocol for the - // consideration. - uint64[] tickets; - // Information about ticket submitters (group member candidates). - mapping(uint256 => address) candidate; - // Pseudorandom seed value used as an input for the group selection. - uint256 seed; - // Timeout in blocks after which the ticket submission is finished. - uint256 ticketSubmissionTimeout; - // Number of block at which the group selection started and from which - // ticket submissions are accepted. - uint256 ticketSubmissionStartBlock; - // Indicates whether a group selection is currently in progress. - // Concurrent group selections are not allowed. - bool inProgress; - // Captures the minimum stake when group selection starts. This is to ensure the - // same staking weight divisor is applied for all member candidates participating. - uint256 minimumStake; - // Map simulates a sorted linked list of ticket values by their indexes. - // key -> value represent indices from the tickets[] array. - // 'key' index holds an index of a ticket and 'value' holds an index - // of the next ticket. Tickets are sorted by their value in - // descending order starting from the tail. - // Ex. tickets = [151, 42, 175, 7] - // tail: 2 because tickets[2] = 175 - // previousTicketIndex[0] -> 1 - // previousTicketIndex[1] -> 3 - // previousTicketIndex[2] -> 0 - // previousTicketIndex[3] -> 3 note: index that holds a lowest - // value points to itself because there is no `nil` in Solidity. - // Traversing from tail: [2]->[0]->[1]->[3] result in 175->151->42->7 - bytes previousTicketIndices; - // Tail represents an index of a ticket in a tickets[] array which holds - // the highest ticket value. It is a tail of the linked list defined by - // `previousTicketIndex`. - uint256 tail; - // Size of a group in the threshold relay. - uint256 groupSize; - } - - /// @notice Starts group selection protocol. - /// @param _seed pseudorandom seed value used as an input for the group - /// selection. All submitted tickets needs to have the seed mixed-in into the - /// value. - function start(Storage storage self, uint256 _seed) public { - // We execute the minimum required cleanup here needed in case the - // previous group selection failed and did not clean up properly in - // finish function. - cleanupTickets(self); - self.inProgress = true; - self.seed = _seed; - self.ticketSubmissionStartBlock = block.number; - } - - /// @notice Finishes group selection protocol clearing up all the submitted - /// tickets. This function may be expensive if not executed as a part of - /// another transaction consuming a lot of gas and as a result, getting - /// gas refund for clearing up the storage. - function finish(Storage storage self) public { - cleanupCandidates(self); - cleanupTickets(self); - self.inProgress = false; - } - - /// @notice Submits ticket to request to participate in a new candidate group. - /// @param ticket Bytes representation of a ticket that holds the following: - /// - ticketValue: first 8 bytes of a result of keccak256 cryptography hash - /// function on the combination of the group selection seed (previous - /// beacon output), staker-specific value (address) and virtual staker index. - /// - stakerValue: a staker-specific value which is the address of the staker. - /// - virtualStakerIndex: 4-bytes number within a range of 1 to staker's weight; - /// has to be unique for all tickets submitted by the given staker for the - /// current candidate group selection. - /// @param stakingWeight Ratio of the minimum stake to the candidate's - /// stake. - function submitTicket( - Storage storage self, - bytes32 ticket, - uint256 stakingWeight - ) public { - uint64 ticketValue; - uint160 stakerValue; - uint32 virtualStakerIndex; - - bytes memory ticketBytes = abi.encodePacked(ticket); - /* solium-disable-next-line */ - assembly { - // ticket value is 8 bytes long - ticketValue := mload(add(ticketBytes, 8)) - // staker value is 20 bytes long - stakerValue := mload(add(ticketBytes, 28)) - // virtual staker index is 4 bytes long - virtualStakerIndex := mload(add(ticketBytes, 32)) - } - - submitTicket( - self, - ticketValue, - uint256(stakerValue), - uint256(virtualStakerIndex), - stakingWeight - ); - } - - /// @notice Submits ticket to request to participate in a new candidate group. - /// @param ticketValue First 8 bytes of a result of keccak256 cryptography hash - /// function on the combination of the group selection seed (previous - /// beacon output), staker-specific value (address) and virtual staker index. - /// @param stakerValue Staker-specific value which is the address of the staker. - /// @param virtualStakerIndex 4-bytes number within a range of 1 to staker's weight; - /// has to be unique for all tickets submitted by the given staker for the - /// current candidate group selection. - /// @param stakingWeight Ratio of the minimum stake to the candidate's - /// stake. - function submitTicket( - Storage storage self, - uint64 ticketValue, - uint256 stakerValue, - uint256 virtualStakerIndex, - uint256 stakingWeight - ) public { - if ( - block.number > - self.ticketSubmissionStartBlock.add(self.ticketSubmissionTimeout) - ) { - revert("Ticket submission is over"); - } - - if (self.candidate[ticketValue] != address(0)) { - revert("Duplicate ticket"); - } - - if ( - isTicketValid( - ticketValue, - stakerValue, - virtualStakerIndex, - stakingWeight, - self.seed - ) - ) { - addTicket(self, ticketValue); - } else { - revert("Invalid ticket"); - } - } - - /// @notice Performs full verification of the ticket. - function isTicketValid( - uint64 ticketValue, - uint256 stakerValue, - uint256 virtualStakerIndex, - uint256 stakingWeight, - uint256 groupSelectionSeed - ) internal view returns (bool) { - uint64 ticketValueExpected; - bytes memory ticketBytes = - abi.encodePacked( - keccak256( - abi.encodePacked( - groupSelectionSeed, - stakerValue, - virtualStakerIndex - ) - ) - ); - // use first 8 bytes to compare ticket values - /* solium-disable-next-line */ - assembly { - ticketValueExpected := mload(add(ticketBytes, 8)) - } - - bool isVirtualStakerIndexValid = - virtualStakerIndex > 0 && virtualStakerIndex <= stakingWeight; - bool isStakerValueValid = stakerValue == uint256(msg.sender); - bool isTicketValueValid = ticketValue == ticketValueExpected; - - return - isVirtualStakerIndexValid && - isStakerValueValid && - isTicketValueValid; - } - - /// @notice Adds a new, verified ticket. Ticket is accepted when it is lower - /// than the currently highest ticket or when the number of tickets is still - /// below the group size. - function addTicket(Storage storage self, uint64 newTicketValue) internal { - uint256[] memory previousTicketIndex = readPreviousTicketIndices(self); - uint256[] memory ordered = - getTicketValueOrderedIndices(self, previousTicketIndex); - - // any ticket goes when the tickets array size is lower than the group size - if (self.tickets.length < self.groupSize) { - // no tickets - if (self.tickets.length == 0) { - self.tickets.push(newTicketValue); - // higher than the current highest - } else if (newTicketValue > self.tickets[self.tail]) { - self.tickets.push(newTicketValue); - uint256 oldTail = self.tail; - self.tail = self.tickets.length - 1; - previousTicketIndex[self.tail] = oldTail; - // lower than the current lowest - } else if (newTicketValue < self.tickets[ordered[0]]) { - self.tickets.push(newTicketValue); - // last element points to itself - previousTicketIndex[self.tickets.length - 1] = - self.tickets.length - - 1; - // previous lowest ticket points to the new lowest - previousTicketIndex[ordered[0]] = self.tickets.length - 1; - // higher than the lowest ticket value and lower than the highest ticket value - } else { - self.tickets.push(newTicketValue); - uint256 j = findReplacementIndex(self, newTicketValue, ordered); - previousTicketIndex[ - self.tickets.length - 1 - ] = previousTicketIndex[j]; - previousTicketIndex[j] = self.tickets.length - 1; - } - self.candidate[newTicketValue] = msg.sender; - } else if (newTicketValue < self.tickets[self.tail]) { - uint256 ticketToRemove = self.tickets[self.tail]; - // new ticket is lower than currently lowest - if (newTicketValue < self.tickets[ordered[0]]) { - // replacing highest ticket with the new lowest - self.tickets[self.tail] = newTicketValue; - uint256 newTail = previousTicketIndex[self.tail]; - previousTicketIndex[ordered[0]] = self.tail; - previousTicketIndex[self.tail] = self.tail; - self.tail = newTail; - } else { - // new ticket is between lowest and highest - uint256 j = findReplacementIndex(self, newTicketValue, ordered); - self.tickets[self.tail] = newTicketValue; - // do not change the order if a new ticket is still highest - if (j != self.tail) { - uint256 newTail = previousTicketIndex[self.tail]; - previousTicketIndex[self.tail] = previousTicketIndex[j]; - previousTicketIndex[j] = self.tail; - self.tail = newTail; - } - } - // we are replacing tickets so we also need to replace information - // about the submitter - delete self.candidate[ticketToRemove]; - self.candidate[newTicketValue] = msg.sender; - } - storePreviousTicketIndices(self, previousTicketIndex); - } - - /// @notice Use binary search to find an index for a new ticket in the tickets[] array - function findReplacementIndex( - Storage storage self, - uint64 newTicketValue, - uint256[] memory ordered - ) internal view returns (uint256) { - uint256 lo = 0; - uint256 hi = ordered.length - 1; - uint256 mid = 0; - while (lo <= hi) { - mid = (lo + hi) >> 1; - if (newTicketValue < self.tickets[ordered[mid]]) { - hi = mid - 1; - } else if (newTicketValue > self.tickets[ordered[mid]]) { - lo = mid + 1; - } else { - return ordered[mid]; - } - } - - return ordered[lo]; - } - - function readPreviousTicketIndices(Storage storage self) - internal - view - returns (uint256[] memory uncompressed) - { - bytes memory compressed = self.previousTicketIndices; - uncompressed = new uint256[](self.groupSize); - for (uint256 i = 0; i < compressed.length; i++) { - uncompressed[i] = uint256(uint8(compressed[i])); - } - } - - function storePreviousTicketIndices( - Storage storage self, - uint256[] memory uncompressed - ) internal { - bytes memory compressed = new bytes(uncompressed.length); - for (uint256 i = 0; i < compressed.length; i++) { - compressed[i] = bytes1(uint8(uncompressed[i])); - } - self.previousTicketIndices = compressed; - } - - /// @notice Creates an array of ticket indexes based on their values in the - /// ascending order: - /// - /// ordered[n-1] = tail - /// ordered[n-2] = previousTicketIndex[tail] - /// ordered[n-3] = previousTicketIndex[ordered[n-2]] - function getTicketValueOrderedIndices( - Storage storage self, - uint256[] memory previousIndices - ) internal view returns (uint256[] memory) { - uint256[] memory ordered = new uint256[](self.tickets.length); - if (ordered.length > 0) { - ordered[self.tickets.length - 1] = self.tail; - if (ordered.length > 1) { - for (uint256 i = self.tickets.length - 1; i > 0; i--) { - ordered[i - 1] = previousIndices[ordered[i]]; - } - } - } - - return ordered; - } - - /// @notice Gets selected participants in ascending order of their tickets. - function selectedParticipants(Storage storage self) - public - view - returns (address[] memory) - { - require( - block.number >= - self.ticketSubmissionStartBlock.add( - self.ticketSubmissionTimeout - ), - "Ticket submission in progress" - ); - - require( - self.tickets.length >= self.groupSize, - "Not enough tickets submitted" - ); - - uint256[] memory previousTicketIndex = readPreviousTicketIndices(self); - address[] memory selected = new address[](self.groupSize); - uint256 ticketIndex = self.tail; - selected[self.tickets.length - 1] = self.candidate[ - self.tickets[ticketIndex] - ]; - for (uint256 i = self.tickets.length - 1; i > 0; i--) { - ticketIndex = previousTicketIndex[ticketIndex]; - selected[i - 1] = self.candidate[self.tickets[ticketIndex]]; - } - - return selected; - } - - /// @notice Clears up data of the group selection tickets. - function cleanupTickets(Storage storage self) internal { - delete self.tickets; - self.tail = 0; - } - - /// @notice Clears up data of the group selection candidates. - /// This operation may have a significant cost if not executed as a part of - /// another transaction consuming a lot of gas and as a result, getting - /// gas refund for clearing up the storage. - function cleanupCandidates(Storage storage self) internal { - for (uint256 i = 0; i < self.tickets.length; i++) { - delete self.candidate[self.tickets[i]]; - } - } -} diff --git a/solidity-v1/contracts/libraries/operator/Groups.sol b/solidity-v1/contracts/libraries/operator/Groups.sol deleted file mode 100644 index 367d2ffe1e..0000000000 --- a/solidity-v1/contracts/libraries/operator/Groups.sol +++ /dev/null @@ -1,474 +0,0 @@ -pragma solidity 0.5.17; -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "../../utils/BytesLib.sol"; -import "../../utils/PercentUtils.sol"; -import "../../cryptography/AltBn128.sol"; -import "../../cryptography/BLS.sol"; -import "../../TokenStaking.sol"; - -library Groups { - using SafeMath for uint256; - using PercentUtils for uint256; - using BytesLib for bytes; - - // The index of a group is flagged with the most significant bit set, - // to distinguish the group `0` from null. - // The flag is toggled with bitwise XOR (`^`) - // which keeps all other bits intact but flips the flag bit. - // The flag should be set before writing to `groupIndices`, - // and unset after reading from `groupIndices` - // before using the value. - uint256 constant GROUP_INDEX_FLAG = 1 << 255; - - uint256 constant ONE_MONTH = 86400 * 30; - uint256 constant THREE_MONTHS = 3 * ONE_MONTH; - uint256 constant SIX_MONTHS = 6 * ONE_MONTH; - - struct Group { - bytes groupPubKey; - uint256 registrationBlockHeight; - bool terminated; - uint248 registrationTime; - } - - struct Storage { - // Time in blocks after which a group expires. - uint256 groupActiveTime; - // Duplicated constant from operator contract to avoid extra call. - // The value is set when the operator contract is added. - uint256 relayEntryTimeout; - // Mapping of `groupPubKey` to flagged `groupIndex` - mapping(bytes => uint256) groupIndices; - Group[] groups; - uint256[] activeTerminatedGroups; - mapping(bytes => address[]) groupMembers; - // Sum of all group member rewards earned so far. The value is the same for - // all group members. Submitter reward and reimbursement is paid immediately - // and is not included here. Each group member can withdraw no more than - // this value. - mapping(bytes => uint256) groupMemberRewards; - // Mapping of `groupPubKey, operator` - // to whether the operator has withdrawn rewards from that group. - mapping(bytes => mapping(address => bool)) withdrawn; - // expiredGroupOffset is pointing to the first active group, it is also the - // expired groups counter - uint256 expiredGroupOffset; - TokenStaking stakingContract; - } - - /// @notice Adds a new group. - function addGroup(Storage storage self, bytes memory groupPubKey) public { - self.groupIndices[groupPubKey] = (self.groups.length ^ - GROUP_INDEX_FLAG); - self.groups.push( - Group(groupPubKey, block.number, false, uint248(block.timestamp)) - ); - } - - /// @notice Sets addresses of members for the group with the given public key - /// eliminating members at positions pointed by the misbehaved array. - /// @param groupPubKey Group public key. - /// @param members Group member addresses as outputted by the group selection - /// protocol. - /// @param misbehaved Bytes array of misbehaved (disqualified or inactive) - /// group members indexes in ascending order; Indexes reflect positions of - /// members in the group as outputted by the group selection protocol - - /// member indexes start from 1. - function setGroupMembers( - Storage storage self, - bytes memory groupPubKey, - address[] memory members, - bytes memory misbehaved - ) public { - self.groupMembers[groupPubKey] = members; - - // Iterate misbehaved array backwards, replace misbehaved - // member with the last element and reduce array length - uint256 i = misbehaved.length; - while (i > 0) { - // group member indexes start from 1, so we need to -1 on misbehaved - uint256 memberArrayPosition = misbehaved.toUint8(i - 1) - 1; - self.groupMembers[groupPubKey][memberArrayPosition] = self - .groupMembers[groupPubKey][ - self.groupMembers[groupPubKey].length - 1 - ]; - self.groupMembers[groupPubKey].length--; - i--; - } - } - - /// @notice Adds group member reward per group so the accumulated amount can - /// be withdrawn later. - function addGroupMemberReward( - Storage storage self, - bytes memory groupPubKey, - uint256 amount - ) internal { - self.groupMemberRewards[groupPubKey] = self.groupMemberRewards[ - groupPubKey - ] - .add(amount); - } - - /// @notice Returns accumulated group member rewards for provided group. - function getGroupMemberRewards( - Storage storage self, - bytes memory groupPubKey - ) internal view returns (uint256) { - return self.groupMemberRewards[groupPubKey]; - } - - /// @notice Gets group public key. - function getGroupPublicKey(Storage storage self, uint256 groupIndex) - internal - view - returns (bytes memory) - { - return self.groups[groupIndex].groupPubKey; - } - - /// @notice Gets group member. - function getGroupMember( - Storage storage self, - bytes memory groupPubKey, - uint256 memberIndex - ) internal view returns (address) { - return self.groupMembers[groupPubKey][memberIndex]; - } - - /// @notice Terminates group with the provided index. Reverts if the group - /// is already terminated. - function terminateGroup(Storage storage self, uint256 groupIndex) public { - require( - !isGroupTerminated(self, groupIndex), - "Group has been already terminated" - ); - self.groups[groupIndex].terminated = true; - self.activeTerminatedGroups.length++; - - // Sorting activeTerminatedGroups in ascending order so a non-terminated - // group is properly selected. - uint256 i; - for ( - i = self.activeTerminatedGroups.length - 1; - i > 0 && self.activeTerminatedGroups[i - 1] > groupIndex; - i-- - ) { - self.activeTerminatedGroups[i] = self.activeTerminatedGroups[i - 1]; - } - self.activeTerminatedGroups[i] = groupIndex; - } - - /// @notice Checks if group with the given index is terminated. - function isGroupTerminated(Storage storage self, uint256 groupIndex) - internal - view - returns (bool) - { - return self.groups[groupIndex].terminated; - } - - /// @notice Checks if group with the given public key is registered. - function isGroupRegistered(Storage storage self, bytes memory groupPubKey) - internal - view - returns (bool) - { - // Values in `groupIndices` are flagged with `GROUP_INDEX_FLAG` - // and thus nonzero, even for group 0 - return self.groupIndices[groupPubKey] > 0; - } - - /// @notice Gets the cutoff time in blocks until which the given group is - /// considered as an active group assuming it hasn't been terminated before. - function groupActiveTimeOf(Storage storage self, Group memory group) - internal - view - returns (uint256) - { - return uint256(group.registrationBlockHeight).add(self.groupActiveTime); - } - - /// @notice Gets the cutoff time in blocks after which the given group is - /// considered as stale. Stale group is an expired group which is no longer - /// performing any operations. - function groupStaleTime(Storage storage self, Group memory group) - internal - view - returns (uint256) - { - return groupActiveTimeOf(self, group).add(self.relayEntryTimeout); - } - - /// @notice Checks if a group with the given public key is a stale group. - /// Stale group is an expired group which is no longer performing any - /// operations. It is important to understand that an expired group may - /// still perform some operations for which it was selected when it was still - /// active. We consider a group to be stale when it's expired and when its - /// expiration time and potentially executed operation timeout are both in - /// the past. - function isStaleGroup(Storage storage self, bytes memory groupPubKey) - public - view - returns (bool) - { - uint256 flaggedIndex = self.groupIndices[groupPubKey]; - require(flaggedIndex != 0, "Group does not exist"); - uint256 index = flaggedIndex ^ GROUP_INDEX_FLAG; - bool isExpired = self.expiredGroupOffset > index; - bool isStale = groupStaleTime(self, self.groups[index]) < block.number; - return isExpired && isStale; - } - - /// @notice Checks if a group with the given index is a stale group. - /// Stale group is an expired group which is no longer performing any - /// operations. It is important to understand that an expired group may - /// still perform some operations for which it was selected when it was still - /// active. We consider a group to be stale when it's expired and when its - /// expiration time and potentially executed operation timeout are both in - /// the past. - function isStaleGroup(Storage storage self, uint256 groupIndex) - public - view - returns (bool) - { - return groupStaleTime(self, self.groups[groupIndex]) < block.number; - } - - /// @notice Gets the number of active groups. Expired and terminated groups are - /// not counted as active. - function numberOfGroups(Storage storage self) - internal - view - returns (uint256) - { - return - self.groups.length.sub(self.expiredGroupOffset).sub( - self.activeTerminatedGroups.length - ); - } - - /// @notice Goes through groups starting from the oldest one that is still - /// active and checks if it hasn't expired. If so, updates the information - /// about expired groups so that all expired groups are marked as such. - function expireOldGroups(Storage storage self) public { - // Move expiredGroupOffset as long as there are some groups that should - // be marked as expired. It is possible that expired group offset will - // move out of the groups array by one position. It means that all groups - // are expired (it points to the first active group) and that place in - // groups array - currently empty - will be possibly filled later by - // a new group. - while ( - self.expiredGroupOffset < self.groups.length && - groupActiveTimeOf(self, self.groups[self.expiredGroupOffset]) < - block.number - ) { - self.expiredGroupOffset++; - } - - // Go through all activeTerminatedGroups and if some of the terminated - // groups are expired, remove them from activeTerminatedGroups collection. - // This is needed because we evaluate the shift of selected group index - // based on how many non-expired groups has been terminated. - for (uint256 i = 0; i < self.activeTerminatedGroups.length; i++) { - if (self.expiredGroupOffset > self.activeTerminatedGroups[i]) { - self.activeTerminatedGroups[i] = self.activeTerminatedGroups[ - self.activeTerminatedGroups.length - 1 - ]; - self.activeTerminatedGroups.length--; - } - } - } - - /// @notice Returns an index of a randomly selected active group. Terminated - /// and expired groups are not considered as active. - /// Before new group is selected, information about expired groups - /// is updated. At least one active group needs to be present for this - /// function to succeed. - /// @param seed Random number used as a group selection seed. - function selectGroup(Storage storage self, uint256 seed) - public - returns (uint256) - { - expireOldGroups(self); - - require(numberOfGroups(self) > 0, "No active groups"); - - uint256 selectedGroup = seed % numberOfGroups(self); - return - shiftByTerminatedGroups( - self, - shiftByExpiredGroups(self, selectedGroup) - ); - } - - /// @notice Evaluates the shift of selected group index based on the number of - /// expired groups. - function shiftByExpiredGroups(Storage storage self, uint256 selectedIndex) - internal - view - returns (uint256) - { - return self.expiredGroupOffset.add(selectedIndex); - } - - /// @notice Evaluates the shift of selected group index based on the number of - /// non-expired, terminated groups. - function shiftByTerminatedGroups( - Storage storage self, - uint256 selectedIndex - ) internal view returns (uint256) { - uint256 shiftedIndex = selectedIndex; - for (uint256 i = 0; i < self.activeTerminatedGroups.length; i++) { - if (self.activeTerminatedGroups[i] <= shiftedIndex) { - shiftedIndex++; - } - } - - return shiftedIndex; - } - - /// @notice Withdraws accumulated group member rewards for operator - /// using the provided group index. - /// Once the accumulated reward is withdrawn from the selected group, - /// the operator is flagged as withdrawn. - /// Rewards can be withdrawn only from stale group. - /// @param operator Operator address. - /// @param groupIndex Group index. - function withdrawFromGroup( - Storage storage self, - address operator, - uint256 groupIndex - ) public returns (uint256 rewards) { - bool isExpired = self.expiredGroupOffset > groupIndex; - bool isStale = isStaleGroup(self, groupIndex); - require(isExpired && isStale, "Group must be expired and stale"); - bytes memory groupPublicKey = getGroupPublicKey(self, groupIndex); - require( - !(self.withdrawn[groupPublicKey][operator]), - "Rewards already withdrawn" - ); - self.withdrawn[groupPublicKey][operator] = true; - for (uint256 i = 0; i < self.groupMembers[groupPublicKey].length; i++) { - if (operator == self.groupMembers[groupPublicKey][i]) { - rewards = rewards.add(self.groupMemberRewards[groupPublicKey]); - } - } - } - - /// @notice Returns members of the given group by group public key. - /// @param groupPubKey Group public key. - function getGroupMembers(Storage storage self, bytes memory groupPubKey) - public - view - returns (address[] memory members) - { - return self.groupMembers[groupPubKey]; - } - - /// @notice Returns addresses of all the members in the provided group. - function getGroupMembers(Storage storage self, uint256 groupIndex) - public - view - returns (address[] memory members) - { - bytes memory groupPubKey = self.groups[groupIndex].groupPubKey; - return self.groupMembers[groupPubKey]; - } - - function getGroupRegistrationTime(Storage storage self, uint256 groupIndex) - public - view - returns (uint256) - { - return uint256(self.groups[groupIndex].registrationTime); - } - - /// @notice Reports unauthorized signing for the provided group. Must provide - /// a valid signature of the group address as a message. Successful signature - /// verification means the private key has been leaked and all group members - /// should be punished by seizing their tokens. The submitter of this proof is - /// rewarded with 5% of the total seized amount scaled by the reward adjustment - /// parameter and the rest 95% is burned. Group has to be active or expired. - /// Unauthorized signing cannot be reported for stale or terminated group. - /// In case of reporting unauthorized signing for stale group, - /// terminated group, or when the signature is inavlid, function reverts. - function reportUnauthorizedSigning( - Storage storage self, - uint256 groupIndex, - bytes memory signedMsgSender, - uint256 minimumStake - ) public { - require(!isStaleGroup(self, groupIndex), "Group can not be stale"); - bytes memory groupPubKey = getGroupPublicKey(self, groupIndex); - - require( - BLS.verifyBytes( - groupPubKey, - abi.encodePacked(msg.sender), - signedMsgSender - ), - "Invalid signature" - ); - - terminateGroup(self, groupIndex); - self.stakingContract.seize( - minimumStake, - 100, - msg.sender, - self.groupMembers[groupPubKey] - ); - } - - function reportRelayEntryTimeout( - Storage storage self, - uint256 groupIndex, - uint256 groupSize - ) public { - uint256 punishment = relayEntryTimeoutPunishment(self); - terminateGroup(self, groupIndex); - // Reward is limited to min(1, 20 / group_size) of the maximum tattletale reward, see the Yellow Paper for more details. - uint256 rewardAdjustment = uint256(20 * 100).div(groupSize); // Reward adjustment in percentage - rewardAdjustment = rewardAdjustment > 100 ? 100 : rewardAdjustment; // Reward adjustment can be 100% max - self.stakingContract.seize( - punishment, - rewardAdjustment, - msg.sender, - getGroupMembers(self, groupIndex) - ); - } - - /// @notice Evaluates relay entry timeout punishment using the following - /// rules: - /// - 1% of the minimum stake for the first 3 months, - /// - 50% of the minimum stake between the first 3 and 6 months, - /// - 100% of the minimum stake after the first 6 months. - function relayEntryTimeoutPunishment(Storage storage self) - public - view - returns (uint256) - { - uint256 minimumStake = self.stakingContract.minimumStake(); - - uint256 stakingContractDeployedAt = self.stakingContract.deployedAt(); - /* solium-disable-next-line security/no-block-members */ - if (now < stakingContractDeployedAt + THREE_MONTHS) { - return minimumStake.percent(1); - /* solium-disable-next-line security/no-block-members */ - } else if (now < stakingContractDeployedAt + SIX_MONTHS) { - return minimumStake.percent(50); - } else { - return minimumStake; - } - } - - /// @notice Return whether the given operator - /// has withdrawn their rewards from the given group. - function hasWithdrawnRewards( - Storage storage self, - address operator, - uint256 groupIndex - ) public view returns (bool) { - return self.withdrawn[getGroupPublicKey(self, groupIndex)][operator]; - } -} diff --git a/solidity-v1/contracts/libraries/operator/Reimbursements.sol b/solidity-v1/contracts/libraries/operator/Reimbursements.sol deleted file mode 100644 index b67961bff2..0000000000 --- a/solidity-v1/contracts/libraries/operator/Reimbursements.sol +++ /dev/null @@ -1,67 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "../../utils/BytesLib.sol"; -import "../../TokenStaking.sol"; - -library Reimbursements { - using SafeMath for uint256; - using BytesLib for bytes; - - /// @notice Reimburses callback execution cost and surplus based on actual gas - /// usage to the submitter's beneficiary address and if necessary to the - /// callback requestor (surplus recipient). - /// @param stakingContract Staking contract to get the address of the beneficiary - /// @param gasPriceCeiling Gas price ceiling in wei - /// @param gasLimit Gas limit set for the callback - /// @param gasSpent Gas spent by the submitter on the callback - /// @param callbackFee Fee paid for the callback by the requestor - /// @param callbackSurplusRecipientData Data containing surplus recipient address - function reimburseCallback( - TokenStaking stakingContract, - uint256 gasPriceCeiling, - uint256 gasLimit, - uint256 gasSpent, - uint256 callbackFee, - bytes memory callbackSurplusRecipientData - ) public { - uint256 gasPrice = gasPriceCeiling; - // We need to check if tx.gasprice is non-zero as a workaround to a bug - // in go-ethereum: - // https://github.com/ethereum/go-ethereum/pull/20189 - if (tx.gasprice > 0 && tx.gasprice < gasPriceCeiling) { - gasPrice = tx.gasprice; - } - - // Obtain the actual callback gas expenditure and refund the surplus. - // - // In case of heavily underpriced transactions, EVM may wrap the call - // with additional opcodes. In this case gasSpent > gasLimit. - // The worst scenario cost is included in entry verification fee. - // If this happens we return just the gasLimit here. - uint256 actualCallbackGas = gasSpent < gasLimit ? gasSpent : gasLimit; - uint256 actualCallbackFee = actualCallbackGas.mul(gasPrice); - - // Get the beneficiary. - address payable beneficiary = stakingContract.beneficiaryOf(msg.sender); - - // If we spent less on the callback than the customer transferred for the - // callback execution, we need to reimburse the difference. - if (actualCallbackFee < callbackFee) { - uint256 callbackSurplus = callbackFee.sub(actualCallbackFee); - // Reimburse submitter with his actual callback cost. - beneficiary.call.value(actualCallbackFee)(""); - - // Return callback surplus to the requestor. - // Expecting 32 bytes data containing 20 byte address - if (callbackSurplusRecipientData.length == 32) { - address surplusRecipient = - callbackSurplusRecipientData.toAddress(12); - surplusRecipient.call.gas(8000).value(callbackSurplus)(""); - } - } else { - // Reimburse submitter with the callback payment sent by the requestor. - beneficiary.call.value(callbackFee)(""); - } - } -} diff --git a/solidity-v1/contracts/libraries/staking/GrantStaking.sol b/solidity-v1/contracts/libraries/staking/GrantStaking.sol deleted file mode 100644 index 6ae99faa54..0000000000 --- a/solidity-v1/contracts/libraries/staking/GrantStaking.sol +++ /dev/null @@ -1,166 +0,0 @@ -pragma solidity 0.5.17; - -import "../../TokenGrant.sol"; -import "../RolesLookup.sol"; - -/// @notice TokenStaking contract library allowing to capture the details of -/// delegated grants and offering functions allowing to check grantee -/// authentication for stake delegation management. -library GrantStaking { - using RolesLookup for address payable; - - /// @dev Grant ID is flagged with the most significant bit set, to - /// distinguish the grant ID `0` from default (null) value. The flag is - /// toggled with bitwise XOR (`^`) which keeps all other bits intact but - /// flips the flag bit. The flag should be set before writing to - /// `operatorToGrant`, and unset after reading from `operatorToGrant` - /// before using the value. - uint256 constant GRANT_ID_FLAG = 1 << 255; - - struct Storage { - /// @dev Do not read or write this mapping directly; please use - /// `hasGrantDelegated`, `setGrantForOperator`, and `getGrantForOperator` - /// instead. - mapping(address => uint256) _operatorToGrant; - } - - /// @notice Tries to capture delegation data if the pending delegation has - /// been created from a grant. - /// @dev Delegation data are obtained directly from the TokenGrant contract - /// using `tryCapturingGrantId` function. - /// @param tokenGrant KEEP token grant contract reference. - /// @param operator The operator tokens are delegated to. - function tryCapturingDelegationData( - Storage storage self, - TokenGrant tokenGrant, - address operator - ) public returns (bool, uint256) { - return tryCapturingGrantId(self, tokenGrant, operator); - } - - /// @notice Checks if the delegation for the given operator has been created - /// from a grant defined in the passed token grant contract and if so, - /// captures the grant ID for that delegation. - /// Grant ID can be later retrieved based on the operator address and used - /// to authenticate grantee or to fetch the information about grant - /// unlocking schedule. - /// @param tokenGrant KEEP token grant contract reference. - /// @param operator The operator tokens are delegated to. - function tryCapturingGrantId( - Storage storage self, - TokenGrant tokenGrant, - address operator - ) internal returns (bool, uint256) { - (bool success, bytes memory data) = - address(tokenGrant).call( - abi.encodeWithSignature( - "getGrantStakeDetails(address)", - operator - ) - ); - if (success) { - (uint256 grantId, , address grantStakingContract) = - abi.decode(data, (uint256, uint256, address)); - // Double-check if the delegation in TokenGrant has been defined - // for this staking contract. If not, it means it's an old - // delegation and the current one does not come from a grant. - // The scenario covered here is: - // - grantee delegated to operator A from a TokenGrant using another - // staking contract, - // - someone delegates to operator A using liquid tokens and this - // staking contract. - // Without this check, we'd consider the second delegation as coming - // from a grant. - if (address(this) != grantStakingContract) { - return (false, 0); - } - - setGrantForOperator(self, operator, grantId); - return (true, grantId); - } - - return (false, 0); - } - - /// @notice Returns true if the given operator operates on stake delegated - /// from a grant. false is returned otherwise. - /// @param operator The operator to which tokens from a grant are - /// potentially delegated to. - function hasGrantDelegated(Storage storage self, address operator) - public - view - returns (bool) - { - return self._operatorToGrant[operator] != 0; - } - - /// @notice Associates operator with the provided grant ID. It means that - /// the given operator delegates on stake from the grant with this ID. - /// @param operator The operator tokens are delegate to. - /// @param grantId Identifier of a grant from which the tokens are delegated - /// to. - function setGrantForOperator( - Storage storage self, - address operator, - uint256 grantId - ) public { - self._operatorToGrant[operator] = grantId ^ GRANT_ID_FLAG; - } - - /// @notice Returns grant ID for the provided operator. If the operator - /// does not operate on stake delegated from a grant, function reverts. - /// @dev To avoid reverting in case the grant ID for the operator does not - /// exist, consider calling hasGrantDelegated before. - /// @param operator The operator tokens are delegate to. - function getGrantForOperator(Storage storage self, address operator) - public - view - returns (uint256) - { - uint256 grantId = self._operatorToGrant[operator]; - require(grantId != 0, "No grant for the operator"); - return grantId ^ GRANT_ID_FLAG; - } - - /// @notice Returns true if msg.sender is grantee eligible to trigger stake - /// undelegation for this operator. Function checks both standard grantee - /// and managed grantee case. - /// @param operator The operator tokens are delegated to. - /// @param tokenGrant KEEP token grant contract reference. - function canUndelegate( - Storage storage self, - address operator, - TokenGrant tokenGrant - ) public returns (bool) { - // First of all, we need to see if the operator has grant delegated. - // If not, we don't need to bother about checking grantee or - // managed grantee and we just return false. - if (!hasGrantDelegated(self, operator)) { - return false; - } - - uint256 grantId = getGrantForOperator(self, operator); - (, , , , uint256 revokedAt, address grantee) = - tokenGrant.getGrant(grantId); - - // Is msg.sender grantee of a standard grant? - if (msg.sender == grantee) { - return true; - } - - // If not, we need to dig deeper and see if we are dealing with - // a grantee from a managed grant. - if ((msg.sender).isManagedGranteeForGrant(grantId, tokenGrant)) { - return true; - } - - // There is only one possibility left - grant has been revoked and - // grant manager wants to take back delegated tokens. - if (revokedAt == 0) { - return false; - } - (address grantManager, , , , ) = - tokenGrant.getGrantUnlockingSchedule(grantId); - return msg.sender == grantManager; - } -} diff --git a/solidity-v1/contracts/libraries/staking/LockUtils.sol b/solidity-v1/contracts/libraries/staking/LockUtils.sol deleted file mode 100644 index 3bfbe7560c..0000000000 --- a/solidity-v1/contracts/libraries/staking/LockUtils.sol +++ /dev/null @@ -1,85 +0,0 @@ -pragma solidity 0.5.17; - -library LockUtils { - struct Lock { - address creator; - uint96 expiresAt; - } - - /// @notice The LockSet is like an array of unique `uint256`s, - /// but additionally supports O(1) membership tests and removals. - /// @dev Because the LockSet relies on a mapping, - /// it can only be used in storage, not in memory. - struct LockSet { - // locks[positions[lock.creator] - 1] = lock - Lock[] locks; - mapping(address => uint256) positions; - } - - /// @notice Check whether the LockSet `self` contains a lock by `creator` - function contains(LockSet storage self, address creator) - internal - view - returns (bool) - { - return (self.positions[creator] != 0); - } - - function getLockTime(LockSet storage self, address creator) - internal - view - returns (uint96) - { - uint256 positionPlusOne = self.positions[creator]; - if (positionPlusOne == 0) { - return 0; - } - return self.locks[positionPlusOne - 1].expiresAt; - } - - /// @notice Set the lock of `creator` to `expiresAt`, - /// overriding the current value if any. - function setLock( - LockSet storage self, - address _creator, - uint96 _expiresAt - ) internal { - uint256 positionPlusOne = self.positions[_creator]; - Lock memory lock = Lock(_creator, _expiresAt); - // No existing lock - if (positionPlusOne == 0) { - self.locks.push(lock); - self.positions[_creator] = self.locks.length; - // Existing lock present - } else { - self.locks[positionPlusOne - 1].expiresAt = _expiresAt; - } - } - - /// @notice Remove the lock of `creator`. - /// If no lock present, do nothing. - function releaseLock(LockSet storage self, address _creator) internal { - uint256 positionPlusOne = self.positions[_creator]; - if (positionPlusOne != 0) { - uint256 lockCount = self.locks.length; - if (positionPlusOne != lockCount) { - // Not the last lock, - // so we need to move the last lock into the emptied position. - Lock memory lastLock = self.locks[lockCount - 1]; - self.locks[positionPlusOne - 1] = lastLock; - self.positions[lastLock.creator] = positionPlusOne; - } - self.locks.length--; - self.positions[_creator] = 0; - } - } - - /// @notice Return the locks of the LockSet `self`. - function enumerate(LockSet storage self) - internal - view - returns (Lock[] memory) - { - return self.locks; - } -} diff --git a/solidity-v1/contracts/libraries/staking/Locks.sol b/solidity-v1/contracts/libraries/staking/Locks.sol deleted file mode 100644 index 9615a1e4d4..0000000000 --- a/solidity-v1/contracts/libraries/staking/Locks.sol +++ /dev/null @@ -1,119 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import {AuthorityVerifier} from "../../Authorizations.sol"; -import "./LockUtils.sol"; - -library Locks { - using SafeMath for uint256; - using LockUtils for LockUtils.LockSet; - - event StakeLocked( - address indexed operator, - address lockCreator, - uint256 until - ); - event LockReleased(address indexed operator, address lockCreator); - event ExpiredLockReleased(address indexed operator, address lockCreator); - - uint256 public constant maximumLockDuration = 86400 * 200; // 200 days in seconds - - struct Storage { - // Locks placed on the operator. - // `operatorLocks[operator]` returns all locks placed on the operator. - // Each authorized operator contract can place one lock on an operator. - mapping(address => LockUtils.LockSet) operatorLocks; - } - - function lockStake( - Storage storage self, - address operator, - uint256 duration - ) public { - require(duration <= maximumLockDuration, "Lock duration too long"); - self.operatorLocks[operator].setLock( - msg.sender, - uint96(block.timestamp.add(duration)) - ); - emit StakeLocked(operator, msg.sender, block.timestamp.add(duration)); - } - - function releaseLock(Storage storage self, address operator) public { - self.operatorLocks[operator].releaseLock(msg.sender); - emit LockReleased(operator, msg.sender); - } - - function releaseExpiredLock( - Storage storage self, - address operator, - address operatorContract, - address authorityVerifier - ) public { - LockUtils.LockSet storage locks = self.operatorLocks[operator]; - - require(locks.contains(operatorContract), "No matching lock present"); - - bool expired = block.timestamp >= locks.getLockTime(operatorContract); - bool disabled = - !AuthorityVerifier(authorityVerifier).isApprovedOperatorContract( - operatorContract - ); - - require(expired || disabled, "Lock still active and valid"); - - locks.releaseLock(operatorContract); - - emit ExpiredLockReleased(operator, operatorContract); - } - - /// @dev AuthorityVerifier is a trusted implementation and not a third-party, - /// external contract. AuthorityVerifier never reverts on the check and - /// has a reasonable gas consumption. - function isStakeLocked( - Storage storage self, - address operator, - address authorityVerifier - ) public view returns (bool) { - LockUtils.Lock[] storage _locks = self.operatorLocks[operator].locks; - LockUtils.Lock memory lock; - for (uint256 i = 0; i < _locks.length; i++) { - lock = _locks[i]; - if (block.timestamp < lock.expiresAt) { - if ( - AuthorityVerifier(authorityVerifier) - .isApprovedOperatorContract(lock.creator) - ) { - return true; - } - } - } - return false; - } - - function isStakeReleased( - Storage storage self, - address operator, - address operatorContract - ) public view returns (bool) { - LockUtils.LockSet storage locks = self.operatorLocks[operator]; - // `getLockTime` returns 0 if the lock doesn't exist, - // thus we don't need to check for its presence separately. - return block.timestamp >= locks.getLockTime(operatorContract); - } - - function getLocks(Storage storage self, address operator) - public - view - returns (address[] memory creators, uint256[] memory expirations) - { - uint256 lockCount = self.operatorLocks[operator].locks.length; - creators = new address[](lockCount); - expirations = new uint256[](lockCount); - LockUtils.Lock memory lock; - for (uint256 i = 0; i < lockCount; i++) { - lock = self.operatorLocks[operator].locks[i]; - creators[i] = lock.creator; - expirations[i] = lock.expiresAt; - } - } -} diff --git a/solidity-v1/contracts/libraries/staking/MinimumStakeSchedule.sol b/solidity-v1/contracts/libraries/staking/MinimumStakeSchedule.sol deleted file mode 100644 index a2d196cad8..0000000000 --- a/solidity-v1/contracts/libraries/staking/MinimumStakeSchedule.sol +++ /dev/null @@ -1,28 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; - -/// @notice MinimumStakeSchedule defines the minimum stake parametrization and -/// schedule. It starts with a minimum stake of 100k KEEP. Over the following -/// 2 years, the minimum stake is lowered periodically using a uniform stepwise -/// function, eventually ending at 10k. -library MinimumStakeSchedule { - using SafeMath for uint256; - - // 2 years in seconds (seconds per day * days in a year * years) - uint256 public constant schedule = 86400 * 365 * 2; - uint256 public constant steps = 10; - uint256 public constant base = 10000 * 1e18; - - /// @notice Returns the current value of the minimum stake. The minimum - /// stake is lowered periodically over the course of 2 years since the time - /// of the shedule start and eventually ends at 10k KEEP. - function current(uint256 scheduleStart) internal view returns (uint256) { - if (now < scheduleStart.add(schedule)) { - uint256 currentStep = - steps.mul(now.sub(scheduleStart)).div(schedule); - return base.mul(steps.sub(currentStep)); - } - return base; - } -} diff --git a/solidity-v1/contracts/libraries/staking/TopUps.sol b/solidity-v1/contracts/libraries/staking/TopUps.sol deleted file mode 100644 index 7838ad6035..0000000000 --- a/solidity-v1/contracts/libraries/staking/TopUps.sol +++ /dev/null @@ -1,150 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; - -import "../../utils/OperatorParams.sol"; - -/// @notice TokenStaking contract library allowing to perform two-step stake -/// top-ups for existing delegations. -/// Top-up is a two-step process: it is initiated with a declared top-up value -/// and after waiting for at least the initialization period it can be -/// committed. -library TopUps { - using SafeMath for uint256; - using OperatorParams for uint256; - - event TopUpInitiated(address indexed operator, uint256 topUp); - event TopUpCompleted(address indexed operator, uint256 newAmount); - - struct TopUp { - uint256 amount; - uint256 createdAt; - } - - struct Storage { - // operator -> TopUp - mapping(address => TopUp) topUps; - } - - /// @notice Performs top-up in one step when stake is not yet initialized by - /// adding the top-up amount to the stake and resetting stake initialization - /// time counter. - /// @dev This function should be called only for not yet initialized stake. - /// @param value Top-up value, the number of tokens added to the stake. - /// @param operator Operator The operator with existing delegation to which - /// the tokens should be added to. - /// @param operatorParams Parameters of that operator, as stored in the - /// staking contract. - /// @return New value of parameters. It should be updated for the operator - /// in the staking contract. - function instantComplete( - Storage storage, - uint256 value, - address operator, - uint256 operatorParams - ) public returns (uint256 newParams) { - // Stake is not yet initialized so we don't need to check if the - // operator is not undelegating - initializing and undelegating at the - // same time is not possible. - require( - operatorParams.getAmount() > 0, - "Operator stake already cancelled" - ); - require(value > 0, "Top-up value must be greater than zero"); - - uint256 newAmount = operatorParams.getAmount().add(value); - newParams = operatorParams.setAmountAndCreationTimestamp( - newAmount, - block.timestamp - ); - - emit TopUpCompleted(operator, newAmount); - } - - /// @notice Initiates top-up of the given value for tokens delegated to - /// the provided operator. If there is an existing top-up still - /// initializing, top-up values are summed up and initialization period - /// is set to the current block timestamp. - /// @dev This function should be called only for active operators with - /// initialized stake. - /// @param value Top-up value, the number of tokens added to the stake. - /// @param operator Operator The operator with existing delegation to which - /// the tokens should be added to. - /// @param operatorParams Parameters of that operator, as stored in the - /// staking contract. - function initiate( - Storage storage self, - uint256 value, - address operator, - uint256 operatorParams - ) public { - // Stake is initialized, the operator is still active so we need - // to check if it's not undelegating. - require( - operatorParams.getAmount() > 0, - "Operator stake already cancelled" - ); - require(!isUndelegating(operatorParams), "Stake undelegated"); - require(value > 0, "Top-up value must be greater than zero"); - - TopUp memory awaiting = self.topUps[operator]; - self.topUps[operator] = TopUp(awaiting.amount.add(value), now); - emit TopUpInitiated(operator, value); - } - - /// @notice Commits the top-up if it passed the initialization period. - /// Tokens are added to the stake once the top-up is committed. - /// @param operator Operator The operator with a pending stake top-up. - /// @param initializationPeriod Stake initialization period. - function commit( - Storage storage self, - address operator, - uint256 operatorParams, - uint256 initializationPeriod - ) public returns (uint256 newParams) { - TopUp memory topUp = self.topUps[operator]; - require(topUp.amount > 0, "No top up to commit"); - require( - now > topUp.createdAt.add(initializationPeriod), - "Stake is initializing" - ); - - uint256 newAmount = operatorParams.getAmount().add(topUp.amount); - newParams = operatorParams.setAmount(newAmount); - - delete self.topUps[operator]; - emit TopUpCompleted(operator, newAmount); - } - - /// @notice Cancels pending, initiating top-up. If there is no initiating - /// top-up for the operator, function does nothing. This function should be - /// used when the stake is recovered to return tokens from a pending, - /// initiating top-up. - /// @param operator Operator The operator from which the stake is recovered. - function cancel(Storage storage self, address operator) - public - returns (uint256) - { - TopUp memory topUp = self.topUps[operator]; - if (topUp.amount == 0) { - return 0; - } - - delete self.topUps[operator]; - return topUp.amount; - } - - /// @notice Returns true if the given operatorParams indicate that the - /// operator is undelegating its stake or that it completed stake - /// undelegation. - /// @param operatorParams Parameters of the operator, as stored in the - /// staking contract. - function isUndelegating(uint256 operatorParams) - internal - view - returns (bool) - { - uint256 undelegatedAt = operatorParams.getUndelegationTimestamp(); - return (undelegatedAt != 0) && (block.timestamp > undelegatedAt); - } -} diff --git a/solidity-v1/contracts/statistics/KeepRandomBeaconOperatorStatistics.sol b/solidity-v1/contracts/statistics/KeepRandomBeaconOperatorStatistics.sol deleted file mode 100644 index a67e6e833d..0000000000 --- a/solidity-v1/contracts/statistics/KeepRandomBeaconOperatorStatistics.sol +++ /dev/null @@ -1,99 +0,0 @@ -pragma solidity ^0.5.4; - -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "../KeepRandomBeaconOperator.sol"; - -contract KeepRandomBeaconOperatorStatistics { - using SafeMath for uint256; - - KeepRandomBeaconOperator public operatorContract; - - constructor(address _operatorContract) public { - operatorContract = KeepRandomBeaconOperator(_operatorContract); - } - - /// @notice Counts how many times the operator is present in a group. - /// @param groupPubKey The public key of the group. - /// @param operator The address of the operator. - /// @return The number of members the operator has in the group. - function countGroupMembership(bytes memory groupPubKey, address operator) - public - view - returns (uint256) - { - address[] memory members = - operatorContract.getGroupMembers(groupPubKey); - uint256 counter; - for (uint256 i = 0; i < members.length; i++) { - if (members[i] == operator) { - counter++; - } - } - return counter; - } - - /// @notice Gets all indices in the provided group for a member. - /// If the given operator is not a member, returns an empty array. - function getGroupMemberIndices(bytes memory groupPubKey, address operator) - public - view - returns (uint256[] memory indices) - { - uint256 count = countGroupMembership(groupPubKey, operator); - address[] memory members = - operatorContract.getGroupMembers(groupPubKey); - - indices = new uint256[](count); - uint256 counter = 0; - for (uint256 i = 0; i < members.length; i++) { - if (members[i] == operator) { - indices[counter] = i; - counter++; - } - } - } - - /// @notice Get the amount of group rewards - /// allocated to the given operator in the given group. - /// The rewards may or may not be withdrawable. - /// @param operator Address of the operator. - /// @param groupIndex Index of the group. - /// @return The total allocated rewards. - function awaitingRewards(address operator, uint256 groupIndex) - public - view - returns (uint256 rewards) - { - if (operatorContract.hasWithdrawnRewards(operator, groupIndex)) { - return 0; - } - bytes memory groupPubKey = - operatorContract.getGroupPublicKey(groupIndex); - uint256 memberRewards = - operatorContract.getGroupMemberRewards(groupPubKey); - - uint256 memberCount = countGroupMembership(groupPubKey, operator); - - return memberRewards.mul(memberCount); - } - - /// @notice Get the amount of group rewards - /// withdrawable by the given operator in the given group. - /// The group must be stale for any group rewards to be withdrawn. - /// @param operator Address of the operator. - /// @param groupIndex Index of the group. - /// @return The total withdrawable rewards. - function withdrawableRewards(address operator, uint256 groupIndex) - public - view - returns (uint256 rewards) - { - bytes memory groupPubKey = - operatorContract.getGroupPublicKey(groupIndex); - if (operatorContract.isStaleGroup(groupPubKey)) { - return awaitingRewards(operator, groupIndex); - } else { - return 0; - } - } -} diff --git a/solidity-v1/contracts/stubs/DelegatedAuthorityStub.sol b/solidity-v1/contracts/stubs/DelegatedAuthorityStub.sol deleted file mode 100644 index 964832bbce..0000000000 --- a/solidity-v1/contracts/stubs/DelegatedAuthorityStub.sol +++ /dev/null @@ -1,21 +0,0 @@ -pragma solidity 0.5.17; - -import "../TokenStaking.sol"; - -contract DelegatedAuthorityStub { - address recognizedContract; - - constructor(address _recognizedContract) public { - recognizedContract = _recognizedContract; - } - - function __isRecognized(address _contract) public view returns (bool) { - return _contract == recognizedContract; - } - - function claimAuthorityRecursively(address stakingContract, address source) - public - { - TokenStaking(stakingContract).claimDelegatedAuthority(source); - } -} diff --git a/solidity-v1/contracts/stubs/EvilStakingPolicy.sol b/solidity-v1/contracts/stubs/EvilStakingPolicy.sol deleted file mode 100644 index 7da6051535..0000000000 --- a/solidity-v1/contracts/stubs/EvilStakingPolicy.sol +++ /dev/null @@ -1,22 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "../GrantStakingPolicy.sol"; - -/// @title EvilStakingPolicy -/// @dev A staking policy which allows the grantee to stake -/// a million times more than the grant amount. -contract EvilStakingPolicy is GrantStakingPolicy { - using SafeMath for uint256; - - function getStakeableAmount( - uint256 _now, - uint256 grantedAmount, - uint256 duration, - uint256 start, - uint256 cliff, - uint256 withdrawn - ) public view returns (uint256) { - return grantedAmount.mul(1000000); - } -} diff --git a/solidity-v1/contracts/stubs/GasPriceOracleConsumerStub.sol b/solidity-v1/contracts/stubs/GasPriceOracleConsumerStub.sol deleted file mode 100644 index 4998b51833..0000000000 --- a/solidity-v1/contracts/stubs/GasPriceOracleConsumerStub.sol +++ /dev/null @@ -1,17 +0,0 @@ -pragma solidity 0.5.17; - -import "../GasPriceOracle.sol"; - -contract GasPriceOracleConsumerStub is GasPriceOracleConsumer { - GasPriceOracle gasPriceOracle; - - uint256 public gasPrice; - - constructor(GasPriceOracle _gasPriceOracle) public { - gasPriceOracle = _gasPriceOracle; - } - - function refreshGasPrice() public { - gasPrice = gasPriceOracle.gasPrice(); - } -} diff --git a/solidity-v1/contracts/stubs/GrantStakingStub.sol b/solidity-v1/contracts/stubs/GrantStakingStub.sol deleted file mode 100644 index 98be39059c..0000000000 --- a/solidity-v1/contracts/stubs/GrantStakingStub.sol +++ /dev/null @@ -1,24 +0,0 @@ -pragma solidity 0.5.17; - -import "../libraries/staking/GrantStaking.sol"; - -contract GrantStakingStub { - using GrantStaking for GrantStaking.Storage; - GrantStaking.Storage grantStaking; - - function hasGrantDelegated(address operator) public view returns (bool) { - return grantStaking.hasGrantDelegated(operator); - } - - function setGrantForOperator(address operator, uint256 grantId) public { - grantStaking.setGrantForOperator(operator, grantId); - } - - function getGrantForOperator(address operator) - public - view - returns (uint256) - { - return grantStaking.getGrantForOperator(operator); - } -} diff --git a/solidity-v1/contracts/stubs/GroupsExpirationStub.sol b/solidity-v1/contracts/stubs/GroupsExpirationStub.sol deleted file mode 100644 index 7776273cd4..0000000000 --- a/solidity-v1/contracts/stubs/GroupsExpirationStub.sol +++ /dev/null @@ -1,44 +0,0 @@ -pragma solidity 0.5.17; -import "../libraries/operator/Groups.sol"; - -contract GroupsExpirationStub { - using Groups for Groups.Storage; - Groups.Storage groups; - - constructor() public { - groups.groupActiveTime = 20; - groups.relayEntryTimeout = 10; - } - - function addGroup(bytes memory groupPubKey) public { - groups.addGroup(groupPubKey); - } - - function getGroupRegistrationBlockHeight(uint256 groupIndex) - public - view - returns (uint256) - { - return groups.groups[groupIndex].registrationBlockHeight; - } - - function getGroupPublicKey(uint256 groupIndex) - public - view - returns (bytes memory) - { - return groups.groups[groupIndex].groupPubKey; - } - - function selectGroup(uint256 seed) public returns (uint256) { - return groups.selectGroup(seed); - } - - function isStaleGroup(bytes memory groupPubKey) public view returns (bool) { - return groups.isStaleGroup(groupPubKey); - } - - function numberOfGroups() public view returns (uint256) { - return groups.numberOfGroups(); - } -} diff --git a/solidity-v1/contracts/stubs/GroupsSelectionStub.sol b/solidity-v1/contracts/stubs/GroupsSelectionStub.sol deleted file mode 100644 index 9e4e4ceeb6..0000000000 --- a/solidity-v1/contracts/stubs/GroupsSelectionStub.sol +++ /dev/null @@ -1,47 +0,0 @@ -pragma solidity 0.5.17; -import "../libraries/operator/GroupSelection.sol"; - -contract GroupSelectionStub { - using GroupSelection for GroupSelection.Storage; - GroupSelection.Storage groupSelection; - - constructor(uint256 groupSize) public { - groupSelection.groupSize = groupSize; - } - - function addTicket(uint64 newTicketValue) public { - groupSelection.addTicket(newTicketValue); - } - - /** - * @dev Gets submitted group candidate tickets so far. - */ - function getTickets() public view returns (uint64[] memory) { - return groupSelection.tickets; - } - - /** - * @dev Gets an index of the highest ticket value (tail). - */ - function getTail() public view returns (uint256) { - return groupSelection.tail; - } - - /** - * @dev Gets an index of a ticket that a higherTicketValueIndex points to. - * Ex. tickets[23, 5, 65] - * getPreviousTicketIndex(2) = 0 - */ - function getPreviousTicketIndex(uint256 higherTicketValueIndex) - public - view - returns (uint256) - { - return - uint256( - uint8( - groupSelection.previousTicketIndices[higherTicketValueIndex] - ) - ); - } -} diff --git a/solidity-v1/contracts/stubs/GroupsTerminationStub.sol b/solidity-v1/contracts/stubs/GroupsTerminationStub.sol deleted file mode 100644 index 87bb28a667..0000000000 --- a/solidity-v1/contracts/stubs/GroupsTerminationStub.sol +++ /dev/null @@ -1,29 +0,0 @@ -pragma solidity 0.5.17; -import "../libraries/operator/Groups.sol"; - -contract GroupsTerminationStub { - using Groups for Groups.Storage; - Groups.Storage groups; - - constructor() public { - groups.groupActiveTime = 5; - } - - function addGroup(bytes memory groupPubKey) public { - groups.addGroup(groupPubKey); - } - - function registerNewGroups(uint256 groupsCount) public { - for (uint256 i = 1; i <= groupsCount; i++) { - groups.addGroup(new bytes(i)); - } - } - - function terminateGroup(uint256 groupIndex) public { - groups.terminateGroup(groupIndex); - } - - function selectGroup(uint256 seed) public returns (uint256) { - return groups.selectGroup(seed); - } -} diff --git a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorBeaconRewardsStub.sol b/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorBeaconRewardsStub.sol deleted file mode 100644 index cb6ae894f1..0000000000 --- a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorBeaconRewardsStub.sol +++ /dev/null @@ -1,45 +0,0 @@ -pragma solidity 0.5.17; - -import "../KeepRandomBeaconOperator.sol"; - -contract KeepRandomBeaconOperatorBeaconRewardsStub is KeepRandomBeaconOperator { - constructor( - address _serviceContract, - address _stakingContract, - address _registryContract, - address _gasPriceOracle - ) - public - KeepRandomBeaconOperator( - _serviceContract, - _stakingContract, - _registryContract, - _gasPriceOracle - ) - { - groupSize = 3; - groups.groupActiveTime = 5; - groups.relayEntryTimeout = 10; - } - - function registerNewGroup( - bytes memory groupPublicKey, - address[] memory members, - uint256 creationTimestamp - ) public { - groups.addGroup(groupPublicKey); - groups.groups[groups.groups.length - 1].registrationTime = uint248( - creationTimestamp - ); - - groups.setGroupMembers(groupPublicKey, members, hex""); - } - - function terminateGroup(uint256 groupIndex) public { - groups.terminateGroup(groupIndex); - } - - function expireOldGroups() public { - groups.expireOldGroups(); - } -} diff --git a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorCallbackStub.sol b/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorCallbackStub.sol deleted file mode 100644 index c327f1a649..0000000000 --- a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorCallbackStub.sol +++ /dev/null @@ -1,45 +0,0 @@ -pragma solidity 0.5.17; - -import "../KeepRandomBeaconOperator.sol"; - -contract KeepRandomBeaconOperatorCallbackStub is KeepRandomBeaconOperator { - constructor( - address _serviceContract, - address _stakingContract, - address _registryContract, - address _gasPriceOracle - ) - public - KeepRandomBeaconOperator( - _serviceContract, - _stakingContract, - _registryContract, - _gasPriceOracle - ) - { - relayEntryTimeout = 10; - groupSelection.ticketSubmissionTimeout = 69; - resultPublicationBlockStep = 3; - - // setGroupSize - groupSize = 3; - groupSelection.groupSize = 3; - dkgResultVerification.groupSize = 3; - - // setGroupThreshold - groupThreshold = 2; - dkgResultVerification.signatureThreshold = 2; - } - - function getGroupSelectionRelayEntry() public view returns (uint256) { - return groupSelection.seed; - } - - function getTicketSubmissionStartBlock() public view returns (uint256) { - return groupSelection.ticketSubmissionStartBlock; - } - - function timeDKG() public view returns (uint256) { - return dkgResultVerification.timeDKG; - } -} diff --git a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorDKGResultStub.sol b/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorDKGResultStub.sol deleted file mode 100644 index fc6ca7b640..0000000000 --- a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorDKGResultStub.sol +++ /dev/null @@ -1,57 +0,0 @@ -pragma solidity 0.5.17; - -import "../KeepRandomBeaconOperator.sol"; - -contract KeepRandomBeaconOperatorDKGResultStub is KeepRandomBeaconOperator { - constructor( - address _serviceContract, - address _stakingContract, - address _registryContract, - address _gasPriceOracle - ) - public - KeepRandomBeaconOperator( - _serviceContract, - _stakingContract, - _registryContract, - _gasPriceOracle - ) - { - groupSelection.ticketSubmissionTimeout = 100; - } - - function setGroupSize(uint256 size) public { - groupSize = size; - groupSelection.groupSize = size; - dkgResultVerification.groupSize = size; - } - - function setGroupThreshold(uint256 threshold) public { - groupThreshold = threshold; - dkgResultVerification.signatureThreshold = threshold; - } - - function setDKGResultSignatureThreshold(uint256 threshold) public { - dkgResultVerification.signatureThreshold = threshold; - } - - function getGroupSelectionRelayEntry() public view returns (uint256) { - return groupSelection.seed; - } - - function getTicketSubmissionStartBlock() public view returns (uint256) { - return groupSelection.ticketSubmissionStartBlock; - } - - function isGroupSelectionInProgress() public view returns (bool) { - return groupSelection.inProgress; - } - - function setGasPriceCeiling(uint256 _gasPriceCeiling) public { - gasPriceCeiling = _gasPriceCeiling; - } - - function timeDKG() public view returns (uint256) { - return dkgResultVerification.timeDKG; - } -} diff --git a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorGroupSelectionStub.sol b/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorGroupSelectionStub.sol deleted file mode 100644 index 61b91aadec..0000000000 --- a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorGroupSelectionStub.sol +++ /dev/null @@ -1,36 +0,0 @@ -pragma solidity 0.5.17; - -import "../KeepRandomBeaconOperator.sol"; - -contract KeepRandomBeaconOperatorGroupSelectionStub is - KeepRandomBeaconOperator -{ - constructor( - address _serviceContract, - address _stakingContract, - address _registryContract, - address _gasPriceOracle - ) - public - KeepRandomBeaconOperator( - _serviceContract, - _stakingContract, - _registryContract, - _gasPriceOracle - ) - { - groupSelection.ticketSubmissionTimeout = 65; - - // setGroupSize - groupSize = 3; - groupSelection.groupSize = 3; - } - - function getGroupSelectionRelayEntry() public view returns (uint256) { - return groupSelection.seed; - } - - function startGroupSelection(uint256 seed) public { - groupSelection.start(seed); - } -} diff --git a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorInitializationStub.sol b/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorInitializationStub.sol deleted file mode 100644 index b37ecfaba7..0000000000 --- a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorInitializationStub.sol +++ /dev/null @@ -1,34 +0,0 @@ -pragma solidity 0.5.17; - -import "../KeepRandomBeaconOperator.sol"; - -/** - * @title KeepRandomBeaconOperatorInitializationStub - * @dev A simplified Random Beacon operator contract to help local development. - */ -contract KeepRandomBeaconOperatorInitializationStub is - KeepRandomBeaconOperator -{ - constructor( - address _serviceContract, - address _stakingContract, - address _registryContract, - address _gasPriceOracle - ) - public - KeepRandomBeaconOperator( - _serviceContract, - _stakingContract, - _registryContract, - _gasPriceOracle - ) - {} - - function getGroupsRelayEntryTimeout() public view returns (uint256) { - return groups.relayEntryTimeout; - } - - function getGroupsActiveTime() public view returns (uint256) { - return groups.groupActiveTime; - } -} diff --git a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorMisbehaviorStub.sol b/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorMisbehaviorStub.sol deleted file mode 100644 index e562d61ff2..0000000000 --- a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorMisbehaviorStub.sol +++ /dev/null @@ -1,43 +0,0 @@ -pragma solidity 0.5.17; - -import "../KeepRandomBeaconOperator.sol"; - -contract KeepRandomBeaconOperatorMisbehaviorStub is KeepRandomBeaconOperator { - constructor( - address _serviceContract, - address _stakingContract, - address _registryContract, - address _gasPriceOracle - ) - public - KeepRandomBeaconOperator( - _serviceContract, - _stakingContract, - _registryContract, - _gasPriceOracle - ) - { - relayEntryTimeout = 10; - groupSelection.ticketSubmissionTimeout = 69; - resultPublicationBlockStep = 3; - - groupSize = 5; - groupSelection.groupSize = 5; - dkgResultVerification.groupSize = 5; - - groupThreshold = 3; - dkgResultVerification.signatureThreshold = 3; - } - - function getGroupSelectionRelayEntry() public view returns (uint256) { - return groupSelection.seed; - } - - function getTicketSubmissionStartBlock() public view returns (uint256) { - return groupSelection.ticketSubmissionStartBlock; - } - - function timeDKG() public view returns (uint256) { - return dkgResultVerification.timeDKG; - } -} diff --git a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorPricingDKGStub.sol b/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorPricingDKGStub.sol deleted file mode 100644 index 43fdd6f949..0000000000 --- a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorPricingDKGStub.sol +++ /dev/null @@ -1,53 +0,0 @@ -pragma solidity 0.5.17; - -import "../KeepRandomBeaconOperator.sol"; - -/** - * @title KeepRandomBeaconOperatorPricingDKGStub - * @dev A simplified Random Beacon operator contract to help local development. - */ -contract KeepRandomBeaconOperatorPricingDKGStub is KeepRandomBeaconOperator { - constructor( - address _serviceContract, - address _stakingContract, - address _registryContract, - address _gasPriceOracle - ) - public - KeepRandomBeaconOperator( - _serviceContract, - _stakingContract, - _registryContract, - _gasPriceOracle - ) - { - relayEntryTimeout = 10; - groupSelection.ticketSubmissionTimeout = 69; - resultPublicationBlockStep = 3; - - // setGroupSize - groupSize = 20; - groupSelection.groupSize = 20; - dkgResultVerification.groupSize = 20; - - // setGroupThreshold - groupThreshold = 11; - dkgResultVerification.signatureThreshold = 11; - } - - function getGroupSelectionRelayEntry() public view returns (uint256) { - return groupSelection.seed; - } - - function getTicketSubmissionStartBlock() public view returns (uint256) { - return groupSelection.ticketSubmissionStartBlock; - } - - function isGroupSelectionInProgress() public view returns (bool) { - return groupSelection.inProgress; - } - - function timeDKG() public view returns (uint256) { - return dkgResultVerification.timeDKG; - } -} diff --git a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorPricingRewardsWithdrawStub.sol b/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorPricingRewardsWithdrawStub.sol deleted file mode 100644 index d35c8db314..0000000000 --- a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorPricingRewardsWithdrawStub.sol +++ /dev/null @@ -1,46 +0,0 @@ -pragma solidity 0.5.17; - -import "../KeepRandomBeaconOperator.sol"; -import "../utils/BytesLib.sol"; - -contract KeepRandomBeaconOperatorPricingRewardsWithdrawStub is - KeepRandomBeaconOperator -{ - using BytesLib for bytes; - - constructor( - address _serviceContract, - address _stakingContract, - address _registryContract, - address _gasPriceOracle - ) - public - KeepRandomBeaconOperator( - _serviceContract, - _stakingContract, - _registryContract, - _gasPriceOracle - ) - { - groupSize = 3; - groups.groupActiveTime = 3; - groups.relayEntryTimeout = 10; - } - - function registerNewGroup( - bytes memory groupPublicKey, - address[] memory members - ) public { - groups.addGroup(groupPublicKey); - groups.setGroupMembers(groupPublicKey, members, hex""); - } - - function relayEntry() public returns (uint256) { - (uint256 groupMemberReward, , ) = newEntryRewardsBreakdown(); - groups.addGroupMemberReward( - groups.getGroupPublicKey(currentRequestGroupIndex), - groupMemberReward - ); - currentRequestStartBlock = 0; - } -} diff --git a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorPricingStub.sol b/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorPricingStub.sol deleted file mode 100644 index f38f5940eb..0000000000 --- a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorPricingStub.sol +++ /dev/null @@ -1,57 +0,0 @@ -pragma solidity 0.5.17; - -import "../KeepRandomBeaconOperator.sol"; - -contract KeepRandomBeaconOperatorPricingStub is KeepRandomBeaconOperator { - constructor( - address _serviceContract, - address _stakingContract, - address _registryContract, - address _gasPriceOracle - ) - public - KeepRandomBeaconOperator( - _serviceContract, - _stakingContract, - _registryContract, - _gasPriceOracle - ) - {} - - function registerNewGroup(bytes memory groupPublicKey) public { - groups.addGroup(groupPublicKey); - } - - function setEntryVerificationGasEstimate(uint256 gasEstimate) public { - entryVerificationGasEstimate = gasEstimate; - } - - function setGroupMemberBaseReward(uint256 reward) public { - groupMemberBaseReward = reward; - } - - function setGroupSize(uint256 size) public { - groupSize = size; - } - - function setGasPriceCeiling(uint256 _gasPriceCeiling) public { - gasPriceCeiling = _gasPriceCeiling; - } - - function getNewEntryRewardsBreakdown() - public - view - returns ( - uint256 groupMemberReward, - uint256 submitterReward, - uint256 subsidy - ) - { - return super.newEntryRewardsBreakdown(); - } - - function delayFactor() public view returns (uint256) { - return - DelayFactor.calculate(currentRequestStartBlock, relayEntryTimeout); - } -} diff --git a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorRewardsStub.sol b/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorRewardsStub.sol deleted file mode 100644 index 1269e5fe5c..0000000000 --- a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorRewardsStub.sol +++ /dev/null @@ -1,55 +0,0 @@ -pragma solidity 0.5.17; - -import "../KeepRandomBeaconOperator.sol"; - -contract KeepRandomBeaconOperatorRewardsStub is KeepRandomBeaconOperator { - constructor( - address _serviceContract, - address _stakingContract, - address _registryContract, - address _gasPriceOracle - ) - public - KeepRandomBeaconOperator( - _serviceContract, - _stakingContract, - _registryContract, - _gasPriceOracle - ) - { - groups.groupActiveTime = 5; - groups.relayEntryTimeout = 10; - } - - function registerNewGroup( - bytes memory groupPublicKey, - address[] memory members - ) public { - groups.addGroup(groupPublicKey); - groups.setGroupMembers(groupPublicKey, members, hex""); - emit DkgResultSubmittedEvent(0, groupPublicKey, ""); - } - - function addGroupMemberReward( - bytes memory groupPubKey, - uint256 groupMemberReward - ) public { - groups.addGroupMemberReward(groupPubKey, groupMemberReward); - } - - function reportUnauthorizedSigning(uint256 groupIndex) public { - // Marks the given group as terminated. - groups.reportRelayEntryTimeout(groupIndex, groupSize); - emit UnauthorizedSigningReported(groupIndex); - } - - function reportRelayEntryTimeout(uint256 groupIndex) public { - // Marks the given group as terminated. - groups.reportRelayEntryTimeout(groupIndex, groupSize); - emit RelayEntryTimeoutReported(groupIndex); - } - - function isGroupTerminated(uint256 groupIndex) public view returns (bool) { - return groups.isGroupTerminated(groupIndex); - } -} diff --git a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorServicePricingStub.sol b/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorServicePricingStub.sol deleted file mode 100644 index f9662f4a62..0000000000 --- a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorServicePricingStub.sol +++ /dev/null @@ -1,56 +0,0 @@ -pragma solidity 0.5.17; - -import "../KeepRandomBeaconOperator.sol"; - -/** - * @title KeepRandomBeaconOperatorServicePricingStub - * @dev A simplified Random Beacon operator contract to help local development. - */ -contract KeepRandomBeaconOperatorServicePricingStub is - KeepRandomBeaconOperator -{ - constructor( - address _serviceContract, - address _stakingContract, - address _registryContract, - address _gasPriceOracle - ) - public - KeepRandomBeaconOperator( - _serviceContract, - _stakingContract, - _registryContract, - _gasPriceOracle - ) - { - relayEntryTimeout = 10; - groupSelection.ticketSubmissionTimeout = 69; - resultPublicationBlockStep = 3; - groupSize = 3; - groupSelection.groupSize = 3; - dkgResultVerification.groupSize = 3; - } - - function registerNewGroup(bytes memory groupPublicKey) public { - groups.addGroup(groupPublicKey); - } - - function setGroupMembers( - bytes memory groupPublicKey, - address[] memory members - ) public { - groups.setGroupMembers(groupPublicKey, members, hex""); - } - - function getGroupPublicKey(uint256 groupIndex) - public - view - returns (bytes memory) - { - return groups.groups[groupIndex].groupPubKey; - } - - function setGasPriceCeiling(uint256 _gasPriceCeiling) public { - gasPriceCeiling = _gasPriceCeiling; - } -} diff --git a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorSlashingStub.sol b/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorSlashingStub.sol deleted file mode 100644 index 11409897ab..0000000000 --- a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorSlashingStub.sol +++ /dev/null @@ -1,32 +0,0 @@ -pragma solidity 0.5.17; - -import "../KeepRandomBeaconOperator.sol"; - -contract KeepRandomBeaconOperatorSlashingStub is KeepRandomBeaconOperator { - constructor( - address _serviceContract, - address _stakingContract, - address _registryContract, - address _gasPriceOracle - ) - public - KeepRandomBeaconOperator( - _serviceContract, - _stakingContract, - _registryContract, - _gasPriceOracle - ) - { - relayEntryTimeout = 10; - groupSelection.ticketSubmissionTimeout = 69; - resultPublicationBlockStep = 3; - } - - function registerNewGroup( - bytes memory groupPublicKey, - address[] memory members - ) public { - groups.addGroup(groupPublicKey); - groups.setGroupMembers(groupPublicKey, members, hex""); - } -} diff --git a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorStub.sol b/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorStub.sol deleted file mode 100644 index 995656862e..0000000000 --- a/solidity-v1/contracts/stubs/KeepRandomBeaconOperatorStub.sol +++ /dev/null @@ -1,59 +0,0 @@ -pragma solidity 0.5.17; - -import "../KeepRandomBeaconOperator.sol"; - -/** - * @title KeepRandomBeaconOperatorStub - * @dev A simplified Random Beacon operator contract to help local development. - */ -contract KeepRandomBeaconOperatorStub is KeepRandomBeaconOperator { - constructor( - address _serviceContract, - address _stakingContract, - address _registryContract, - address _gasPriceOracle - ) - public - KeepRandomBeaconOperator( - _serviceContract, - _stakingContract, - _registryContract, - _gasPriceOracle - ) - { - relayEntryTimeout = 10; - groupSelection.ticketSubmissionTimeout = 69; - resultPublicationBlockStep = 3; - } - - function registerNewGroup(bytes memory groupPublicKey) public { - groups.addGroup(groupPublicKey); - } - - function setGroupMembers( - bytes memory groupPublicKey, - address[] memory members - ) public { - groups.setGroupMembers(groupPublicKey, members, hex""); - } - - function getGroupSelectionRelayEntry() public view returns (uint256) { - return groupSelection.seed; - } - - function getTicketSubmissionStartBlock() public view returns (uint256) { - return groupSelection.ticketSubmissionStartBlock; - } - - function getGroupPublicKey(uint256 groupIndex) - public - view - returns (bytes memory) - { - return groups.groups[groupIndex].groupPubKey; - } - - function timeDKG() public view returns (uint256) { - return dkgResultVerification.timeDKG; - } -} diff --git a/solidity-v1/contracts/stubs/LockStub.sol b/solidity-v1/contracts/stubs/LockStub.sol deleted file mode 100644 index caae631e27..0000000000 --- a/solidity-v1/contracts/stubs/LockStub.sol +++ /dev/null @@ -1,33 +0,0 @@ -pragma solidity 0.5.17; - -import "../libraries/staking/LockUtils.sol"; - -contract LockStub { - using LockUtils for LockUtils.LockSet; - - LockUtils.LockSet _locks; - - function publicContains(address creator) public view returns (bool) { - return _locks.contains(creator); - } - - function publicGetLockTime(address creator) public view returns (uint256) { - return uint256(_locks.getLockTime(creator)); - } - - function publicSetLock(address creator, uint256 expiresAt) public { - _locks.setLock(creator, uint96(expiresAt)); - } - - function publicReleaseLock(address creator) public { - _locks.releaseLock(creator); - } - - function publicEnumerateCreators() public view returns (address[] memory) { - address[] memory creators = new address[](_locks.locks.length); - for (uint256 i = 0; i < _locks.locks.length; i++) { - creators[i] = _locks.locks[i].creator; - } - return creators; - } -} diff --git a/solidity-v1/contracts/stubs/MinimumStakeScheduleStub.sol b/solidity-v1/contracts/stubs/MinimumStakeScheduleStub.sol deleted file mode 100644 index 24bf87699b..0000000000 --- a/solidity-v1/contracts/stubs/MinimumStakeScheduleStub.sol +++ /dev/null @@ -1,11 +0,0 @@ -pragma solidity 0.5.17; - -import "../libraries/staking/MinimumStakeSchedule.sol"; - -contract MinimumStakeScheduleStub { - uint256 scheduleStart = now; - - function current() public view returns (uint256) { - return MinimumStakeSchedule.current(scheduleStart); - } -} diff --git a/solidity-v1/contracts/stubs/NewRewardsStub.sol b/solidity-v1/contracts/stubs/NewRewardsStub.sol deleted file mode 100644 index 9f468e47a3..0000000000 --- a/solidity-v1/contracts/stubs/NewRewardsStub.sol +++ /dev/null @@ -1,17 +0,0 @@ -pragma solidity ^0.5.17; - -import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol"; - -contract NewRewardsStub { - using SafeERC20 for IERC20; - - function receiveApproval( - address _from, - uint256 _value, - address _token, - bytes memory - ) public { - IERC20(_token).safeTransferFrom(_from, address(this), _value); - } -} diff --git a/solidity-v1/contracts/stubs/OldTokenStaking.sol b/solidity-v1/contracts/stubs/OldTokenStaking.sol deleted file mode 100644 index 15fba9167e..0000000000 --- a/solidity-v1/contracts/stubs/OldTokenStaking.sol +++ /dev/null @@ -1,149 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol"; -import "../utils/OperatorParams.sol"; -import "../utils/BytesLib.sol"; - -/// Staking contract stub for testing purposes of copy stake flow. -contract OldTokenStaking { - using OperatorParams for uint256; - using BytesLib for bytes; - ERC20Burnable public token; - using SafeERC20 for ERC20Burnable; - - event Undelegated(address indexed operator, uint256 undelegatedAt); - event Staked(address indexed from, uint256 value); - - mapping(address => address[]) public ownerOperators; - mapping(address => Operator) public operators; - - struct Operator { - uint256 packedParams; - address owner; - address payable beneficiary; - address authorizer; - } - - constructor(address _tokenAddress) public { - require(_tokenAddress != address(0x0), "Token address can't be zero."); - token = ERC20Burnable(_tokenAddress); - } - - function operatorsOf(address _address) - public - view - returns (address[] memory) - { - return ownerOperators[_address]; - } - - function balanceOf(address _address) public view returns (uint256 balance) { - return operators[_address].packedParams.getAmount(); - } - - function ownerOf(address _operator) public view returns (address) { - return operators[_operator].owner; - } - - function beneficiaryOf(address _operator) - public - view - returns (address payable) - { - return operators[_operator].beneficiary; - } - - function authorizerOf(address _operator) public view returns (address) { - return operators[_operator].authorizer; - } - - function getDelegationInfo(address _operator) - public - view - returns ( - uint256 amount, - uint256 createdAt, - uint256 undelegatedAt - ) - { - return operators[_operator].packedParams.unpack(); - } - - function undelegationPeriod() public view returns (uint256) { - return 5184000; // two months - } - - function initializationPeriod() public view returns (uint256) { - return 120; - } - - function minimumStake() public view returns (uint256) { - return 10000 * 1e18; - } - - function undelegate(address _operator) public { - uint256 oldParams = operators[_operator].packedParams; - operators[_operator].packedParams = oldParams.setUndelegationTimestamp( - block.timestamp - ); - emit Undelegated(_operator, block.timestamp); - } - - function setOperator( - address _owner, - address _operator, - address payable _beneficiary, - address _authorizer, - uint256 _value - ) public { - operators[_operator] = Operator( - OperatorParams.pack(_value, block.timestamp, 0), - _owner, - _beneficiary, - _authorizer - ); - ownerOperators[_owner].push(_operator); - } - - function receiveApproval( - address _from, - uint256 _value, - address _token, - bytes memory _extraData - ) public { - require( - ERC20Burnable(_token) == token, - "Token contract must be the same one linked to this contract." - ); - require( - _value >= minimumStake(), - "Tokens amount must be greater than the minimum stake" - ); - require( - _extraData.length == 60, - "Stake delegation data must be provided." - ); - - address payable beneficiary = address(uint160(_extraData.toAddress(0))); - address operator = _extraData.toAddress(20); - require( - operators[operator].owner == address(0), - "Operator address is already in use." - ); - address authorizer = _extraData.toAddress(40); - - // Transfer tokens to this contract. - token.safeTransferFrom(_from, address(this), _value); - - operators[operator] = Operator( - OperatorParams.pack(_value, block.timestamp, 0), - _from, - beneficiary, - authorizer - ); - ownerOperators[_from].push(operator); - - emit Staked(operator, _value); - } -} diff --git a/solidity-v1/contracts/stubs/OperatorParamsStub.sol b/solidity-v1/contracts/stubs/OperatorParamsStub.sol deleted file mode 100644 index 12cfd5a9eb..0000000000 --- a/solidity-v1/contracts/stubs/OperatorParamsStub.sol +++ /dev/null @@ -1,64 +0,0 @@ -pragma solidity 0.5.17; -import "../utils/OperatorParams.sol"; - -contract OperatorParamsStub { - using OperatorParams for uint256; - - function publicPack( - uint256 amount, - uint256 createdAt, - uint256 undelegatedAt - ) public pure returns (uint256) { - return OperatorParams.pack(amount, createdAt, undelegatedAt); - } - - function publicGetAmount(uint256 packed) public pure returns (uint256) { - return packed.getAmount(); - } - - function publicSetAmount(uint256 packed, uint256 amount) - public - pure - returns (uint256) - { - return packed.setAmount(amount); - } - - function publicGetCreationTimestamp(uint256 packed) - public - pure - returns (uint256) - { - return packed.getCreationTimestamp(); - } - - function publicSetCreationTimestamp( - uint256 packed, - uint256 creationTimestamp - ) public pure returns (uint256) { - return packed.setCreationTimestamp(creationTimestamp); - } - - function publicGetUndelegationTimestamp(uint256 packed) - public - pure - returns (uint256) - { - return packed.getUndelegationTimestamp(); - } - - function publicSetUndelegationTimestamp( - uint256 packed, - uint256 undelegationTimestamp - ) public pure returns (uint256) { - return packed.setUndelegationTimestamp(undelegationTimestamp); - } - - function publicSetAmountAndCreationTimestamp( - uint256 packed, - uint256 amount, - uint256 creationTimestamp - ) public pure returns (uint256) { - return packed.setAmountAndCreationTimestamp(amount, creationTimestamp); - } -} diff --git a/solidity-v1/contracts/stubs/RewardsStub.sol b/solidity-v1/contracts/stubs/RewardsStub.sol deleted file mode 100644 index dfd11e0abf..0000000000 --- a/solidity-v1/contracts/stubs/RewardsStub.sol +++ /dev/null @@ -1,148 +0,0 @@ -pragma solidity ^0.5.17; - -import "../Rewards.sol"; - -contract RewardsStub is Rewards { - uint256[] creationTimes; - uint256 closedTime; - mapping(uint256 => bool) terminated; - - constructor( - address _token, - uint256 _minimumKeepsPerInterval, - uint256 _firstIntervalStart, - uint256[] memory _intervalWeights, - uint256[] memory _creationTimes, - uint256 _termLength - ) - public - Rewards( - _token, - _firstIntervalStart, - _intervalWeights, - _termLength, - _minimumKeepsPerInterval - ) - { - creationTimes = _creationTimes; - } - - function receiveReward(uint256 i) public { - receiveReward(bytes32(i)); - } - - function receiveRewards(uint256[] memory identifiers) public { - uint256 len = identifiers.length; - bytes32[] memory bytes32identifiers = new bytes32[](len); - for (uint256 i = 0; i < identifiers.length; i++) { - bytes32identifiers[i] = bytes32(identifiers[i]); - } - receiveRewards(bytes32identifiers); - } - - function reportTermination(uint256 i) public { - reportTermination(bytes32(i)); - } - - function reportTerminations(uint256[] memory identifiers) public { - uint256 len = identifiers.length; - bytes32[] memory bytes32identifiers = new bytes32[](len); - for (uint256 i = 0; i < identifiers.length; i++) { - bytes32identifiers[i] = bytes32(identifiers[i]); - } - reportTerminations(bytes32identifiers); - } - - function eligibleForReward(uint256 i) public view returns (bool) { - return eligibleForReward(bytes32(i)); - } - - function eligibleButTerminatedWithUint(uint256 i) - public - view - returns (bool) - { - return eligibleButTerminated(bytes32(i)); - } - - function findEndpoint(uint256 intervalEndpoint) - public - view - returns (uint256) - { - return _findEndpoint(intervalEndpoint); - } - - function getEndpoint(uint256 interval) public returns (uint256) { - return _getEndpoint(interval); - } - - function baseAllocation(uint256 interval) public view returns (uint256) { - return _baseAllocation(interval); - } - - function adjustedAllocation(uint256 interval) public returns (uint256) { - return _adjustedAllocation(interval); - } - - function rewardPerKeep(uint256 interval) public returns (uint256) { - uint256 __adjustedAllocation = _adjustedAllocation(interval); - if (__adjustedAllocation == 0) { - return 0; - } - uint256 keepCount = keepsInInterval(interval); - // Adjusted allocation would be zero if keep count was zero - assert(keepCount > 0); - return __adjustedAllocation.div(keepCount); - } - - function terminate(uint256 i) public { - terminated[i] = true; - } - - function setCloseTime(uint256 i) public { - closedTime = i; - } - - function _getKeepCount() internal view returns (uint256) { - return creationTimes.length; - } - - function _getKeepAtIndex(uint256 i) internal view returns (bytes32) { - return bytes32(i); - } - - function _getCreationTime(bytes32 groupIndexBytes) - internal - view - returns (uint256) - { - return creationTimes[uint256(groupIndexBytes)]; - } - - function _isClosed(bytes32 groupIndexBytes) internal view returns (bool) { - return _getCreationTime(groupIndexBytes) <= closedTime; - } - - function _isTerminated(bytes32 groupIndexBytes) - internal - view - returns (bool) - { - return terminated[uint256(groupIndexBytes)]; - } - - function _recognizedByFactory(bytes32 groupIndexBytes) - internal - view - returns (bool) - { - return _getKeepCount() > uint256(groupIndexBytes); - } - - function _distributeReward(bytes32 groupIndexBytes, uint256 _value) - internal - { - token.safeTransfer(msg.sender, _value); - } -} diff --git a/solidity-v1/contracts/stubs/RolesLookupStub.sol b/solidity-v1/contracts/stubs/RolesLookupStub.sol deleted file mode 100644 index 57502b8d23..0000000000 --- a/solidity-v1/contracts/stubs/RolesLookupStub.sol +++ /dev/null @@ -1,56 +0,0 @@ -pragma solidity 0.5.17; - -import "../libraries/RolesLookup.sol"; - -contract RolesLookupStub { - TokenStaking internal tokenStaking; - TokenGrant internal tokenGrant; - - constructor(TokenStaking _tokenStaking, TokenGrant _tokenGrant) public { - tokenStaking = _tokenStaking; - tokenGrant = _tokenGrant; - } - - function isTokenOwnerForOperator(address tokenOwner, address operator) - public - view - returns (bool) - { - return - RolesLookup.isTokenOwnerForOperator( - tokenOwner, - operator, - tokenStaking - ); - } - - function isGranteeForOperator(address grantee, address operator) - public - view - returns (bool) - { - return RolesLookup.isGranteeForOperator(grantee, operator, tokenGrant); - } - - function isManagedGranteeForOperator( - address grantee, - address operator, - address granteeContract - ) public view returns (bool) { - return - RolesLookup.isManagedGranteeForOperator( - grantee, - operator, - granteeContract, - tokenGrant - ); - } - - function isManagedGranteeForGrant(address grantee, uint256 grantId) - public - returns (bool) - { - return - RolesLookup.isManagedGranteeForGrant(grantee, grantId, tokenGrant); - } -} diff --git a/solidity-v1/contracts/stubs/TestAltBn128.sol b/solidity-v1/contracts/stubs/TestAltBn128.sol deleted file mode 100644 index 6e986de3cb..0000000000 --- a/solidity-v1/contracts/stubs/TestAltBn128.sol +++ /dev/null @@ -1,449 +0,0 @@ -pragma solidity 0.5.17; - -// it is just a stub, not a live deployment; -// we are fine with experimental feature -/* solium-disable-next-line */ -pragma experimental ABIEncoderV2; - -import "../cryptography/AltBn128.sol"; - -contract TestAltBn128 { - function publicG1Unmarshal(bytes memory m) - public - pure - returns (AltBn128.G1Point memory) - { - return AltBn128.g1Unmarshal(m); - } - - function publicG2Unmarshal(bytes memory m) - public - pure - returns (AltBn128.G2Point memory) - { - return AltBn128.g2Unmarshal(m); - } - - function publicG2Decompress(bytes memory m) - public - pure - returns (AltBn128.G2Point memory) - { - return AltBn128.g2Decompress(m); - } - - AltBn128.G1Point g1 = AltBn128.g1(); - AltBn128.G2Point g2 = AltBn128.g2(); - - function runHashingTest() public { - string memory hello = "hello!"; - string memory goodbye = "goodbye."; - AltBn128.G1Point memory p_1; - AltBn128.G1Point memory p_2; - p_1 = AltBn128.g1HashToPoint(bytes(hello)); - p_2 = AltBn128.g1HashToPoint(bytes(goodbye)); - - require(p_1.x != 0, "X should not equal 0 in a hashed point."); - require(p_1.y != 0, "Y should not equal 0 in a hashed point."); - require(p_2.x != 0, "X should not equal 0 in a hashed point."); - require(p_2.y != 0, "Y should not equal 0 in a hashed point."); - - require( - AltBn128.isG1PointOnCurve(p_1), - "Hashed points should be on the curve." - ); - require( - AltBn128.isG1PointOnCurve(p_2), - "Hashed points should be on the curve." - ); - } - - function runHashAndAddTest() public { - string memory hello = "hello!"; - string memory goodbye = "goodbye."; - AltBn128.G1Point memory p_1; - AltBn128.G1Point memory p_2; - p_1 = AltBn128.g1HashToPoint(bytes(hello)); - p_2 = AltBn128.g1HashToPoint(bytes(goodbye)); - - AltBn128.G1Point memory p_3; - AltBn128.G1Point memory p_4; - - p_3 = AltBn128.g1Add(p_1, p_2); - p_4 = AltBn128.g1Add(p_2, p_1); - - require(p_3.x == p_4.x, "Point addition should be commutative."); - require(p_3.y == p_4.y, "Point addition should be commutative."); - - require( - AltBn128.isG1PointOnCurve(p_3), - "Added points should be on the curve." - ); - } - - function runHashAndScalarMultiplyTest() public { - string memory hello = "hello!"; - AltBn128.G1Point memory p_1; - AltBn128.G1Point memory p_2; - p_1 = AltBn128.g1HashToPoint(bytes(hello)); - - p_2 = AltBn128.scalarMultiply(p_1, 12); - - require( - AltBn128.isG1PointOnCurve(p_2), - "Multiplied point should be on the curve." - ); - } - - uint256[2][] randomG1 = [ - [ - 19985462441994274044747034318046506954527006367483173410210086890020894468080, - 18435086518936643964830423002803816020906755142322386776411266459735121477493 - ], - [ - 5020462286181323390508118928832214575747271080433231325350949221928552771006, - 6185819871141660402526014503512646294685393996180865467240675728617780703293 - ], - [ - 6443569433573553122968863711873646857259386088199162681359502284812487407640, - 5378163071719228060986147516945215302807920666474786022068644421654848367565 - ], - [ - 19923401560169709235429596406611561407855841155398968552083379042854674266499, - 10525710049852251332517421942831871137061760270860191079861735894813959253055 - ], - [ - 19708536568727021605314080150939514846681180496259214578335284564769723419938, - 10692356507990003585226828000662725800587874779874382732784071410185542028439 - ], - [ - 9372321588728408099991690236147178727235677209811335191981120085012199642559, - 11142558497436993571688400857990083465974854590891619188837196531526982135288 - ], - [ - 5965886725029153696599727822391947370059044516209856603831046549655428439060, - 10175397348860086021525298362240324520688370458967443904613437789517586359962 - ], - [ - 20748498912264019189558145442056089284703240490771913074152837182874426945993, - 18057592905480302483449076150943157907511999106688668826058046434471622799474 - ], - [ - 7477907739342510339540973467783537984932469471333402963930842749621045686487, - 1179596217276931579251786249459263438406283313229247981371951224605996910316 - ], - [ - 3386341017431964271492464889305868556498227248869025090652509478713128447791, - 1836930069368635496176332910536803390892441983393373783218213609800061729358 - ], - [ - 15369136978943154357167241223632015935727499997608268363280373457134516735375, - 13963714284290182895189799343803541866405397472877283227980653081636863075815 - ], - [ - 252324504554101299613500369843808394682741893676105206770010905523927747936, - 5301348107423388196155421770728871408649649793716391651642915616092861338462 - ] - ]; - - uint256[4][] randomG2 = [ - [ - 11559732032986387107991004021392285783925812861821192530917403151452391805634, - 10857046999023057135944570762232829481370756359578518086990519993285655852781, - 4082367875863433681332203403145435568316851327593401208105741076214120093531, - 8495653923123431417604973247489272438418190587263600148770280649306958101930 - ], - [ - 3558222795862351239338057832504031412042231518727744074889572712970741892158, - 1306678064139060928090556321451178074402697032692562310283497263099767804676, - 2316442485869095896235201578689810877812891214989209176315292141295656899653, - 2999256016806770587400278223266487828070696882906920737522774393744811789778 - ], - [ - 14622493903084144595613313812136815995549249456289461446052351022658739726486, - 14815420576980748908539135128242740015127336122409448605930237255046504879157, - 13400921316097996971584638040633436051131826349725459963804926452735715285087, - 11851371827558083239355447328198017836652007495098247662236445322029872280124 - ], - [ - 6217401439122098088765827257305726706731572245002926407946450711747381925871, - 14805062536146767263542014365237987548032285721054252746437955688297149797718, - 2682992062255943794448341271274355111144659536522130372456554423016095772641, - 8381914770822556071474775460600158217731085727931186436939477443088764950881 - ] - ]; - - function runGfP2AddTest() public { - uint256 i; - uint8 j; - - AltBn128.gfP2 memory p_1; - AltBn128.gfP2 memory p_2; - AltBn128.gfP2 memory p_3; - AltBn128.gfP2 memory p_4; - - for (i = 0; i < randomG2.length; i++) { - for (j = 0; j < randomG2.length; j++) { - p_1 = AltBn128.gfP2Add( - AltBn128.gfP2(randomG2[i][0], randomG2[i][1]), - AltBn128.gfP2(randomG2[j][0], randomG2[j][1]) - ); - p_2 = AltBn128.gfP2Add( - AltBn128.gfP2(randomG2[i][2], randomG2[i][3]), - AltBn128.gfP2(randomG2[j][2], randomG2[j][3]) - ); - p_3 = AltBn128.gfP2Add( - AltBn128.gfP2(randomG2[j][0], randomG2[j][1]), - AltBn128.gfP2(randomG2[i][0], randomG2[i][1]) - ); - p_4 = AltBn128.gfP2Add( - AltBn128.gfP2(randomG2[j][2], randomG2[j][3]), - AltBn128.gfP2(randomG2[i][2], randomG2[i][3]) - ); - - require( - p_1.x == p_3.x, - "Point addition should be commutative." - ); - require( - p_1.y == p_3.y, - "Point addition should be commutative." - ); - require( - p_2.x == p_4.x, - "Point addition should be commutative." - ); - require( - p_2.y == p_4.y, - "Point addition should be commutative." - ); - } - } - } - - function runAddTest() public { - uint256 i; - uint8 j; - - AltBn128.G1Point memory p_1; - AltBn128.G1Point memory p_2; - - for (i = 0; i < randomG1.length; i++) { - for (j = 0; j < randomG1.length; j++) { - p_1 = AltBn128.g1Add( - AltBn128.G1Point(randomG1[i][0], randomG1[i][1]), - AltBn128.G1Point(randomG1[j][0], randomG1[j][1]) - ); - p_2 = AltBn128.g1Add( - AltBn128.G1Point(randomG1[j][0], randomG1[j][1]), - AltBn128.G1Point(randomG1[i][0], randomG1[i][1]) - ); - - require( - p_1.x == p_2.x, - "Point addition should be commutative." - ); - require( - p_1.y == p_2.y, - "Point addition should be commutative." - ); - - require( - AltBn128.isG1PointOnCurve(p_1), - "Added points should be on the curve." - ); - } - } - } - - function runScalarMultiplyTest() public { - uint256 i; - uint256 j; - - AltBn128.G1Point memory p_1; - AltBn128.G1Point memory p_2; - - for (i = 1; i < randomG1.length; i++) { - p_1 = AltBn128.scalarMultiply( - AltBn128.G1Point(randomG1[i][0], randomG1[i][1]), - i - ); - - require( - AltBn128.isG1PointOnCurve(p_1), - "Multiplied point should be on the curve." - ); - - p_2 = AltBn128.G1Point(randomG1[i][0], randomG1[i][1]); - for (j = 1; j < i; j++) { - p_2 = AltBn128.g1Add( - p_2, - AltBn128.G1Point(randomG1[i][0], randomG1[i][1]) - ); - } - - require( - p_1.x == p_2.x, - "Scalar multiplication should match repeat addition." - ); - require( - p_1.y == p_2.y, - "Scalar multiplication should match repeat addition." - ); - } - } - - function runBasicPairingTest() public { - bool result = - AltBn128.pairing( - g1, - g2, - AltBn128.G1Point(g1.x, AltBn128.getP() - g1.y), - g2 - ); - require(result, "Basic pairing check should succeed."); - } - - function runG1PointMarshalingTest() public { - AltBn128.G1Point memory point; - point - .x = 656647519899395589093611455851658769732922739162315270379466002146796568126; - point - .y = 5296675831567268847773497112983742440203412208935796410329912816023128374551; - - bytes memory marshaledPoint = AltBn128.g1Marshal(point); - AltBn128.G1Point memory actual = AltBn128.g1Unmarshal(marshaledPoint); - - require( - point.x == actual.x, - "Unmarshaling a marshaled point should give the same x coordinate." - ); - require( - point.y == actual.y, - "Unmarshaling a marshaled point should give the same y coordinate." - ); - } - - // Verifying sample data generated with bn256.go - Ethereum's bn256/cloudflare curve. - function runVerifySignatureTest() public { - // "hello!" message hashed to G1 point using G1HashToPoint from keep-core/pkg/bls/altbn128.go - AltBn128.G1Point memory message; - message - .x = 5634139805531803244211629196316241342481813136353842610045004964364565232495; - message - .y = 12935759374343796368049060881302766596646163398265176009268480404372697203641; - - // G1 point hashed message above signed with private key = 123 using ScalarMult - // from go-ethereum/crypto/bn256/cloudflare library - AltBn128.G1Point memory signature; - signature - .x = 656647519899395589093611455851658769732922739162315270379466002146796568126; - signature - .y = 5296675831567268847773497112983742440203412208935796410329912816023128374551; - - // G2 point representing public key for private key = 123 - AltBn128.G2Point memory publicKey; - publicKey - .x - .x = 14066454060412929535985836631817650877381034334390275410072431082437297539867; - publicKey - .x - .y = 19276105129625393659655050515259006463014579919681138299520812914148935621072; - publicKey - .y - .x = 10109651107942685361120988628892759706059655669161016107907096760613704453218; - publicKey - .y - .y = 12642665914920339463975152321804664028480770144655934937445922690262428344269; - - bool result = - AltBn128.pairing( - signature, - g2, - AltBn128.G1Point(message.x, AltBn128.getP() - message.y), - publicKey - ); - require( - result, - "Verify signature using precompiled pairing contract should succeed." - ); - } - - function runCompressG1InvertibilityTest() public { - AltBn128.G1Point memory p_1; - AltBn128.G1Point memory p_2; - - for (uint256 i = 0; i < randomG1.length; i++) { - p_1.x = randomG1[i][0]; - p_1.y = randomG1[i][1]; - bytes32 compressed = AltBn128.g1Compress(p_1); - p_2 = AltBn128.g1Decompress(compressed); - require( - p_1.x == p_2.x, - "Decompressing a compressed point should give the same x coordinate." - ); - require( - p_1.y == p_2.y, - "Decompressing a compressed point should give the same y coordinate." - ); - } - } - - function runCompressG2InvertibilityTest() public { - AltBn128.G2Point memory p_1; - AltBn128.G2Point memory p_2; - - for (uint256 i = 0; i < randomG2.length; i++) { - p_1.x.x = randomG2[i][0]; - p_1.x.y = randomG2[i][1]; - p_1.y.x = randomG2[i][2]; - p_1.y.y = randomG2[i][3]; - - p_2 = AltBn128.g2Decompress(AltBn128.g2Compress(p_1)); - require( - p_1.x.x == p_2.x.x, - "Decompressing a compressed point should give the same x coordinate." - ); - require( - p_1.x.y == p_2.x.y, - "Decompressing a compressed point should give the same x coordinate." - ); - require( - p_1.y.x == p_2.y.x, - "Decompressing a compressed point should give the same x coordinate." - ); - require( - p_1.y.y == p_2.y.y, - "Decompressing a compressed point should give the same x coordinate." - ); - } - } - - function runG2PointOnCurveTest() public { - AltBn128.G2Point memory point; - - for (uint256 i = 0; i < randomG2.length; i++) { - point.x.x = randomG2[i][0]; - point.x.y = randomG2[i][1]; - point.y.x = randomG2[i][2]; - point.y.y = randomG2[i][3]; - - require( - AltBn128.isG2PointOnCurve(point), - "Valid points should be on the curve." - ); - } - - for (uint256 i = 0; i < randomG2.length; i++) { - point.x.x = randomG2[i][2]; - point.x.y = randomG2[i][3]; - point.y.x = randomG2[i][0]; - point.y.y = randomG2[i][1]; - - require( - !AltBn128.isG2PointOnCurve(point), - "Invalid points should not be on the curve." - ); - } - } -} diff --git a/solidity-v1/contracts/stubs/TestArrayUtils.sol b/solidity-v1/contracts/stubs/TestArrayUtils.sol deleted file mode 100644 index 5d26be79ee..0000000000 --- a/solidity-v1/contracts/stubs/TestArrayUtils.sol +++ /dev/null @@ -1,114 +0,0 @@ -pragma solidity 0.5.17; - -import "../utils/AddressArrayUtils.sol"; -import "../utils/UintArrayUtils.sol"; - -contract TestArrayUtils { - using AddressArrayUtils for address[]; - using UintArrayUtils for uint256[]; - - address[][4] public addressArrays; - uint256[] public values; - - function runCanHandleEmptyArrayTest() public { - address[] storage addresses = addressArrays[0]; - addresses.removeAddress(0x2222222222222222222222222222222222222222); - require( - addresses.length == 0, - "Empty array should stay unchanged on attempt to remove address from it." - ); - } - - function runCanRemoveAddressFromSingleElementArrayTest() public { - address[] storage addresses = addressArrays[1]; - addresses.push(0x2222222222222222222222222222222222222222); - addresses.removeAddress(0x2222222222222222222222222222222222222222); - require( - addresses.length == 0, - "Occurrence of address in a single element array should be removed." - ); - } - - function runCanRemoveIdenticalAddressesTest() public { - address[] storage addresses = addressArrays[2]; - addresses.push(0x2222222222222222222222222222222222222222); - addresses.push(0x2222222222222222222222222222222222222222); - addresses.push(0x2222222222222222222222222222222222222222); - addresses.removeAddress(0x2222222222222222222222222222222222222222); - require( - addresses.length == 0, - "All occurrences should be removed and array length should become 0." - ); - } - - function runCanRemoveAddressTest() public { - address[] storage addresses = addressArrays[3]; - bool exists = false; - addresses.push(0x2222222222222222222222222222222222222222); - addresses.push(0x1111111111111111111111111111111111111111); - addresses.push(0x2222222222222222222222222222222222222222); - addresses.push(0x2222222222222222222222222222222222222222); - addresses.push(0x3333333333333333333333333333333333333333); - addresses.push(0x2222222222222222222222222222222222222222); - - addresses.removeAddress(0x2222222222222222222222222222222222222222); - for (uint256 i = 0; i < addresses.length; i++) { - if (addresses[i] == 0x2222222222222222222222222222222222222222) { - exists = true; - } - } - - require( - !exists, - "All occurrences of the address should be removed from the array." - ); - require( - addresses.length == 2, - "Array length should change accordingly." - ); - } - - function runCanHandleEmptyValueArrayTest() public { - values.removeValue(2); - require( - values.length == 0, - "Empty array should stay unchanged on attempt to remove value from it." - ); - } - - function runCanRemoveValueFromSingleElementArrayTest() public { - values = [2]; - values.removeValue(2); - require( - values.length == 0, - "Occurrence of a value in a single element array should be removed." - ); - } - - function runCanRemoveIdenticalValuesTest() public { - values = [2, 2, 2]; - values.removeValue(2); - require( - values.length == 0, - "All occurrences should be removed and array length should become 0." - ); - } - - function runCanRemoveValueTest() public { - bool exists = false; - values = [2, 1, 2, 2, 3, 2]; - - values.removeValue(2); - for (uint256 i = 0; i < values.length; i++) { - if (values[i] == 2) { - exists = true; - } - } - - require( - !exists, - "All occurrences of the value should be removed from the array." - ); - require(values.length == 2, "Array length should change accordingly."); - } -} diff --git a/solidity-v1/contracts/stubs/TestModUtils.sol b/solidity-v1/contracts/stubs/TestModUtils.sol deleted file mode 100644 index 0e83738abc..0000000000 --- a/solidity-v1/contracts/stubs/TestModUtils.sol +++ /dev/null @@ -1,298 +0,0 @@ -pragma solidity 0.5.17; - -import "../utils/ModUtils.sol"; - -contract TestModUtils { - using ModUtils for uint256; - - uint256[16] smallOddPrimes = [ - 3, - 5, - 7, - 11, - 13, - 17, - 19, - 23, - 29, - 31, - 37, - 41, - 43, - 47, - 53, - 59 - ]; - - function runModExponentTest() public { - uint256 a = 21; - // a simple test - require(a.modExp(2, 5) == 1, ""); - // test for overflow - (2 ^ 256 - 1) ^ 2 % alt_bn128_P - uint256 almostOverflow = (2**256 - 1); - uint256 result = - almostOverflow.modExp( - 2, - 21888242871839275222246405745257275088696311157297823662689037894645226208583 - ); - require( - result == - 12283109618583340521412061117291584720854994367414008739435419022702680857751, - "modExp() should not overflow" - ); - } - - int256[][] smallOddPrimesLegendre = [ - [int256(3), int256(0), int256(0)], - [int256(3), int256(1), int256(1)], - [int256(3), int256(2), int256(-1)], - [int256(5), int256(0), int256(0)], - [int256(5), int256(1), int256(1)], - [int256(5), int256(2), int256(-1)], - [int256(5), int256(3), int256(-1)], - [int256(5), int256(4), int256(1)], - [int256(7), int256(0), int256(0)], - [int256(7), int256(1), int256(1)], - [int256(7), int256(2), int256(1)], - [int256(7), int256(3), int256(-1)], - [int256(7), int256(4), int256(1)], - [int256(7), int256(5), int256(-1)], - [int256(7), int256(6), int256(-1)], - [int256(11), int256(0), int256(0)], - [int256(11), int256(1), int256(1)], - [int256(11), int256(2), int256(-1)], - [int256(11), int256(3), int256(1)], - [int256(11), int256(4), int256(1)], - [int256(11), int256(5), int256(1)], - [int256(11), int256(6), int256(-1)], - [int256(11), int256(7), int256(-1)], - [int256(11), int256(8), int256(-1)], - [int256(11), int256(9), int256(1)], - [int256(11), int256(10), int256(-1)], - [int256(13), int256(0), int256(0)], - [int256(13), int256(1), int256(1)], - [int256(13), int256(2), int256(-1)], - [int256(13), int256(3), int256(1)], - [int256(13), int256(4), int256(1)], - [int256(13), int256(5), int256(-1)], - [int256(13), int256(6), int256(-1)], - [int256(13), int256(7), int256(-1)], - [int256(13), int256(8), int256(-1)], - [int256(13), int256(9), int256(1)], - [int256(13), int256(10), int256(1)], - [int256(13), int256(11), int256(-1)], - [int256(13), int256(12), int256(1)], - [int256(17), int256(0), int256(0)], - [int256(17), int256(1), int256(1)], - [int256(17), int256(2), int256(1)], - [int256(17), int256(3), int256(-1)], - [int256(17), int256(4), int256(1)], - [int256(17), int256(5), int256(-1)], - [int256(17), int256(6), int256(-1)], - [int256(17), int256(7), int256(-1)], - [int256(17), int256(8), int256(1)], - [int256(17), int256(9), int256(1)] - ]; - - function runLegendreRangeTest() public { - uint256 i; - uint256 j; - int256 leg; - for (i = 0; i < smallOddPrimes.length; i++) { - for (j = 0; j < 50; j++) { - leg = ModUtils.legendre(j, smallOddPrimes[i]); - require( - leg == 0 || leg == 1 || leg == -1, - "legendre() should only return [-1, 0, 1]" - ); - } - } - } - - function runLegendreListTest() public { - uint256 i; - int256 leg; - - for (i = 0; i < smallOddPrimesLegendre.length; i++) { - leg = ModUtils.legendre( - uint256(smallOddPrimesLegendre[i][1]), - uint256(smallOddPrimesLegendre[i][0]) - ); - require( - leg == smallOddPrimesLegendre[i][2], - "legendre() result differed from list" - ); - } - } - - function runModSqrtOf0Test() public { - uint256 p; - uint256 i; - uint256 zero = 0; - - // a = 0 mod p - for (i = 0; i < smallOddPrimes.length; i++) { - p = smallOddPrimes[i]; - require(zero == zero.modSqrt(p), "0 mod p should always equal 0"); - } - } - - function runModSqrtMultipleOfPTest() public { - uint256 p; - uint256 pMult; - uint256 i; - uint256 j; - uint256 zero = 0; - - // a = 0 mod p - for (i = 0; i < smallOddPrimes.length; i++) { - p = smallOddPrimes[i]; - for (j = 0; j < 20; j++) { - pMult = p * i; - require( - zero == pMult.modSqrt(p), - "(n * p) mod p should always equal 0" - ); - } - } - } - - function runModSqrtAgainstListTest() public { - uint256 i; - uint256 a; - uint256 p; - uint256 root; - - uint8[3][30] memory smallOddPrimesResults = - [ - [3, 1, 1], - [5, 1, 1], - [5, 4, 3], - [7, 1, 1], - [7, 2, 4], - [7, 4, 2], - [11, 1, 1], - [11, 3, 5], - [11, 4, 9], - [11, 5, 4], - [11, 9, 3], - [13, 1, 1], - [13, 3, 9], - [13, 4, 11], - [13, 9, 3], - [13, 10, 7], - [13, 12, 8], - [17, 1, 1], - [17, 2, 6], - [17, 4, 2], - [17, 8, 12], - [17, 9, 14], - [17, 13, 8], - [17, 15, 7], - [17, 16, 4], - [19, 1, 1], - [19, 4, 17], - [19, 5, 9], - [19, 6, 5], - [19, 7, 11] - ]; - - for (i = 0; i < smallOddPrimesResults.length; i++) { - p = smallOddPrimesResults[i][0]; - a = smallOddPrimesResults[i][1]; - root = a.modSqrt(p); - - require( - root == smallOddPrimesResults[i][2], - "modSqrt() result differed from list" - ); - } - } - - function runModSqrtAgainstNonSquaresTest() public { - uint8 i; - uint256 a; - uint256 p; - uint256 root; - - uint8[3][23] memory smallOddPrimesResults = - [ - [3, 2, 0], - [5, 2, 0], - [5, 3, 0], - [7, 3, 0], - [7, 5, 0], - [7, 6, 0], - [11, 2, 0], - [11, 6, 0], - [11, 7, 0], - [11, 8, 0], - [13, 2, 0], - [13, 5, 0], - [13, 6, 0], - [13, 7, 0], - [13, 8, 0], - [13, 11, 0], - [17, 3, 0], - [17, 5, 0], - [17, 6, 0], - [17, 7, 0], - [17, 11, 0], - [17, 12, 0], - [17, 14, 0] - ]; - - for (i = 0; i < smallOddPrimesResults.length; i++) { - p = smallOddPrimesResults[i][0]; - a = smallOddPrimesResults[i][1]; - root = a.modSqrt(p); - - require( - root == smallOddPrimesResults[i][2], - "modSqrt() result differed from list" - ); - } - } - - function runModSqrtALessThanPTest() public { - uint256 p; - uint256 root; - uint256 i; - uint256 a; - - // a < p for small p - for (i = 0; i < smallOddPrimes.length; i++) { - p = smallOddPrimes[i]; - for (a = 1; a < p; a++) { - root = a.modSqrt(p); - if (root != 0) { - require( - a % p == (root * root) % p, - "Invalid modular square root for a < p" - ); - } - } - } - } - - function runModSqrtAGreaterThanPTest() public { - uint256 p; - uint256 root; - uint8 i; - uint256 a; - - // a > p for small p - for (i = 0; i < smallOddPrimes.length; i++) { - p = smallOddPrimes[i]; - for (a = p + 1; a < p + 10; a++) { - root = a.modSqrt(p); - if (root != 0) { - require( - a % p == (root * root) % p, - "Invalid modular square root for a > p" - ); - } - } - } - } -} diff --git a/solidity-v1/contracts/stubs/TestPhasedEscrowBeneficiaries.sol b/solidity-v1/contracts/stubs/TestPhasedEscrowBeneficiaries.sol deleted file mode 100644 index c60b33b4cf..0000000000 --- a/solidity-v1/contracts/stubs/TestPhasedEscrowBeneficiaries.sol +++ /dev/null @@ -1,55 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol"; - -// Simple beneficiary that does nothing when notified that it has received -// tokens. -contract TestSimpleBeneficiary { - function __escrowSentTokens(uint256 amount) external {} -} - -// CurveRewards contract mock for curvefi. -contract TestCurveRewards { - using SafeERC20 for IERC20; - - IERC20 public token; - - event RewardAdded(uint256 reward); - - constructor(IERC20 _token) public { - token = _token; - } - - function notifyRewardAmount(uint256 reward) external { - token.safeTransferFrom(msg.sender, address(this), reward); - emit RewardAdded(reward); - } -} - -// Simple reward contract mock for testing purposes. -contract TestSimpleStakerRewards { - using SafeERC20 for IERC20; - - IERC20 public token; - - constructor(IERC20 _token) public { - token = _token; - } - - function receiveApproval( - address _from, - uint256 _value, - address _token, - bytes memory - ) public { - token.safeTransferFrom(_from, address(this), _value); - } -} - -// Simple smart contract mock for testing purposes. -// Represents any contract receiving ERC20 tokens via plain transfer. -contract TestSimpleReceiver { - -} diff --git a/solidity-v1/contracts/stubs/TestToken.sol b/solidity-v1/contracts/stubs/TestToken.sol deleted file mode 100644 index d43459ef3b..0000000000 --- a/solidity-v1/contracts/stubs/TestToken.sol +++ /dev/null @@ -1,15 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol"; - -contract TestToken is ERC20 { - /// @dev Mints an amount of the token and assigns it to an account. - /// Uses the internal _mint function. Anyone can call - /// @param _account The account that will receive the created tokens. - /// @param _amount The amount of tokens that will be created. - function mint(address _account, uint256 _amount) public returns (bool) { - // NOTE: this is a public function with unchecked minting. - _mint(_account, _amount); - return true; - } -} diff --git a/solidity-v1/contracts/stubs/TokenStakingSlashingStub.sol b/solidity-v1/contracts/stubs/TokenStakingSlashingStub.sol deleted file mode 100644 index 02e527c9d3..0000000000 --- a/solidity-v1/contracts/stubs/TokenStakingSlashingStub.sol +++ /dev/null @@ -1,43 +0,0 @@ -pragma solidity 0.5.17; - -import "../TokenStaking.sol"; -import "../TokenGrant.sol"; -import "../KeepRegistry.sol"; - -contract TokenStakingSlashingStub is TokenStaking { - constructor( - ERC20Burnable _token, - TokenGrant _tokenGrant, - KeepRegistry _registry, - uint256 _initializationPeriod - ) - public - TokenStaking( - _token, - _tokenGrant, - _registry, - _initializationPeriod - ) - {} - - function slash(uint256 amountToSlash, address[] memory misbehavedOperators) - public - { - for (uint256 i = 0; i < misbehavedOperators.length; i++) { - address operator = misbehavedOperators[i]; - emit TokensSlashed(operator, 1 ether); - } - } - - function seize( - uint256 amountToSeize, - uint256 rewardMultiplier, - address tattletale, - address[] memory misbehavedOperators - ) public { - for (uint256 i = 0; i < misbehavedOperators.length; i++) { - address operator = misbehavedOperators[i]; - emit TokensSeized(operator, 1 ether); - } - } -} diff --git a/solidity-v1/contracts/stubs/TokenStakingStub.sol b/solidity-v1/contracts/stubs/TokenStakingStub.sol deleted file mode 100644 index edc814a028..0000000000 --- a/solidity-v1/contracts/stubs/TokenStakingStub.sol +++ /dev/null @@ -1,32 +0,0 @@ -pragma solidity 0.5.17; - -import "../TokenStaking.sol"; -import "../TokenGrant.sol"; -import "../KeepRegistry.sol"; - -/// @dev TokenStakingStub keeps the same minimum stake value of 100k KEEP for -/// all the time. This stub is used by tests for which we want to maintain the -/// same minimum stake value. MinimumStakeSchedule uses the time of deploying KEEP -/// token as the starting point of the minimum stake schedule. -/// Use this stub to keep it at the same, predictable level. Going back in time -/// in tests is not possible. -contract TokenStakingStub is TokenStaking { - constructor( - ERC20Burnable _token, - TokenGrant _tokenGrant, - KeepRegistry _registry, - uint256 _initializationPeriod - ) - public - TokenStaking( - _token, - _tokenGrant, - _registry, - _initializationPeriod - ) - {} - - function minimumStake() public view returns (uint256) { - return 100000 * 1e18; - } -} diff --git a/solidity-v1/contracts/token-distribution/TokenDistributor.sol b/solidity-v1/contracts/token-distribution/TokenDistributor.sol deleted file mode 100644 index 2a6b1159d5..0000000000 --- a/solidity-v1/contracts/token-distribution/TokenDistributor.sol +++ /dev/null @@ -1,258 +0,0 @@ -/** -▓▓▌ ▓▓ ▐▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓ ▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓ ▐▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▄▄▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▄▄▄▄ ▓▓▓▓▓▓▄▄▄▄ ▐▓▓▓▓▓▌ ▐▓▓▓▓▓▓ - ▓▓▓▓▓▓▓▓▓▓▓▓▓▀ ▐▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▌ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ - ▓▓▓▓▓▓▀▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓▀▀▀▀ ▓▓▓▓▓▓▀▀▀▀ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▀ - ▓▓▓▓▓▓ ▀▓▓▓▓▓▓▄ ▐▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▐▓▓▓▓▓▌ -▓▓▓▓▓▓▓▓▓▓ █▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ -▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ ▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓ - - Trust math, not hardware. -*/ - -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol"; -import "openzeppelin-solidity/contracts/cryptography/MerkleProof.sol"; - -/// @title Token Distributor -/// @notice This contract can be used to distribute ERC20 tokens with a merkle -/// tree distribution mechanism in a cross-chain environment. -/// An owner of the contract has to calculate a merkle tree for tokens assignments -/// based on a mapping of a recipient addresses with the assigned tokens amount. -/// Next the owner allocates the total amount of tokens in the contract by calling -/// allocate function with the calculated merkle tree root. The owner has also -/// a possibility to define a period after which unclaimed tokens will be allowed -/// to recover by the owner. Once tokens allocation is made recipients can call -/// claim function to withdraw tokens to any destination address. The destination -/// address should be signed by the recipient prior to calling the function and -/// the signature should be provided on claim. For details of the signature see -/// claim function documentation. -/// Signing of destination addresses is implemented to allow cross-chain tokens -/// distribution. It covers a situation when recipient receives a tokens assignment -/// based on their address on some chain (A), and operates under a different address -/// on another chain (B) where tokens distribution takes place (e.g. a recipient -/// is as a multi-sig wallet on chain A and receives tokens assignment on chain B, -/// they have to sign an address on chain B they control with a signature calculated -/// with a private key controlling the address on chain A). -/// @dev This contract is based on the Uniswap's Merkle Distributor -/// https://github.com/Uniswap/merkle-distributor with some modifications: -/// - added 'allocate' function that will be called to allocate tokens for a -/// merkle root, -/// - added a possibility for a recipient to redirect tokens withdrawal to another -/// address by providing a signature over that address, -/// - added a possibility for the owner to recover unclaimed tokens after the -/// unclaimed unlock duration that is configurable on tokens allocation. -contract TokenDistributor is Ownable { - using SafeERC20 for IERC20; - - // Distributed token. - IERC20 public token; - - // Merkle tree root. - bytes32 public merkleRoot; - - // Timestamp after which allocated and unclaimed tokens can be recovered from - // the contract by the owner. If the value is zero the recovery is not possible. - uint256 public unclaimedUnlockTimestamp; - - mapping(uint256 => uint256) private claimedBitMap; - - event TokensAllocated( - bytes32 merkleRoot, - uint256 amount, - uint256 unclaimedUnlockTimestamp - ); - - event TokensClaimed( - uint256 indexed index, - address indexed recipient, - address indexed destination, - uint256 amount - ); - - event TokensRecovered(address destination, uint256 amount); - - constructor(IERC20 _token) public { - token = _token; - } - - /// @notice Claim assigned tokens. The function can be used to withdraw tokens - /// assigned to the recipient in the merkle tree distribution. The caller has - /// to provide merkle data: recipient address, index, amount, and merkle proof. - /// Anyone can call this function. The function requires a destination address - /// for a transfer to be provided. The destination address should be signed - /// by the recipient. To construct the message to signing recipient has to - /// hash this contract address and destination address with keccak256 and - /// prefix the obtained digest with Ethereum specific `\x19Ethereum Signed Message:\n32`. - /// When using web3's signing function the prefixing is done automatically, - /// so the signing operation can look like: - /// `sign(soliditySha3(tokenDistributor, destination), privateKey)`. - /// The signature should be provided with the call to this function. This is - /// to confirm that the recipient approved the destination address for a transfer. - /// The solution allows cross-chain allocations, where a recipient from a - /// different chain does not operate under the same address on the chain - /// where the tokens were allocated, (e.g. recipient is a wallet) - /// @dev Due to the malleability concern described in EIP-2, the function expects - /// s values in the lower half of the secp256k1 curve's order and v value of - /// 27 or 28. - /// @param _recipient Address that received tokens assignment. - /// @param _destination Address to send tokens to. - /// @param _v Destination address signature's v parameter. - /// @param _r Destination address signature's r parameter. - /// @param _s Destination address signature's s parameter. - /// @param _index Merkle index. - /// @param _amount Assigned tokens amount. - /// @param _merkleProof Merkle proof. - function claim( - address _recipient, - address _destination, - uint8 _v, - bytes32 _r, - bytes32 _s, - uint256 _index, - uint256 _amount, - bytes32[] calldata _merkleProof - ) external { - require(_recipient != address(0), "recipient address cannot be zero"); - require( - _destination != address(0), - "destination address cannot be zero" - ); - require(merkleRoot != "", "tokens were not allocated yet"); - require(!isClaimed(_index), "tokens already claimed"); - - // Verify the signature over destination address. - require( - _recipient == recoverSignerAddress(_destination, _v, _r, _s), - "invalid signature of destination address" - ); - - // Verify the merkle proof. - bytes32 node = keccak256(abi.encodePacked(_index, _recipient, _amount)); - require( - MerkleProof.verify(_merkleProof, merkleRoot, node), - "invalid proof" - ); - - // Mark it claimed and send the token. - setClaimed(_index); - - token.safeTransfer(_destination, _amount); - - emit TokensClaimed(_index, _recipient, _destination, _amount); - } - - /// Allocates amount of tokens for the merkle root. - /// @param _merkleRoot The merkle root. - /// @param _amount The amount of tokens allocated for the merkle root. - /// @param _unclaimedUnlockDurationSec Duration of a period (in seconds) - /// after which unclaimed tokens can be recovered from the contract. If the - /// value is zero the recovery won't be allowed. - function allocate( - bytes32 _merkleRoot, - uint256 _amount, - uint256 _unclaimedUnlockDurationSec - ) public onlyOwner { - require(merkleRoot == "", "tokens were already allocated"); - require(_merkleRoot != "", "merkle root cannot be empty"); - require(_amount > 0, "amount has to be greater than zero"); - - token.safeTransferFrom(msg.sender, address(this), _amount); - - merkleRoot = _merkleRoot; - - // If unclaimed unlock duration was provided calculate timestamp after - // which unclaimed tokens will be recoverable. If the duration is set to - // zero the tokens won't be recoverable. - if (_unclaimedUnlockDurationSec > 0) { - unclaimedUnlockTimestamp = - /* solium-disable-next-line security/no-block-members */ - block.timestamp + - _unclaimedUnlockDurationSec; - } - - emit TokensAllocated(_merkleRoot, _amount, unclaimedUnlockTimestamp); - } - - /// @notice Withdraws unclaimed tokens to the destination address. The function - /// can be called only by the contract owner. Tokens are recoverable after - /// unlock duration defined on tokens allocation. - /// @param _destination Address to send tokens to. - function recoverUnclaimed(address _destination) public onlyOwner { - require( - _destination != address(0), - "destination address cannot be zero" - ); - require(unclaimedUnlockTimestamp > 0, "token recovery is not allowed"); - require( - /* solium-disable-next-line security/no-block-members */ - unclaimedUnlockTimestamp <= block.timestamp, - "token recovery is not possible yet" - ); - - uint256 amount = token.balanceOf(address(this)); - token.safeTransfer(_destination, amount); - - emit TokensRecovered(_destination, amount); - } - - /// @notice Checks if tokens were claimed for the given merkle index. - /// @param _index Merkle index. - /// @return True is tokens were claimed, false otherwise. - function isClaimed(uint256 _index) public view returns (bool) { - uint256 claimedWordIndex = _index / 256; - uint256 claimedBitIndex = _index % 256; - uint256 claimedWord = claimedBitMap[claimedWordIndex]; - uint256 mask = (1 << claimedBitIndex); - return claimedWord & mask == mask; - } - - /// @notice Recovers signer's address from a signature and destination address. - /// @dev Destination address is a part of a message that should be signed. - /// To construct the message one has to hash this contract address along with - /// destination address with keccak256 and prefix the obtained digest with - /// Ethereum specific `\x19Ethereum Signed Message:\n32`. - /// Due to the malleability concern described in EIP-2, the function expects - /// s values in the lower half of the secp256k1 curve's order and v value of - /// 27 or 28. - function recoverSignerAddress( - address _destination, - uint8 _v, - bytes32 _r, - bytes32 _s - ) internal view returns (address) { - // Validate `s` and `v` values for a malleability concern described in EIP-2. - // Only signatures with `s` value in the lower half of the secp256k1 - // curve's order and `v` value of 27 or 28 are considered valid. - require( - uint256(_s) <= - 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, - "Invalid signature 's' value" - ); - require(_v == 27 || _v == 28, "Invalid signature 'v' value"); - - bytes32 digest = - keccak256(abi.encodePacked(address(this), _destination)); - bytes32 prefixedDigest = - keccak256( - abi.encodePacked("\x19Ethereum Signed Message:\n32", digest) - ); - - return ecrecover(prefixedDigest, _v, _r, _s); - } - - /// @notice Marks the given merkle index as claimed. - /// @param _index Merkle index. - function setClaimed(uint256 _index) private { - uint256 claimedWordIndex = _index / 256; - uint256 claimedBitIndex = _index % 256; - claimedBitMap[claimedWordIndex] = - claimedBitMap[claimedWordIndex] | - (1 << claimedBitIndex); - } -} diff --git a/solidity-v1/contracts/utils/AddressArrayUtils.sol b/solidity-v1/contracts/utils/AddressArrayUtils.sol deleted file mode 100644 index 8a0c59e99c..0000000000 --- a/solidity-v1/contracts/utils/AddressArrayUtils.sol +++ /dev/null @@ -1,34 +0,0 @@ -pragma solidity 0.5.17; - -library AddressArrayUtils { - function contains(address[] memory self, address _address) - internal - pure - returns (bool) - { - for (uint256 i = 0; i < self.length; i++) { - if (_address == self[i]) { - return true; - } - } - return false; - } - - function removeAddress(address[] storage self, address _addressToRemove) - internal - returns (address[] storage) - { - for (uint256 i = 0; i < self.length; i++) { - // If address is found in array. - if (_addressToRemove == self[i]) { - // Delete element at index and shift array. - for (uint256 j = i; j < self.length - 1; j++) { - self[j] = self[j + 1]; - } - self.length--; - i--; - } - } - return self; - } -} diff --git a/solidity-v1/contracts/utils/BytesLib.sol b/solidity-v1/contracts/utils/BytesLib.sol deleted file mode 100644 index 15afc3c71a..0000000000 --- a/solidity-v1/contracts/utils/BytesLib.sol +++ /dev/null @@ -1,491 +0,0 @@ -pragma solidity 0.5.17; - -/* -Verison pulled from https://github.com/summa-tx/bitcoin-spv/blob/2535e4edaeaac4b2b095903fce684ae1c05761bc/solidity/contracts/BytesLib.sol -*/ - -/* -https://github.com/GNSPS/solidity-bytes-utils/ -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. -For more information, please refer to -*/ - -/** @title BytesLib **/ -/** @author https://github.com/GNSPS **/ - -library BytesLib { - function concat(bytes memory _preBytes, bytes memory _postBytes) - internal - pure - returns (bytes memory) - { - bytes memory tempBytes; - - assembly { - // Get a location of some free memory and store it in tempBytes as - // Solidity does for memory variables. - tempBytes := mload(0x40) - - // Store the length of the first bytes array at the beginning of - // the memory for tempBytes. - let length := mload(_preBytes) - mstore(tempBytes, length) - - // Maintain a memory counter for the current write location in the - // temp bytes array by adding the 32 bytes for the array length to - // the starting location. - let mc := add(tempBytes, 0x20) - // Stop copying when the memory counter reaches the length of the - // first bytes array. - let end := add(mc, length) - - for { - // Initialize a copy counter to the start of the _preBytes data, - // 32 bytes into its memory. - let cc := add(_preBytes, 0x20) - } lt(mc, end) { - // Increase both counters by 32 bytes each iteration. - mc := add(mc, 0x20) - cc := add(cc, 0x20) - } { - // Write the _preBytes data into the tempBytes memory 32 bytes - // at a time. - mstore(mc, mload(cc)) - } - - // Add the length of _postBytes to the current length of tempBytes - // and store it as the new length in the first 32 bytes of the - // tempBytes memory. - length := mload(_postBytes) - mstore(tempBytes, add(length, mload(tempBytes))) - - // Move the memory counter back from a multiple of 0x20 to the - // actual end of the _preBytes data. - mc := end - // Stop copying when the memory counter reaches the new combined - // length of the arrays. - end := add(mc, length) - - for { - let cc := add(_postBytes, 0x20) - } lt(mc, end) { - mc := add(mc, 0x20) - cc := add(cc, 0x20) - } { - mstore(mc, mload(cc)) - } - - // Update the free-memory pointer by padding our last write location - // to 32 bytes: add 31 bytes to the end of tempBytes to move to the - // next 32 byte block, then round down to the nearest multiple of - // 32. If the sum of the length of the two arrays is zero then add - // one before rounding down to leave a blank 32 bytes (the length block with 0). - mstore( - 0x40, - and( - add(add(end, iszero(add(length, mload(_preBytes)))), 31), - not(31) // Round down to the nearest 32 bytes. - ) - ) - } - - return tempBytes; - } - - function concatStorage(bytes storage _preBytes, bytes memory _postBytes) - internal - { - assembly { - // Read the first 32 bytes of _preBytes storage, which is the length - // of the array. (We don't need to use the offset into the slot - // because arrays use the entire slot.) - let fslot := sload(_preBytes_slot) - // Arrays of 31 bytes or less have an even value in their slot, - // while longer arrays have an odd value. The actual length is - // the slot divided by two for odd values, and the lowest order - // byte divided by two for even values. - // If the slot is even, bitwise and the slot with 255 and divide by - // two to get the length. If the slot is odd, bitwise and the slot - // with -1 and divide by two. - let slength := div( - and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), - 2 - ) - let mlength := mload(_postBytes) - let newlength := add(slength, mlength) - // slength can contain both the length and contents of the array - // if length < 32 bytes so let's prepare for that - // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage - switch add(lt(slength, 32), lt(newlength, 32)) - case 2 { - // Since the new array still fits in the slot, we just need to - // update the contents of the slot. - // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length - sstore( - _preBytes_slot, - // all the modifications to the slot are inside this - // next block - add( - // we can just add to the slot contents because the - // bytes we want to change are the LSBs - fslot, - add( - mul( - div( - // load the bytes from memory - mload(add(_postBytes, 0x20)), - // zero all bytes to the right - exp(0x100, sub(32, mlength)) - ), - // and now shift left the number of bytes to - // leave space for the length in the slot - exp(0x100, sub(32, newlength)) - ), - // increase length by the double of the memory - // bytes length - mul(mlength, 2) - ) - ) - ) - } - case 1 { - // The stored value fits in the slot, but the combined value - // will exceed it. - // get the keccak hash to get the contents of the array - mstore(0x0, _preBytes_slot) - let sc := add(keccak256(0x0, 0x20), div(slength, 32)) - - // save new length - sstore(_preBytes_slot, add(mul(newlength, 2), 1)) - - // The contents of the _postBytes array start 32 bytes into - // the structure. Our first read should obtain the `submod` - // bytes that can fit into the unused space in the last word - // of the stored array. To get this, we read 32 bytes starting - // from `submod`, so the data we read overlaps with the array - // contents by `submod` bytes. Masking the lowest-order - // `submod` bytes allows us to add that value directly to the - // stored value. - - let submod := sub(32, slength) - let mc := add(_postBytes, submod) - let end := add(_postBytes, mlength) - let mask := sub(exp(0x100, submod), 1) - - sstore( - sc, - add( - and( - fslot, - 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 - ), - and(mload(mc), mask) - ) - ) - - for { - mc := add(mc, 0x20) - sc := add(sc, 1) - } lt(mc, end) { - sc := add(sc, 1) - mc := add(mc, 0x20) - } { - sstore(sc, mload(mc)) - } - - mask := exp(0x100, sub(mc, end)) - - sstore(sc, mul(div(mload(mc), mask), mask)) - } - default { - // get the keccak hash to get the contents of the array - mstore(0x0, _preBytes_slot) - // Start copying to the last used word of the stored array. - let sc := add(keccak256(0x0, 0x20), div(slength, 32)) - - // save new length - sstore(_preBytes_slot, add(mul(newlength, 2), 1)) - - // Copy over the first `submod` bytes of the new data as in - // case 1 above. - let slengthmod := mod(slength, 32) - let mlengthmod := mod(mlength, 32) - let submod := sub(32, slengthmod) - let mc := add(_postBytes, submod) - let end := add(_postBytes, mlength) - let mask := sub(exp(0x100, submod), 1) - - sstore(sc, add(sload(sc), and(mload(mc), mask))) - - for { - sc := add(sc, 1) - mc := add(mc, 0x20) - } lt(mc, end) { - sc := add(sc, 1) - mc := add(mc, 0x20) - } { - sstore(sc, mload(mc)) - } - - mask := exp(0x100, sub(mc, end)) - - sstore(sc, mul(div(mload(mc), mask), mask)) - } - } - } - - function slice( - bytes memory _bytes, - uint256 _start, - uint256 _length - ) internal pure returns (bytes memory res) { - uint256 _end = _start + _length; - require(_end > _start && _bytes.length >= _end, "Slice out of bounds"); - - assembly { - // Alloc bytes array with additional 32 bytes afterspace and assign it's size - res := mload(0x40) - mstore(0x40, add(add(res, 64), _length)) - mstore(res, _length) - - // Compute distance between source and destination pointers - let diff := sub(res, add(_bytes, _start)) - - for { - let src := add(add(_bytes, 32), _start) - let end := add(src, _length) - } lt(src, end) { - src := add(src, 32) - } { - mstore(add(src, diff), mload(src)) - } - } - } - - function toAddress(bytes memory _bytes, uint256 _start) - internal - pure - returns (address) - { - uint256 _totalLen = _start + 20; - require( - _totalLen > _start && _bytes.length >= _totalLen, - "Address conversion out of bounds." - ); - address tempAddress; - - assembly { - tempAddress := div( - mload(add(add(_bytes, 0x20), _start)), - 0x1000000000000000000000000 - ) - } - - return tempAddress; - } - - function toUint8(bytes memory _bytes, uint256 _start) - internal - pure - returns (uint8) - { - require( - _bytes.length >= (_start + 1), - "Uint8 conversion out of bounds." - ); - uint8 tempUint; - - assembly { - tempUint := mload(add(add(_bytes, 0x1), _start)) - } - - return tempUint; - } - - function toUint(bytes memory _bytes, uint256 _start) - internal - pure - returns (uint256) - { - uint256 _totalLen = _start + 32; - require( - _totalLen > _start && _bytes.length >= _totalLen, - "Uint conversion out of bounds." - ); - uint256 tempUint; - - assembly { - tempUint := mload(add(add(_bytes, 0x20), _start)) - } - - return tempUint; - } - - function equal(bytes memory _preBytes, bytes memory _postBytes) - internal - pure - returns (bool) - { - bool success = true; - - assembly { - let length := mload(_preBytes) - - // if lengths don't match the arrays are not equal - switch eq(length, mload(_postBytes)) - case 1 { - // cb is a circuit breaker in the for loop since there's - // no said feature for inline assembly loops - // cb = 1 - don't breaker - // cb = 0 - break - let cb := 1 - - let mc := add(_preBytes, 0x20) - let end := add(mc, length) - - for { - let cc := add(_postBytes, 0x20) - // the next line is the loop condition: - // while(uint(mc < end) + cb == 2) - } eq(add(lt(mc, end), cb), 2) { - mc := add(mc, 0x20) - cc := add(cc, 0x20) - } { - // if any of these checks fails then arrays are not equal - if iszero(eq(mload(mc), mload(cc))) { - // unsuccess: - success := 0 - cb := 0 - } - } - } - default { - // unsuccess: - success := 0 - } - } - - return success; - } - - function equalStorage(bytes storage _preBytes, bytes memory _postBytes) - internal - view - returns (bool) - { - bool success = true; - - assembly { - // we know _preBytes_offset is 0 - let fslot := sload(_preBytes_slot) - // Decode the length of the stored array like in concatStorage(). - let slength := div( - and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), - 2 - ) - let mlength := mload(_postBytes) - - // if lengths don't match the arrays are not equal - switch eq(slength, mlength) - case 1 { - // slength can contain both the length and contents of the array - // if length < 32 bytes so let's prepare for that - // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage - if iszero(iszero(slength)) { - switch lt(slength, 32) - case 1 { - // blank the last byte which is the length - fslot := mul(div(fslot, 0x100), 0x100) - - if iszero( - eq(fslot, mload(add(_postBytes, 0x20))) - ) { - // unsuccess: - success := 0 - } - } - default { - // cb is a circuit breaker in the for loop since there's - // no said feature for inline assembly loops - // cb = 1 - don't breaker - // cb = 0 - break - let cb := 1 - - // get the keccak hash to get the contents of the array - mstore(0x0, _preBytes_slot) - let sc := keccak256(0x0, 0x20) - - let mc := add(_postBytes, 0x20) - let end := add(mc, mlength) - - // the next line is the loop condition: - // while(uint(mc < end) + cb == 2) - for { - - } eq(add(lt(mc, end), cb), 2) { - sc := add(sc, 1) - mc := add(mc, 0x20) - } { - if iszero(eq(sload(sc), mload(mc))) { - // unsuccess: - success := 0 - cb := 0 - } - } - } - } - } - default { - // unsuccess: - success := 0 - } - } - - return success; - } - - function toBytes32(bytes memory _source) - internal - pure - returns (bytes32 result) - { - if (_source.length == 0) { - return 0x0; - } - - assembly { - result := mload(add(_source, 32)) - } - } - - function keccak256Slice( - bytes memory _bytes, - uint256 _start, - uint256 _length - ) internal pure returns (bytes32 result) { - uint256 _end = _start + _length; - require(_end > _start && _bytes.length >= _end, "Slice out of bounds"); - - assembly { - result := keccak256(add(add(_bytes, 32), _start), _length) - } - } -} diff --git a/solidity-v1/contracts/utils/ModUtils.sol b/solidity-v1/contracts/utils/ModUtils.sol deleted file mode 100644 index 5cda1c5d90..0000000000 --- a/solidity-v1/contracts/utils/ModUtils.sol +++ /dev/null @@ -1,114 +0,0 @@ -pragma solidity 0.5.17; - -library ModUtils { - /** - * @dev Wrap the modular exponent pre-compile introduced in Byzantium. - * Returns base^exponent mod p. - */ - function modExp( - uint256 base, - uint256 exponent, - uint256 p - ) internal view returns (uint256 o) { - /* solium-disable-next-line */ - assembly { - // Args for the precompile: [ - // ] - let output := mload(0x40) - let args := add(output, 0x20) - mstore(args, 0x20) - mstore(add(args, 0x20), 0x20) - mstore(add(args, 0x40), 0x20) - mstore(add(args, 0x60), base) - mstore(add(args, 0x80), exponent) - mstore(add(args, 0xa0), p) - - // 0x05 is the modular exponent contract address - if iszero(staticcall(not(0), 0x05, args, 0xc0, output, 0x20)) { - revert(0, 0) - } - o := mload(output) - } - } - - /** - * @dev Calculates and returns the square root of a mod p if such a square - * root exists. The modulus p must be an odd prime. If a square root does - * not exist, function returns 0. - */ - function modSqrt(uint256 a, uint256 p) internal view returns (uint256) { - if (legendre(a, p) != 1) { - return 0; - } - - if (a == 0) { - return 0; - } - - if (p % 4 == 3) { - return modExp(a, (p + 1) / 4, p); - } - - uint256 s = p - 1; - uint256 e = 0; - - while (s % 2 == 0) { - s = s / 2; - e = e + 1; - } - - // Note the smaller int- finding n with Legendre symbol or -1 - // should be quick - uint256 n = 2; - while (legendre(n, p) != -1) { - n = n + 1; - } - - uint256 x = modExp(a, (s + 1) / 2, p); - uint256 b = modExp(a, s, p); - uint256 g = modExp(n, s, p); - uint256 r = e; - uint256 gs = 0; - uint256 m = 0; - uint256 t = b; - - while (true) { - t = b; - m = 0; - - for (m = 0; m < r; m++) { - if (t == 1) { - break; - } - t = modExp(t, 2, p); - } - - if (m == 0) { - return x; - } - - gs = modExp(g, uint256(2)**(r - m - 1), p); - g = (gs * gs) % p; - x = (x * gs) % p; - b = (b * g) % p; - r = m; - } - } - - /** - * @dev Calculates the Legendre symbol of the given a mod p. - * @return Returns 1 if a is a quadratic residue mod p, -1 if it is - * a non-quadratic residue, and 0 if a is 0. - */ - function legendre(uint256 a, uint256 p) internal view returns (int256) { - uint256 raised = modExp(a, (p - 1) / uint256(2), p); - - if (raised == 0 || raised == 1) { - return int256(raised); - } else if (raised == p - 1) { - return -1; - } - - require(false, "Failed to calculate legendre."); - } -} diff --git a/solidity-v1/contracts/utils/OperatorParams.sol b/solidity-v1/contracts/utils/OperatorParams.sol deleted file mode 100644 index e5dcf8eff2..0000000000 --- a/solidity-v1/contracts/utils/OperatorParams.sol +++ /dev/null @@ -1,134 +0,0 @@ -pragma solidity 0.5.17; - -library OperatorParams { - // OperatorParams packs values that are commonly used together - // into a single uint256 to reduce the cost functions - // like querying eligibility. - // - // An OperatorParams uint256 contains: - // - the operator's staked token amount (uint128) - // - the operator's creation timestamp (uint64) - // - the operator's undelegation timestamp (uint64) - // - // These are packed as [amount | createdAt | undelegatedAt] - // - // Staked KEEP is stored in an uint128, - // which is sufficient because KEEP tokens have 18 decimals (2^60) - // and there will be at most 10^9 KEEP in existence (2^30). - // - // Creation and undelegation times are stored in an uint64 each. - // Thus uint64s would be sufficient for around 3*10^11 years. - uint256 constant TIMESTAMP_WIDTH = 64; - uint256 constant AMOUNT_WIDTH = 128; - - uint256 constant TIMESTAMP_MAX = (2**TIMESTAMP_WIDTH) - 1; - uint256 constant AMOUNT_MAX = (2**AMOUNT_WIDTH) - 1; - - uint256 constant CREATION_SHIFT = TIMESTAMP_WIDTH; - uint256 constant AMOUNT_SHIFT = 2 * TIMESTAMP_WIDTH; - - function pack( - uint256 amount, - uint256 createdAt, - uint256 undelegatedAt - ) internal pure returns (uint256) { - // Check for staked amount overflow. - // We shouldn't actually ever need this. - require(amount <= AMOUNT_MAX, "uint128 overflow"); - // Bitwise OR the timestamps together. - // The resulting number is equal or greater than either, - // and tells if we have a bit set outside the 64 available bits. - require( - (createdAt | undelegatedAt) <= TIMESTAMP_MAX, - "uint64 overflow" - ); - - return ((amount << AMOUNT_SHIFT) | - (createdAt << CREATION_SHIFT) | - undelegatedAt); - } - - function unpack(uint256 packedParams) - internal - pure - returns ( - uint256 amount, - uint256 createdAt, - uint256 undelegatedAt - ) - { - amount = getAmount(packedParams); - createdAt = getCreationTimestamp(packedParams); - undelegatedAt = getUndelegationTimestamp(packedParams); - } - - function getAmount(uint256 packedParams) internal pure returns (uint256) { - return (packedParams >> AMOUNT_SHIFT) & AMOUNT_MAX; - } - - function setAmount(uint256 packedParams, uint256 amount) - internal - pure - returns (uint256) - { - return - pack( - amount, - getCreationTimestamp(packedParams), - getUndelegationTimestamp(packedParams) - ); - } - - function getCreationTimestamp(uint256 packedParams) - internal - pure - returns (uint256) - { - return (packedParams >> CREATION_SHIFT) & TIMESTAMP_MAX; - } - - function setCreationTimestamp( - uint256 packedParams, - uint256 creationTimestamp - ) internal pure returns (uint256) { - return - pack( - getAmount(packedParams), - creationTimestamp, - getUndelegationTimestamp(packedParams) - ); - } - - function getUndelegationTimestamp(uint256 packedParams) - internal - pure - returns (uint256) - { - return packedParams & TIMESTAMP_MAX; - } - - function setUndelegationTimestamp( - uint256 packedParams, - uint256 undelegationTimestamp - ) internal pure returns (uint256) { - return - pack( - getAmount(packedParams), - getCreationTimestamp(packedParams), - undelegationTimestamp - ); - } - - function setAmountAndCreationTimestamp( - uint256 packedParams, - uint256 amount, - uint256 creationTimestamp - ) internal pure returns (uint256) { - return - pack( - amount, - creationTimestamp, - getUndelegationTimestamp(packedParams) - ); - } -} diff --git a/solidity-v1/contracts/utils/PercentUtils.sol b/solidity-v1/contracts/utils/PercentUtils.sol deleted file mode 100644 index cd59c2c923..0000000000 --- a/solidity-v1/contracts/utils/PercentUtils.sol +++ /dev/null @@ -1,20 +0,0 @@ -pragma solidity 0.5.17; - -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; - -library PercentUtils { - using SafeMath for uint256; - - // Return `b`% of `a` - // 200.percent(40) == 80 - // Commutative, works both ways - function percent(uint256 a, uint256 b) internal pure returns (uint256) { - return a.mul(b).div(100); - } - - // Return `a` as percentage of `b`: - // 80.asPercentOf(200) == 40 - function asPercentOf(uint256 a, uint256 b) internal pure returns (uint256) { - return a.mul(100).div(b); - } -} diff --git a/solidity-v1/contracts/utils/UintArrayUtils.sol b/solidity-v1/contracts/utils/UintArrayUtils.sol deleted file mode 100644 index 2289748b96..0000000000 --- a/solidity-v1/contracts/utils/UintArrayUtils.sol +++ /dev/null @@ -1,21 +0,0 @@ -pragma solidity 0.5.17; - -library UintArrayUtils { - function removeValue(uint256[] storage self, uint256 _value) - internal - returns (uint256[] storage) - { - for (uint256 i = 0; i < self.length; i++) { - // If value is found in array. - if (_value == self[i]) { - // Delete element at index and shift array. - for (uint256 j = i; j < self.length - 1; j++) { - self[j] = self[j + 1]; - } - self.length--; - i--; - } - } - return self; - } -} diff --git a/solidity-v1/migrations/1_initial_migration.js b/solidity-v1/migrations/1_initial_migration.js deleted file mode 100644 index d320512ef2..0000000000 --- a/solidity-v1/migrations/1_initial_migration.js +++ /dev/null @@ -1,5 +0,0 @@ -const Migrations = artifacts.require("./Migrations.sol") - -module.exports = function (deployer) { - deployer.deploy(Migrations) -} diff --git a/solidity-v1/migrations/2_deploy_contracts.js b/solidity-v1/migrations/2_deploy_contracts.js deleted file mode 100644 index dd1dd6630d..0000000000 --- a/solidity-v1/migrations/2_deploy_contracts.js +++ /dev/null @@ -1,184 +0,0 @@ -const KeepToken = artifacts.require("./KeepToken.sol") -const ModUtils = artifacts.require("./utils/ModUtils.sol") -const AltBn128 = artifacts.require("./cryptography/AltBn128.sol") -const BLS = artifacts.require("./cryptography/BLS.sol") -const MinimumStakeSchedule = artifacts.require( - "./libraries/staking/MinimumStakeSchedule.sol" -) -const GrantStaking = artifacts.require("./libraries/staking/GrantStaking.sol") -const Locks = artifacts.require("./libraries/staking/Locks.sol") -const TopUps = artifacts.require("./libraries/staking/TopUps.sol") -const TokenStaking = artifacts.require("./TokenStaking.sol") -const PermissiveStakingPolicy = artifacts.require( - "./PermissiveStakingPolicy.sol" -) -const GuaranteedMinimumStakingPolicy = artifacts.require( - "./GuaranteedMinimumStakingPolicy.sol" -) -const TokenGrant = artifacts.require("./TokenGrant.sol") -const ManagedGrantFactory = artifacts.require("./ManagedGrantFactory.sol") -const KeepRandomBeaconService = artifacts.require( - "./KeepRandomBeaconService.sol" -) -const KeepRandomBeaconServiceImplV1 = artifacts.require( - "./KeepRandomBeaconServiceImplV1.sol" -) -const KeepRandomBeaconOperator = artifacts.require( - "./KeepRandomBeaconOperator.sol" -) -const KeepRandomBeaconOperatorStatistics = artifacts.require( - "./statistics/KeepRandomBeaconOperatorStatistics.sol" -) -const GroupSelection = artifacts.require( - "./libraries/operator/GroupSelection.sol" -) -const Groups = artifacts.require("./libraries/operator/Groups.sol") -const DKGResultVerification = artifacts.require( - "./libraries/operator/DKGResultVerification.sol" -) -const Reimbursements = artifacts.require( - "./libraries/operator/Reimbursements.sol" -) -const DelayFactor = artifacts.require("./libraries/operator/DelayFactor.sol") -const KeepRegistry = artifacts.require("./KeepRegistry.sol") -const GasPriceOracle = artifacts.require("./GasPriceOracle.sol") -const StakingPortBacker = artifacts.require("./StakingPortBacker.sol") -const BeaconRewards = artifacts.require("./BeaconRewards.sol") -const KeepVault = artifacts.require("./geyser/KeepVault.sol") - -let initializationPeriod = 43200 // ~12 hours -const dkgContributionMargin = 1 // 1% -const testNetworks = [ - "local", - "ropsten", - "keep_dev", - "alfajores", - "goerli", - "sepolia", -] - -module.exports = async function (deployer, network) { - // Set the stake initialization period to 1 block for local development and testnet. - if (testNetworks.includes(network)) { - initializationPeriod = 1 - } - - await deployer.deploy(ModUtils) - await deployer.link(ModUtils, AltBn128) - await deployer.deploy(AltBn128) - await deployer.link(AltBn128, BLS) - await deployer.deploy(BLS) - await deployer.deploy(KeepToken) - await deployer.deploy(TokenGrant, KeepToken.address) - await deployer.deploy(KeepRegistry) - await deployer.deploy(MinimumStakeSchedule) - await deployer.deploy(GrantStaking) - await deployer.deploy(Locks) - await deployer.deploy(TopUps) - await deployer.link(MinimumStakeSchedule, TokenStaking) - await deployer.link(GrantStaking, TokenStaking) - await deployer.link(Locks, TokenStaking) - await deployer.link(TopUps, TokenStaking) - await deployer.deploy( - TokenStaking, - KeepToken.address, - TokenGrant.address, - KeepRegistry.address, - initializationPeriod - ) - - let oldStakingContractAddress - if (testNetworks.includes(network)) { - const OldTokenStaking = artifacts.require("./stubs/OldTokenStaking.sol") - await deployer.link(MinimumStakeSchedule, OldTokenStaking) - await deployer.link(GrantStaking, OldTokenStaking) - await deployer.link(Locks, OldTokenStaking) - await deployer.link(TopUps, OldTokenStaking) - await deployer.deploy(OldTokenStaking, KeepToken.address) - oldStakingContractAddress = OldTokenStaking.address - - console.log( - `Deploying StakingPortBacker using old TokenStaking[${oldStakingContractAddress}]` - ) - await deployer.deploy( - StakingPortBacker, - KeepToken.address, - TokenGrant.address, - oldStakingContractAddress, - TokenStaking.address - ) - } - - await deployer.deploy(PermissiveStakingPolicy) - await deployer.deploy(GuaranteedMinimumStakingPolicy, TokenStaking.address) - await deployer.deploy( - ManagedGrantFactory, - KeepToken.address, - TokenGrant.address - ) - await deployer.deploy(GasPriceOracle) - await deployer.deploy(GroupSelection) - await deployer.link(GroupSelection, KeepRandomBeaconOperator) - await deployer.link(BLS, Groups) - await deployer.deploy(Groups) - await deployer.link(Groups, KeepRandomBeaconOperator) - await deployer.deploy(DKGResultVerification) - await deployer.link(DKGResultVerification, KeepRandomBeaconOperator) - await deployer.deploy(DelayFactor) - await deployer.link(DelayFactor, KeepRandomBeaconOperator) - await deployer.deploy(Reimbursements) - await deployer.link(Reimbursements, KeepRandomBeaconOperator) - await deployer.link(BLS, KeepRandomBeaconOperator) - - const keepRandomBeaconServiceImplV1 = await deployer.deploy( - KeepRandomBeaconServiceImplV1 - ) - - const initialize = keepRandomBeaconServiceImplV1.contract.methods - .initialize(dkgContributionMargin, KeepRegistry.address) - .encodeABI() - - await deployer.deploy( - KeepRandomBeaconService, - KeepRandomBeaconServiceImplV1.address, - initialize - ) - - await deployer.deploy( - KeepRandomBeaconOperator, - KeepRandomBeaconService.address, - TokenStaking.address, - KeepRegistry.address, - GasPriceOracle.address - ) - - await deployer.deploy( - KeepRandomBeaconOperatorStatistics, - KeepRandomBeaconOperator.address - ) - - await deployer.deploy( - BeaconRewards, - KeepToken.address, - KeepRandomBeaconOperator.address, - TokenStaking.address - ) - - // KEEP token geyser contract - const maxUnlockSchedules = 12 - const startBonus = 30 // 30% - const bonusPeriodSec = 2592000 // 30 days in seconds - const initialSharesPerToken = 1 - const durationSec = 2592000 // 30 days in seconds - - await deployer.deploy( - KeepVault, - // KEEP token is a distribution and staking token. - KeepToken.address, - maxUnlockSchedules, - startBonus, - bonusPeriodSec, - initialSharesPerToken, - durationSec - ) -} diff --git a/solidity-v1/migrations/3_initialize.js b/solidity-v1/migrations/3_initialize.js deleted file mode 100644 index a890f53ce0..0000000000 --- a/solidity-v1/migrations/3_initialize.js +++ /dev/null @@ -1,51 +0,0 @@ -const KeepRandomBeaconService = artifacts.require( - "./KeepRandomBeaconService.sol" -) -const KeepRandomBeaconServiceImplV1 = artifacts.require( - "./KeepRandomBeaconServiceImplV1.sol" -) -const KeepRandomBeaconOperator = artifacts.require( - "./KeepRandomBeaconOperator.sol" -) -const KeepRegistry = artifacts.require("./KeepRegistry.sol") -const TokenStaking = artifacts.require("./TokenStaking.sol") -const TokenGrant = artifacts.require("./TokenGrant.sol") -const GasPriceOracle = artifacts.require("./GasPriceOracle.sol") -const OldTokenStaking = artifacts.require("../stubs/OldTokenStaking.sol") - -module.exports = async function (deployer, network) { - const keepRandomBeaconService = await KeepRandomBeaconService.deployed() - const keepRandomBeaconServiceImplV1 = await KeepRandomBeaconServiceImplV1.at( - keepRandomBeaconService.address - ) - const keepRandomBeaconOperator = await KeepRandomBeaconOperator.deployed() - const keepRegistry = await KeepRegistry.deployed() - const tokenStaking = await TokenStaking.deployed() - const oldTokenStaking = await OldTokenStaking.deployed() - const tokenGrant = await TokenGrant.deployed() - const gasPriceOracle = await GasPriceOracle.deployed() - - if (!(await keepRandomBeaconServiceImplV1.initialized())) { - throw Error("keep random beacon service not initialized") - } - - await tokenGrant.authorizeStakingContract(tokenStaking.address) - if (network === "local") { - await tokenGrant.authorizeStakingContract(oldTokenStaking.address) - } - - await keepRegistry.approveOperatorContract(keepRandomBeaconOperator.address) - - // Set service contract owner as operator contract upgrader by default - const operatorContractUpgrader = await keepRandomBeaconService.admin() - await keepRegistry.setOperatorContractUpgrader( - keepRandomBeaconServiceImplV1.address, - operatorContractUpgrader - ) - keepRandomBeaconServiceImplV1.addOperatorContract( - keepRandomBeaconOperator.address, - { from: operatorContractUpgrader } - ) - - await gasPriceOracle.addConsumerContract(keepRandomBeaconOperator.address) -} diff --git a/solidity-v1/package-lock.json b/solidity-v1/package-lock.json deleted file mode 100644 index 02349f499f..0000000000 --- a/solidity-v1/package-lock.json +++ /dev/null @@ -1,60646 +0,0 @@ -{ - "name": "@keep-network/keep-core", - "version": "1.8.1-dev", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@keep-network/keep-core", - "version": "1.8.1-dev", - "license": "MIT", - "dependencies": { - "@openzeppelin/upgrades": "^2.7.2", - "openzeppelin-solidity": "2.4.0" - }, - "devDependencies": { - "@celo/contractkit": "^1.0.1", - "@openzeppelin/test-environment": "^0.1.9", - "@openzeppelin/test-helpers": "^0.5.5", - "@truffle/hdwallet-provider": "^2.0.10", - "babel-polyfill": "^6.26.0", - "babel-preset-es2015": "^6.18.0", - "babel-preset-stage-2": "^6.18.0", - "babel-preset-stage-3": "^6.17.0", - "babel-register": "^6.26.0", - "bn-chai": "^1.0.1", - "chai": "^4.2.0", - "eslint": "^6.8.0", - "eslint-config-keep": "github:keep-network/eslint-config-keep#0.3.0", - "eth-gas-reporter": "^0.2.14", - "ethereumjs-abi": "^0.6.5", - "mocha": "^7.1.1", - "mocha-junit-reporter": "^1.23.1", - "prettier": "^2.2.1", - "prettier-plugin-solidity": "^1.0.0-beta.2 ", - "solc": "0.5.17", - "solium": "^1.2.5", - "solium-config-keep": "github:keep-network/solium-config-keep#0.1.2", - "toml": "^3.0.0", - "tomlify-j0.4": "^3.0.0", - "truffle": "^5.5.20", - "truffle-plugin-verify": "^0.5.26", - "websocket": "^1.0.28" - } - }, - "node_modules/@apollo/protobufjs": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.2.6.tgz", - "integrity": "sha512-Wqo1oSHNUj/jxmsVp4iR3I480p6qdqHikn38lKrFhfzcDJ7lwd7Ck7cHRl4JE81tWNArl77xhnG/OkZhxKBYOw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.0", - "@types/node": "^10.1.0", - "long": "^4.0.0" - }, - "bin": { - "apollo-pbjs": "bin/pbjs", - "apollo-pbts": "bin/pbts" - } - }, - "node_modules/@apollo/protobufjs/node_modules/@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", - "dev": true, - "optional": true - }, - "node_modules/@apollo/utils.dropunuseddefinitions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@apollo/utils.dropunuseddefinitions/-/utils.dropunuseddefinitions-1.1.0.tgz", - "integrity": "sha512-jU1XjMr6ec9pPoL+BFWzEPW7VHHulVdGKMkPAMiCigpVIT11VmCbnij0bWob8uS3ODJ65tZLYKAh/55vLw2rbg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "graphql": "14.x || 15.x || 16.x" - } - }, - "node_modules/@apollo/utils.keyvaluecache": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-1.0.1.tgz", - "integrity": "sha512-nLgYLomqjVimEzQ4cdvVQkcryi970NDvcRVPfd0OPeXhBfda38WjBq+WhQFk+czSHrmrSp34YHBxpat0EtiowA==", - "dev": true, - "optional": true, - "dependencies": { - "@apollo/utils.logger": "^1.0.0", - "lru-cache": "^7.10.1" - } - }, - "node_modules/@apollo/utils.keyvaluecache/node_modules/lru-cache": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.12.0.tgz", - "integrity": "sha512-OIP3DwzRZDfLg9B9VP/huWBlpvbkmbfiBy8xmsXp4RPmE4A3MhwNozc5ZJ3fWnSg8fDcdlE/neRTPG2ycEKliw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@apollo/utils.logger": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@apollo/utils.logger/-/utils.logger-1.0.0.tgz", - "integrity": "sha512-dx9XrjyisD2pOa+KsB5RcDbWIAdgC91gJfeyLCgy0ctJMjQe7yZK5kdWaWlaOoCeX0z6YI9iYlg7vMPyMpQF3Q==", - "dev": true, - "optional": true - }, - "node_modules/@apollo/utils.printwithreducedwhitespace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@apollo/utils.printwithreducedwhitespace/-/utils.printwithreducedwhitespace-1.1.0.tgz", - "integrity": "sha512-GfFSkAv3n1toDZ4V6u2d7L4xMwLA+lv+6hqXicMN9KELSJ9yy9RzuEXaX73c/Ry+GzRsBy/fdSUGayGqdHfT2Q==", - "dev": true, - "optional": true, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "graphql": "14.x || 15.x || 16.x" - } - }, - "node_modules/@apollo/utils.removealiases": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@apollo/utils.removealiases/-/utils.removealiases-1.0.0.tgz", - "integrity": "sha512-6cM8sEOJW2LaGjL/0vHV0GtRaSekrPQR4DiywaApQlL9EdROASZU5PsQibe2MWeZCOhNrPRuHh4wDMwPsWTn8A==", - "dev": true, - "optional": true, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "graphql": "14.x || 15.x || 16.x" - } - }, - "node_modules/@apollo/utils.sortast": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@apollo/utils.sortast/-/utils.sortast-1.1.0.tgz", - "integrity": "sha512-VPlTsmUnOwzPK5yGZENN069y6uUHgeiSlpEhRnLFYwYNoJHsuJq2vXVwIaSmts015WTPa2fpz1inkLYByeuRQA==", - "dev": true, - "optional": true, - "dependencies": { - "lodash.sortby": "^4.7.0" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "graphql": "14.x || 15.x || 16.x" - } - }, - "node_modules/@apollo/utils.stripsensitiveliterals": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@apollo/utils.stripsensitiveliterals/-/utils.stripsensitiveliterals-1.2.0.tgz", - "integrity": "sha512-E41rDUzkz/cdikM5147d8nfCFVKovXxKBcjvLEQ7bjZm/cg9zEcXvS6vFY8ugTubI3fn6zoqo0CyU8zT+BGP9w==", - "dev": true, - "optional": true, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "graphql": "14.x || 15.x || 16.x" - } - }, - "node_modules/@apollo/utils.usagereporting": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@apollo/utils.usagereporting/-/utils.usagereporting-1.0.0.tgz", - "integrity": "sha512-5PL7hJMkTPmdo3oxPtigRrIyPxDk/ddrUryHPDaezL1lSFExpNzsDd2f1j0XJoHOg350GRd3LyD64caLA2PU1w==", - "dev": true, - "optional": true, - "dependencies": { - "@apollo/utils.dropunuseddefinitions": "^1.1.0", - "@apollo/utils.printwithreducedwhitespace": "^1.1.0", - "@apollo/utils.removealiases": "1.0.0", - "@apollo/utils.sortast": "^1.1.0", - "@apollo/utils.stripsensitiveliterals": "^1.2.0", - "apollo-reporting-protobuf": "^3.3.1" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "graphql": "14.x || 15.x || 16.x" - } - }, - "node_modules/@apollographql/apollo-tools": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.5.4.tgz", - "integrity": "sha512-shM3q7rUbNyXVVRkQJQseXv6bnYM3BUma/eZhwXR4xsuM+bqWnJKvW7SAfRjP7LuSCocrexa5AXhjjawNHrIlw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8", - "npm": ">=6" - }, - "peerDependencies": { - "graphql": "^14.2.1 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@apollographql/graphql-playground-html": { - "version": "1.6.29", - "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.29.tgz", - "integrity": "sha512-xCcXpoz52rI4ksJSdOCxeOCn2DLocxwHf9dVT/Q90Pte1LX+LY+91SFtJF3KXVHH8kEin+g1KKCQPKBjZJfWNA==", - "dev": true, - "optional": true, - "dependencies": { - "xss": "^1.0.8" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz", - "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz", - "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/generator/node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", - "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", - "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", - "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.6.tgz", - "integrity": "sha512-8uRHk9ZmRSnWqUgyae249EJZ94b0yAGLBIqzZzl+0iEdbno55Pmlt/32JZsHwXD9k/uZj18Aqqk35wBX4CBTXA==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-polyfill-corejs2": "^0.3.1", - "babel-plugin-polyfill-corejs3": "^0.5.2", - "babel-plugin-polyfill-regenerator": "^0.3.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/runtime": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", - "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz", - "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/traverse/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@celo/base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@celo/base/-/base-1.0.1.tgz", - "integrity": "sha512-DvWWFroRTHAnKEz2IaXJDzSl0CsctaLjvLaEaEDJ+998FMqu8iR1bbN6gV05ZwhdHOseS7j9eTkPTH4hBcHGrA==", - "dev": true - }, - "node_modules/@celo/connect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@celo/connect/-/connect-1.0.1.tgz", - "integrity": "sha512-/jg1F4upqfYEqOnnp2vsE2MK8B9gdtGO+yuwRE1n3aenjCT8qAWFVqIL49tnVpQAyhfq0u4xvOaF40db5b6Qpw==", - "dev": true, - "dependencies": { - "@celo/utils": "1.0.1", - "@types/debug": "^4.1.5", - "@types/utf8": "^2.1.6", - "bignumber.js": "^9.0.0", - "debug": "^4.1.1", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.13.0" - }, - "peerDependencies": { - "web3": "1.3.0" - } - }, - "node_modules/@celo/connect/node_modules/bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/@celo/connect/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@celo/connect/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@celo/contractkit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@celo/contractkit/-/contractkit-1.0.1.tgz", - "integrity": "sha512-iMXcRGj2X7sbkY2Cflxg4G4lhoTRYR4EEPbslLBjQMUJZ4SgelphD9hl6WgdN/h1xIbPBLNafhbqHgXfhqBrPg==", - "dev": true, - "dependencies": { - "@celo/base": "1.0.1", - "@celo/connect": "1.0.1", - "@celo/utils": "1.0.1", - "@celo/wallet-local": "1.0.1", - "@types/debug": "^4.1.5", - "bignumber.js": "^9.0.0", - "cross-fetch": "3.0.4", - "debug": "^4.1.1", - "fp-ts": "2.1.1", - "io-ts": "2.0.1", - "moment": "^2.29.0", - "web3": "1.3.0" - }, - "engines": { - "node": ">=8.13.0" - } - }, - "node_modules/@celo/contractkit/node_modules/bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/@celo/contractkit/node_modules/cross-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.4.tgz", - "integrity": "sha512-MSHgpjQqgbT/94D4CyADeNoYh52zMkCX4pcJvPP5WqPsLFMKjr2TCMg381ox5qI0ii2dPwaLx/00477knXqXVw==", - "dev": true, - "dependencies": { - "node-fetch": "2.6.0", - "whatwg-fetch": "3.0.0" - } - }, - "node_modules/@celo/contractkit/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@celo/contractkit/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@celo/contractkit/node_modules/node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", - "dev": true, - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/@celo/contractkit/node_modules/whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==", - "dev": true - }, - "node_modules/@celo/utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@celo/utils/-/utils-1.0.1.tgz", - "integrity": "sha512-33Xuf1eB/Yhc/Sb+QmAv9L89IIfnYSkLwJqBcAauEY97u86T8gM/j8I1RxNSSQgVYSpV5VZJvshFUtD4m02YXw==", - "dev": true, - "dependencies": { - "@celo/base": "1.0.1", - "@types/country-data": "^0.0.0", - "@types/elliptic": "^6.4.9", - "@types/ethereumjs-util": "^5.2.0", - "@types/google-libphonenumber": "^7.4.17", - "@types/lodash": "^4.14.136", - "@types/node": "^10.12.18", - "@types/randombytes": "^2.0.0", - "@umpirsky/country-list": "https://github.com/umpirsky/country-list#05fda51", - "bigi": "^1.1.0", - "bignumber.js": "^9.0.0", - "bip32": "2.0.5", - "bip39": "3.0.2", - "bls12377js": "https://github.com/celo-org/bls12377js#cb38a4cfb643c778619d79b20ca3e5283a2122a6", - "bn.js": "4.11.8", - "buffer-reverse": "^1.0.1", - "country-data": "^0.0.31", - "crypto-js": "^3.1.9-1", - "elliptic": "^6.5.3", - "ethereumjs-util": "^5.2.0", - "fp-ts": "2.1.1", - "google-libphonenumber": "^3.2.15", - "io-ts": "2.0.1", - "keccak256": "^1.0.0", - "lodash": "^4.17.14", - "numeral": "^2.0.6", - "web3-eth-abi": "1.3.0", - "web3-utils": "1.3.0" - } - }, - "node_modules/@celo/utils/node_modules/@ethersproject/abi": { - "version": "5.0.0-beta.153", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz", - "integrity": "sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==", - "dev": true, - "dependencies": { - "@ethersproject/address": ">=5.0.0-beta.128", - "@ethersproject/bignumber": ">=5.0.0-beta.130", - "@ethersproject/bytes": ">=5.0.0-beta.129", - "@ethersproject/constants": ">=5.0.0-beta.128", - "@ethersproject/hash": ">=5.0.0-beta.128", - "@ethersproject/keccak256": ">=5.0.0-beta.127", - "@ethersproject/logger": ">=5.0.0-beta.129", - "@ethersproject/properties": ">=5.0.0-beta.131", - "@ethersproject/strings": ">=5.0.0-beta.130" - } - }, - "node_modules/@celo/utils/node_modules/@types/node": { - "version": "10.17.51", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.51.tgz", - "integrity": "sha512-KANw+MkL626tq90l++hGelbl67irOJzGhUJk6a1Bt8QHOeh9tztJx+L0AqttraWKinmZn7Qi5lJZJzx45Gq0dg==", - "dev": true - }, - "node_modules/@celo/utils/node_modules/bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/@celo/utils/node_modules/bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "node_modules/@celo/utils/node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/@celo/utils/node_modules/elliptic/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/@celo/utils/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@celo/utils/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/@celo/utils/node_modules/web3-eth-abi": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.3.0.tgz", - "integrity": "sha512-1OrZ9+KGrBeBRd3lO8upkpNua9+7cBsQAgor9wbA25UrcUYSyL8teV66JNRu9gFxaTbkpdrGqM7J/LXpraXWrg==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "5.0.0-beta.153", - "underscore": "1.9.1", - "web3-utils": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@celo/utils/node_modules/web3-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz", - "integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@celo/utils/node_modules/web3-utils/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/@celo/wallet-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@celo/wallet-base/-/wallet-base-1.0.1.tgz", - "integrity": "sha512-vrxJVGyxoJ48v03z28kjgSqhv5e/zr73RHDSJ2ZnBM++i+33Pz4ukshTdv9VEr3SFUoDAjJ1QLjxX29AcyaKcQ==", - "dev": true, - "dependencies": { - "@celo/base": "1.0.1", - "@celo/connect": "1.0.1", - "@celo/utils": "1.0.1", - "@types/debug": "^4.1.5", - "@types/ethereumjs-util": "^5.2.0", - "bignumber.js": "^9.0.0", - "debug": "^4.1.1", - "eth-lib": "^0.2.8", - "ethereumjs-util": "^5.2.0" - }, - "engines": { - "node": ">=8.13.0" - } - }, - "node_modules/@celo/wallet-base/node_modules/bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/@celo/wallet-base/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@celo/wallet-base/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@celo/wallet-base/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/@celo/wallet-base/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@celo/wallet-local": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@celo/wallet-local/-/wallet-local-1.0.1.tgz", - "integrity": "sha512-VOXZZFmnsNa5JNwWjEos078IZ4VvYK458ZNt+pdlF2s/+F1aRSe1Oui9Ac60oLyVGl6ojGkW4lGCIck33Cxj1g==", - "dev": true, - "dependencies": { - "@celo/connect": "1.0.1", - "@celo/utils": "1.0.1", - "@celo/wallet-base": "1.0.1", - "@types/ethereumjs-util": "^5.2.0", - "eth-lib": "^0.2.8", - "ethereumjs-util": "^5.2.0" - }, - "engines": { - "node": ">=8.13.0" - } - }, - "node_modules/@celo/wallet-local/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@celo/wallet-local/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", - "dev": true, - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" - } - }, - "node_modules/@ethereumjs/common/node_modules/@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@ethereumjs/common/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/@ethereumjs/common/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@ethereumjs/tx": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", - "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" - } - }, - "node_modules/@ethereumjs/tx/node_modules/@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@ethereumjs/tx/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/@ethereumjs/tx/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@ethersproject/abi": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.6.4.tgz", - "integrity": "sha512-TTeZUlCeIHG6527/2goZA6gW5F8Emoc7MrZDC7hhP84aRGvW3TEdTnZR08Ls88YXM1m2SuK42Osw/jSi3uO8gg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/address": "^5.6.1", - "@ethersproject/bignumber": "^5.6.2", - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/constants": "^5.6.1", - "@ethersproject/hash": "^5.6.1", - "@ethersproject/keccak256": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "@ethersproject/properties": "^5.6.0", - "@ethersproject/strings": "^5.6.1" - } - }, - "node_modules/@ethersproject/abstract-provider": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.6.1.tgz", - "integrity": "sha512-BxlIgogYJtp1FS8Muvj8YfdClk3unZH0vRMVX791Z9INBNT/kuACZ9GzaY1Y4yFq+YSy6/w4gzj3HCRKrK9hsQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.6.2", - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "@ethersproject/networks": "^5.6.3", - "@ethersproject/properties": "^5.6.0", - "@ethersproject/transactions": "^5.6.2", - "@ethersproject/web": "^5.6.1" - } - }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.6.2.tgz", - "integrity": "sha512-n1r6lttFBG0t2vNiI3HoWaS/KdOt8xyDjzlP2cuevlWLG6EX0OwcKLyG/Kp/cuwNxdy/ous+R/DEMdTUwWQIjQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.6.1", - "@ethersproject/bignumber": "^5.6.2", - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "@ethersproject/properties": "^5.6.0" - } - }, - "node_modules/@ethersproject/address": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.1.tgz", - "integrity": "sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.6.2", - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/keccak256": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "@ethersproject/rlp": "^5.6.1" - } - }, - "node_modules/@ethersproject/base64": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.6.1.tgz", - "integrity": "sha512-qB76rjop6a0RIYYMiB4Eh/8n+Hxu2NIZm8S/Q7kNo5pmZfXhHGHmS4MinUainiBC54SCyRnwzL+KZjj8zbsSsw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.6.1" - } - }, - "node_modules/@ethersproject/bignumber": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.6.2.tgz", - "integrity": "sha512-v7+EEUbhGqT3XJ9LMPsKvXYHFc8eHxTowFCG/HgJErmq4XHJ2WR7aeyICg3uTOAQ7Icn0GFHAohXEhxQHq4Ubw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "bn.js": "^5.2.1" - } - }, - "node_modules/@ethersproject/bignumber/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/@ethersproject/bytes": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.6.1.tgz", - "integrity": "sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.6.0" - } - }, - "node_modules/@ethersproject/constants": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.6.1.tgz", - "integrity": "sha512-QSq9WVnZbxXYFftrjSjZDUshp6/eKp6qrtdBtUCm0QxCV5z1fG/w3kdlcsjMCQuQHUnAclKoK7XpXMezhRDOLg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.6.2" - } - }, - "node_modules/@ethersproject/hash": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.6.1.tgz", - "integrity": "sha512-L1xAHurbaxG8VVul4ankNX5HgQ8PNCTrnVXEiFnE9xoRnaUcgfD12tZINtDinSllxPLCtGwguQxJ5E6keE84pA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.6.2", - "@ethersproject/address": "^5.6.1", - "@ethersproject/bignumber": "^5.6.2", - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/keccak256": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "@ethersproject/properties": "^5.6.0", - "@ethersproject/strings": "^5.6.1" - } - }, - "node_modules/@ethersproject/keccak256": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.6.1.tgz", - "integrity": "sha512-bB7DQHCTRDooZZdL3lk9wpL0+XuG3XLGHLh3cePnybsO3V0rdCAOQGpn/0R3aODmnTOOkCATJiD2hnL+5bwthA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.6.1", - "js-sha3": "0.8.0" - } - }, - "node_modules/@ethersproject/keccak256/node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "dev": true - }, - "node_modules/@ethersproject/logger": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.6.0.tgz", - "integrity": "sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ] - }, - "node_modules/@ethersproject/networks": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.6.4.tgz", - "integrity": "sha512-KShHeHPahHI2UlWdtDMn2lJETcbtaJge4k7XSjDR9h79QTd6yQJmv6Cp2ZA4JdqWnhszAOLSuJEd9C0PRw7hSQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.6.0" - } - }, - "node_modules/@ethersproject/properties": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.6.0.tgz", - "integrity": "sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.6.0" - } - }, - "node_modules/@ethersproject/rlp": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.6.1.tgz", - "integrity": "sha512-uYjmcZx+DKlFUk7a5/W9aQVaoEC7+1MOBgNtvNg13+RnuUwT4F0zTovC0tmay5SmRslb29V1B7Y5KCri46WhuQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/logger": "^5.6.0" - } - }, - "node_modules/@ethersproject/signing-key": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.6.2.tgz", - "integrity": "sha512-jVbu0RuP7EFpw82vHcL+GP35+KaNruVAZM90GxgQnGqB6crhBqW/ozBfFvdeImtmb4qPko0uxXjn8l9jpn0cwQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "@ethersproject/properties": "^5.6.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/signing-key/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/@ethersproject/signing-key/node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/@ethersproject/signing-key/node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/@ethersproject/signing-key/node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/@ethersproject/strings": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.6.1.tgz", - "integrity": "sha512-2X1Lgk6Jyfg26MUnsHiT456U9ijxKUybz8IM1Vih+NJxYtXhmvKBcHOmvGqpFSVJ0nQ4ZCoIViR8XlRw1v/+Cw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/constants": "^5.6.1", - "@ethersproject/logger": "^5.6.0" - } - }, - "node_modules/@ethersproject/transactions": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.6.2.tgz", - "integrity": "sha512-BuV63IRPHmJvthNkkt9G70Ullx6AcM+SDc+a8Aw/8Yew6YwT51TcBKEp1P4oOQ/bP25I18JJr7rcFRgFtU9B2Q==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/address": "^5.6.1", - "@ethersproject/bignumber": "^5.6.2", - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/constants": "^5.6.1", - "@ethersproject/keccak256": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "@ethersproject/properties": "^5.6.0", - "@ethersproject/rlp": "^5.6.1", - "@ethersproject/signing-key": "^5.6.2" - } - }, - "node_modules/@ethersproject/web": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.6.1.tgz", - "integrity": "sha512-/vSyzaQlNXkO1WV+RneYKqCJwualcUdx/Z3gseVovZP0wIlOFcCE1hkRhKBH8ImKbGQbMl9EAAyJFrJu7V0aqA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/base64": "^5.6.1", - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "@ethersproject/properties": "^5.6.0", - "@ethersproject/strings": "^5.6.1" - } - }, - "node_modules/@graphql-tools/batch-execute": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.5.0.tgz", - "integrity": "sha512-S9/76X4uYIbVlJyRzXhCBbTJvVD0VvaWNqGiKgkITxlq4aBsTOHVuE84OSi3E1QKP3PTiJYrgMIn220iFOkyQw==", - "dev": true, - "optional": true, - "dependencies": { - "@graphql-tools/utils": "8.8.0", - "dataloader": "2.1.0", - "tslib": "^2.4.0", - "value-or-promise": "1.0.11" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/batch-execute/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true, - "optional": true - }, - "node_modules/@graphql-tools/delegate": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-8.8.0.tgz", - "integrity": "sha512-dbhfOI8rQXPcowXrbwHLOBY9oGi7qxtlrXF4RuRXmjqGTs2AgogdOE3Ep1+6wFD7qYTuFmHXZ8Cl0PmhoZUgrg==", - "dev": true, - "optional": true, - "dependencies": { - "@graphql-tools/batch-execute": "8.5.0", - "@graphql-tools/schema": "8.5.0", - "@graphql-tools/utils": "8.8.0", - "dataloader": "2.1.0", - "tslib": "~2.4.0", - "value-or-promise": "1.0.11" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/delegate/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true, - "optional": true - }, - "node_modules/@graphql-tools/merge": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.3.0.tgz", - "integrity": "sha512-xRa7RAQok/0DD2YnjuqikMrr7dUAxTpdGtZ7BkvUUGhYs3B3p7reCAfvOVr1DJAqVToP7hdlMk+S5+Ylk+AaqA==", - "dev": true, - "optional": true, - "dependencies": { - "@graphql-tools/utils": "8.8.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/merge/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true, - "optional": true - }, - "node_modules/@graphql-tools/mock": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/mock/-/mock-8.7.0.tgz", - "integrity": "sha512-K/hqP442mXAvW36v/3TmqFpNzRw14P86xlsJZod88OXwpDfb97X09z1QsaMcvSe8E7ijcKWLlTRk15/vDQSL2Q==", - "dev": true, - "optional": true, - "dependencies": { - "@graphql-tools/schema": "8.5.0", - "@graphql-tools/utils": "8.8.0", - "fast-json-stable-stringify": "^2.1.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/mock/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true, - "optional": true - }, - "node_modules/@graphql-tools/schema": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-8.5.0.tgz", - "integrity": "sha512-VeFtKjM3SA9/hCJJfr95aEdC3G0xIKM9z0Qdz4i+eC1g2fdZYnfWFt2ucW4IME+2TDd0enHlKzaV0qk2SLVUww==", - "dev": true, - "optional": true, - "dependencies": { - "@graphql-tools/merge": "8.3.0", - "@graphql-tools/utils": "8.8.0", - "tslib": "^2.4.0", - "value-or-promise": "1.0.11" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/schema/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true, - "optional": true - }, - "node_modules/@graphql-tools/utils": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.8.0.tgz", - "integrity": "sha512-KJrtx05uSM/cPYFdTnGAS1doL5bftJLAiFCDMZ8Vkifztz3BFn3gpFiy/o4wDtM8s39G46mxmt2Km/RmeltfGw==", - "dev": true, - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/utils/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true, - "optional": true - }, - "node_modules/@josephg/resolvable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@josephg/resolvable/-/resolvable-1.0.1.tgz", - "integrity": "sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==", - "dev": true, - "optional": true - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz", - "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@metamask/eth-sig-util": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", - "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", - "dev": true, - "dependencies": { - "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^6.2.1", - "ethjs-util": "^0.1.6", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dev": true, - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, - "node_modules/@metamask/eth-sig-util/node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "dev": true - }, - "node_modules/@metamask/safe-event-emitter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz", - "integrity": "sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==", - "dev": true - }, - "node_modules/@noble/hashes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.0.0.tgz", - "integrity": "sha512-DZVbtY62kc3kkBtMHqwCOfXrT/hnoORy5BJ4+HU1IR59X0KWAOqsfzQPcUl/lQLlG7qXbe/fZ3r/emxtAl+sqg==", - "dev": true - }, - "node_modules/@noble/secp256k1": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.5.5.tgz", - "integrity": "sha512-sZ1W6gQzYnu45wPrWx8D3kwI2/U29VYTx9OjbDAd7jwRItJ0cSTMPRL/C8AWZFn9kWFLQGqEXVEE86w4Z8LpIQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@openzeppelin/contract-loader": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contract-loader/-/contract-loader-0.6.2.tgz", - "integrity": "sha512-/P8v8ZFVwK+Z7rHQH2N3hqzEmTzLFjhMtvNK4FeIak6DEeONZ92vdFaFb10CCCQtp390Rp/Y57Rtfrm50bUdMQ==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "fs-extra": "^8.1.0" - } - }, - "node_modules/@openzeppelin/contract-loader/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@openzeppelin/contract-loader/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@openzeppelin/contract-loader/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@openzeppelin/contract-loader/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@openzeppelin/contract-loader/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@openzeppelin/contract-loader/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@openzeppelin/contract-loader/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@openzeppelin/test-environment": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@openzeppelin/test-environment/-/test-environment-0.1.9.tgz", - "integrity": "sha512-QJ2TSRGbHMv4lrLChT7ghcoPGB3osXZvLXM3VqD8XhrJsYi/t5QJ8aHNYKa+A8EmCkH/rGZWgvRfhphVTFf0DA==", - "dev": true, - "dependencies": { - "@openzeppelin/contract-loader": "^0.6.1", - "@truffle/contract": "^4.0.38", - "ansi-colors": "^4.1.1", - "ethereumjs-wallet": "^0.6.3", - "exit-hook": "^2.2.0", - "find-up": "^4.1.0", - "fs-extra": "^9.0.1", - "ganache-core": "^2.11.2", - "lodash.merge": "^4.6.2", - "p-queue": "^6.2.0", - "semver": "^7.1.3", - "try-require": "^1.2.1", - "web3": "^1.3.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/@ethersproject/abi": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz", - "integrity": "sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==", - "dev": true, - "dependencies": { - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/hash": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/strings": "^5.0.4" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/@types/node": { - "version": "12.20.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.13.tgz", - "integrity": "sha512-1x8W5OpxPq+T85OUsHRP6BqXeosKmeXRtjoF39STcdf/UWLqUsoehstZKOi0CunhVqHG17AyZgpj20eRVooK6A==", - "dev": true - }, - "node_modules/@openzeppelin/test-environment/node_modules/bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true - }, - "node_modules/@openzeppelin/test-environment/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=", - "dev": true, - "dependencies": { - "http-https": "^1.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true - }, - "node_modules/@openzeppelin/test-environment/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "node_modules/@openzeppelin/test-environment/node_modules/swarm-js": { - "version": "0.1.40", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", - "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/swarm-js/node_modules/fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/swarm-js/node_modules/got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "dependencies": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/swarm-js/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/swarm-js/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/underscore": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", - "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", - "dev": true - }, - "node_modules/@openzeppelin/test-environment/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "dependencies": { - "prepend-http": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.3.6.tgz", - "integrity": "sha512-jEpPhnL6GDteifdVh7ulzlPrtVQeA30V9vnki9liYlUvLV82ZM7BNOQJiuzlDePuE+jZETZSP/0G/JlUVt6pOA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-bzz": "1.3.6", - "web3-core": "1.3.6", - "web3-eth": "1.3.6", - "web3-eth-personal": "1.3.6", - "web3-net": "1.3.6", - "web3-shh": "1.3.6", - "web3-utils": "1.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-bzz": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.3.6.tgz", - "integrity": "sha512-ibHdx1wkseujFejrtY7ZyC0QxQ4ATXjzcNUpaLrvM6AEae8prUiyT/OloG9FWDgFD2CPLwzKwfSQezYQlANNlw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40", - "underscore": "1.12.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-core": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.3.6.tgz", - "integrity": "sha512-gkLDM4T1Sc0T+HZIwxrNrwPg0IfWI0oABSglP2X5ZbBAYVUeEATA0o92LWV8BeF+okvKXLK1Fek/p6axwM/h3Q==", - "dev": true, - "dependencies": { - "@types/bn.js": "^4.11.5", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.3.6", - "web3-core-method": "1.3.6", - "web3-core-requestmanager": "1.3.6", - "web3-utils": "1.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-core-helpers": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.3.6.tgz", - "integrity": "sha512-nhtjA2ZbkppjlxTSwG0Ttu6FcPkVu1rCN5IFAOVpF/L0SEt+jy+O5l90+cjDq0jAYvlBwUwnbh2mR9hwDEJCNA==", - "dev": true, - "dependencies": { - "underscore": "1.12.1", - "web3-eth-iban": "1.3.6", - "web3-utils": "1.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-core-method": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.3.6.tgz", - "integrity": "sha512-RyegqVGxn0cyYW5yzAwkPlsSEynkdPiegd7RxgB4ak1eKk2Cv1q2x4C7D2sZjeeCEF+q6fOkVmo2OZNqS2iQxg==", - "dev": true, - "dependencies": { - "@ethersproject/transactions": "^5.0.0-beta.135", - "underscore": "1.12.1", - "web3-core-helpers": "1.3.6", - "web3-core-promievent": "1.3.6", - "web3-core-subscriptions": "1.3.6", - "web3-utils": "1.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-core-promievent": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.3.6.tgz", - "integrity": "sha512-Z+QzfyYDTXD5wJmZO5wwnRO8bAAHEItT1XNSPVb4J1CToV/I/SbF7CuF8Uzh2jns0Cm1109o666H7StFFvzVKw==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-core-requestmanager": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.3.6.tgz", - "integrity": "sha512-2rIaeuqeo7QN1Eex7aXP0ZqeteJEPWXYFS/M3r3LXMiV8R4STQBKE+//dnHJXoo2ctzEB5cgd+7NaJM8S3gPyA==", - "dev": true, - "dependencies": { - "underscore": "1.12.1", - "util": "^0.12.0", - "web3-core-helpers": "1.3.6", - "web3-providers-http": "1.3.6", - "web3-providers-ipc": "1.3.6", - "web3-providers-ws": "1.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-core-subscriptions": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.3.6.tgz", - "integrity": "sha512-wi9Z9X5X75OKvxAg42GGIf81ttbNR2TxzkAsp1g+nnp5K8mBwgZvXrIsDuj7Z7gx72Y45mWJADCWjk/2vqNu8g==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "underscore": "1.12.1", - "web3-core-helpers": "1.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-eth": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.3.6.tgz", - "integrity": "sha512-9+rnywRRpyX3C4hfsAQXPQh6vHh9XzQkgLxo3gyeXfbhbShUoq2gFVuy42vsRs//6JlsKdyZS7Z3hHPHz2wreA==", - "dev": true, - "dependencies": { - "underscore": "1.12.1", - "web3-core": "1.3.6", - "web3-core-helpers": "1.3.6", - "web3-core-method": "1.3.6", - "web3-core-subscriptions": "1.3.6", - "web3-eth-abi": "1.3.6", - "web3-eth-accounts": "1.3.6", - "web3-eth-contract": "1.3.6", - "web3-eth-ens": "1.3.6", - "web3-eth-iban": "1.3.6", - "web3-eth-personal": "1.3.6", - "web3-net": "1.3.6", - "web3-utils": "1.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-eth-abi": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.3.6.tgz", - "integrity": "sha512-Or5cRnZu6WzgScpmbkvC6bfNxR26hqiKK4i8sMPFeTUABQcb/FU3pBj7huBLYbp9dH+P5W79D2MqwbWwjj9DoQ==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "5.0.7", - "underscore": "1.12.1", - "web3-utils": "1.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-eth-accounts": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.3.6.tgz", - "integrity": "sha512-Ilr0hG6ONbCdSlVKffasCmNwftD5HsNpwyQASevocIQwHdTlvlwO0tb3oGYuajbKOaDzNTwXfz25bttAEoFCGA==", - "dev": true, - "dependencies": { - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", - "scrypt-js": "^3.0.1", - "underscore": "1.12.1", - "uuid": "3.3.2", - "web3-core": "1.3.6", - "web3-core-helpers": "1.3.6", - "web3-core-method": "1.3.6", - "web3-utils": "1.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-eth-accounts/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-eth-contract": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.3.6.tgz", - "integrity": "sha512-8gDaRrLF2HCg+YEZN1ov0zN35vmtPnGf3h1DxmJQK5Wm2lRMLomz9rsWsuvig3UJMHqZAQKD7tOl3ocJocQsmA==", - "dev": true, - "dependencies": { - "@types/bn.js": "^4.11.5", - "underscore": "1.12.1", - "web3-core": "1.3.6", - "web3-core-helpers": "1.3.6", - "web3-core-method": "1.3.6", - "web3-core-promievent": "1.3.6", - "web3-core-subscriptions": "1.3.6", - "web3-eth-abi": "1.3.6", - "web3-utils": "1.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-eth-ens": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.3.6.tgz", - "integrity": "sha512-n27HNj7lpSkRxTgSx+Zo7cmKAgyg2ElFilaFlUu/X2CNH23lXfcPm2bWssivH9z0ndhg0OyR4AYFZqPaqDHkJA==", - "dev": true, - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "underscore": "1.12.1", - "web3-core": "1.3.6", - "web3-core-helpers": "1.3.6", - "web3-core-promievent": "1.3.6", - "web3-eth-abi": "1.3.6", - "web3-eth-contract": "1.3.6", - "web3-utils": "1.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-eth-iban": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.3.6.tgz", - "integrity": "sha512-nfMQaaLA/zsg5W4Oy/EJQbs8rSs1vBAX6b/35xzjYoutXlpHMQadujDx2RerTKhSHqFXSJeQAfE+2f6mdhYkRQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "web3-utils": "1.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-eth-personal": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.3.6.tgz", - "integrity": "sha512-pOHU0+/h1RFRYoh1ehYBehRbcKWP4OSzd4F7mDljhHngv6W8ewMHrAN8O1ol9uysN2MuCdRE19qkRg5eNgvzFQ==", - "dev": true, - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.3.6", - "web3-core-helpers": "1.3.6", - "web3-core-method": "1.3.6", - "web3-net": "1.3.6", - "web3-utils": "1.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-net": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.3.6.tgz", - "integrity": "sha512-KhzU3wMQY/YYjyMiQzbaLPt2kut88Ncx2iqjy3nw28vRux3gVX0WOCk9EL/KVJBiAA/fK7VklTXvgy9dZnnipw==", - "dev": true, - "dependencies": { - "web3-core": "1.3.6", - "web3-core-method": "1.3.6", - "web3-utils": "1.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-providers-http": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.3.6.tgz", - "integrity": "sha512-OQkT32O1A06dISIdazpGLveZcOXhEo5cEX6QyiSQkiPk/cjzDrXMw4SKZOGQbbS1+0Vjizm1Hrp7O8Vp2D1M5Q==", - "dev": true, - "dependencies": { - "web3-core-helpers": "1.3.6", - "xhr2-cookies": "1.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-providers-ipc": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.3.6.tgz", - "integrity": "sha512-+TVsSd2sSVvVgHG4s6FXwwYPPT91boKKcRuEFXqEfAbUC5t52XOgmyc2LNiD9LzPhed65FbV4LqICpeYGUvSwA==", - "dev": true, - "dependencies": { - "oboe": "2.1.5", - "underscore": "1.12.1", - "web3-core-helpers": "1.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-providers-ws": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.3.6.tgz", - "integrity": "sha512-bk7MnJf5or0Re2zKyhR3L3CjGululLCHXx4vlbc/drnaTARUVvi559OI5uLytc/1k5HKUUyENAxLvetz2G1dnQ==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "underscore": "1.12.1", - "web3-core-helpers": "1.3.6", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-shh": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.3.6.tgz", - "integrity": "sha512-9zRo415O0iBslxBnmu9OzYjNErzLnzOsy+IOvSpIreLYbbAw0XkDWxv3SfcpKnTIWIACBR4AYMIxmmyi5iB3jw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-core": "1.3.6", - "web3-core-method": "1.3.6", - "web3-core-subscriptions": "1.3.6", - "web3-net": "1.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-utils": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", - "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.12.1", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/web3-utils/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@openzeppelin/test-environment/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@openzeppelin/test-helpers": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@openzeppelin/test-helpers/-/test-helpers-0.5.10.tgz", - "integrity": "sha512-agXr5Rn/q0MCDaU0ioYMGQVjY32Ln3Ae3cyQKtESuKdDoEZ7g3Y7x4eUbT779OE9nQ+xQCytmVqjKvZvajURug==", - "dev": true, - "dependencies": { - "@openzeppelin/contract-loader": "^0.6.2", - "@truffle/contract": "^4.0.35", - "ansi-colors": "^3.2.3", - "chai": "^4.2.0", - "chai-bn": "^0.2.1", - "ethjs-abi": "^0.2.1", - "lodash.flatten": "^4.4.0", - "semver": "^5.6.0", - "web3": "^1.2.5", - "web3-utils": "^1.2.5" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/@ethersproject/abi": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz", - "integrity": "sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==", - "dev": true, - "dependencies": { - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/hash": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/strings": "^5.0.4" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/@types/node": { - "version": "12.20.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.8.tgz", - "integrity": "sha512-uxDkaUGwXNDHu5MHqs+FAsmOjNoNibDF1cu4668QG96mQldQfgV3M+UyntXWWrtXSh13jFxEdNUdoLWH46mLKQ==", - "dev": true - }, - "node_modules/@openzeppelin/test-helpers/node_modules/ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true - }, - "node_modules/@openzeppelin/test-helpers/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=", - "dev": true, - "dependencies": { - "http-https": "^1.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true - }, - "node_modules/@openzeppelin/test-helpers/node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "node_modules/@openzeppelin/test-helpers/node_modules/swarm-js": { - "version": "0.1.40", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", - "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/swarm-js/node_modules/got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "dependencies": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "dependencies": { - "prepend-http": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.3.5.tgz", - "integrity": "sha512-UyQW/MT5EIGBrXPCh/FDIaD7RtJTn5/rJUNw2FOglp0qoXnCQHNKvntiR1ylztk05fYxIF6UgsC76IrazlKJjw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-bzz": "1.3.5", - "web3-core": "1.3.5", - "web3-eth": "1.3.5", - "web3-eth-personal": "1.3.5", - "web3-net": "1.3.5", - "web3-shh": "1.3.5", - "web3-utils": "1.3.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-bzz": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.3.5.tgz", - "integrity": "sha512-XiEUAbB1uKm/agqfwBsCW8fbw+sma85TfwuDpdcy591vinVk0S9TfWgLxro6v1KJ6nSELySIbKGbAJbh2GSyxw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40", - "underscore": "1.9.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-core": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.3.5.tgz", - "integrity": "sha512-VQjTvnGTqJwDwjKEHSApea3RmgtFGLDSJ6bqrOyHROYNyTyKYjFQ/drG9zs3rjDkND9mgh8foI1ty37Qua3QCQ==", - "dev": true, - "dependencies": { - "@types/bn.js": "^4.11.5", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.3.5", - "web3-core-method": "1.3.5", - "web3-core-requestmanager": "1.3.5", - "web3-utils": "1.3.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-core-helpers": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.3.5.tgz", - "integrity": "sha512-HYh3ix5FjysgT0jyzD8s/X5ym0b4BGU7I2QtuBiydMnE0mQEWy7GcT9XKpTySA8FTOHHIAQYvQS07DN/ky3UzA==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "web3-eth-iban": "1.3.5", - "web3-utils": "1.3.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-core-method": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.3.5.tgz", - "integrity": "sha512-hCbmgQ+At6OTuaNGAdjXMsCr4eUCmp9yGKSuaB5HdkNVDpqFso4HHjVxcjNrTyJp3OZnyjKBzQzK1ZWLpLl84Q==", - "dev": true, - "dependencies": { - "@ethersproject/transactions": "^5.0.0-beta.135", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.5", - "web3-core-promievent": "1.3.5", - "web3-core-subscriptions": "1.3.5", - "web3-utils": "1.3.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-core-promievent": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.3.5.tgz", - "integrity": "sha512-K0j8x3ZJr0eAyNvyUCxOUsSTd4hco0/9nxxlyOuijcsa6YV8l9NL6eqhniWbSyxCJT8ka5Mb7yAiUZe69EDLBQ==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-core-requestmanager": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.3.5.tgz", - "integrity": "sha512-9l294U3Ga8qmvv8E37BqjQREfMs+kFnkU3PY28g9DZGYzKvl3V1dgDYqxyrOBdCFhc7rNSpHdgC4PrVHjouspg==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "util": "^0.12.0", - "web3-core-helpers": "1.3.5", - "web3-providers-http": "1.3.5", - "web3-providers-ipc": "1.3.5", - "web3-providers-ws": "1.3.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-core-subscriptions": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.3.5.tgz", - "integrity": "sha512-6mtXdaEB1V1zKLqYBq7RF2W75AK5ZJNGpW6QYC7Zvbku7zq1ZlgaUkJo88JKMWJ7etfaHaYqQ/7VveHk5sQynA==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-eth": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.3.5.tgz", - "integrity": "sha512-5qqDPMMD+D0xRqOV2ePU2G7/uQmhn0FgCEhFzKDMHrssDQJyQLW/VgfA0NLn64lWnuUrGnQStGvNxrWf7MgsfA==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "web3-core": "1.3.5", - "web3-core-helpers": "1.3.5", - "web3-core-method": "1.3.5", - "web3-core-subscriptions": "1.3.5", - "web3-eth-abi": "1.3.5", - "web3-eth-accounts": "1.3.5", - "web3-eth-contract": "1.3.5", - "web3-eth-ens": "1.3.5", - "web3-eth-iban": "1.3.5", - "web3-eth-personal": "1.3.5", - "web3-net": "1.3.5", - "web3-utils": "1.3.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-eth-abi": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.3.5.tgz", - "integrity": "sha512-bkbG2v/mOW5DH6rF/SEgqunusjYoEi2IBw+fkmD3rzWDaEY7+/i1xY94AeO257d06QMgld75GtV/N+aEs7A6vQ==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "5.0.7", - "underscore": "1.9.1", - "web3-utils": "1.3.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-eth-accounts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.3.5.tgz", - "integrity": "sha512-r3WOR21rgm6Cd6OFnifr3Tizdm5K+g2TsSOPySwX4FrgLrYDL6ck4zr5VXUPz+llpSExb/JztpE8pqEHr3U2NA==", - "dev": true, - "dependencies": { - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", - "scrypt-js": "^3.0.1", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.3.5", - "web3-core-helpers": "1.3.5", - "web3-core-method": "1.3.5", - "web3-utils": "1.3.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-eth-accounts/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-eth-contract": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.3.5.tgz", - "integrity": "sha512-WfGVeQquN3D7Qm+KEIN9EI7yrm/fL2V9Y4+YhDWiKA/ns1pX1LYcEWojTOnBXCnPF3tcvoKKL+KBxXg1iKm38A==", - "dev": true, - "dependencies": { - "@types/bn.js": "^4.11.5", - "underscore": "1.9.1", - "web3-core": "1.3.5", - "web3-core-helpers": "1.3.5", - "web3-core-method": "1.3.5", - "web3-core-promievent": "1.3.5", - "web3-core-subscriptions": "1.3.5", - "web3-eth-abi": "1.3.5", - "web3-utils": "1.3.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-eth-ens": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.3.5.tgz", - "integrity": "sha512-5bkpFTXV18CvaVP8kCbLZZm2r1TWUv9AsXH+80yz8bTZulUGvXsBMRfK6e5nfEr2Yv59xlIXCFoalmmySI9EJw==", - "dev": true, - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.3.5", - "web3-core-helpers": "1.3.5", - "web3-core-promievent": "1.3.5", - "web3-eth-abi": "1.3.5", - "web3-eth-contract": "1.3.5", - "web3-utils": "1.3.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-eth-iban": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.3.5.tgz", - "integrity": "sha512-x+BI/d2Vt0J1cKK8eFd4W0f1TDjgEOYCwiViTb28lLE+tqrgyPqWDA+l6UlKYLF/yMFX3Dym4ofcCOtgcn4q4g==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "web3-utils": "1.3.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-eth-personal": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.3.5.tgz", - "integrity": "sha512-xELQHNZ8p3VoO1582ghCaq+Bx7pSkOOalc6/ACOCGtHDMelqgVejrmSIZGScYl+k0HzngmQAzURZWQocaoGM1g==", - "dev": true, - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.3.5", - "web3-core-helpers": "1.3.5", - "web3-core-method": "1.3.5", - "web3-net": "1.3.5", - "web3-utils": "1.3.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-net": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.3.5.tgz", - "integrity": "sha512-usbFbuUpKK8s7jPLGoUzi/WpNnefGFPTj948aJv8BZ04UQA4L/XS5NNkkhk358zNMmhGfEFW8wrWy+0Oy0njtA==", - "dev": true, - "dependencies": { - "web3-core": "1.3.5", - "web3-core-method": "1.3.5", - "web3-utils": "1.3.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-providers-http": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.3.5.tgz", - "integrity": "sha512-ZQOmceFjcajEZdiuqciXjijwIYWNmEJ1oxMtbrwB2eGxHRCMXEH2xGRUZuhOFNF88yQC/VXVi14yvYg5ZlFJlA==", - "dev": true, - "dependencies": { - "web3-core-helpers": "1.3.5", - "xhr2-cookies": "1.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-providers-ipc": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.3.5.tgz", - "integrity": "sha512-cbZOeb/sALiHjzMolJjIyHla/J5wdL2JKUtRO66Nh/uLALBCpU8JUgzNvpAdJ1ae3+A33+EdFStdzuDYHKtQew==", - "dev": true, - "dependencies": { - "oboe": "2.1.5", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-providers-ws": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.3.5.tgz", - "integrity": "sha512-zeZ4LMvKhYaJBDCqA//Bzgp4r/T0tNq5U/xvN0axA4YflzF7yqlsbzGwCkcZYDbrUaK3Ltl2uOmvwjbWALOZ1A==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.5", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-shh": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.3.5.tgz", - "integrity": "sha512-aRwzCduXvuGVslLL/Y15VcOHa70Qr2kxZI7UwOzQVhaaOdxuRRvo3AK/cmyln1Tsd54/n93Yk8I3qg5I2+6alw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-core": "1.3.5", - "web3-core-method": "1.3.5", - "web3-core-subscriptions": "1.3.5", - "web3-net": "1.3.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-utils": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.5.tgz", - "integrity": "sha512-5apMRm8ElYjI/92GHqijmaLC+s+d5lgjpjHft+rJSs/dsnX8I8tQreqev0dmU+wzU+2EEe4Sx9a/OwGWHhQv3A==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/web3-utils/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@openzeppelin/upgrades": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades/-/upgrades-2.8.0.tgz", - "integrity": "sha512-LzjTQPeljPsgHDPdZyH9cMCbIHZILgd2cpNcYEkdsC2IylBYRHShlbEDXJV9snnqg9JWfzPiKIqyj3XVliwtqQ==", - "deprecated": "The OpenZeppelin SDK is no longer being developed. For smart contract upgrades check out the OpenZeppelin Upgrades Plugins. https://zpl.in/upgrades-plugins", - "dependencies": { - "@types/cbor": "^2.0.0", - "axios": "^0.18.0", - "bignumber.js": "^7.2.0", - "cbor": "^4.1.5", - "chalk": "^2.4.1", - "ethers": "^4.0.20", - "glob": "^7.1.3", - "lodash": "^4.17.15", - "semver": "^5.5.1", - "spinnies": "^0.4.2", - "truffle-flattener": "^1.4.0", - "web3": "1.2.2", - "web3-eth": "1.2.2", - "web3-eth-contract": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "node_modules/@openzeppelin/upgrades/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" - }, - "node_modules/@openzeppelin/upgrades/node_modules/web3": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.2.tgz", - "integrity": "sha512-/ChbmB6qZpfGx6eNpczt5YSUBHEA5V2+iUCbn85EVb3Zv6FVxrOo5Tv7Lw0gE2tW7EEjASbCyp3mZeiZaCCngg==", - "hasInstallScript": true, - "dependencies": { - "@types/node": "^12.6.1", - "web3-bzz": "1.2.2", - "web3-core": "1.2.2", - "web3-eth": "1.2.2", - "web3-eth-personal": "1.2.2", - "web3-net": "1.2.2", - "web3-shh": "1.2.2", - "web3-utils": "1.2.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/upgrades/node_modules/web3-bzz": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.2.tgz", - "integrity": "sha512-b1O2ObsqUN1lJxmFSjvnEC4TsaCbmh7Owj3IAIWTKqL9qhVgx7Qsu5O9cD13pBiSPNZJ68uJPaKq380QB4NWeA==", - "dependencies": { - "@types/node": "^10.12.18", - "got": "9.6.0", - "swarm-js": "0.1.39", - "underscore": "1.9.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@openzeppelin/upgrades/node_modules/web3-bzz/node_modules/@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" - }, - "node_modules/@openzeppelin/upgrades/node_modules/web3-shh": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.2.tgz", - "integrity": "sha512-og258NPhlBn8yYrDWjoWBBb6zo1OlBgoWGT+LL5/LPqRbjPe09hlOYHgscAAr9zZGtohTOty7RrxYw6Z6oDWCg==", - "dependencies": { - "web3-core": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-net": "1.2.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "dev": true, - "optional": true - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "dev": true, - "optional": true - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "dev": true, - "optional": true - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "dev": true, - "optional": true - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dev": true, - "optional": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "dev": true, - "optional": true - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "dev": true, - "optional": true - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "dev": true, - "optional": true - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "dev": true, - "optional": true - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "dev": true, - "optional": true - }, - "node_modules/@redux-saga/core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.1.3.tgz", - "integrity": "sha512-8tInBftak8TPzE6X13ABmEtRJGjtK17w7VUs7qV17S8hCO5S3+aUTWZ/DBsBJPdE8Z5jOPwYALyvofgq1Ws+kg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.6.3", - "@redux-saga/deferred": "^1.1.2", - "@redux-saga/delay-p": "^1.1.2", - "@redux-saga/is": "^1.1.2", - "@redux-saga/symbols": "^1.1.2", - "@redux-saga/types": "^1.1.0", - "redux": "^4.0.4", - "typescript-tuple": "^2.2.1" - } - }, - "node_modules/@redux-saga/core/node_modules/redux": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", - "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, - "node_modules/@redux-saga/deferred": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@redux-saga/deferred/-/deferred-1.1.2.tgz", - "integrity": "sha512-908rDLHFN2UUzt2jb4uOzj6afpjgJe3MjICaUNO3bvkV/kN/cNeI9PMr8BsFXB/MR8WTAZQq/PlTq8Kww3TBSQ==", - "dev": true - }, - "node_modules/@redux-saga/delay-p": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.1.2.tgz", - "integrity": "sha512-ojc+1IoC6OP65Ts5+ZHbEYdrohmIw1j9P7HS9MOJezqMYtCDgpkoqB5enAAZrNtnbSL6gVCWPHaoaTY5KeO0/g==", - "dev": true, - "dependencies": { - "@redux-saga/symbols": "^1.1.2" - } - }, - "node_modules/@redux-saga/is": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@redux-saga/is/-/is-1.1.2.tgz", - "integrity": "sha512-OLbunKVsCVNTKEf2cH4TYyNbbPgvmZ52iaxBD4I1fTif4+MTXMa4/Z07L83zW/hTCXwpSZvXogqMqLfex2Tg6w==", - "dev": true, - "dependencies": { - "@redux-saga/symbols": "^1.1.2", - "@redux-saga/types": "^1.1.0" - } - }, - "node_modules/@redux-saga/symbols": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@redux-saga/symbols/-/symbols-1.1.2.tgz", - "integrity": "sha512-EfdGnF423glv3uMwLsGAtE6bg+R9MdqlHEzExnfagXPrIiuxwr3bdiAwz3gi+PsrQ3yBlaBpfGLtDG8rf3LgQQ==", - "dev": true - }, - "node_modules/@redux-saga/types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@redux-saga/types/-/types-1.1.0.tgz", - "integrity": "sha512-afmTuJrylUU/0OtqzaRkbyYFFNgCF73Bvel/sw90pvGrWIZ+vyoIJqA6eMSoA6+nb443kTmulmBtC9NerXboNg==", - "dev": true - }, - "node_modules/@resolver-engine/core": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@resolver-engine/core/-/core-0.2.1.tgz", - "integrity": "sha512-nsLQHmPJ77QuifqsIvqjaF5B9aHnDzJjp73Q1z6apY3e9nqYrx4Dtowhpsf7Jwftg/XzVDEMQC+OzUBNTS+S1A==", - "dependencies": { - "debug": "^3.1.0", - "request": "^2.85.0" - } - }, - "node_modules/@resolver-engine/fs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.2.1.tgz", - "integrity": "sha512-7kJInM1Qo2LJcKyDhuYzh9ZWd+mal/fynfL9BNjWOiTcOpX+jNfqb/UmGUqros5pceBITlWGqS4lU709yHFUbg==", - "dependencies": { - "@resolver-engine/core": "^0.2.1", - "debug": "^3.1.0" - } - }, - "node_modules/@resolver-engine/imports": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.2.2.tgz", - "integrity": "sha512-u5/HUkvo8q34AA+hnxxqqXGfby5swnH0Myw91o3Sm2TETJlNKXibFGSKBavAH+wvWdBi4Z5gS2Odu0PowgVOUg==", - "dependencies": { - "@resolver-engine/core": "^0.2.1", - "debug": "^3.1.0", - "hosted-git-info": "^2.6.0" - } - }, - "node_modules/@resolver-engine/imports-fs": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.2.2.tgz", - "integrity": "sha512-gFCgMvCwyppjwq0UzIjde/WI+yDs3oatJhozG9xdjJdewwtd7LiF0T5i9lrHAUtqrQbqoFE4E+ZMRVHWpWHpKQ==", - "dependencies": { - "@resolver-engine/fs": "^0.2.1", - "@resolver-engine/imports": "^0.2.2", - "debug": "^3.1.0" - } - }, - "node_modules/@scure/base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.0.0.tgz", - "integrity": "sha512-gIVaYhUsy+9s58m/ETjSJVKHhKTBMmcRb9cEV5/5dwvfDlfORjKrFsDeDHWRrm6RjcPvCLZFwGJjAjLj1gg4HA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@scure/bip32": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.0.1.tgz", - "integrity": "sha512-AU88KKTpQ+YpTLoicZ/qhFhRRIo96/tlb+8YmDDHR9yiKVjSsFZiefJO4wjS2PMTkz5/oIcw84uAq/8pleQURA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "@noble/hashes": "~1.0.0", - "@noble/secp256k1": "~1.5.2", - "@scure/base": "~1.0.0" - } - }, - "node_modules/@scure/bip39": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.0.0.tgz", - "integrity": "sha512-HrtcikLbd58PWOkl02k9V6nXWQyoa7A0+Ek9VF7z17DDk9XZAFUcIdqfh0jJXLypmizc5/8P6OxoUeKliiWv4w==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "@noble/hashes": "~1.0.0", - "@scure/base": "~1.0.0" - } - }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@solidity-parser/parser": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.6.2.tgz", - "integrity": "sha512-kUVUvrqttndeprLoXjI5arWHeiP3uh4XODAKbG+ZaWHCVQeelxCbnXBeWxZ2BPHdXgH0xR9dU1b916JhDhbgAA==" - }, - "node_modules/@stablelib/binary": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@stablelib/binary/-/binary-0.7.2.tgz", - "integrity": "sha1-GzOSFwyKh0HIuPhD6ilN5xrrLPc=", - "dev": true, - "dependencies": { - "@stablelib/int": "^0.5.0" - } - }, - "node_modules/@stablelib/blake2s": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@stablelib/blake2s/-/blake2s-0.10.4.tgz", - "integrity": "sha512-IasdklC7YfXXLmVbnsxqmd66+Ki+Ysbp0BtcrNxAtrGx/HRGjkUZbSTbEa7HxFhBWIstJRcE5ExgY+RCqAiULQ==", - "dev": true, - "dependencies": { - "@stablelib/binary": "^0.7.2", - "@stablelib/hash": "^0.5.0", - "@stablelib/wipe": "^0.5.0" - } - }, - "node_modules/@stablelib/blake2xs": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@stablelib/blake2xs/-/blake2xs-0.10.4.tgz", - "integrity": "sha512-1N0S4cruso/StV9TmoujPGj3RU0Cy42wlZneBWLWby7m2ssnY57l/CsYQSm03TshOoYss4hqc5kwSy5pmWAdUA==", - "dev": true, - "dependencies": { - "@stablelib/blake2s": "^0.10.4", - "@stablelib/hash": "^0.5.0", - "@stablelib/wipe": "^0.5.0" - } - }, - "node_modules/@stablelib/hash": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@stablelib/hash/-/hash-0.5.0.tgz", - "integrity": "sha1-if6QQKPUODsZIcfYpglIvDCEYGg=", - "dev": true - }, - "node_modules/@stablelib/int": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@stablelib/int/-/int-0.5.0.tgz", - "integrity": "sha1-zKkiWVHVXS3khlZ1V4R4hjNmDCs=", - "dev": true - }, - "node_modules/@stablelib/wipe": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@stablelib/wipe/-/wipe-0.5.0.tgz", - "integrity": "sha1-poLV+USOlQ4JnlN+b3L8lgJ10VE=", - "dev": true - }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/abi-utils": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.2.14.tgz", - "integrity": "sha512-2eHoWSFVutt+xAN8+g2x6N3+TM0AMUmGS4iW7KJNfxDsGdMBNe+qqUrDKM0NnA16yxqk95yQztO5EmWPiXw3+Q==", - "dev": true, - "dependencies": { - "change-case": "3.0.2", - "faker": "5.5.3", - "fast-check": "^2.12.1" - } - }, - "node_modules/@truffle/blockchain-utils": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.0.20.tgz", - "integrity": "sha512-BZY31tWdmf7QFc9ejzsqJ3zSsjIrJyiAYdjJfRBt1JFG/VBmYer4QiZgMQjlVE/1gB/RZAy2XOA91XlxkyfEMw==", - "dev": true, - "dependencies": { - "source-map-support": "^0.5.19" - } - }, - "node_modules/@truffle/code-utils": { - "version": "1.2.34", - "resolved": "https://registry.npmjs.org/@truffle/code-utils/-/code-utils-1.2.34.tgz", - "integrity": "sha512-Ie+PTdJIvK90voInSvn7WEdAsXd1VUw0TsX2225OMGVyYRWiQdX0K6Vfkib7RSZvdUEaURFAaHo5r57l2RacWg==", - "dev": true, - "dependencies": { - "cbor": "^5.1.0" - } - }, - "node_modules/@truffle/code-utils/node_modules/bignumber.js": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", - "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/@truffle/code-utils/node_modules/cbor": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", - "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", - "dev": true, - "dependencies": { - "bignumber.js": "^9.0.1", - "nofilter": "^1.0.4" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@truffle/codec": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.5.5.tgz", - "integrity": "sha512-RcpUnsWn3UoaBYL7jXOsJOLPnMzojQZEMW1LK7Wnc8ZNGWxL9fG6C3qcHepBogNyXy0Fhr1S4NaxgXTAFVRXHg==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "bn.js": "^4.11.8", - "debug": "^4.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.escaperegexp": "^4.1.2", - "lodash.partition": "^4.6.0", - "lodash.sum": "^4.0.2", - "semver": "^6.3.0", - "source-map-support": "^0.5.19", - "utf8": "^3.0.0", - "web3-utils": "1.2.1" - } - }, - "node_modules/@truffle/codec/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@truffle/codec/node_modules/eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@truffle/codec/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@truffle/codec/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@truffle/codec/node_modules/web3-utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.1.tgz", - "integrity": "sha512-Mrcn3l58L+yCKz3zBryM6JZpNruWuT0OCbag8w+reeNROSGVlXzUQkU+gtAwc9JCZ7tKUyg67+2YUGqUjVcyBA==", - "dev": true, - "dependencies": { - "bn.js": "4.11.8", - "eth-lib": "0.2.7", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randomhex": "0.1.5", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/codec/node_modules/web3-utils/node_modules/bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "node_modules/@truffle/compile-common": { - "version": "0.7.32", - "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.7.32.tgz", - "integrity": "sha512-SzIxwwQj8mJwoa7/kjkAslGenB4NejhmRHmdWdxNS5fqg2XqKhmSJcjir5qFjjvNzjcFZGecLg4EOm1Hj6letw==", - "dev": true, - "dependencies": { - "@truffle/error": "^0.1.0", - "colors": "1.4.0" - } - }, - "node_modules/@truffle/compile-common/node_modules/@truffle/error": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.0.tgz", - "integrity": "sha512-RbUfp5VreNhsa2Q4YbBjz18rOQI909pG32bghl1hulO7IpvcqTS+C3Ge5cNbiWQ1WGzy1wIeKLW0tmQtHFB7qg==", - "dev": true - }, - "node_modules/@truffle/config": { - "version": "1.3.31", - "resolved": "https://registry.npmjs.org/@truffle/config/-/config-1.3.31.tgz", - "integrity": "sha512-RTXtRiFrzUT1WVmP8KdBl/DJ2b9GV77gOYSZ3NILuSrEL8IzWq57F1G/9rg5jq1v8b5JLDd7db5Yitn53ipBdA==", - "dev": true, - "optional": true, - "dependencies": { - "@truffle/error": "^0.1.0", - "@truffle/events": "^0.1.8", - "@truffle/provider": "^0.2.56", - "conf": "^10.0.2", - "find-up": "^2.1.0", - "lodash": "^4.17.21", - "original-require": "^1.0.1" - } - }, - "node_modules/@truffle/config/node_modules/@truffle/error": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.0.tgz", - "integrity": "sha512-RbUfp5VreNhsa2Q4YbBjz18rOQI909pG32bghl1hulO7IpvcqTS+C3Ge5cNbiWQ1WGzy1wIeKLW0tmQtHFB7qg==", - "dev": true, - "optional": true - }, - "node_modules/@truffle/contract": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.2.10.tgz", - "integrity": "sha512-86h1qyw9reJRWmYiGkMreAIZaG5bnP4VHniBe/ufMvspQVhgVPHQtpuVJD9hr1BkXwBH9WHBFdLx6z9eeiFm4w==", - "dev": true, - "dependencies": { - "@truffle/blockchain-utils": "^0.0.20", - "@truffle/contract-schema": "^3.2.0", - "@truffle/debug-utils": "^4.1.7", - "@truffle/error": "^0.0.8", - "@truffle/interface-adapter": "^0.4.9", - "bignumber.js": "^7.2.1", - "ethereum-ens": "^0.8.0", - "ethers": "^4.0.0-beta.1", - "source-map-support": "^0.5.19", - "web3": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-promievent": "1.2.1", - "web3-eth-abi": "1.2.1", - "web3-utils": "1.2.1" - } - }, - "node_modules/@truffle/contract-schema": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.2.0.tgz", - "integrity": "sha512-yeb4UoK9cbrT5/Nuz0I0p2XKbf0K1wEmyyBQmo3Q4JOrLidxf59LtDupo9Uq74RtlTAxZC0cy9DnsfWeWVma4A==", - "dev": true, - "dependencies": { - "ajv": "^6.10.0", - "crypto-js": "^3.1.9-1", - "debug": "^4.1.0" - } - }, - "node_modules/@truffle/contract-schema/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@truffle/contract-schema/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@truffle/contract/node_modules/@types/node": { - "version": "10.17.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.26.tgz", - "integrity": "sha512-myMwkO2Cr82kirHY8uknNRHEVtn0wV3DTQfkrjx17jmkstDRZ24gNUdl8AHXVyVclTYI/bNjgTPTAWvWLqXqkw==", - "dev": true - }, - "node_modules/@truffle/contract/node_modules/bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "node_modules/@truffle/contract/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@truffle/contract/node_modules/scrypt-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", - "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=", - "dev": true - }, - "node_modules/@truffle/contract/node_modules/semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@truffle/contract/node_modules/web3": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.1.tgz", - "integrity": "sha512-nNMzeCK0agb5i/oTWNdQ1aGtwYfXzHottFP2Dz0oGIzavPMGSKyVlr8ibVb1yK5sJBjrWVnTdGaOC2zKDFuFRw==", - "dev": true, - "dependencies": { - "web3-bzz": "1.2.1", - "web3-core": "1.2.1", - "web3-eth": "1.2.1", - "web3-eth-personal": "1.2.1", - "web3-net": "1.2.1", - "web3-shh": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.1.tgz", - "integrity": "sha512-LdOO44TuYbGIPfL4ilkuS89GQovxUpmLz6C1UC7VYVVRILeZS740FVB3j9V4P4FHUk1RenaDfKhcntqgVCHtjw==", - "dev": true, - "dependencies": { - "got": "9.6.0", - "swarm-js": "0.1.39", - "underscore": "1.9.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.1.tgz", - "integrity": "sha512-5ODwIqgl8oIg/0+Ai4jsLxkKFWJYE0uLuE1yUKHNVCL4zL6n3rFjRMpKPokd6id6nJCNgeA64KdWQ4XfpnjdMg==", - "dev": true, - "dependencies": { - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-core-requestmanager": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.1.tgz", - "integrity": "sha512-Gx3sTEajD5r96bJgfuW377PZVFmXIH4TdqDhgGwd2lZQCcMi+DA4TgxJNJGxn0R3aUVzyyE76j4LBrh412mXrw==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "web3-eth-iban": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core-method": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.1.tgz", - "integrity": "sha512-Ghg2WS23qi6Xj8Od3VCzaImLHseEA7/usvnOItluiIc5cKs00WYWsNy2YRStzU9a2+z8lwQywPYp0nTzR/QXdQ==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1", - "web3-core-promievent": "1.2.1", - "web3-core-subscriptions": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core-promievent": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.1.tgz", - "integrity": "sha512-IVUqgpIKoeOYblwpex4Hye6npM0aMR+kU49VP06secPeN0rHMyhGF0ZGveWBrGvf8WDPI7jhqPBFIC6Jf3Q3zw==", - "dev": true, - "dependencies": { - "any-promise": "1.3.0", - "eventemitter3": "3.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core-requestmanager": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.1.tgz", - "integrity": "sha512-xfknTC69RfYmLKC+83Jz73IC3/sS2ZLhGtX33D4Q5nQ8yc39ElyAolxr9sJQS8kihOcM6u4J+8gyGMqsLcpIBg==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1", - "web3-providers-http": "1.2.1", - "web3-providers-ipc": "1.2.1", - "web3-providers-ws": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core-subscriptions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.1.tgz", - "integrity": "sha512-nmOwe3NsB8V8UFsY1r+sW6KjdOS68h8nuh7NzlWxBQT/19QSUGiERRTaZXWu5BYvo1EoZRMxCKyCQpSSXLc08g==", - "dev": true, - "dependencies": { - "eventemitter3": "3.1.2", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.1.tgz", - "integrity": "sha512-/2xly4Yry5FW1i+uygPjhfvgUP/MS/Dk+PDqmzp5M88tS86A+j8BzKc23GrlA8sgGs0645cpZK/999LpEF5UdA==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-core-subscriptions": "1.2.1", - "web3-eth-abi": "1.2.1", - "web3-eth-accounts": "1.2.1", - "web3-eth-contract": "1.2.1", - "web3-eth-ens": "1.2.1", - "web3-eth-iban": "1.2.1", - "web3-eth-personal": "1.2.1", - "web3-net": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-abi": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.1.tgz", - "integrity": "sha512-jI/KhU2a/DQPZXHjo2GW0myEljzfiKOn+h1qxK1+Y9OQfTcBMxrQJyH5AP89O6l6NZ1QvNdq99ThAxBFoy5L+g==", - "dev": true, - "dependencies": { - "ethers": "4.0.0-beta.3", - "underscore": "1.9.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-abi/node_modules/elliptic": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", - "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", - "dev": true, - "dependencies": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-abi/node_modules/ethers": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.3.tgz", - "integrity": "sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog==", - "dev": true, - "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.3", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-accounts": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.1.tgz", - "integrity": "sha512-26I4qq42STQ8IeKUyur3MdQ1NzrzCqPsmzqpux0j6X/XBD7EjZ+Cs0lhGNkSKH5dI3V8CJasnQ5T1mNKeWB7nQ==", - "dev": true, - "dependencies": { - "any-promise": "1.3.0", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.7", - "scryptsy": "2.1.0", - "semver": "6.2.0", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-accounts/node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-contract": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.1.tgz", - "integrity": "sha512-kYFESbQ3boC9bl2rYVghj7O8UKMiuKaiMkxvRH5cEDHil8V7MGEGZNH0slSdoyeftZVlaWSMqkRP/chfnKND0g==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-core-promievent": "1.2.1", - "web3-core-subscriptions": "1.2.1", - "web3-eth-abi": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-ens": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.1.tgz", - "integrity": "sha512-lhP1kFhqZr2nnbu3CGIFFrAnNxk2veXpOXBY48Tub37RtobDyHijHgrj+xTh+mFiPokyrapVjpFsbGa+Xzye4Q==", - "dev": true, - "dependencies": { - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-promievent": "1.2.1", - "web3-eth-abi": "1.2.1", - "web3-eth-contract": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-iban": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.1.tgz", - "integrity": "sha512-9gkr4QPl1jCU+wkgmZ8EwODVO3ovVj6d6JKMos52ggdT2YCmlfvFVF6wlGLwi0VvNa/p+0BjJzaqxnnG/JewjQ==", - "dev": true, - "dependencies": { - "bn.js": "4.11.8", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-personal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.1.tgz", - "integrity": "sha512-RNDVSiaSoY4aIp8+Hc7z+X72H7lMb3fmAChuSBADoEc7DsJrY/d0R5qQDK9g9t2BO8oxgLrLNyBP/9ub2Hc6Bg==", - "dev": true, - "dependencies": { - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-net": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-net": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.1.tgz", - "integrity": "sha512-Yt1Bs7WgnLESPe0rri/ZoPWzSy55ovioaP35w1KZydrNtQ5Yq4WcrAdhBzcOW7vAkIwrsLQsvA+hrOCy7mNauw==", - "dev": true, - "dependencies": { - "web3-core": "1.2.1", - "web3-core-method": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-providers-http": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.1.tgz", - "integrity": "sha512-BDtVUVolT9b3CAzeGVA/np1hhn7RPUZ6YYGB/sYky+GjeO311Yoq8SRDUSezU92x8yImSC2B+SMReGhd1zL+bQ==", - "dev": true, - "dependencies": { - "web3-core-helpers": "1.2.1", - "xhr2-cookies": "1.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-providers-ipc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.1.tgz", - "integrity": "sha512-oPEuOCwxVx8L4CPD0TUdnlOUZwGBSRKScCz/Ws2YHdr9Ium+whm+0NLmOZjkjQp5wovQbyBzNa6zJz1noFRvFA==", - "dev": true, - "dependencies": { - "oboe": "2.1.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-providers-ws": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.1.tgz", - "integrity": "sha512-oqsQXzu+ejJACVHy864WwIyw+oB21nw/pI65/sD95Zi98+/HQzFfNcIFneF1NC4bVF3VNX4YHTNq2I2o97LAiA==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1", - "websocket": "github:web3-js/WebSocket-Node#polyfill/globalThis" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-shh": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.1.tgz", - "integrity": "sha512-/3Cl04nza5kuFn25bV3FJWa0s3Vafr5BlT933h26xovQ6HIIz61LmvNQlvX1AhFL+SNJOTcQmK1SM59vcyC8bA==", - "dev": true, - "dependencies": { - "web3-core": "1.2.1", - "web3-core-method": "1.2.1", - "web3-core-subscriptions": "1.2.1", - "web3-net": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.1.tgz", - "integrity": "sha512-Mrcn3l58L+yCKz3zBryM6JZpNruWuT0OCbag8w+reeNROSGVlXzUQkU+gtAwc9JCZ7tKUyg67+2YUGqUjVcyBA==", - "dev": true, - "dependencies": { - "bn.js": "4.11.8", - "eth-lib": "0.2.7", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randomhex": "0.1.5", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/websocket": { - "version": "1.0.29", - "resolved": "git+ssh://git@github.com/web3-js/WebSocket-Node.git#ef5ea2f41daf4a2113b80c9223df884b4d56c400", - "integrity": "sha512-fS64f2anyRmFjuEVoqTbtgtV4Ay1dQ6kP078yM1RxnF0+9hNYk4iirrtII6FIoNoNgmhhIqzQaadEU6ZRpGoEw==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "nan": "^2.14.0", - "typedarray-to-buffer": "^3.1.5", - "yaeti": "^0.0.6" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@truffle/dashboard-message-bus-client": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@truffle/dashboard-message-bus-client/-/dashboard-message-bus-client-0.1.1.tgz", - "integrity": "sha512-tLcLxfnk8fa8m6gnnIiuIkJXMwOnm1gX60hXis091bEokJaR1/RYEdDQsFxy8/XkJmOOEfQ0NRD5ZPXn0KYvjA==", - "dev": true, - "optional": true, - "dependencies": { - "@truffle/dashboard-message-bus-common": "^0.1.1", - "@truffle/promise-tracker": "^0.1.0", - "axios": "^0.24.0", - "debug": "^4.3.1", - "delay": "^5.0.0", - "isomorphic-ws": "^4.0.1", - "tiny-typed-emitter": "^2.1.0", - "ws": "^7.2.0" - } - }, - "node_modules/@truffle/dashboard-message-bus-client/node_modules/axios": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", - "dev": true, - "optional": true, - "dependencies": { - "follow-redirects": "^1.14.4" - } - }, - "node_modules/@truffle/dashboard-message-bus-client/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@truffle/dashboard-message-bus-client/node_modules/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "optional": true, - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/@truffle/dashboard-message-bus-client/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "optional": true - }, - "node_modules/@truffle/dashboard-message-bus-client/node_modules/ws": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz", - "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@truffle/dashboard-message-bus-common": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@truffle/dashboard-message-bus-common/-/dashboard-message-bus-common-0.1.1.tgz", - "integrity": "sha512-DqrP2IQeao2u3en/csj9MwmEk7KKgLfvyHMwxrU6NyFXQ0Rs6F0AycpGTDivnoowVxqJohA+aut4IYHQuvwH8A==", - "dev": true, - "optional": true - }, - "node_modules/@truffle/db": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@truffle/db/-/db-1.0.12.tgz", - "integrity": "sha512-/7T3kHsMgih/QjtcTInllyo5W9OmAPCA+faHHGLgm0G76gML738NOwz3T/JZhjMKnQabYulZeWid0sjUlzlIPg==", - "dev": true, - "optional": true, - "dependencies": { - "@graphql-tools/delegate": "^8.4.3", - "@graphql-tools/schema": "^8.3.1", - "@truffle/abi-utils": "^0.2.14", - "@truffle/code-utils": "^1.2.34", - "@truffle/config": "^1.3.31", - "abstract-leveldown": "^7.2.0", - "apollo-server": "^3.6.3", - "debug": "^4.3.1", - "fs-extra": "^9.1.0", - "graphql": "^15.3.0", - "graphql-tag": "^2.11.0", - "json-stable-stringify": "^1.0.1", - "pascal-case": "^2.0.1", - "pluralize": "^8.0.0", - "pouchdb": "7.3.0", - "pouchdb-adapter-memory": "^7.1.1", - "pouchdb-adapter-node-websql": "^7.0.0", - "pouchdb-debug": "^7.1.1", - "pouchdb-find": "^7.0.0", - "web3-utils": "1.7.4" - } - }, - "node_modules/@truffle/db-loader": { - "version": "0.1.22", - "resolved": "https://registry.npmjs.org/@truffle/db-loader/-/db-loader-0.1.22.tgz", - "integrity": "sha512-n1ljxscIaci6r0qbJMw34ng2IQGK3lXMoowO5ohP9Gwaqxv+atNLsV7s/6YVmGgsLV8cDNIEZoKKnRh/EDJO4g==", - "dev": true, - "optionalDependencies": { - "@truffle/db": "^1.0.12" - } - }, - "node_modules/@truffle/db/node_modules/@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@truffle/db/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true, - "optional": true - }, - "node_modules/@truffle/db/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@truffle/db/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "optional": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@truffle/db/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "optional": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@truffle/db/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "optional": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@truffle/db/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "optional": true - }, - "node_modules/@truffle/db/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@truffle/db/node_modules/web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "dev": true, - "optional": true, - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debug-utils": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-4.1.7.tgz", - "integrity": "sha512-KV3OQPKud0Ymzntfb9Jxz/X6Ndz34m9qgcmmtqy/u7SRacOXHKs6Ov6QPT05QAUZdT6XgpegpSOiZCzbz+jpSQ==", - "dev": true, - "dependencies": { - "@truffle/codec": "^0.5.5", - "@trufflesuite/chromafi": "^2.1.2", - "chalk": "^2.4.2", - "debug": "^4.1.0", - "highlight.js": "^9.15.8", - "highlightjs-solidity": "^1.0.16", - "node-dir": "0.1.17" - } - }, - "node_modules/@truffle/debug-utils/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@truffle/debug-utils/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@truffle/debugger": { - "version": "10.0.16", - "resolved": "https://registry.npmjs.org/@truffle/debugger/-/debugger-10.0.16.tgz", - "integrity": "sha512-poXnJ+fLA2oTMHBhfuML4o1bMtersDVWypATi+YXxCvebVMUQMgOv1baVYDl0pK/J3FaLQSI1W7x8B6415f7cQ==", - "dev": true, - "dependencies": { - "@truffle/abi-utils": "^0.2.14", - "@truffle/codec": "^0.13.2", - "@truffle/source-map-utils": "^1.3.88", - "bn.js": "^5.1.3", - "debug": "^4.3.1", - "json-pointer": "^0.6.1", - "json-stable-stringify": "^1.0.1", - "lodash": "^4.17.21", - "redux": "^3.7.2", - "redux-saga": "1.0.0", - "reselect-tree": "^1.3.7", - "semver": "^7.3.4", - "web3": "1.7.4", - "web3-eth-abi": "1.7.4" - } - }, - "node_modules/@truffle/debugger/node_modules/@truffle/codec": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.13.2.tgz", - "integrity": "sha512-iViBnh6WV2BKaLboFC3xd9FGgC2Iybx4CHI+A5PPPqFkjnEycigdN8wnV2eqic9ptE1Ix7wsj9urZitnsnLhCA==", - "dev": true, - "dependencies": { - "@truffle/abi-utils": "^0.2.14", - "@truffle/compile-common": "^0.7.32", - "big.js": "^6.0.3", - "bn.js": "^5.1.3", - "cbor": "^5.1.0", - "debug": "^4.3.1", - "lodash": "^4.17.21", - "semver": "^7.3.4", - "utf8": "^3.0.0", - "web3-utils": "1.7.4" - } - }, - "node_modules/@truffle/debugger/node_modules/@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@truffle/debugger/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "node_modules/@truffle/debugger/node_modules/big.js": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.0.tgz", - "integrity": "sha512-paIKvJiAaOYdLt6MfnvxkDo64lTOV257XYJyX3oJnJQocIclUn+48k6ZerH/c5FxWE6DGJu1TKDYis7tqHg9kg==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/bigjs" - } - }, - "node_modules/@truffle/debugger/node_modules/bignumber.js": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", - "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/@truffle/debugger/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/@truffle/debugger/node_modules/cbor": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", - "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", - "dev": true, - "dependencies": { - "bignumber.js": "^9.0.1", - "nofilter": "^1.0.4" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@truffle/debugger/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true - }, - "node_modules/@truffle/debugger/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/debugger/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@truffle/debugger/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@truffle/debugger/node_modules/oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", - "dev": true, - "dependencies": { - "http-https": "^1.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/debugger/node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@truffle/debugger/node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true - }, - "node_modules/@truffle/debugger/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@truffle/debugger/node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "node_modules/@truffle/debugger/node_modules/swarm-js": { - "version": "0.1.40", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", - "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - } - }, - "node_modules/@truffle/debugger/node_modules/swarm-js/node_modules/got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "dependencies": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/debugger/node_modules/url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", - "dev": true, - "dependencies": { - "prepend-http": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@truffle/debugger/node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/@truffle/debugger/node_modules/web3": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.4.tgz", - "integrity": "sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-bzz": "1.7.4", - "web3-core": "1.7.4", - "web3-eth": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-shh": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-bzz": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.4.tgz", - "integrity": "sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz", - "integrity": "sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-requestmanager": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-core-helpers": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz", - "integrity": "sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg==", - "dev": true, - "dependencies": { - "web3-eth-iban": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-core-method": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz", - "integrity": "sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ==", - "dev": true, - "dependencies": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-core-promievent": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz", - "integrity": "sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-core-requestmanager": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz", - "integrity": "sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA==", - "dev": true, - "dependencies": { - "util": "^0.12.0", - "web3-core-helpers": "1.7.4", - "web3-providers-http": "1.7.4", - "web3-providers-ipc": "1.7.4", - "web3-providers-ws": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-core-subscriptions": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz", - "integrity": "sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-eth": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz", - "integrity": "sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug==", - "dev": true, - "dependencies": { - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-accounts": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-eth-ens": "1.7.4", - "web3-eth-iban": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-eth-abi": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz", - "integrity": "sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-eth-accounts": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz", - "integrity": "sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "^2.5.0", - "@ethereumjs/tx": "^3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-eth-accounts/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/@truffle/debugger/node_modules/web3-eth-accounts/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-eth-contract": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz", - "integrity": "sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-eth-ens": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz", - "integrity": "sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA==", - "dev": true, - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-eth-iban": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz", - "integrity": "sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-eth-personal": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz", - "integrity": "sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g==", - "dev": true, - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-net": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz", - "integrity": "sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg==", - "dev": true, - "dependencies": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-providers-http": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz", - "integrity": "sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA==", - "dev": true, - "dependencies": { - "web3-core-helpers": "1.7.4", - "xhr2-cookies": "1.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-providers-ipc": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz", - "integrity": "sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw==", - "dev": true, - "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-providers-ws": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz", - "integrity": "sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-shh": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz", - "integrity": "sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-net": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debugger/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@truffle/error": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.0.8.tgz", - "integrity": "sha512-x55rtRuNfRO1azmZ30iR0pf0OJ6flQqbax1hJz+Avk1K5fdmOv5cr22s9qFnwTWnS6Bw0jvJEoR0ITsM7cPKtQ==", - "dev": true - }, - "node_modules/@truffle/events": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@truffle/events/-/events-0.1.8.tgz", - "integrity": "sha512-oK+nnV9ToCk1qKW01l+bojV61sCj1zljcS5+xBZ9Dteb52mQ9tpsy6xuQXVcsHAhZOQ4Gz2S3bTrlvjU4AyeCQ==", - "dev": true, - "optional": true, - "dependencies": { - "@truffle/dashboard-message-bus-client": "^0.1.1", - "@truffle/spinners": "^0.2.0", - "debug": "^4.3.1", - "emittery": "^0.4.1", - "web3-utils": "1.7.4" - } - }, - "node_modules/@truffle/events/node_modules/@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@truffle/events/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true, - "optional": true - }, - "node_modules/@truffle/events/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@truffle/events/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "optional": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@truffle/events/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "optional": true - }, - "node_modules/@truffle/events/node_modules/web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "dev": true, - "optional": true, - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/hdwallet-provider": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@truffle/hdwallet-provider/-/hdwallet-provider-2.0.10.tgz", - "integrity": "sha512-0wOdWYciTEKy3doZCzkhcKbYN4QnwtLx/ihRelIsZZyklNe++fppOqjKKa4t+8t2g5r0Ji3i5xPFOc2CAdS+fQ==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "^2.4.0", - "@ethereumjs/tx": "^3.3.0", - "@metamask/eth-sig-util": "4.0.1", - "ethereum-cryptography": "1.0.3", - "ethereum-protocol": "^1.0.1", - "ethereumjs-util": "^6.1.0", - "ethereumjs-wallet": "^1.0.1", - "web3-provider-engine": "16.0.3" - } - }, - "node_modules/@truffle/hdwallet-provider/node_modules/@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@truffle/hdwallet-provider/node_modules/aes-js": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==", - "dev": true - }, - "node_modules/@truffle/hdwallet-provider/node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/@truffle/hdwallet-provider/node_modules/ethereum-cryptography": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.0.3.tgz", - "integrity": "sha512-NQLTW0x0CosoVb/n79x/TRHtfvS3hgNUPTUSCu0vM+9k6IIhHFFrAOJReneexjZsoZxMjJHnJn4lrE8EbnSyqQ==", - "dev": true, - "dependencies": { - "@noble/hashes": "1.0.0", - "@noble/secp256k1": "1.5.5", - "@scure/bip32": "1.0.1", - "@scure/bip39": "1.0.0" - } - }, - "node_modules/@truffle/hdwallet-provider/node_modules/ethereumjs-wallet": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-1.0.1.tgz", - "integrity": "sha512-3Z5g1hG1das0JWU6cQ9HWWTY2nt9nXCcwj7eXVNAHKbo00XAZO8+NHlwdgXDWrL0SXVQMvTWN8Q/82DRH/JhPw==", - "dev": true, - "dependencies": { - "aes-js": "^3.1.1", - "bs58check": "^2.1.2", - "ethereum-cryptography": "^0.1.3", - "ethereumjs-util": "^7.0.2", - "randombytes": "^2.0.6", - "scrypt-js": "^3.0.1", - "utf8": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "node_modules/@truffle/hdwallet-provider/node_modules/ethereumjs-wallet/node_modules/bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "dev": true - }, - "node_modules/@truffle/hdwallet-provider/node_modules/ethereumjs-wallet/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@truffle/hdwallet-provider/node_modules/ethereumjs-wallet/node_modules/ethereumjs-util": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz", - "integrity": "sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@truffle/hdwallet-provider/node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/@truffle/hdwallet-provider/node_modules/keccak": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@truffle/hdwallet-provider/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@truffle/hdwallet-provider/node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true - }, - "node_modules/@truffle/hdwallet-provider/node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@truffle/hdwallet-provider/node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "node_modules/@truffle/hdwallet-provider/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/@truffle/interface-adapter": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.4.9.tgz", - "integrity": "sha512-2dYccf7lAwx90NVYmn89QABpd3dx7BxvDAaHgzVa2YVOUkTUpkZiaIsD2YlsVQ1rew17wMNi5WXH2RFnmzQ82A==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.8", - "ethers": "^4.0.32", - "source-map-support": "^0.5.19", - "web3": "1.2.1" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/@types/node": { - "version": "10.17.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.26.tgz", - "integrity": "sha512-myMwkO2Cr82kirHY8uknNRHEVtn0wV3DTQfkrjx17jmkstDRZ24gNUdl8AHXVyVclTYI/bNjgTPTAWvWLqXqkw==", - "dev": true - }, - "node_modules/@truffle/interface-adapter/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/scrypt-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", - "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=", - "dev": true - }, - "node_modules/@truffle/interface-adapter/node_modules/semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.1.tgz", - "integrity": "sha512-nNMzeCK0agb5i/oTWNdQ1aGtwYfXzHottFP2Dz0oGIzavPMGSKyVlr8ibVb1yK5sJBjrWVnTdGaOC2zKDFuFRw==", - "dev": true, - "dependencies": { - "web3-bzz": "1.2.1", - "web3-core": "1.2.1", - "web3-eth": "1.2.1", - "web3-eth-personal": "1.2.1", - "web3-net": "1.2.1", - "web3-shh": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.1.tgz", - "integrity": "sha512-LdOO44TuYbGIPfL4ilkuS89GQovxUpmLz6C1UC7VYVVRILeZS740FVB3j9V4P4FHUk1RenaDfKhcntqgVCHtjw==", - "dev": true, - "dependencies": { - "got": "9.6.0", - "swarm-js": "0.1.39", - "underscore": "1.9.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.1.tgz", - "integrity": "sha512-5ODwIqgl8oIg/0+Ai4jsLxkKFWJYE0uLuE1yUKHNVCL4zL6n3rFjRMpKPokd6id6nJCNgeA64KdWQ4XfpnjdMg==", - "dev": true, - "dependencies": { - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-core-requestmanager": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.1.tgz", - "integrity": "sha512-Gx3sTEajD5r96bJgfuW377PZVFmXIH4TdqDhgGwd2lZQCcMi+DA4TgxJNJGxn0R3aUVzyyE76j4LBrh412mXrw==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "web3-eth-iban": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-method": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.1.tgz", - "integrity": "sha512-Ghg2WS23qi6Xj8Od3VCzaImLHseEA7/usvnOItluiIc5cKs00WYWsNy2YRStzU9a2+z8lwQywPYp0nTzR/QXdQ==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1", - "web3-core-promievent": "1.2.1", - "web3-core-subscriptions": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-promievent": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.1.tgz", - "integrity": "sha512-IVUqgpIKoeOYblwpex4Hye6npM0aMR+kU49VP06secPeN0rHMyhGF0ZGveWBrGvf8WDPI7jhqPBFIC6Jf3Q3zw==", - "dev": true, - "dependencies": { - "any-promise": "1.3.0", - "eventemitter3": "3.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-requestmanager": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.1.tgz", - "integrity": "sha512-xfknTC69RfYmLKC+83Jz73IC3/sS2ZLhGtX33D4Q5nQ8yc39ElyAolxr9sJQS8kihOcM6u4J+8gyGMqsLcpIBg==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1", - "web3-providers-http": "1.2.1", - "web3-providers-ipc": "1.2.1", - "web3-providers-ws": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-subscriptions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.1.tgz", - "integrity": "sha512-nmOwe3NsB8V8UFsY1r+sW6KjdOS68h8nuh7NzlWxBQT/19QSUGiERRTaZXWu5BYvo1EoZRMxCKyCQpSSXLc08g==", - "dev": true, - "dependencies": { - "eventemitter3": "3.1.2", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.1.tgz", - "integrity": "sha512-/2xly4Yry5FW1i+uygPjhfvgUP/MS/Dk+PDqmzp5M88tS86A+j8BzKc23GrlA8sgGs0645cpZK/999LpEF5UdA==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-core-subscriptions": "1.2.1", - "web3-eth-abi": "1.2.1", - "web3-eth-accounts": "1.2.1", - "web3-eth-contract": "1.2.1", - "web3-eth-ens": "1.2.1", - "web3-eth-iban": "1.2.1", - "web3-eth-personal": "1.2.1", - "web3-net": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-abi": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.1.tgz", - "integrity": "sha512-jI/KhU2a/DQPZXHjo2GW0myEljzfiKOn+h1qxK1+Y9OQfTcBMxrQJyH5AP89O6l6NZ1QvNdq99ThAxBFoy5L+g==", - "dev": true, - "dependencies": { - "ethers": "4.0.0-beta.3", - "underscore": "1.9.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-abi/node_modules/elliptic": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", - "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", - "dev": true, - "dependencies": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-abi/node_modules/ethers": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.3.tgz", - "integrity": "sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog==", - "dev": true, - "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.3", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.1.tgz", - "integrity": "sha512-26I4qq42STQ8IeKUyur3MdQ1NzrzCqPsmzqpux0j6X/XBD7EjZ+Cs0lhGNkSKH5dI3V8CJasnQ5T1mNKeWB7nQ==", - "dev": true, - "dependencies": { - "any-promise": "1.3.0", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.7", - "scryptsy": "2.1.0", - "semver": "6.2.0", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts/node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-contract": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.1.tgz", - "integrity": "sha512-kYFESbQ3boC9bl2rYVghj7O8UKMiuKaiMkxvRH5cEDHil8V7MGEGZNH0slSdoyeftZVlaWSMqkRP/chfnKND0g==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-core-promievent": "1.2.1", - "web3-core-subscriptions": "1.2.1", - "web3-eth-abi": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-ens": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.1.tgz", - "integrity": "sha512-lhP1kFhqZr2nnbu3CGIFFrAnNxk2veXpOXBY48Tub37RtobDyHijHgrj+xTh+mFiPokyrapVjpFsbGa+Xzye4Q==", - "dev": true, - "dependencies": { - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-promievent": "1.2.1", - "web3-eth-abi": "1.2.1", - "web3-eth-contract": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-iban": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.1.tgz", - "integrity": "sha512-9gkr4QPl1jCU+wkgmZ8EwODVO3ovVj6d6JKMos52ggdT2YCmlfvFVF6wlGLwi0VvNa/p+0BjJzaqxnnG/JewjQ==", - "dev": true, - "dependencies": { - "bn.js": "4.11.8", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-iban/node_modules/bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-personal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.1.tgz", - "integrity": "sha512-RNDVSiaSoY4aIp8+Hc7z+X72H7lMb3fmAChuSBADoEc7DsJrY/d0R5qQDK9g9t2BO8oxgLrLNyBP/9ub2Hc6Bg==", - "dev": true, - "dependencies": { - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-net": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-net": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.1.tgz", - "integrity": "sha512-Yt1Bs7WgnLESPe0rri/ZoPWzSy55ovioaP35w1KZydrNtQ5Yq4WcrAdhBzcOW7vAkIwrsLQsvA+hrOCy7mNauw==", - "dev": true, - "dependencies": { - "web3-core": "1.2.1", - "web3-core-method": "1.2.1", - "web3-utils": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-providers-http": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.1.tgz", - "integrity": "sha512-BDtVUVolT9b3CAzeGVA/np1hhn7RPUZ6YYGB/sYky+GjeO311Yoq8SRDUSezU92x8yImSC2B+SMReGhd1zL+bQ==", - "dev": true, - "dependencies": { - "web3-core-helpers": "1.2.1", - "xhr2-cookies": "1.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-providers-ipc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.1.tgz", - "integrity": "sha512-oPEuOCwxVx8L4CPD0TUdnlOUZwGBSRKScCz/Ws2YHdr9Ium+whm+0NLmOZjkjQp5wovQbyBzNa6zJz1noFRvFA==", - "dev": true, - "dependencies": { - "oboe": "2.1.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-providers-ws": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.1.tgz", - "integrity": "sha512-oqsQXzu+ejJACVHy864WwIyw+oB21nw/pI65/sD95Zi98+/HQzFfNcIFneF1NC4bVF3VNX4YHTNq2I2o97LAiA==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1", - "websocket": "github:web3-js/WebSocket-Node#polyfill/globalThis" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-shh": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.1.tgz", - "integrity": "sha512-/3Cl04nza5kuFn25bV3FJWa0s3Vafr5BlT933h26xovQ6HIIz61LmvNQlvX1AhFL+SNJOTcQmK1SM59vcyC8bA==", - "dev": true, - "dependencies": { - "web3-core": "1.2.1", - "web3-core-method": "1.2.1", - "web3-core-subscriptions": "1.2.1", - "web3-net": "1.2.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.1.tgz", - "integrity": "sha512-Mrcn3l58L+yCKz3zBryM6JZpNruWuT0OCbag8w+reeNROSGVlXzUQkU+gtAwc9JCZ7tKUyg67+2YUGqUjVcyBA==", - "dev": true, - "dependencies": { - "bn.js": "4.11.8", - "eth-lib": "0.2.7", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randomhex": "0.1.5", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-utils/node_modules/bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "node_modules/@truffle/interface-adapter/node_modules/websocket": { - "version": "1.0.29", - "resolved": "git+ssh://git@github.com/web3-js/WebSocket-Node.git#ef5ea2f41daf4a2113b80c9223df884b4d56c400", - "integrity": "sha512-fS64f2anyRmFjuEVoqTbtgtV4Ay1dQ6kP078yM1RxnF0+9hNYk4iirrtII6FIoNoNgmhhIqzQaadEU6ZRpGoEw==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "nan": "^2.14.0", - "typedarray-to-buffer": "^3.1.5", - "yaeti": "^0.0.6" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@truffle/promise-tracker": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@truffle/promise-tracker/-/promise-tracker-0.1.0.tgz", - "integrity": "sha512-XH9gf7Vfgn4iPnERpJJPFSob85LXeKg8tkoUZku8JdAYUNIjVztLVJQwh54exsz7Npe6RPh/Hcj8Tiw65uooiA==", - "dev": true, - "optional": true - }, - "node_modules/@truffle/provider": { - "version": "0.2.56", - "resolved": "https://registry.npmjs.org/@truffle/provider/-/provider-0.2.56.tgz", - "integrity": "sha512-9mz03psTeWkL45IrF3NUTiKO46HUi+9Lkco3rVjqzUQ+5rAhld0TwOljKbLvVKbDFtHl5LVuC+H4uQP8fpoXSg==", - "dev": true, - "optional": true, - "dependencies": { - "@truffle/error": "^0.1.0", - "@truffle/interface-adapter": "^0.5.18", - "debug": "^4.3.1", - "web3": "1.7.4" - } - }, - "node_modules/@truffle/provider/node_modules/@truffle/error": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.0.tgz", - "integrity": "sha512-RbUfp5VreNhsa2Q4YbBjz18rOQI909pG32bghl1hulO7IpvcqTS+C3Ge5cNbiWQ1WGzy1wIeKLW0tmQtHFB7qg==", - "dev": true, - "optional": true - }, - "node_modules/@truffle/provider/node_modules/@truffle/interface-adapter": { - "version": "0.5.18", - "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.18.tgz", - "integrity": "sha512-OPrz7bf+TDjZGruXzm6d08SpFNGERctf4O9uC6IJjNmjvKtdEYcLY3DTXOZT6I9PmrViCJ+dC5VlZD5IaamQnQ==", - "dev": true, - "optional": true, - "dependencies": { - "bn.js": "^5.1.3", - "ethers": "^4.0.32", - "web3": "1.7.4" - } - }, - "node_modules/@truffle/provider/node_modules/@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@truffle/provider/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true, - "optional": true - }, - "node_modules/@truffle/provider/node_modules/bignumber.js": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", - "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", - "dev": true, - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/@truffle/provider/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true, - "optional": true - }, - "node_modules/@truffle/provider/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@truffle/provider/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "optional": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true, - "optional": true - }, - "node_modules/@truffle/provider/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/provider/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "optional": true - }, - "node_modules/@truffle/provider/node_modules/oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", - "dev": true, - "optional": true, - "dependencies": { - "http-https": "^1.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/provider/node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@truffle/provider/node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true, - "optional": true - }, - "node_modules/@truffle/provider/node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true, - "optional": true - }, - "node_modules/@truffle/provider/node_modules/swarm-js": { - "version": "0.1.40", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", - "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", - "dev": true, - "optional": true, - "dependencies": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - } - }, - "node_modules/@truffle/provider/node_modules/swarm-js/node_modules/got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "optional": true, - "dependencies": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/provider/node_modules/url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", - "dev": true, - "optional": true, - "dependencies": { - "prepend-http": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@truffle/provider/node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "optional": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/@truffle/provider/node_modules/web3": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.4.tgz", - "integrity": "sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "web3-bzz": "1.7.4", - "web3-core": "1.7.4", - "web3-eth": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-shh": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-bzz": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.4.tgz", - "integrity": "sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz", - "integrity": "sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q==", - "dev": true, - "optional": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-requestmanager": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-helpers": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz", - "integrity": "sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg==", - "dev": true, - "optional": true, - "dependencies": { - "web3-eth-iban": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-method": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz", - "integrity": "sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ==", - "dev": true, - "optional": true, - "dependencies": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-promievent": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz", - "integrity": "sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA==", - "dev": true, - "optional": true, - "dependencies": { - "eventemitter3": "4.0.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-requestmanager": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz", - "integrity": "sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA==", - "dev": true, - "optional": true, - "dependencies": { - "util": "^0.12.0", - "web3-core-helpers": "1.7.4", - "web3-providers-http": "1.7.4", - "web3-providers-ipc": "1.7.4", - "web3-providers-ws": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-subscriptions": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz", - "integrity": "sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g==", - "dev": true, - "optional": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz", - "integrity": "sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug==", - "dev": true, - "optional": true, - "dependencies": { - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-accounts": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-eth-ens": "1.7.4", - "web3-eth-iban": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-abi": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz", - "integrity": "sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg==", - "dev": true, - "optional": true, - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-accounts": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz", - "integrity": "sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw==", - "dev": true, - "optional": true, - "dependencies": { - "@ethereumjs/common": "^2.5.0", - "@ethereumjs/tx": "^3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-accounts/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "optional": true - }, - "node_modules/@truffle/provider/node_modules/web3-eth-accounts/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "optional": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-contract": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz", - "integrity": "sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ==", - "dev": true, - "optional": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-ens": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz", - "integrity": "sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA==", - "dev": true, - "optional": true, - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-iban": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz", - "integrity": "sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w==", - "dev": true, - "optional": true, - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-personal": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz", - "integrity": "sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-net": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz", - "integrity": "sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg==", - "dev": true, - "optional": true, - "dependencies": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-providers-http": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz", - "integrity": "sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA==", - "dev": true, - "optional": true, - "dependencies": { - "web3-core-helpers": "1.7.4", - "xhr2-cookies": "1.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-providers-ipc": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz", - "integrity": "sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw==", - "dev": true, - "optional": true, - "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-providers-ws": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz", - "integrity": "sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ==", - "dev": true, - "optional": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-shh": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz", - "integrity": "sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-net": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "dev": true, - "optional": true, - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/source-map-utils": { - "version": "1.3.88", - "resolved": "https://registry.npmjs.org/@truffle/source-map-utils/-/source-map-utils-1.3.88.tgz", - "integrity": "sha512-8PMvCR+l2TpyEO5CV5uA6w87w7Nqqhd5zM0ukwYhfrTAmBqNNPk+pWYAjaL7fVThDeaOkVy+aoOo0rUW5SzAfw==", - "dev": true, - "dependencies": { - "@truffle/code-utils": "^1.2.34", - "@truffle/codec": "^0.13.2", - "debug": "^4.3.1", - "json-pointer": "^0.6.1", - "node-interval-tree": "^1.3.3", - "web3-utils": "1.7.4" - } - }, - "node_modules/@truffle/source-map-utils/node_modules/@truffle/codec": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.13.2.tgz", - "integrity": "sha512-iViBnh6WV2BKaLboFC3xd9FGgC2Iybx4CHI+A5PPPqFkjnEycigdN8wnV2eqic9ptE1Ix7wsj9urZitnsnLhCA==", - "dev": true, - "dependencies": { - "@truffle/abi-utils": "^0.2.14", - "@truffle/compile-common": "^0.7.32", - "big.js": "^6.0.3", - "bn.js": "^5.1.3", - "cbor": "^5.1.0", - "debug": "^4.3.1", - "lodash": "^4.17.21", - "semver": "^7.3.4", - "utf8": "^3.0.0", - "web3-utils": "1.7.4" - } - }, - "node_modules/@truffle/source-map-utils/node_modules/@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@truffle/source-map-utils/node_modules/big.js": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.0.tgz", - "integrity": "sha512-paIKvJiAaOYdLt6MfnvxkDo64lTOV257XYJyX3oJnJQocIclUn+48k6ZerH/c5FxWE6DGJu1TKDYis7tqHg9kg==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/bigjs" - } - }, - "node_modules/@truffle/source-map-utils/node_modules/bignumber.js": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", - "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/@truffle/source-map-utils/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/@truffle/source-map-utils/node_modules/cbor": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", - "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", - "dev": true, - "dependencies": { - "bignumber.js": "^9.0.1", - "nofilter": "^1.0.4" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@truffle/source-map-utils/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@truffle/source-map-utils/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@truffle/source-map-utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@truffle/source-map-utils/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@truffle/source-map-utils/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@truffle/source-map-utils/node_modules/web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/source-map-utils/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@truffle/spinners": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@truffle/spinners/-/spinners-0.2.0.tgz", - "integrity": "sha512-rX0qA7GRDzN2ILClUIifMrVzF9EMR9b23CNasJkBgLBvqp1xKwdMbHG3IwUTYelGQtnGQmZ4UZQsBdDb6wf1Tw==", - "dev": true, - "optional": true, - "dependencies": { - "@trufflesuite/spinnies": "^0.1.0" - } - }, - "node_modules/@trufflesuite/chromafi": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-2.1.2.tgz", - "integrity": "sha512-KcfjcH3B8+lHfSTfugFPBpMZmppLNCnM6/PP8ByrQLSACyjh9UOMUWHAW3FDHKEt1cOCzIFXrx2f4AFFrQFxSg==", - "dev": true, - "dependencies": { - "ansi-mark": "^1.0.0", - "ansi-regex": "^3.0.0", - "array-uniq": "^1.0.3", - "camelcase": "^4.1.0", - "chalk": "^2.3.2", - "cheerio": "^1.0.0-rc.2", - "detect-indent": "^5.0.0", - "he": "^1.1.1", - "highlight.js": "^9.12.0", - "husky": "^0.14.3", - "lodash.merge": "^4.6.2", - "min-indent": "^1.0.0", - "strip-ansi": "^4.0.0", - "strip-indent": "^2.0.0", - "super-split": "^1.1.0" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@trufflesuite/spinnies": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@trufflesuite/spinnies/-/spinnies-0.1.0.tgz", - "integrity": "sha512-22rVi7rECyAg9vsopa9jR84xQ9kSbjRxCYI9SPbHx4jjfRQODDzmVZtXLobUuXEQZYLgP1pXBtgY5kReb72E2g==", - "dev": true, - "optional": true, - "dependencies": { - "chalk": "^4.1.2", - "cli-cursor": "^3.1.0", - "strip-ansi": "^6.0.0" - } - }, - "node_modules/@trufflesuite/spinnies/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@trufflesuite/spinnies/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@trufflesuite/spinnies/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "optional": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@trufflesuite/spinnies/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@trufflesuite/spinnies/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true - }, - "node_modules/@trufflesuite/spinnies/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@trufflesuite/spinnies/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "optional": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@trufflesuite/spinnies/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "optional": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@types/accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "optional": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/cbor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/cbor/-/cbor-2.0.0.tgz", - "integrity": "sha1-xievwu4i8j8jN/7LNGKKT5fGr7s=", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "node_modules/@types/concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", - "dev": true, - "optional": true - }, - "node_modules/@types/country-data": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@types/country-data/-/country-data-0.0.0.tgz", - "integrity": "sha512-lIxCk6G7AwmUagQ4gIQGxUBnvAq664prFD9nSAz6dgd1XmBXBtZABV/op+QsJsIyaP1GZsf/iXhYKHX3azSRCw==", - "dev": true - }, - "node_modules/@types/debug": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", - "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==", - "dev": true - }, - "node_modules/@types/elliptic": { - "version": "6.4.12", - "resolved": "https://registry.npmjs.org/@types/elliptic/-/elliptic-6.4.12.tgz", - "integrity": "sha512-gP1KsqoouLJGH6IJa28x7PXb3cRqh83X8HCLezd2dF+XcAIMKYv53KV+9Zn6QA561E120uOqZBQ+Jy/cl+fviw==", - "dev": true, - "dependencies": { - "@types/bn.js": "*" - } - }, - "node_modules/@types/ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@types/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-qwQgQqXXTRv2h2AlJef+tMEszLFkCB9dWnrJYIdAwqjubERXEc/geB+S3apRw0yQyTVnsBf8r6BhlrE8vx+3WQ==", - "dev": true, - "dependencies": { - "@types/bn.js": "*", - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.29", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", - "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/form-data": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", - "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/google-libphonenumber": { - "version": "7.4.19", - "resolved": "https://registry.npmjs.org/@types/google-libphonenumber/-/google-libphonenumber-7.4.19.tgz", - "integrity": "sha512-Rm2VhKzu4UofafuTrNTG6fy+385x1PIomnTGGSzOXGbKLpXAhNlUG+7F6UdcIosM5JMvXcJBnwUW/u4qQmt0yg==", - "dev": true - }, - "node_modules/@types/lodash": { - "version": "4.14.168", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", - "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==", - "dev": true - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "dev": true, - "optional": true - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true, - "optional": true - }, - "node_modules/@types/node": { - "version": "14.0.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.14.tgz", - "integrity": "sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ==" - }, - "node_modules/@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/qs": { - "version": "6.9.3", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.3.tgz", - "integrity": "sha512-7s9EQWupR1fTc2pSMtXRQ9w9gLOcrJn+h7HOXw4evxyvVqMi4f+q7d2tnFe3ng3SNHjtK+0EzGMGFUQX4/AQRA==", - "dev": true - }, - "node_modules/@types/randombytes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/randombytes/-/randombytes-2.0.0.tgz", - "integrity": "sha512-bz8PhAVlwN72vqefzxa14DKNT8jK/mV66CSjwdVQM/k3Th3EPKfUtdMniwZgMedQTFuywAsfjnZsg+pEnltaMA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true, - "optional": true - }, - "node_modules/@types/secp256k1": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.1.tgz", - "integrity": "sha512-+ZjSA8ELlOp8SlKi0YLB2tz9d5iPNEmOBd+8Rz21wTMdaXQIa9b6TEnD6l5qKOCypE7FSyPyck12qZJxSDNoog==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "dev": true, - "optional": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/utf8": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@types/utf8/-/utf8-2.1.6.tgz", - "integrity": "sha512-pRs2gYF5yoKYrgSaira0DJqVg2tFuF+Qjp838xS7K+mJyY2jJzjsrl6y17GbIa4uMRogMbxs+ghNCvKg6XyNrA==", - "dev": true - }, - "node_modules/@umpirsky/country-list": { - "version": "1.0.0", - "resolved": "git+ssh://git@github.com/umpirsky/country-list.git#05fda51cd97b3294e8175ffed06104c44b3c71d7", - "integrity": "sha512-iJcpUOtwOC1xLIp7yyK3ZLYjT/zCrf0BT+e5BGTUYkIF4FpC+W+8WVwm2nJNXiWqbiOLI7z3jtvCR3qJYnU5kA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "optional": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/abstract-leveldown": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", - "integrity": "sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==", - "dev": true, - "optional": true, - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.0.0", - "is-buffer": "^2.0.5", - "level-concat-iterator": "^3.0.0", - "level-supports": "^2.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/abstract-leveldown/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", - "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0" - } - }, - "node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" - }, - "node_modules/ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "optional": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "optional": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "optional": true - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "dependencies": { - "type-fest": "^0.11.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-mark": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ansi-mark/-/ansi-mark-1.0.4.tgz", - "integrity": "sha1-HNS6jVfxXxCdaq9uycqXhsik7mw=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0", - "array-uniq": "^1.0.3", - "chalk": "^2.3.2", - "strip-ansi": "^4.0.0", - "super-split": "^1.1.0" - } - }, - "node_modules/ansi-mark/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-mark/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/apollo-datasource": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-3.3.2.tgz", - "integrity": "sha512-L5TiS8E2Hn/Yz7SSnWIVbZw0ZfEIXZCa5VUiVxD9P53JvSrf4aStvsFDlGWPvpIdCR+aly2CfoB79B9/JjKFqg==", - "dev": true, - "optional": true, - "dependencies": { - "@apollo/utils.keyvaluecache": "^1.0.1", - "apollo-server-env": "^4.2.1" - }, - "engines": { - "node": ">=12.0" - } - }, - "node_modules/apollo-reporting-protobuf": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.3.3.tgz", - "integrity": "sha512-L3+DdClhLMaRZWVmMbBcwl4Ic77CnEBPXLW53F7hkYhkaZD88ivbCVB1w/x5gunO6ZHrdzhjq0FHmTsBvPo7aQ==", - "deprecated": "The `apollo-reporting-protobuf` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/usage-reporting-protobuf` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details.", - "dev": true, - "optional": true, - "dependencies": { - "@apollo/protobufjs": "1.2.6" - } - }, - "node_modules/apollo-server": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/apollo-server/-/apollo-server-3.9.0.tgz", - "integrity": "sha512-g80gXDuK8fl2W0fQF/hEyeoO9AU+sO2gBzeJAYUyGLotYc+oL/Y3mTRk5GB8C7cXUXCg5uvWbUj8va0E5UZE7w==", - "dev": true, - "optional": true, - "dependencies": { - "@types/express": "4.17.13", - "apollo-server-core": "^3.9.0", - "apollo-server-express": "^3.9.0", - "express": "^4.17.1" - }, - "peerDependencies": { - "graphql": "^15.3.0 || ^16.0.0" - } - }, - "node_modules/apollo-server-core": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-3.11.1.tgz", - "integrity": "sha512-t/eCKrRFK1lYZlc5pHD99iG7Np7CEm3SmbDiONA7fckR3EaB/pdsEdIkIwQ5QBBpT5JLp/nwvrZRVwhaWmaRvw==", - "deprecated": "The `apollo-server-core` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/server` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details.", - "dev": true, - "optional": true, - "dependencies": { - "@apollo/utils.keyvaluecache": "^1.0.1", - "@apollo/utils.logger": "^1.0.0", - "@apollo/utils.usagereporting": "^1.0.0", - "@apollographql/apollo-tools": "^0.5.3", - "@apollographql/graphql-playground-html": "1.6.29", - "@graphql-tools/mock": "^8.1.2", - "@graphql-tools/schema": "^8.0.0", - "@josephg/resolvable": "^1.0.0", - "apollo-datasource": "^3.3.2", - "apollo-reporting-protobuf": "^3.3.3", - "apollo-server-env": "^4.2.1", - "apollo-server-errors": "^3.3.1", - "apollo-server-plugin-base": "^3.7.1", - "apollo-server-types": "^3.7.1", - "async-retry": "^1.2.1", - "fast-json-stable-stringify": "^2.1.0", - "graphql-tag": "^2.11.0", - "loglevel": "^1.6.8", - "lru-cache": "^6.0.0", - "node-abort-controller": "^3.0.1", - "sha.js": "^2.4.11", - "uuid": "^9.0.0", - "whatwg-mimetype": "^3.0.0" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "graphql": "^15.3.0 || ^16.0.0" - } - }, - "node_modules/apollo-server-core/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/apollo-server-core/node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true, - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/apollo-server-core/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "optional": true - }, - "node_modules/apollo-server-env": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-4.2.1.tgz", - "integrity": "sha512-vm/7c7ld+zFMxibzqZ7SSa5tBENc4B0uye9LTfjJwGoQFY5xsUPH5FpO5j0bMUDZ8YYNbrF9SNtzc5Cngcr90g==", - "dev": true, - "optional": true, - "dependencies": { - "node-fetch": "^2.6.7" - }, - "engines": { - "node": ">=12.0" - } - }, - "node_modules/apollo-server-errors": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-3.3.1.tgz", - "integrity": "sha512-xnZJ5QWs6FixHICXHxUfm+ZWqqxrNuPlQ+kj5m6RtEgIpekOPssH/SD9gf2B4HuWV0QozorrygwZnux8POvyPA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "graphql": "^15.3.0 || ^16.0.0" - } - }, - "node_modules/apollo-server-express": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-3.9.0.tgz", - "integrity": "sha512-scSeHy9iB7W3OiF3uLQEzad9Jm9tEfDF8ACsJb2P+xX69uqg6zizsrQvj3qRhazCO7FKMcMu9zQFR0hy7zKbUA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/accepts": "^1.3.5", - "@types/body-parser": "1.19.2", - "@types/cors": "2.8.12", - "@types/express": "4.17.13", - "@types/express-serve-static-core": "4.17.29", - "accepts": "^1.3.5", - "apollo-server-core": "^3.9.0", - "apollo-server-types": "^3.6.1", - "body-parser": "^1.19.0", - "cors": "^2.8.5", - "parseurl": "^1.3.3" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "express": "^4.17.1", - "graphql": "^15.3.0 || ^16.0.0" - } - }, - "node_modules/apollo-server-plugin-base": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-3.7.1.tgz", - "integrity": "sha512-g3vJStmQtQvjGI289UkLMfThmOEOddpVgHLHT2bNj0sCD/bbisj4xKbBHETqaURokteqSWyyd4RDTUe0wAUDNQ==", - "deprecated": "The `apollo-server-plugin-base` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/server` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details.", - "dev": true, - "optional": true, - "dependencies": { - "apollo-server-types": "^3.7.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "graphql": "^15.3.0 || ^16.0.0" - } - }, - "node_modules/apollo-server-types": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-3.7.1.tgz", - "integrity": "sha512-aE9RDVplmkaOj/OduNmGa+0a1B5RIWI0o3zC1zLvBTVWMKTpo0ifVf11TyMkLCY+T7cnZqVqwyShziOyC3FyUw==", - "deprecated": "The `apollo-server-types` package is part of Apollo Server v2 and v3, which are now deprecated (end-of-life October 22nd 2023). This package's functionality is now found in the `@apollo/server` package. See https://www.apollographql.com/docs/apollo-server/previous-versions/ for more details.", - "dev": true, - "optional": true, - "dependencies": { - "@apollo/utils.keyvaluecache": "^1.0.1", - "@apollo/utils.logger": "^1.0.0", - "apollo-reporting-protobuf": "^3.3.3", - "apollo-server-env": "^4.2.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "graphql": "^15.3.0 || ^16.0.0" - } - }, - "node_modules/app-module-path": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", - "integrity": "sha1-ZBqlXft9am8KgUHEucCqULbCTdU=", - "dev": true - }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "node_modules/are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "dev": true, - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/argsarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/argsarray/-/argsarray-0.0.1.tgz", - "integrity": "sha512-u96dg2GcAKtpTrBdDoFIM7PjcBA+6rSP0OR94MOReNRyUECL6MtQt5XXmRr4qrftYaef9+l5hcpO5te7sML1Cg==", - "dev": true, - "optional": true - }, - "node_modules/arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "dependencies": { - "arr-flatten": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", - "dev": true - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "node_modules/async-eventemitter": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", - "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "dev": true, - "dependencies": { - "async": "^2.4.0" - } - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "node_modules/async-mutex": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.2.6.tgz", - "integrity": "sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==", - "dev": true, - "dependencies": { - "tslib": "^2.0.0" - } - }, - "node_modules/async-mutex/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "dev": true, - "optional": true, - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/atomically": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", - "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", - "dev": true, - "optional": true, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", - "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", - "dev": true, - "dependencies": { - "array-filter": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" - }, - "node_modules/axios": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", - "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", - "deprecated": "Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410", - "dependencies": { - "follow-redirects": "1.5.10", - "is-buffer": "^2.0.2" - } - }, - "node_modules/babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "node_modules/babel-code-frame/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-code-frame/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-code-frame/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-code-frame/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-code-frame/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "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" - } - }, - "node_modules/babel-core/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/babel-core/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "dependencies": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - } - }, - "node_modules/babel-generator/node_modules/detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "dependencies": { - "repeating": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-generator/node_modules/jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/babel-generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-helper-bindify-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", - "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "dependencies": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "dependencies": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-explode-class": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", - "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", - "dev": true, - "dependencies": { - "babel-helper-bindify-decorators": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "dependencies": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "dependencies": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "node_modules/babel-plugin-syntax-async-generators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", - "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", - "dev": true - }, - "node_modules/babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", - "dev": true - }, - "node_modules/babel-plugin-syntax-decorators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", - "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", - "dev": true - }, - "node_modules/babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", - "dev": true - }, - "node_modules/babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "node_modules/babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "node_modules/babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "node_modules/babel-plugin-transform-async-generator-functions": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", - "dev": true, - "dependencies": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-generators": "^6.5.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "dependencies": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "dev": true, - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-plugin-syntax-class-properties": "^6.8.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", - "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "dev": true, - "dependencies": { - "babel-helper-explode-class": "^6.24.1", - "babel-plugin-syntax-decorators": "^6.13.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "dependencies": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "dependencies": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "dependencies": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "node_modules/babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "dependencies": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "dependencies": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "dependencies": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "dependencies": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "dependencies": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "dependencies": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "node_modules/babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "dependencies": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "dependencies": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "node_modules/babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "dependencies": { - "regenerator-transform": "^0.10.0" - } - }, - "node_modules/babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - } - }, - "node_modules/babel-polyfill/node_modules/regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - }, - "node_modules/babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "deprecated": "🙌 Thanks for using Babel: we recommend using babel-preset-env now: please read https://babeljs.io/env to update!", - "dev": true, - "dependencies": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.24.1", - "babel-plugin-transform-es2015-classes": "^6.24.1", - "babel-plugin-transform-es2015-computed-properties": "^6.24.1", - "babel-plugin-transform-es2015-destructuring": "^6.22.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", - "babel-plugin-transform-es2015-for-of": "^6.22.0", - "babel-plugin-transform-es2015-function-name": "^6.24.1", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-umd": "^6.24.1", - "babel-plugin-transform-es2015-object-super": "^6.24.1", - "babel-plugin-transform-es2015-parameters": "^6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", - "babel-plugin-transform-regenerator": "^6.24.1" - } - }, - "node_modules/babel-preset-stage-2": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", - "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "dev": true, - "dependencies": { - "babel-plugin-syntax-dynamic-import": "^6.18.0", - "babel-plugin-transform-class-properties": "^6.24.1", - "babel-plugin-transform-decorators": "^6.24.1", - "babel-preset-stage-3": "^6.24.1" - } - }, - "node_modules/babel-preset-stage-3": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", - "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "dev": true, - "dependencies": { - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-generator-functions": "^6.24.1", - "babel-plugin-transform-async-to-generator": "^6.24.1", - "babel-plugin-transform-exponentiation-operator": "^6.24.1", - "babel-plugin-transform-object-rest-spread": "^6.22.0" - } - }, - "node_modules/babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "dependencies": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - } - }, - "node_modules/babel-register/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/babel-register/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-register/node_modules/source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "dependencies": { - "source-map": "^0.5.6" - } - }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "node_modules/babel-runtime/node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "node_modules/babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "dependencies": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-traverse/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "node_modules/babel-types/node_modules/to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true, - "bin": { - "babylon": "bin/babylon.js" - } - }, - "node_modules/backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", - "dev": true, - "dependencies": { - "precond": "0.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base-x": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", - "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/big-integer": { - "version": "1.6.48", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", - "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/bigi": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/bigi/-/bigi-1.4.2.tgz", - "integrity": "sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU=", - "dev": true - }, - "node_modules/bignumber.js": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", - "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bip32": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.5.tgz", - "integrity": "sha512-zVY4VvJV+b2fS0/dcap/5XLlpqtgwyN8oRkuGgAS1uLOeEp0Yo6Tw2yUTozTtlrMJO3G8n4g/KX/XGFHW6Pq3g==", - "dev": true, - "dependencies": { - "@types/node": "10.12.18", - "bs58check": "^2.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "tiny-secp256k1": "^1.1.3", - "typeforce": "^1.11.5", - "wif": "^2.0.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/bip32/node_modules/@types/node": { - "version": "10.12.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", - "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", - "dev": true - }, - "node_modules/bip39": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.2.tgz", - "integrity": "sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ==", - "dev": true, - "dependencies": { - "@types/node": "11.11.6", - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" - } - }, - "node_modules/bip39/node_modules/@types/node": { - "version": "11.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", - "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==", - "dev": true - }, - "node_modules/bip66": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/blakejs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz", - "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=", - "dev": true - }, - "node_modules/bls12377js": { - "version": "0.1.0", - "resolved": "git+ssh://git@github.com/celo-org/bls12377js.git#cb38a4cfb643c778619d79b20ca3e5283a2122a6", - "integrity": "sha512-genS+AxHQKkrKA2xa1C1HCzSlZM8S/ZQEnjqET9u78/fpbHrNbXWvFYypYA3h7ukTD+WpF0hh+S9yxH6mhx4iA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@stablelib/blake2xs": "0.10.4", - "@types/node": "^12.11.7", - "big-integer": "^1.6.44", - "chai": "^4.2.0", - "mocha": "^6.2.2", - "ts-node": "^8.4.1", - "typescript": "^3.6.4" - } - }, - "node_modules/bls12377js/node_modules/@types/node": { - "version": "12.19.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.16.tgz", - "integrity": "sha512-7xHmXm/QJ7cbK2laF+YYD7gb5MggHIIQwqyjin3bpEGiSuvScMQ5JZZXPvRipi1MwckTQbJZROMns/JxdnIL1Q==", - "dev": true - }, - "node_modules/bls12377js/node_modules/ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/bls12377js/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/bls12377js/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/bls12377js/node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/bls12377js/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/bls12377js/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/bls12377js/node_modules/log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "dependencies": { - "chalk": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/bls12377js/node_modules/mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/bls12377js/node_modules/mocha": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", - "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", - "dev": true, - "dependencies": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.4", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/bls12377js/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "node_modules/bls12377js/node_modules/node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "dependencies": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node_modules/bls12377js/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bls12377js/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/bls12377js/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/bls12377js/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/bls12377js/node_modules/supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/bn-chai": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bn-chai/-/bn-chai-1.0.1.tgz", - "integrity": "sha512-7rJXt21DwYiLLpvzLaACixBBoUGkRV1iuFD3wElEhw8Ji9IiY/QsJRtvW+c7ChRgEOyLQkGaSGFUUqBKm21SNA==", - "dev": true, - "peerDependencies": { - "chai": ">= 2.1.2 < 5" - } - }, - "node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - }, - "node_modules/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dependencies": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dependencies": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", - "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.2", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/browserify-sign/node_modules/bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==" - }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/browserslist": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.1.tgz", - "integrity": "sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001359", - "electron-to-chromium": "^1.4.172", - "node-releases": "^2.0.5", - "update-browserslist-db": "^1.0.4" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", - "dev": true, - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dev": true, - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/btoa": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", - "dev": true, - "bin": { - "btoa": "bin/btoa.js" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/buffer-reverse": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-reverse/-/buffer-reverse-1.0.1.tgz", - "integrity": "sha1-SSg8jvpvkBvAH6MwTQYCeXGuL2A=", - "dev": true - }, - "node_modules/buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "node_modules/bufferutil": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz", - "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.2.0" - } - }, - "node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cache-base/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", - "dev": true, - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001363", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001363.tgz", - "integrity": "sha512-HpQhpzTGGPVMnCjIomjt+jvyUu8vNFo3TaDiZ/RcoTrlOq/5+tC8zHdsbgFB6MxmaY+jCpsH09aD80Bb4Ow3Sg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "node_modules/catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cbor": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-4.3.0.tgz", - "integrity": "sha512-CvzaxQlaJVa88sdtTWvLJ++MbdtPHtZOBBNjm7h3YKUHILMs9nQyD4AC6hvFZy7GBVB3I6bRibJcxeHydyT2IQ==", - "dependencies": { - "bignumber.js": "^9.0.0", - "commander": "^3.0.0", - "json-text-sequence": "^0.1", - "nofilter": "^1.0.3" - }, - "bin": { - "cbor2comment": "bin/cbor2comment", - "cbor2diag": "bin/cbor2diag", - "cbor2json": "bin/cbor2json", - "json2cbor": "bin/json2cbor" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/cbor/node_modules/bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", - "engines": { - "node": "*" - } - }, - "node_modules/chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chai-bn": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/chai-bn/-/chai-bn-0.2.1.tgz", - "integrity": "sha512-01jt2gSXAw7UYFPT5K8d7HYjdXj2vyeIuE+0T/34FWzlNcVbs1JkPxRu7rYMfQnJhrHT8Nr6qjSf5ZwwLU2EYg==", - "dev": true, - "peerDependencies": { - "bn.js": "^4.11.0", - "chai": "^4.0.0" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/change-case": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", - "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", - "dev": true, - "dependencies": { - "camel-case": "^3.0.0", - "constant-case": "^2.0.0", - "dot-case": "^2.1.0", - "header-case": "^1.0.0", - "is-lower-case": "^1.1.0", - "is-upper-case": "^1.1.0", - "lower-case": "^1.1.1", - "lower-case-first": "^1.0.0", - "no-case": "^2.3.2", - "param-case": "^2.1.0", - "pascal-case": "^2.0.0", - "path-case": "^2.1.0", - "sentence-case": "^2.1.0", - "snake-case": "^2.1.0", - "swap-case": "^1.1.0", - "title-case": "^2.1.0", - "upper-case": "^1.1.1", - "upper-case-first": "^1.1.0" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/checkpoint-store": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", - "integrity": "sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg==", - "dev": true, - "dependencies": { - "functional-red-black-tree": "^1.0.1" - } - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", - "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", - "dev": true, - "dependencies": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.1", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.1" - } - }, - "node_modules/chokidar/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - }, - "node_modules/cids": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", - "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", - "deprecated": "This module has been superseded by the multiformats module", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "^1.0.0", - "multihashes": "~0.4.15" - }, - "engines": { - "node": ">=4.0.0", - "npm": ">=3.0.0" - } - }, - "node_modules/cids/node_modules/multicodec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", - "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", - "deprecated": "This module has been superseded by the multiformats module", - "dev": true, - "dependencies": { - "buffer": "^5.6.0", - "varint": "^5.0.0" - } - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/circular": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/circular/-/circular-1.0.5.tgz", - "integrity": "sha1-fad6+Yu96c5LWzWM1Va13e0tMUk=", - "dev": true - }, - "node_modules/class-is": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", - "dev": true - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-logger": { - "version": "0.5.40", - "resolved": "https://registry.npmjs.org/cli-logger/-/cli-logger-0.5.40.tgz", - "integrity": "sha1-CX8OEbByx8aYomxH9YiinCC0iws=", - "dev": true, - "dependencies": { - "circular": "^1.0.5", - "cli-util": "~1.1.27" - } - }, - "node_modules/cli-regexp": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/cli-regexp/-/cli-regexp-0.1.2.tgz", - "integrity": "sha1-a82TsJ+y7RAl0woRVdWZeVSlNRI=", - "dev": true - }, - "node_modules/cli-table3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", - "dev": true, - "dependencies": { - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - }, - "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "colors": "^1.1.2" - } - }, - "node_modules/cli-table3/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-table3/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-util": { - "version": "1.1.27", - "resolved": "https://registry.npmjs.org/cli-util/-/cli-util-1.1.27.tgz", - "integrity": "sha1-QtaeNqBAoyH8nPhRwVE8rcUJMFQ=", - "dev": true, - "dependencies": { - "cli-regexp": "~0.1.0" - } - }, - "node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dependencies": { - "mimic-response": "^1.0.0" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true - }, - "node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/conf": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/conf/-/conf-10.1.2.tgz", - "integrity": "sha512-o9Fv1Mv+6A0JpoayQ8JleNp3hhkbOJP/Re/Q+QqxMPHPkABVsRjQGWZn9A5GcqLiTNC6d89p2PB5ZhHVDSMwyg==", - "dev": true, - "optional": true, - "dependencies": { - "ajv": "^8.6.3", - "ajv-formats": "^2.1.1", - "atomically": "^1.7.0", - "debounce-fn": "^4.0.0", - "dot-prop": "^6.0.1", - "env-paths": "^2.2.1", - "json-schema-typed": "^7.0.3", - "onetime": "^5.1.2", - "pkg-up": "^3.1.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/conf/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "optional": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/conf/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "optional": true - }, - "node_modules/conf/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conf/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conf/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "optional": true - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true, - "optional": true - }, - "node_modules/constant-case": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", - "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", - "dev": true, - "dependencies": { - "snake-case": "^2.1.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/content-hash": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", - "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", - "dev": true, - "dependencies": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" - } - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/convert-source-map/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "node_modules/cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, - "hasInstallScript": true - }, - "node_modules/core-js-compat": { - "version": "3.23.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.3.tgz", - "integrity": "sha512-WSzUs2h2vvmKsacLHNTdpyOC9k43AEhcGoFlVgCY4L7aw98oSBKtPL6vD0/TqZjRWRQYdDSLkzZIni4Crbbiqw==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.0", - "semver": "7.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/country-data": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/country-data/-/country-data-0.0.31.tgz", - "integrity": "sha1-gJZrjh0Uf6bWpYnTKTP4eTd0lW0=", - "dev": true, - "dependencies": { - "currency-symbol-map": "~2", - "underscore": ">1.4.4" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/cross-fetch": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.6.tgz", - "integrity": "sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA==", - "dev": true, - "dependencies": { - "node-fetch": "^2.6.7", - "whatwg-fetch": "^2.0.4" - } - }, - "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/crypto-js": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", - "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==", - "dev": true - }, - "node_modules/css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "dependencies": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "node_modules/css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/cssfilter": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", - "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==", - "dev": true, - "optional": true - }, - "node_modules/currency-symbol-map": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/currency-symbol-map/-/currency-symbol-map-2.2.0.tgz", - "integrity": "sha1-KzwYcv8aws5ZXYJz5Y4f/wJyrqI=", - "dev": true - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/dataloader": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.1.0.tgz", - "integrity": "sha512-qTcEYLen3r7ojZNgVUaRggOI+KM7jrKxXeSHhogh/TWxYMeONEMqY+hmkobiYQozsGIyg9OYVzO4ZIfoB4I0pQ==", - "dev": true, - "optional": true - }, - "node_modules/debounce-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", - "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", - "dev": true, - "optional": true, - "dependencies": { - "mimic-fn": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/debounce-fn/node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/decompress": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", - "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", - "dependencies": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "dependencies": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "dependencies": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-tarbz2/node_modules/file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "dependencies": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", - "dependencies": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-unzip/node_modules/file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-unzip/node_modules/get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "dependencies": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, - "node_modules/deferred-leveldown": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", - "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", - "dev": true, - "optional": true, - "dependencies": { - "abstract-leveldown": "~6.2.1", - "inherits": "^2.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deferred-leveldown/node_modules/abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "dev": true, - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deferred-leveldown/node_modules/level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/deferred-leveldown/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "optional": true, - "dependencies": { - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delay": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", - "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true, - "optional": true - }, - "node_modules/delimit-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", - "integrity": "sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs=" - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "node_modules/detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/dir-to-object": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-to-object/-/dir-to-object-2.0.0.tgz", - "integrity": "sha512-sXs0JKIhymON7T1UZuO2Ud6VTNAx/VTBXIl4+3mjb2RgfOpt+hectX0x04YqPOPdkeOAKoJuKqwqnXXURNPNEA==", - "dev": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dev": true, - "dependencies": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "node_modules/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" - }, - "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/dot-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", - "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", - "dev": true, - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "optional": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/double-ended-queue": { - "version": "2.1.0-0", - "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", - "integrity": "sha512-+BNfZ+deCo8hMNpDqDnvT+c0XpJ5cUa6mqYq89bho2Ifze4URTqRkcwR399hWoTrTkbZ/XJYDgP6rc7pRgffEQ==", - "dev": true, - "optional": true - }, - "node_modules/drbg.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", - "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", - "dependencies": { - "browserify-aes": "^1.0.6", - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.179", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.179.tgz", - "integrity": "sha512-1XeTb/U/8Xgh2YgPOqhakLYsvCcU4U7jUjTMbEnhIJoIWd/Qt3yC8y0cbG+fHzn4zUNF99Ey1xiPf20bwgLO3Q==", - "dev": true - }, - "node_modules/elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", - "dependencies": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "node_modules/emittery": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.4.1.tgz", - "integrity": "sha512-r4eRSeStEGf6M5SKdrQhhLK5bOwOBxQhIE3YSTnZE3GpKiLfnnhE+tPtrJE79+eDJgm39BM6LSoI8SCx4HbwlQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding-down": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", - "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", - "dev": true, - "optional": true, - "dependencies": { - "abstract-leveldown": "^6.2.1", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/encoding-down/node_modules/abstract-leveldown": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", - "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", - "dev": true, - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/encoding-down/node_modules/level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/encoding-down/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "optional": true, - "dependencies": { - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/end-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/end-stream/-/end-stream-0.1.0.tgz", - "integrity": "sha512-Brl10T8kYnc75IepKizW6Y9liyW8ikz1B7n/xoHrJxoVSSjoqPn30sb7XVFfQERK4QfUMYRGs9dhWwtt2eu6uA==", - "dev": true, - "optional": true, - "dependencies": { - "write-stream": "~0.4.3" - } - }, - "node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eol": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", - "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==", - "dev": true - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dev": true, - "dependencies": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-google": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.13.0.tgz", - "integrity": "sha512-ELgMdOIpn0CFdsQS+FuxO+Ttu4p+aLaXHv9wA9yVnzqlUGV7oN/eRRnJekk7TCur6Cu2FXX0fqfIXRBaM14lpQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "eslint": ">=5.16.0" - } - }, - "node_modules/eslint-config-keep": { - "version": "0.3.0", - "resolved": "git+ssh://git@github.com/keep-network/eslint-config-keep.git#fed0f9a92d4bb4abbf738266d7521b56a08987ee", - "integrity": "sha512-Cz7kreFZ5CNsg1CvLKO+3a6q/q+/tb0QcXIluhe8iT1VqJ8Haif0GHW1pX/xYJ5VcfBxTysvXJIH2wwAjn9sBw==", - "dev": true, - "dependencies": { - "eslint-config-google": "^0.13.0", - "eslint-config-prettier": "^6.10.0", - "eslint-plugin-no-only-tests": "^2.3.1", - "eslint-plugin-prettier": "^3.1.2" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "eslint": ">=6.8.0", - "prettier": ">=1.19.1" - } - }, - "node_modules/eslint-config-prettier": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", - "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", - "dev": true, - "dependencies": { - "get-stdin": "^6.0.0" - }, - "bin": { - "eslint-config-prettier-check": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=3.14.1" - } - }, - "node_modules/eslint-plugin-no-only-tests": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.6.0.tgz", - "integrity": "sha512-T9SmE/g6UV1uZo1oHAqOvL86XWl7Pl2EpRpnLI8g/bkJu+h7XBCB+1LnubRZ2CUQXj805vh4/CYZdnqtVaEo2Q==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", - "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "eslint": ">=5.0.0", - "prettier": ">=1.13.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", - "dev": true, - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "dependencies": { - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/eslint/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/eslint/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", - "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "dependencies": { - "estraverse": "^4.1.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eth-block-tracker": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz", - "integrity": "sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw==", - "dev": true, - "dependencies": { - "@babel/plugin-transform-runtime": "^7.5.5", - "@babel/runtime": "^7.5.5", - "eth-query": "^2.1.0", - "json-rpc-random-id": "^1.0.1", - "pify": "^3.0.0", - "safe-event-emitter": "^1.0.1" - } - }, - "node_modules/eth-block-tracker/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=", - "dependencies": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" - } - }, - "node_modules/eth-gas-reporter": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.17.tgz", - "integrity": "sha512-MsrUqeXTAFU9QEdAIdaVu+QeU1XwFsKvPDEC68iheppVR5xUP11h4SyPhSRZiGfOzXr1CfTtPM/B6wPGtt7/LA==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.0.0-beta.146", - "@solidity-parser/parser": "^0.5.2", - "cli-table3": "^0.5.0", - "colors": "^1.1.2", - "ethereumjs-util": "6.2.0", - "ethers": "^4.0.40", - "fs-readdir-recursive": "^1.1.0", - "lodash": "^4.17.14", - "markdown-table": "^1.1.3", - "mocha": "^7.1.1", - "req-cwd": "^2.0.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "sha1": "^1.1.1", - "sync-request": "^6.0.0" - }, - "peerDependencies": { - "@codechecks/client": "^0.1.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/@solidity-parser/parser": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.5.2.tgz", - "integrity": "sha512-uRyvnvVYmgNmTBpWDbBsH/0kPESQhQpEc4KsvMRLVzFJ1o1s0uIv0Y6Y9IB5vI1Dwz2CbS4X/y4Wyw/75cTFnQ==", - "dev": true - }, - "node_modules/eth-json-rpc-filters": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz", - "integrity": "sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw==", - "dev": true, - "dependencies": { - "@metamask/safe-event-emitter": "^2.0.0", - "async-mutex": "^0.2.6", - "eth-json-rpc-middleware": "^6.0.0", - "eth-query": "^2.1.2", - "json-rpc-engine": "^6.1.0", - "pify": "^5.0.0" - } - }, - "node_modules/eth-json-rpc-filters/node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eth-json-rpc-infura": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz", - "integrity": "sha512-THzLye3PHUSGn1EXMhg6WTLW9uim7LQZKeKaeYsS9+wOBcamRiCQVGHa6D2/4P0oS0vSaxsBnU/J6qvn0MPdow==", - "dev": true, - "dependencies": { - "eth-json-rpc-middleware": "^6.0.0", - "eth-rpc-errors": "^3.0.0", - "json-rpc-engine": "^5.3.0", - "node-fetch": "^2.6.0" - } - }, - "node_modules/eth-json-rpc-infura/node_modules/json-rpc-engine": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz", - "integrity": "sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g==", - "dev": true, - "dependencies": { - "eth-rpc-errors": "^3.0.0", - "safe-event-emitter": "^1.0.1" - } - }, - "node_modules/eth-json-rpc-middleware": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz", - "integrity": "sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ==", - "dev": true, - "dependencies": { - "btoa": "^1.2.1", - "clone": "^2.1.1", - "eth-query": "^2.1.2", - "eth-rpc-errors": "^3.0.0", - "eth-sig-util": "^1.4.2", - "ethereumjs-util": "^5.1.2", - "json-rpc-engine": "^5.3.0", - "json-stable-stringify": "^1.0.1", - "node-fetch": "^2.6.1", - "pify": "^3.0.0", - "safe-event-emitter": "^1.0.1" - } - }, - "node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/eth-json-rpc-middleware/node_modules/json-rpc-engine": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz", - "integrity": "sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g==", - "dev": true, - "dependencies": { - "eth-rpc-errors": "^3.0.0", - "safe-event-emitter": "^1.0.1" - } - }, - "node_modules/eth-json-rpc-middleware/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eth-lib": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", - "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/eth-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", - "integrity": "sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==", - "dev": true, - "dependencies": { - "json-rpc-random-id": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "node_modules/eth-rpc-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz", - "integrity": "sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg==", - "dev": true, - "dependencies": { - "fast-safe-stringify": "^2.0.6" - } - }, - "node_modules/eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha512-iNZ576iTOGcfllftB73cPB5AN+XUQAT/T8xzsILsghXC1o8gJUqe3RHlcDqagu+biFpYQ61KQrZZJza8eRSYqw==", - "deprecated": "Deprecated in favor of '@metamask/eth-sig-util'", - "dev": true, - "dependencies": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "ethereumjs-util": "^5.1.1" - } - }, - "node_modules/eth-sig-util/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ethereum-bloom-filters": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.7.tgz", - "integrity": "sha512-cDcJJSJ9GMAcURiAWO3DxIEhTL/uWqlQnvgKpuYQzYPrt/izuGU+1ntQmHt0IRq6ADoSYHFnB+aCEFIldjhkMQ==", - "dependencies": { - "js-sha3": "^0.8.0" - } - }, - "node_modules/ethereum-bloom-filters/node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, - "node_modules/ethereum-common": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", - "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==", - "dev": true - }, - "node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/ethereum-cryptography/node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/ethereum-cryptography/node_modules/keccak": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", - "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ethereum-cryptography/node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true - }, - "node_modules/ethereum-cryptography/node_modules/secp256k1": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", - "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "elliptic": "^6.5.2", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ethereum-cryptography/node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "node_modules/ethereum-ens": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/ethereum-ens/-/ethereum-ens-0.8.0.tgz", - "integrity": "sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==", - "dev": true, - "dependencies": { - "bluebird": "^3.4.7", - "eth-ens-namehash": "^2.0.0", - "js-sha3": "^0.5.7", - "pako": "^1.0.4", - "underscore": "^1.8.3", - "web3": "^1.0.0-beta.34" - } - }, - "node_modules/ethereum-protocol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ethereum-protocol/-/ethereum-protocol-1.0.1.tgz", - "integrity": "sha512-3KLX1mHuEsBW0dKG+c6EOJS1NBNqdCICvZW9sInmZTt5aY0oxmHVggYRE0lJu1tcnMD1K+AKHdLi6U43Awm1Vg==", - "dev": true - }, - "node_modules/ethereumjs-abi": { - "version": "0.6.8", - "resolved": "git+ssh://git@github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - } - }, - "node_modules/ethereumjs-account": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", - "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", - "dev": true, - "dependencies": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ethereumjs-account/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ethereumjs-block": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", - "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", - "deprecated": "New package name format for new versions: @ethereumjs/block. Please update.", - "dev": true, - "dependencies": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - } - }, - "node_modules/ethereumjs-block/node_modules/ethereumjs-tx": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", - "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", - "deprecated": "New package name format for new versions: @ethereumjs/tx. Please update.", - "dev": true, - "dependencies": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } - }, - "node_modules/ethereumjs-block/node_modules/ethereumjs-tx/node_modules/ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ==", - "dev": true - }, - "node_modules/ethereumjs-block/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ethereumjs-common": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.1.tgz", - "integrity": "sha512-aVUPRLgmXORGXXEVkFYgPhr9TGtpBY2tGhZ9Uh0A3lIUzUDr1x6kQx33SbjPUkLkX3eniPQnIL/2psjkjrOfcQ==", - "deprecated": "New package name format for new versions: @ethereumjs/common. Please update." - }, - "node_modules/ethereumjs-tx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", - "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", - "deprecated": "New package name format for new versions: @ethereumjs/tx. Please update.", - "dependencies": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "node_modules/ethereumjs-util": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz", - "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==", - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^2.0.0", - "rlp": "^2.2.3", - "secp256k1": "^3.0.1" - } - }, - "node_modules/ethereumjs-vm": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", - "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", - "deprecated": "New package name format for new versions: @ethereumjs/vm. Please update.", - "dev": true, - "dependencies": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ethereumjs-vm/node_modules/ethereumjs-block": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", - "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", - "deprecated": "New package name format for new versions: @ethereumjs/block. Please update.", - "dev": true, - "dependencies": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - } - }, - "node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ethereumjs-wallet": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz", - "integrity": "sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA==", - "dev": true, - "dependencies": { - "aes-js": "^3.1.1", - "bs58check": "^2.1.2", - "ethereum-cryptography": "^0.1.3", - "ethereumjs-util": "^6.0.0", - "randombytes": "^2.0.6", - "safe-buffer": "^5.1.2", - "scryptsy": "^1.2.1", - "utf8": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "node_modules/ethereumjs-wallet/node_modules/aes-js": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==", - "dev": true - }, - "node_modules/ethereumjs-wallet/node_modules/scryptsy": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", - "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", - "dev": true, - "dependencies": { - "pbkdf2": "^3.0.3" - } - }, - "node_modules/ethereumjs-wallet/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/ethers": { - "version": "4.0.47", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.47.tgz", - "integrity": "sha512-hssRYhngV4hiDNeZmVU/k5/E8xmLG8UpcNUzg6mb7lqhgpFPH/t7nuv20RjRrEf0gblzvi2XwR5Te+V3ZFc9pQ==", - "dependencies": { - "aes-js": "3.0.0", - "bn.js": "^4.4.0", - "elliptic": "6.5.2", - "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" - } - }, - "node_modules/ethjs-abi": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.2.1.tgz", - "integrity": "sha1-4KepOn6BFjqUR3utVu3lJKtt5TM=", - "dev": true, - "dependencies": { - "bn.js": "4.11.6", - "js-sha3": "0.5.5", - "number-to-bn": "1.7.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/ethjs-abi/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true - }, - "node_modules/ethjs-abi/node_modules/js-sha3": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", - "integrity": "sha1-uvDA6MVK1ZA0R9+Wreekobynmko=", - "dev": true - }, - "node_modules/ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", - "dependencies": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/ethjs-unit/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "node_modules/ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "dependencies": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/execa/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/exit-hook": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", - "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "dependencies": { - "is-posix-bracket": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "dependencies": { - "fill-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-range/node_modules/fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "dependencies": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-range/node_modules/is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dependencies": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "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.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dependencies": { - "type": "^2.0.0" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fake-merkle-patricia-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz", - "integrity": "sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA==", - "dev": true, - "dependencies": { - "checkpoint-store": "^1.1.0" - } - }, - "node_modules/faker": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", - "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==", - "dev": true - }, - "node_modules/fast-check": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-2.25.0.tgz", - "integrity": "sha512-wRUT2KD2lAmT75WNIJIHECawoUUMHM0I5jrlLXGtGeqmPL8jl/EldUDjY1VCp6fDY8yflyfUeIOsOBrIbIiArg==", - "dev": true, - "dependencies": { - "pure-rand": "^5.0.1" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fetch-cookie": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-0.11.0.tgz", - "integrity": "sha512-BQm7iZLFhMWFy5CZ/162sAGjBfdNWb7a8LEqqnzsHFhxT/X/SVj/z2t2nu3aJvjlbQkrAlTUApplPRjWyH4mhA==", - "dev": true, - "optional": true, - "dependencies": { - "tough-cookie": "^2.3.3 || ^3.0.1 || ^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "dependencies": { - "flat-cache": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", - "engines": { - "node": ">=4" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "node_modules/filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "deprecated": "Fixed a prototype pollution security issue in 4.1.0, please upgrade to ^4.1.1 or ^5.0.1.", - "dev": true, - "dependencies": { - "is-buffer": "~2.0.3" - }, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "dependencies": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "dependencies": { - "debug": "=3.1.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "dependencies": { - "for-in": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fp-ts": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.1.1.tgz", - "integrity": "sha512-YcWhMdDCFCja0MmaDroTgNu+NWWrrnUEn92nvDgrtVy9Z71YFnhNVIghoHPt8gs82ijoMzFGeWKvArbyICiJgw==", - "dev": true - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "node_modules/fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dependencies": { - "minipass": "^2.6.0" - } - }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/ganache": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/ganache/-/ganache-7.2.0.tgz", - "integrity": "sha512-KsKysVeVN6CALALOkIPSIxNZbl5s2/DE6Z0lFpj05gH1XsvYMit3djP4LxpxdjUfSSyb9gIPEOzqMw7v56ihJg==", - "dev": true, - "hasShrinkwrap": true, - "dependencies": { - "@trufflesuite/bigint-buffer": "1.1.9", - "emittery": "0.10.0", - "keccak": "3.0.1", - "leveldown": "6.1.0", - "secp256k1": "4.0.2" - }, - "bin": { - "ganache": "dist/node/cli.js", - "ganache-cli": "dist/node/cli.js" - }, - "optionalDependencies": { - "bufferutil": "4.0.5", - "utf-8-validate": "5.0.7" - } - }, - "node_modules/ganache-core": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/ganache-core/-/ganache-core-2.13.2.tgz", - "integrity": "sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw==", - "bundleDependencies": [ - "keccak" - ], - "deprecated": "ganache-core is now ganache; visit https://trfl.io/g7 for details", - "dev": true, - "hasShrinkwrap": true, - "dependencies": { - "abstract-leveldown": "3.0.0", - "async": "2.6.2", - "bip39": "2.5.0", - "cachedown": "1.0.0", - "clone": "2.1.2", - "debug": "3.2.6", - "encoding-down": "5.0.4", - "eth-sig-util": "3.0.0", - "ethereumjs-abi": "0.6.8", - "ethereumjs-account": "3.0.0", - "ethereumjs-block": "2.2.2", - "ethereumjs-common": "1.5.0", - "ethereumjs-tx": "2.1.2", - "ethereumjs-util": "6.2.1", - "ethereumjs-vm": "4.2.0", - "heap": "0.2.6", - "keccak": "3.0.1", - "level-sublevel": "6.6.4", - "levelup": "3.1.1", - "lodash": "4.17.20", - "lru-cache": "5.1.1", - "merkle-patricia-tree": "3.0.0", - "patch-package": "6.2.2", - "seedrandom": "3.0.1", - "source-map-support": "0.5.12", - "tmp": "0.1.0", - "web3-provider-engine": "14.2.1", - "websocket": "1.0.32" - }, - "engines": { - "node": ">=8.9.0" - }, - "optionalDependencies": { - "ethereumjs-wallet": "0.6.5", - "web3": "1.2.11" - } - }, - "node_modules/ganache-core/node_modules/@ethersproject/abi": { - "version": "5.0.0-beta.153", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/address": ">=5.0.0-beta.128", - "@ethersproject/bignumber": ">=5.0.0-beta.130", - "@ethersproject/bytes": ">=5.0.0-beta.129", - "@ethersproject/constants": ">=5.0.0-beta.128", - "@ethersproject/hash": ">=5.0.0-beta.128", - "@ethersproject/keccak256": ">=5.0.0-beta.127", - "@ethersproject/logger": ">=5.0.0-beta.129", - "@ethersproject/properties": ">=5.0.0-beta.131", - "@ethersproject/strings": ">=5.0.0-beta.130" - } - }, - "node_modules/ganache-core/node_modules/@ethersproject/abstract-provider": { - "version": "5.0.8", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/networks": "^5.0.7", - "@ethersproject/properties": "^5.0.7", - "@ethersproject/transactions": "^5.0.9", - "@ethersproject/web": "^5.0.12" - } - }, - "node_modules/ganache-core/node_modules/@ethersproject/abstract-signer": { - "version": "5.0.10", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/abstract-provider": "^5.0.8", - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7" - } - }, - "node_modules/ganache-core/node_modules/@ethersproject/address": { - "version": "5.0.9", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/keccak256": "^5.0.7", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/rlp": "^5.0.7" - } - }, - "node_modules/ganache-core/node_modules/@ethersproject/base64": { - "version": "5.0.7", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bytes": "^5.0.9" - } - }, - "node_modules/ganache-core/node_modules/@ethersproject/bignumber": { - "version": "5.0.13", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "bn.js": "^4.4.0" - } - }, - "node_modules/ganache-core/node_modules/@ethersproject/bytes": { - "version": "5.0.9", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/logger": "^5.0.8" - } - }, - "node_modules/ganache-core/node_modules/@ethersproject/constants": { - "version": "5.0.8", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bignumber": "^5.0.13" - } - }, - "node_modules/ganache-core/node_modules/@ethersproject/hash": { - "version": "5.0.10", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/abstract-signer": "^5.0.10", - "@ethersproject/address": "^5.0.9", - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/keccak256": "^5.0.7", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7", - "@ethersproject/strings": "^5.0.8" - } - }, - "node_modules/ganache-core/node_modules/@ethersproject/keccak256": { - "version": "5.0.7", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bytes": "^5.0.9", - "js-sha3": "0.5.7" - } - }, - "node_modules/ganache-core/node_modules/@ethersproject/logger": { - "version": "5.0.8", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/@ethersproject/networks": { - "version": "5.0.7", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/logger": "^5.0.8" - } - }, - "node_modules/ganache-core/node_modules/@ethersproject/properties": { - "version": "5.0.7", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/logger": "^5.0.8" - } - }, - "node_modules/ganache-core/node_modules/@ethersproject/rlp": { - "version": "5.0.7", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8" - } - }, - "node_modules/ganache-core/node_modules/@ethersproject/signing-key": { - "version": "5.0.8", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7", - "elliptic": "6.5.3" - } - }, - "node_modules/ganache-core/node_modules/@ethersproject/strings": { - "version": "5.0.8", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/constants": "^5.0.8", - "@ethersproject/logger": "^5.0.8" - } - }, - "node_modules/ganache-core/node_modules/@ethersproject/transactions": { - "version": "5.0.9", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/address": "^5.0.9", - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/constants": "^5.0.8", - "@ethersproject/keccak256": "^5.0.7", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7", - "@ethersproject/rlp": "^5.0.7", - "@ethersproject/signing-key": "^5.0.8" - } - }, - "node_modules/ganache-core/node_modules/@ethersproject/web": { - "version": "5.0.12", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/base64": "^5.0.7", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7", - "@ethersproject/strings": "^5.0.8" - } - }, - "node_modules/ganache-core/node_modules/@sindresorhus/is": { - "version": "0.14.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/@types/bn.js": { - "version": "4.11.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/ganache-core/node_modules/@types/node": { - "version": "14.14.20", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/@types/pbkdf2": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/ganache-core/node_modules/@types/secp256k1": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/ganache-core/node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/ganache-core/node_modules/abstract-leveldown": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/accepts": { - "version": "1.3.7", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/aes-js": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ganache-core/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/arr-diff": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/arr-flatten": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/arr-union": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/array-flatten": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/array-unique": { - "version": "0.3.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/asn1": { - "version": "0.2.4", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/ganache-core/node_modules/asn1.js": { - "version": "5.4.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ganache-core/node_modules/assert-plus": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/ganache-core/node_modules/assign-symbols": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/async": { - "version": "2.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.11" - } - }, - "node_modules/ganache-core/node_modules/async-eventemitter": { - "version": "0.2.4", - "dev": true, - "license": "MIT", - "dependencies": { - "async": "^2.4.0" - } - }, - "node_modules/ganache-core/node_modules/async-limiter": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/asynckit": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/atob": { - "version": "2.1.2", - "dev": true, - "license": "(MIT OR Apache-2.0)", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/ganache-core/node_modules/aws-sign2": { - "version": "0.7.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/ganache-core/node_modules/aws4": { - "version": "1.11.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/babel-code-frame": { - "version": "6.26.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/ansi-regex": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/ansi-styles": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/chalk": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/js-tokens": { - "version": "3.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/strip-ansi": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/supports-color": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ganache-core/node_modules/babel-core": { - "version": "6.26.3", - "dev": true, - "license": "MIT", - "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" - } - }, - "node_modules/ganache-core/node_modules/babel-core/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/ganache-core/node_modules/babel-core/node_modules/json5": { - "version": "0.5.1", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/ganache-core/node_modules/babel-core/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/babel-core/node_modules/slash": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/babel-generator": { - "version": "6.26.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - } - }, - "node_modules/ganache-core/node_modules/babel-generator/node_modules/jsesc": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/ganache-core/node_modules/babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-helper-call-delegate": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-helper-define-map": { - "version": "6.26.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "node_modules/ganache-core/node_modules/babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-helper-function-name": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-helper-get-function-arity": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-helper-hoist-variables": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-helper-optimise-call-expression": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-helper-regex": { - "version": "6.26.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "node_modules/ganache-core/node_modules/babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-helper-replace-supers": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-helpers": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-messages": { - "version": "6.23.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-regenerator": { - "version": "6.26.0", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerator-transform": "^0.10.0" - } - }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/ganache-core/node_modules/babel-preset-env": { - "version": "1.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" - } - }, - "node_modules/ganache-core/node_modules/babel-preset-env/node_modules/semver": { - "version": "5.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/ganache-core/node_modules/babel-register": { - "version": "6.26.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - } - }, - "node_modules/ganache-core/node_modules/babel-register/node_modules/source-map-support": { - "version": "0.4.18", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "^0.5.6" - } - }, - "node_modules/ganache-core/node_modules/babel-runtime": { - "version": "6.26.0", - "dev": true, - "license": "MIT", - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "node_modules/ganache-core/node_modules/babel-template": { - "version": "6.26.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "node_modules/ganache-core/node_modules/babel-traverse": { - "version": "6.26.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "node_modules/ganache-core/node_modules/babel-traverse/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/ganache-core/node_modules/babel-traverse/node_modules/globals": { - "version": "9.18.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/babel-traverse/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/babel-types": { - "version": "6.26.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "node_modules/ganache-core/node_modules/babel-types/node_modules/to-fast-properties": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/babelify": { - "version": "7.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "node_modules/ganache-core/node_modules/babylon": { - "version": "6.18.0", - "dev": true, - "license": "MIT", - "bin": { - "babylon": "bin/babylon.js" - } - }, - "node_modules/ganache-core/node_modules/backoff": { - "version": "2.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "precond": "0.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/balanced-match": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/base": { - "version": "0.11.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/base-x": { - "version": "3.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ganache-core/node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/base64-js": { - "version": "1.5.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/ganache-core/node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { - "version": "0.14.5", - "dev": true, - "license": "Unlicense" - }, - "node_modules/ganache-core/node_modules/bignumber.js": { - "version": "9.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/ganache-core/node_modules/bip39": { - "version": "2.5.0", - "dev": true, - "license": "ISC", - "dependencies": { - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1", - "safe-buffer": "^5.0.1", - "unorm": "^1.3.3" - } - }, - "node_modules/ganache-core/node_modules/blakejs": { - "version": "1.1.0", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/ganache-core/node_modules/bluebird": { - "version": "3.7.2", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/bn.js": { - "version": "4.11.9", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/body-parser": { - "version": "1.19.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ganache-core/node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/ganache-core/node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/body-parser/node_modules/qs": { - "version": "6.7.0", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/ganache-core/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/ganache-core/node_modules/brorand": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/browserify-aes": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ganache-core/node_modules/browserify-cipher": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/ganache-core/node_modules/browserify-des": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/ganache-core/node_modules/browserify-rsa": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/ganache-core/node_modules/browserify-rsa/node_modules/bn.js": { - "version": "5.1.3", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/browserify-sign": { - "version": "4.2.1", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/ganache-core/node_modules/browserify-sign/node_modules/bn.js": { - "version": "5.1.3", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ganache-core/node_modules/browserslist": { - "version": "3.2.8", - "dev": true, - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" - }, - "bin": { - "browserslist": "cli.js" - } - }, - "node_modules/ganache-core/node_modules/bs58": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/ganache-core/node_modules/bs58check": { - "version": "2.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/ganache-core/node_modules/buffer": { - "version": "5.7.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/ganache-core/node_modules/buffer-from": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/buffer-to-arraybuffer": { - "version": "0.0.5", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/buffer-xor": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/bufferutil": { - "version": "4.0.3", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-gyp-build": "^4.2.0" - } - }, - "node_modules/ganache-core/node_modules/bytes": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ganache-core/node_modules/bytewise": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bytewise-core": "^1.2.2", - "typewise": "^1.0.3" - } - }, - "node_modules/ganache-core/node_modules/bytewise-core": { - "version": "1.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "typewise-core": "^1.2" - } - }, - "node_modules/ganache-core/node_modules/cache-base": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/cacheable-request": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ganache-core/node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ganache-core/node_modules/cachedown": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "^2.4.1", - "lru-cache": "^3.2.0" - } - }, - "node_modules/ganache-core/node_modules/cachedown/node_modules/abstract-leveldown": { - "version": "2.7.2", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~4.0.0" - } - }, - "node_modules/ganache-core/node_modules/cachedown/node_modules/lru-cache": { - "version": "3.2.0", - "dev": true, - "license": "ISC", - "dependencies": { - "pseudomap": "^1.0.1" - } - }, - "node_modules/ganache-core/node_modules/call-bind": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/caniuse-lite": { - "version": "1.0.30001174", - "dev": true, - "license": "CC-BY-4.0" - }, - "node_modules/ganache-core/node_modules/caseless": { - "version": "0.12.0", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/ganache-core/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/checkpoint-store": { - "version": "1.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "functional-red-black-tree": "^1.0.1" - } - }, - "node_modules/ganache-core/node_modules/chownr": { - "version": "1.1.4", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/ganache-core/node_modules/ci-info": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/cids": { - "version": "0.7.5", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "^1.0.0", - "multihashes": "~0.4.15" - }, - "engines": { - "node": ">=4.0.0", - "npm": ">=3.0.0" - } - }, - "node_modules/ganache-core/node_modules/cids/node_modules/multicodec": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.6.0", - "varint": "^5.0.0" - } - }, - "node_modules/ganache-core/node_modules/cipher-base": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ganache-core/node_modules/class-is": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/class-utils": { - "version": "0.3.6", - "dev": true, - "license": "MIT", - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/class-utils/node_modules/is-buffer": { - "version": "1.1.6", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/class-utils/node_modules/kind-of": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/clone": { - "version": "2.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/ganache-core/node_modules/clone-response": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "mimic-response": "^1.0.0" - } - }, - "node_modules/ganache-core/node_modules/collection-visit": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/ganache-core/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/combined-stream": { - "version": "1.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ganache-core/node_modules/component-emitter": { - "version": "1.3.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/concat-stream": { - "version": "1.6.2", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/ganache-core/node_modules/content-disposition": { - "version": "0.5.3", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/content-hash": { - "version": "2.5.2", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" - } - }, - "node_modules/ganache-core/node_modules/content-type": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/convert-source-map": { - "version": "1.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/ganache-core/node_modules/convert-source-map/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/cookie": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/cookie-signature": { - "version": "1.0.6", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/cookiejar": { - "version": "2.1.2", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/copy-descriptor": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/core-js": { - "version": "2.6.12", - "dev": true, - "hasInstallScript": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/core-js-pure": { - "version": "3.8.2", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/ganache-core/node_modules/core-util-is": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/cors": { - "version": "2.8.5", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ganache-core/node_modules/create-ecdh": { - "version": "4.0.4", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/ganache-core/node_modules/create-hash": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/ganache-core/node_modules/create-hmac": { - "version": "1.1.7", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/ganache-core/node_modules/cross-fetch": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "node-fetch": "2.1.2", - "whatwg-fetch": "2.0.4" - } - }, - "node_modules/ganache-core/node_modules/crypto-browserify": { - "version": "3.12.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ganache-core/node_modules/d": { - "version": "1.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/ganache-core/node_modules/dashdash": { - "version": "1.14.1", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/ganache-core/node_modules/debug": { - "version": "3.2.6", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/ganache-core/node_modules/decode-uri-component": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/ganache-core/node_modules/decompress-response": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/deep-equal": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/defer-to-connect": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/deferred-leveldown": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "~5.0.0", - "inherits": "^2.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/deferred-leveldown/node_modules/abstract-leveldown": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/define-properties": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ganache-core/node_modules/define-property": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/defined": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/delayed-stream": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ganache-core/node_modules/depd": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/des.js": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/ganache-core/node_modules/destroy": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/detect-indent": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "repeating": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/diffie-hellman": { - "version": "5.0.3", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/ganache-core/node_modules/dom-walk": { - "version": "0.1.2", - "dev": true - }, - "node_modules/ganache-core/node_modules/dotignore": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimatch": "^3.0.4" - }, - "bin": { - "ignored": "bin/ignored" - } - }, - "node_modules/ganache-core/node_modules/duplexer3": { - "version": "0.1.4", - "dev": true, - "license": "BSD-3-Clause", - "optional": true - }, - "node_modules/ganache-core/node_modules/ecc-jsbn": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ganache-core/node_modules/ee-first": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/electron-to-chromium": { - "version": "1.3.636", - "dev": true, - "license": "ISC" - }, - "node_modules/ganache-core/node_modules/elliptic": { - "version": "6.5.3", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "node_modules/ganache-core/node_modules/encodeurl": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ganache-core/node_modules/encoding": { - "version": "0.1.13", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/ganache-core/node_modules/encoding-down": { - "version": "5.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "^5.0.0", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0", - "xtend": "^4.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/encoding-down/node_modules/abstract-leveldown": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/end-of-stream": { - "version": "1.4.4", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/ganache-core/node_modules/errno": { - "version": "0.1.8", - "dev": true, - "license": "MIT", - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/ganache-core/node_modules/es-abstract": { - "version": "1.18.0-next.1", - "dev": true, - "license": "MIT", - "dependencies": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/es-to-primitive": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/es5-ext": { - "version": "0.10.53", - "dev": true, - "license": "ISC", - "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "node_modules/ganache-core/node_modules/es6-iterator": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/ganache-core/node_modules/es6-symbol": { - "version": "3.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/ganache-core/node_modules/escape-html": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ganache-core/node_modules/esutils": { - "version": "2.0.3", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/etag": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/eth-block-tracker": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "eth-query": "^2.1.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.3", - "ethjs-util": "^0.1.3", - "json-rpc-engine": "^3.6.0", - "pify": "^2.3.0", - "tape": "^4.6.3" - } - }, - "node_modules/ganache-core/node_modules/eth-block-tracker/node_modules/ethereumjs-tx": { - "version": "1.3.7", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } - }, - "node_modules/ganache-core/node_modules/eth-block-tracker/node_modules/ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/eth-block-tracker/node_modules/pify": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/eth-ens-namehash": { - "version": "2.0.8", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-infura": { - "version": "3.2.1", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-fetch": "^2.1.1", - "eth-json-rpc-middleware": "^1.5.0", - "json-rpc-engine": "^3.4.0", - "json-rpc-error": "^2.0.0" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware": { - "version": "1.6.0", - "dev": true, - "license": "ISC", - "dependencies": { - "async": "^2.5.0", - "eth-query": "^2.1.2", - "eth-tx-summary": "^3.1.2", - "ethereumjs-block": "^1.6.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.2", - "ethereumjs-vm": "^2.1.0", - "fetch-ponyfill": "^4.0.0", - "json-rpc-engine": "^3.6.0", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "tape": "^4.6.3" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/abstract-leveldown": { - "version": "2.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~4.0.0" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/deferred-leveldown": { - "version": "1.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "~2.6.0" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-account": { - "version": "2.0.5", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-block": { - "version": "1.7.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-block/node_modules/ethereum-common": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-tx": { - "version": "1.3.7", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm": { - "version": "2.6.0", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-block": { - "version": "2.2.2", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": { - "version": "2.1.2", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-util": { - "version": "6.2.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/isarray": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-codec": { - "version": "7.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-errors": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "errno": "~0.1.1" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-iterator-stream": { - "version": "1.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-iterator-stream/node_modules/readable-stream": { - "version": "1.1.14", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-ws": { - "version": "0.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-ws/node_modules/readable-stream": { - "version": "1.0.34", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-ws/node_modules/xtend": { - "version": "2.1.2", - "dev": true, - "dependencies": { - "object-keys": "~0.4.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/levelup": { - "version": "1.3.9", - "dev": true, - "license": "MIT", - "dependencies": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ltgt": { - "version": "2.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/memdown": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/memdown/node_modules/abstract-leveldown": { - "version": "2.7.2", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~4.0.0" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/merkle-patricia-tree": { - "version": "2.3.2", - "dev": true, - "license": "MPL-2.0", - "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" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/merkle-patricia-tree/node_modules/async": { - "version": "1.5.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/object-keys": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/semver": { - "version": "5.4.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/string_decoder": { - "version": "0.10.31", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-lib": { - "version": "0.1.29", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/ganache-core/node_modules/eth-query": { - "version": "2.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "json-rpc-random-id": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "node_modules/ganache-core/node_modules/eth-sig-util": { - "version": "3.0.0", - "dev": true, - "license": "ISC", - "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" - } - }, - "node_modules/ganache-core/node_modules/eth-sig-util/node_modules/ethereumjs-abi": { - "version": "0.6.5", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^4.3.0" - } - }, - "node_modules/ganache-core/node_modules/eth-sig-util/node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { - "version": "4.5.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^4.8.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.0.0" - } - }, - "node_modules/ganache-core/node_modules/eth-sig-util/node_modules/ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary": { - "version": "3.2.4", - "dev": true, - "license": "ISC", - "dependencies": { - "async": "^2.1.2", - "clone": "^2.0.0", - "concat-stream": "^1.5.1", - "end-of-stream": "^1.1.0", - "eth-query": "^2.0.2", - "ethereumjs-block": "^1.4.1", - "ethereumjs-tx": "^1.1.1", - "ethereumjs-util": "^5.0.1", - "ethereumjs-vm": "^2.6.0", - "through2": "^2.0.3" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/abstract-leveldown": { - "version": "2.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~4.0.0" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/deferred-leveldown": { - "version": "1.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "~2.6.0" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-account": { - "version": "2.0.5", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-block": { - "version": "1.7.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-block/node_modules/ethereum-common": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-tx": { - "version": "1.3.7", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm": { - "version": "2.6.0", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-block": { - "version": "2.2.2", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": { - "version": "2.1.2", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-util": { - "version": "6.2.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/isarray": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-codec": { - "version": "7.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-errors": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "errno": "~0.1.1" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-iterator-stream": { - "version": "1.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-iterator-stream/node_modules/readable-stream": { - "version": "1.1.14", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-ws": { - "version": "0.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-ws/node_modules/readable-stream": { - "version": "1.0.34", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-ws/node_modules/xtend": { - "version": "2.1.2", - "dev": true, - "dependencies": { - "object-keys": "~0.4.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/levelup": { - "version": "1.3.9", - "dev": true, - "license": "MIT", - "dependencies": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ltgt": { - "version": "2.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/memdown": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/memdown/node_modules/abstract-leveldown": { - "version": "2.7.2", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~4.0.0" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/merkle-patricia-tree": { - "version": "2.3.2", - "dev": true, - "license": "MPL-2.0", - "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" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/merkle-patricia-tree/node_modules/async": { - "version": "1.5.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/object-keys": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/semver": { - "version": "5.4.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/string_decoder": { - "version": "0.10.31", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ethashjs": { - "version": "0.0.8", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^2.1.2", - "buffer-xor": "^2.0.1", - "ethereumjs-util": "^7.0.2", - "miller-rabin": "^4.0.0" - } - }, - "node_modules/ganache-core/node_modules/ethashjs/node_modules/bn.js": { - "version": "5.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ethashjs/node_modules/buffer-xor": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/ethashjs/node_modules/ethereumjs-util": { - "version": "7.0.7", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ganache-core/node_modules/ethereum-bloom-filters": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "js-sha3": "^0.8.0" - } - }, - "node_modules/ganache-core/node_modules/ethereum-bloom-filters/node_modules/js-sha3": { - "version": "0.8.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/ethereum-common": { - "version": "0.0.18", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-abi": { - "version": "0.6.8", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-account": { - "version": "3.0.0", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "ethereumjs-util": "^6.0.0", - "rlp": "^2.2.1", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-block": { - "version": "2.2.2", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/abstract-leveldown": { - "version": "2.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~4.0.0" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/deferred-leveldown": { - "version": "1.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "~2.6.0" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/isarray": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-codec": { - "version": "7.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-errors": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "errno": "~0.1.1" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-iterator-stream": { - "version": "1.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-iterator-stream/node_modules/readable-stream": { - "version": "1.1.14", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-ws": { - "version": "0.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-ws/node_modules/readable-stream": { - "version": "1.0.34", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-ws/node_modules/xtend": { - "version": "2.1.2", - "dev": true, - "dependencies": { - "object-keys": "~0.4.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/levelup": { - "version": "1.3.9", - "dev": true, - "license": "MIT", - "dependencies": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/ltgt": { - "version": "2.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/memdown": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/memdown/node_modules/abstract-leveldown": { - "version": "2.7.2", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~4.0.0" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/merkle-patricia-tree": { - "version": "2.3.2", - "dev": true, - "license": "MPL-2.0", - "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" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/merkle-patricia-tree/node_modules/async": { - "version": "1.5.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/object-keys": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/semver": { - "version": "5.4.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/string_decoder": { - "version": "0.10.31", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ethereumjs-blockchain": { - "version": "4.0.4", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^2.6.1", - "ethashjs": "~0.0.7", - "ethereumjs-block": "~2.2.2", - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.1.0", - "flow-stoplight": "^1.0.0", - "level-mem": "^3.0.1", - "lru-cache": "^5.1.1", - "rlp": "^2.2.2", - "semaphore": "^1.1.0" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-common": { - "version": "1.5.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ethereumjs-tx": { - "version": "2.1.2", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-util": { - "version": "6.2.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm": { - "version": "4.2.0", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "core-js-pure": "^3.0.1", - "ethereumjs-account": "^3.0.0", - "ethereumjs-block": "^2.2.2", - "ethereumjs-blockchain": "^4.0.3", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.2", - "ethereumjs-util": "^6.2.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1", - "util.promisify": "^1.0.0" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/abstract-leveldown": { - "version": "2.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~4.0.0" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/deferred-leveldown": { - "version": "1.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "~2.6.0" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/isarray": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-codec": { - "version": "7.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-errors": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "errno": "~0.1.1" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-iterator-stream": { - "version": "1.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-iterator-stream/node_modules/readable-stream": { - "version": "1.1.14", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-ws": { - "version": "0.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/readable-stream": { - "version": "1.0.34", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/xtend": { - "version": "2.1.2", - "dev": true, - "dependencies": { - "object-keys": "~0.4.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/levelup": { - "version": "1.3.9", - "dev": true, - "license": "MIT", - "dependencies": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/ltgt": { - "version": "2.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/memdown": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/memdown/node_modules/abstract-leveldown": { - "version": "2.7.2", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~4.0.0" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree": { - "version": "2.3.2", - "dev": true, - "license": "MPL-2.0", - "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" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree/node_modules/async": { - "version": "1.5.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree/node_modules/ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/object-keys": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/semver": { - "version": "5.4.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/string_decoder": { - "version": "0.10.31", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ethereumjs-wallet": { - "version": "0.6.5", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "aes-js": "^3.1.1", - "bs58check": "^2.1.2", - "ethereum-cryptography": "^0.1.3", - "ethereumjs-util": "^6.0.0", - "randombytes": "^2.0.6", - "safe-buffer": "^5.1.2", - "scryptsy": "^1.2.1", - "utf8": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "node_modules/ganache-core/node_modules/ethjs-unit": { - "version": "0.1.6", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/ganache-core/node_modules/ethjs-unit/node_modules/bn.js": { - "version": "4.11.6", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/ethjs-util": { - "version": "0.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/ganache-core/node_modules/eventemitter3": { - "version": "4.0.4", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/events": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/ganache-core/node_modules/evp_bytestokey": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/expand-brackets": { - "version": "2.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-buffer": { - "version": "1.1.6", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-extendable": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/express": { - "version": "4.17.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "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.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/ganache-core/node_modules/express/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/ganache-core/node_modules/express/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/express/node_modules/qs": { - "version": "6.7.0", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/ganache-core/node_modules/express/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/ext": { - "version": "1.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "type": "^2.0.0" - } - }, - "node_modules/ganache-core/node_modules/ext/node_modules/type": { - "version": "2.1.0", - "dev": true, - "license": "ISC" - }, - "node_modules/ganache-core/node_modules/extend": { - "version": "3.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/extend-shallow": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/extglob": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/extglob/node_modules/is-extendable": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/extsprintf": { - "version": "1.3.0", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/fake-merkle-patricia-tree": { - "version": "1.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "checkpoint-store": "^1.1.0" - } - }, - "node_modules/ganache-core/node_modules/fast-deep-equal": { - "version": "3.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/fetch-ponyfill": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "node-fetch": "~1.7.1" - } - }, - "node_modules/ganache-core/node_modules/fetch-ponyfill/node_modules/is-stream": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/fetch-ponyfill/node_modules/node-fetch": { - "version": "1.7.3", - "dev": true, - "license": "MIT", - "dependencies": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, - "node_modules/ganache-core/node_modules/finalhandler": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ganache-core/node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/ganache-core/node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root": { - "version": "1.2.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "fs-extra": "^4.0.3", - "micromatch": "^3.1.4" - } - }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/braces": { - "version": "2.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/fill-range": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/fs-extra": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-buffer": { - "version": "1.1.6", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-extendable": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-number": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/micromatch": { - "version": "3.1.10", - "dev": true, - "license": "MIT", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/to-regex-range": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/flow-stoplight": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/ganache-core/node_modules/for-each": { - "version": "0.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/ganache-core/node_modules/for-in": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/forever-agent": { - "version": "0.6.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/ganache-core/node_modules/form-data": { - "version": "2.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/ganache-core/node_modules/forwarded": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/fragment-cache": { - "version": "0.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/fresh": { - "version": "0.5.2", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/fs-extra": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/ganache-core/node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/ganache-core/node_modules/function-bind": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/functional-red-black-tree": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/get-intrinsic": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/get-stream": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ganache-core/node_modules/get-value": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/getpass": { - "version": "0.1.7", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/ganache-core/node_modules/glob": { - "version": "7.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ganache-core/node_modules/global": { - "version": "4.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "node_modules/ganache-core/node_modules/got": { - "version": "9.6.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/ganache-core/node_modules/got/node_modules/get-stream": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/graceful-fs": { - "version": "4.2.4", - "dev": true, - "license": "ISC" - }, - "node_modules/ganache-core/node_modules/har-schema": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/har-validator": { - "version": "5.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/has": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/ganache-core/node_modules/has-ansi": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/has-symbol-support-x": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/ganache-core/node_modules/has-symbols": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/has-to-string-tag-x": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "has-symbol-support-x": "^1.4.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ganache-core/node_modules/has-value": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/has-values": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/has-values/node_modules/is-buffer": { - "version": "1.1.6", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/hash-base": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ganache-core/node_modules/hash.js": { - "version": "1.1.7", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/ganache-core/node_modules/heap": { - "version": "0.2.6", - "dev": true - }, - "node_modules/ganache-core/node_modules/hmac-drbg": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/ganache-core/node_modules/home-or-tmp": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/http-cache-semantics": { - "version": "4.1.0", - "dev": true, - "license": "BSD-2-Clause", - "optional": true - }, - "node_modules/ganache-core/node_modules/http-errors": { - "version": "1.7.2", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/http-errors/node_modules/inherits": { - "version": "2.0.3", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/ganache-core/node_modules/http-https": { - "version": "1.0.0", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/ganache-core/node_modules/http-signature": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/ganache-core/node_modules/iconv-lite": { - "version": "0.4.24", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/idna-uts46-hx": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "punycode": "2.1.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/ganache-core/node_modules/idna-uts46-hx/node_modules/punycode": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/ieee754": { - "version": "1.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ganache-core/node_modules/immediate": { - "version": "3.2.3", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/ganache-core/node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "license": "ISC" - }, - "node_modules/ganache-core/node_modules/invariant": { - "version": "2.2.4", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ganache-core/node_modules/ipaddr.js": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ganache-core/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/is-arguments": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/is-callable": { - "version": "1.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/is-ci": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/ganache-core/node_modules/is-data-descriptor": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/is-date-object": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/is-descriptor": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/is-extendable": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/is-finite": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ganache-core/node_modules/is-fn": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/is-function": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/is-hex-prefixed": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/ganache-core/node_modules/is-negative-zero": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/is-object": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/is-plain-obj": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/is-plain-object": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/is-regex": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/is-retry-allowed": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/is-symbol": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/is-typedarray": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/is-windows": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/isarray": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/ganache-core/node_modules/isobject": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/isstream": { - "version": "0.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/isurl": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ganache-core/node_modules/js-sha3": { - "version": "0.5.7", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/jsbn": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/json-buffer": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/json-rpc-engine": { - "version": "3.8.0", - "dev": true, - "license": "ISC", - "dependencies": { - "async": "^2.0.1", - "babel-preset-env": "^1.7.0", - "babelify": "^7.3.0", - "json-rpc-error": "^2.0.0", - "promise-to-callback": "^1.0.0", - "safe-event-emitter": "^1.0.1" - } - }, - "node_modules/ganache-core/node_modules/json-rpc-error": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1" - } - }, - "node_modules/ganache-core/node_modules/json-rpc-random-id": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/ganache-core/node_modules/json-schema": { - "version": "0.2.3", - "dev": true - }, - "node_modules/ganache-core/node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/json-stable-stringify": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "jsonify": "~0.0.0" - } - }, - "node_modules/ganache-core/node_modules/json-stringify-safe": { - "version": "5.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/ganache-core/node_modules/jsonfile": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/ganache-core/node_modules/jsonify": { - "version": "0.0.0", - "dev": true, - "license": "Public Domain" - }, - "node_modules/ganache-core/node_modules/jsprim": { - "version": "1.4.1", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "node_modules/ganache-core/node_modules/keccak": { - "version": "3.0.1", - "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ganache-core/node_modules/keyv": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/ganache-core/node_modules/kind-of": { - "version": "6.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/klaw-sync": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.11" - } - }, - "node_modules/ganache-core/node_modules/level-codec": { - "version": "9.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/level-errors": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "errno": "~0.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/level-iterator-stream": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.5", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/level-mem": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "level-packager": "~4.0.0", - "memdown": "~3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/level-mem/node_modules/abstract-leveldown": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/level-mem/node_modules/ltgt": { - "version": "2.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/level-mem/node_modules/memdown": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "~5.0.0", - "functional-red-black-tree": "~1.0.1", - "immediate": "~3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/level-mem/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/level-packager": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "encoding-down": "~5.0.0", - "levelup": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/level-post": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ltgt": "^2.1.2" - } - }, - "node_modules/ganache-core/node_modules/level-sublevel": { - "version": "6.6.4", - "dev": true, - "license": "MIT", - "dependencies": { - "bytewise": "~1.1.0", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0", - "level-iterator-stream": "^2.0.3", - "ltgt": "~2.1.1", - "pull-defer": "^0.2.2", - "pull-level": "^2.0.3", - "pull-stream": "^3.6.8", - "typewiselite": "~1.0.0", - "xtend": "~4.0.0" - } - }, - "node_modules/ganache-core/node_modules/level-ws": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.2.8", - "xtend": "^4.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/levelup": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "deferred-leveldown": "~4.0.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~3.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/levelup/node_modules/level-iterator-stream": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/lodash": { - "version": "4.17.20", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/looper": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/loose-envify": { - "version": "1.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/ganache-core/node_modules/lowercase-keys": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/lru-cache": { - "version": "5.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/ganache-core/node_modules/ltgt": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/map-cache": { - "version": "0.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/map-visit": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/md5.js": { - "version": "1.3.5", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/ganache-core/node_modules/media-typer": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/merge-descriptors": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/merkle-patricia-tree": { - "version": "3.0.0", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^2.6.1", - "ethereumjs-util": "^5.2.0", - "level-mem": "^3.0.1", - "level-ws": "^1.0.0", - "readable-stream": "^3.0.6", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" - } - }, - "node_modules/ganache-core/node_modules/merkle-patricia-tree/node_modules/ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/merkle-patricia-tree/node_modules/readable-stream": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ganache-core/node_modules/methods": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/miller-rabin": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/ganache-core/node_modules/mime": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/mime-db": { - "version": "1.45.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/mime-types": { - "version": "2.1.28", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.45.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/mimic-response": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/min-document": { - "version": "2.19.0", - "dev": true, - "dependencies": { - "dom-walk": "^0.1.0" - } - }, - "node_modules/ganache-core/node_modules/minimalistic-assert": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/ganache-core/node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/minimatch": { - "version": "3.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ganache-core/node_modules/minimist": { - "version": "1.2.5", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/minizlib": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "minipass": "^2.9.0" - } - }, - "node_modules/ganache-core/node_modules/minizlib/node_modules/minipass": { - "version": "2.9.0", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/ganache-core/node_modules/mixin-deep": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/mkdirp": { - "version": "0.5.5", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ganache-core/node_modules/mkdirp-promise": { - "version": "5.0.1", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "mkdirp": "*" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/mock-fs": { - "version": "4.13.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/multibase": { - "version": "0.6.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, - "node_modules/ganache-core/node_modules/multicodec": { - "version": "0.5.7", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "varint": "^5.0.0" - } - }, - "node_modules/ganache-core/node_modules/multihashes": { - "version": "0.4.21", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "multibase": "^0.7.0", - "varint": "^5.0.0" - } - }, - "node_modules/ganache-core/node_modules/multihashes/node_modules/multibase": { - "version": "0.7.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, - "node_modules/ganache-core/node_modules/nano-json-stream-parser": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/nanomatch": { - "version": "1.2.13", - "dev": true, - "license": "MIT", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/negotiator": { - "version": "0.6.2", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/next-tick": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/nice-try": { - "version": "1.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/node-addon-api": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/node-fetch": { - "version": "2.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/ganache-core/node_modules/node-gyp-build": { - "version": "4.2.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/ganache-core/node_modules/normalize-url": { - "version": "4.5.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ganache-core/node_modules/number-to-bn": { - "version": "1.7.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/ganache-core/node_modules/number-to-bn/node_modules/bn.js": { - "version": "4.11.6", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/oauth-sign": { - "version": "0.9.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/ganache-core/node_modules/object-assign": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/object-copy": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/object-copy/node_modules/is-buffer": { - "version": "1.1.6", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/object-inspect": { - "version": "1.9.0", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/object-is": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/object-keys": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ganache-core/node_modules/object-visit": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/object.assign": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/object.getownpropertydescriptors": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/object.pick": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/oboe": { - "version": "2.1.4", - "dev": true, - "license": "BSD", - "optional": true, - "dependencies": { - "http-https": "^1.0.0" - } - }, - "node_modules/ganache-core/node_modules/on-finished": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ganache-core/node_modules/once": { - "version": "1.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/ganache-core/node_modules/os-homedir": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/os-tmpdir": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/p-cancelable": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/p-timeout": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/p-timeout/node_modules/p-finally": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/parse-asn1": { - "version": "5.1.6", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/parse-headers": { - "version": "2.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/parseurl": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ganache-core/node_modules/pascalcase": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/patch-package": { - "version": "6.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^1.2.1", - "fs-extra": "^7.0.1", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.0", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33" - }, - "bin": { - "patch-package": "index.js" - }, - "engines": { - "npm": ">5" - } - }, - "node_modules/ganache-core/node_modules/patch-package/node_modules/cross-spawn": { - "version": "6.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/ganache-core/node_modules/patch-package/node_modules/path-key": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/patch-package/node_modules/semver": { - "version": "5.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/ganache-core/node_modules/patch-package/node_modules/shebang-command": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/patch-package/node_modules/shebang-regex": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/patch-package/node_modules/slash": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/patch-package/node_modules/tmp": { - "version": "0.0.33", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/ganache-core/node_modules/patch-package/node_modules/which": { - "version": "1.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/ganache-core/node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/path-parse": { - "version": "1.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/path-to-regexp": { - "version": "0.1.7", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/pbkdf2": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/ganache-core/node_modules/performance-now": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/posix-character-classes": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/precond": { - "version": "0.2.3", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/prepend-http": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/private": { - "version": "0.1.8", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/process": { - "version": "0.11.10", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/ganache-core/node_modules/process-nextick-args": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/promise-to-callback": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-fn": "^1.0.0", - "set-immediate-shim": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/proxy-addr": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ganache-core/node_modules/prr": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/pseudomap": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, - "node_modules/ganache-core/node_modules/psl": { - "version": "1.8.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/public-encrypt": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/ganache-core/node_modules/pull-cat": { - "version": "1.1.11", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/pull-defer": { - "version": "0.2.3", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/pull-level": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "level-post": "^1.0.7", - "pull-cat": "^1.1.9", - "pull-live": "^1.0.1", - "pull-pushable": "^2.0.0", - "pull-stream": "^3.4.0", - "pull-window": "^2.1.4", - "stream-to-pull-stream": "^1.7.1" - } - }, - "node_modules/ganache-core/node_modules/pull-live": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "pull-cat": "^1.1.9", - "pull-stream": "^3.4.0" - } - }, - "node_modules/ganache-core/node_modules/pull-pushable": { - "version": "2.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/pull-stream": { - "version": "3.6.14", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/pull-window": { - "version": "2.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "looper": "^2.0.0" - } - }, - "node_modules/ganache-core/node_modules/pump": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/ganache-core/node_modules/punycode": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/qs": { - "version": "6.5.2", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/ganache-core/node_modules/query-string": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/randombytes": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/ganache-core/node_modules/randomfill": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/ganache-core/node_modules/range-parser": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/raw-body": { - "version": "2.4.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ganache-core/node_modules/readable-stream": { - "version": "2.3.7", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/ganache-core/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/regenerate": { - "version": "1.4.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/regenerator-runtime": { - "version": "0.11.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/regenerator-transform": { - "version": "0.10.1", - "dev": true, - "license": "BSD", - "dependencies": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "node_modules/ganache-core/node_modules/regex-not": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/regexp.prototype.flags": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/regexp.prototype.flags/node_modules/es-abstract": { - "version": "1.17.7", - "dev": true, - "license": "MIT", - "dependencies": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/regexpu-core": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "node_modules/ganache-core/node_modules/regjsgen": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/regjsparser": { - "version": "0.1.5", - "dev": true, - "license": "BSD", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/ganache-core/node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/ganache-core/node_modules/repeat-element": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/repeat-string": { - "version": "1.6.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/ganache-core/node_modules/repeating": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-finite": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/request": { - "version": "2.88.2", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.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.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ganache-core/node_modules/resolve-url": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/responselike": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/ganache-core/node_modules/resumer": { - "version": "0.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "through": "~2.3.4" - } - }, - "node_modules/ganache-core/node_modules/ret": { - "version": "0.1.15", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12" - } - }, - "node_modules/ganache-core/node_modules/rimraf": { - "version": "2.6.3", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/ganache-core/node_modules/ripemd160": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/ganache-core/node_modules/rlp": { - "version": "2.2.6", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^4.11.1" - }, - "bin": { - "rlp": "bin/rlp" - } - }, - "node_modules/ganache-core/node_modules/rustbn.js": { - "version": "0.2.0", - "dev": true, - "license": "(MIT OR Apache-2.0)" - }, - "node_modules/ganache-core/node_modules/safe-buffer": { - "version": "5.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/safe-event-emitter": { - "version": "1.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "events": "^3.0.0" - } - }, - "node_modules/ganache-core/node_modules/safe-regex": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/ganache-core/node_modules/safer-buffer": { - "version": "2.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/scrypt-js": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/scryptsy": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "pbkdf2": "^3.0.3" - } - }, - "node_modules/ganache-core/node_modules/secp256k1": { - "version": "4.0.2", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "elliptic": "^6.5.2", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ganache-core/node_modules/seedrandom": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/semaphore": { - "version": "1.1.0", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ganache-core/node_modules/send": { - "version": "0.17.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ganache-core/node_modules/send/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/ganache-core/node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/send/node_modules/ms": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/serve-static": { - "version": "1.14.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ganache-core/node_modules/servify": { - "version": "0.1.12", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/set-immediate-shim": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/set-value": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/setimmediate": { - "version": "1.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/setprototypeof": { - "version": "1.1.1", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/ganache-core/node_modules/sha.js": { - "version": "2.4.11", - "dev": true, - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/ganache-core/node_modules/simple-concat": { - "version": "1.0.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/simple-get": { - "version": "2.8.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/ganache-core/node_modules/snapdragon": { - "version": "0.8.2", - "dev": true, - "license": "MIT", - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/snapdragon-node": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/snapdragon-util": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/snapdragon-util/node_modules/is-buffer": { - "version": "1.1.6", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-buffer": { - "version": "1.1.6", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/kind-of": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/source-map": { - "version": "0.5.7", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/source-map-resolve": { - "version": "0.5.3", - "dev": true, - "license": "MIT", - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/ganache-core/node_modules/source-map-support": { - "version": "0.5.12", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/ganache-core/node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/source-map-url": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/split-string": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/sshpk": { - "version": "1.16.1", - "dev": true, - "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/sshpk/node_modules/tweetnacl": { - "version": "0.14.5", - "dev": true, - "license": "Unlicense" - }, - "node_modules/ganache-core/node_modules/static-extend": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/static-extend/node_modules/is-buffer": { - "version": "1.1.6", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/static-extend/node_modules/kind-of": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/statuses": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/stream-to-pull-stream": { - "version": "1.7.3", - "dev": true, - "license": "MIT", - "dependencies": { - "looper": "^3.0.0", - "pull-stream": "^3.2.3" - } - }, - "node_modules/ganache-core/node_modules/stream-to-pull-stream/node_modules/looper": { - "version": "3.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/strict-uri-encode": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/string_decoder": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/ganache-core/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/string.prototype.trim": { - "version": "1.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/string.prototype.trimend": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/string.prototype.trimstart": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/strip-hex-prefix": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-hex-prefixed": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/ganache-core/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/swarm-js": { - "version": "0.1.40", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - } - }, - "node_modules/ganache-core/node_modules/swarm-js/node_modules/fs-extra": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/ganache-core/node_modules/swarm-js/node_modules/get-stream": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/swarm-js/node_modules/got": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/swarm-js/node_modules/is-stream": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/swarm-js/node_modules/p-cancelable": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/swarm-js/node_modules/prepend-http": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/swarm-js/node_modules/url-parse-lax": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "prepend-http": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/tape": { - "version": "4.13.3", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-equal": "~1.1.1", - "defined": "~1.0.0", - "dotignore": "~0.1.2", - "for-each": "~0.3.3", - "function-bind": "~1.1.1", - "glob": "~7.1.6", - "has": "~1.0.3", - "inherits": "~2.0.4", - "is-regex": "~1.0.5", - "minimist": "~1.2.5", - "object-inspect": "~1.7.0", - "resolve": "~1.17.0", - "resumer": "~0.0.0", - "string.prototype.trim": "~1.2.1", - "through": "~2.3.8" - }, - "bin": { - "tape": "bin/tape" - } - }, - "node_modules/ganache-core/node_modules/tape/node_modules/glob": { - "version": "7.1.6", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ganache-core/node_modules/tape/node_modules/is-regex": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/tape/node_modules/object-inspect": { - "version": "1.7.0", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/tape/node_modules/resolve": { - "version": "1.17.0", - "dev": true, - "license": "MIT", - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/tar": { - "version": "4.4.13", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - }, - "engines": { - "node": ">=4.5" - } - }, - "node_modules/ganache-core/node_modules/tar/node_modules/fs-minipass": { - "version": "1.2.7", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^2.6.0" - } - }, - "node_modules/ganache-core/node_modules/tar/node_modules/minipass": { - "version": "2.9.0", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/ganache-core/node_modules/through": { - "version": "2.3.8", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/through2": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/ganache-core/node_modules/timed-out": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/tmp": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "rimraf": "^2.6.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/to-object-path": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/to-object-path/node_modules/is-buffer": { - "version": "1.1.6", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/to-readable-stream": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache-core/node_modules/to-regex": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/toidentifier": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/ganache-core/node_modules/tough-cookie": { - "version": "2.5.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/ganache-core/node_modules/trim-right": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/tunnel-agent": { - "version": "0.6.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ganache-core/node_modules/tweetnacl": { - "version": "1.0.3", - "dev": true, - "license": "Unlicense" - }, - "node_modules/ganache-core/node_modules/tweetnacl-util": { - "version": "0.15.1", - "dev": true, - "license": "Unlicense" - }, - "node_modules/ganache-core/node_modules/type": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, - "node_modules/ganache-core/node_modules/type-is": { - "version": "1.6.18", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ganache-core/node_modules/typedarray": { - "version": "0.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/ganache-core/node_modules/typewise": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "typewise-core": "^1.2.0" - } - }, - "node_modules/ganache-core/node_modules/typewise-core": { - "version": "1.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/typewiselite": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ultron": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/underscore": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/union-value": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/universalify": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/ganache-core/node_modules/unorm": { - "version": "1.6.0", - "dev": true, - "license": "MIT or GPL-2.0", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/ganache-core/node_modules/unpipe": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ganache-core/node_modules/unset-value": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/uri-js": { - "version": "4.4.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/ganache-core/node_modules/urix": { - "version": "0.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/url-parse-lax": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/url-set-query": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/url-to-options": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ganache-core/node_modules/use": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/utf-8-validate": { - "version": "5.0.4", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-gyp-build": "^4.2.0" - } - }, - "node_modules/ganache-core/node_modules/utf8": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/util.promisify": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "for-each": "^0.3.3", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/utils-merge": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/ganache-core/node_modules/uuid": { - "version": "3.4.0", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/ganache-core/node_modules/varint": { - "version": "5.0.2", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/vary": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ganache-core/node_modules/verror": { - "version": "1.10.0", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/ganache-core/node_modules/web3": { - "version": "1.2.11", - "dev": true, - "hasInstallScript": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "web3-bzz": "1.2.11", - "web3-core": "1.2.11", - "web3-eth": "1.2.11", - "web3-eth-personal": "1.2.11", - "web3-net": "1.2.11", - "web3-shh": "1.2.11", - "web3-utils": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-bzz": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40", - "underscore": "1.9.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-bzz/node_modules/@types/node": { - "version": "12.19.12", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/web3-core": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "@types/bn.js": "^4.11.5", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-requestmanager": "1.2.11", - "web3-utils": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-core-helpers": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "underscore": "1.9.1", - "web3-eth-iban": "1.2.11", - "web3-utils": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-core-method": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "@ethersproject/transactions": "^5.0.0-beta.135", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-utils": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-core-promievent": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "eventemitter3": "4.0.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-core-requestmanager": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "web3-providers-http": "1.2.11", - "web3-providers-ipc": "1.2.11", - "web3-providers-ws": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-core-subscriptions": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-core/node_modules/@types/node": { - "version": "12.19.12", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/web3-eth": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-eth-accounts": "1.2.11", - "web3-eth-contract": "1.2.11", - "web3-eth-ens": "1.2.11", - "web3-eth-iban": "1.2.11", - "web3-eth-personal": "1.2.11", - "web3-net": "1.2.11", - "web3-utils": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-eth-abi": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "@ethersproject/abi": "5.0.0-beta.153", - "underscore": "1.9.1", - "web3-utils": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-eth-accounts": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", - "scrypt-js": "^3.0.1", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-utils": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-eth-accounts/node_modules/eth-lib": { - "version": "0.2.8", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/ganache-core/node_modules/web3-eth-accounts/node_modules/uuid": { - "version": "3.3.2", - "dev": true, - "license": "MIT", - "optional": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/ganache-core/node_modules/web3-eth-contract": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "@types/bn.js": "^4.11.5", - "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-utils": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-eth-ens": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-eth-contract": "1.2.11", - "web3-utils": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-eth-iban": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "bn.js": "^4.11.9", - "web3-utils": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-eth-personal": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-net": "1.2.11", - "web3-utils": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-eth-personal/node_modules/@types/node": { - "version": "12.19.12", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/web3-net": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "web3-core": "1.2.11", - "web3-core-method": "1.2.11", - "web3-utils": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine": { - "version": "14.2.1", - "dev": true, - "license": "MIT", - "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": "3.0.0", - "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" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/abstract-leveldown": { - "version": "2.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~4.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/deferred-leveldown": { - "version": "1.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "~2.6.0" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/eth-sig-util": { - "version": "1.4.2", - "dev": true, - "license": "ISC", - "dependencies": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "ethereumjs-util": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-account": { - "version": "2.0.5", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-block": { - "version": "1.7.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-block/node_modules/ethereum-common": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-tx": { - "version": "1.3.7", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm": { - "version": "2.6.0", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-block": { - "version": "2.2.2", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": { - "version": "2.1.2", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-util": { - "version": "6.2.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/isarray": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-codec": { - "version": "7.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-errors": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "errno": "~0.1.1" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-iterator-stream": { - "version": "1.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-iterator-stream/node_modules/readable-stream": { - "version": "1.1.14", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-ws": { - "version": "0.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-ws/node_modules/readable-stream": { - "version": "1.0.34", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-ws/node_modules/xtend": { - "version": "2.1.2", - "dev": true, - "dependencies": { - "object-keys": "~0.4.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/levelup": { - "version": "1.3.9", - "dev": true, - "license": "MIT", - "dependencies": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ltgt": { - "version": "2.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/memdown": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/memdown/node_modules/abstract-leveldown": { - "version": "2.7.2", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~4.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/merkle-patricia-tree": { - "version": "2.3.2", - "dev": true, - "license": "MPL-2.0", - "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" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/merkle-patricia-tree/node_modules/async": { - "version": "1.5.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/object-keys": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/semver": { - "version": "5.4.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/string_decoder": { - "version": "0.10.31", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ws": { - "version": "5.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-providers-http": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "web3-core-helpers": "1.2.11", - "xhr2-cookies": "1.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-providers-ipc": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "oboe": "2.1.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-providers-ws": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "websocket": "^1.0.31" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-shh": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "web3-core": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-net": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-utils": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/ganache-core/node_modules/web3-utils/node_modules/eth-lib": { - "version": "0.2.8", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/ganache-core/node_modules/websocket": { - "version": "1.0.32", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/ganache-core/node_modules/websocket/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/ganache-core/node_modules/websocket/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/whatwg-fetch": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, - "node_modules/ganache-core/node_modules/ws": { - "version": "3.3.3", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - }, - "node_modules/ganache-core/node_modules/ws/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/xhr": { - "version": "2.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/ganache-core/node_modules/xhr-request": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" - } - }, - "node_modules/ganache-core/node_modules/xhr-request-promise": { - "version": "0.1.3", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "xhr-request": "^1.1.0" - } - }, - "node_modules/ganache-core/node_modules/xhr2-cookies": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "cookiejar": "^2.1.1" - } - }, - "node_modules/ganache-core/node_modules/xtend": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/ganache-core/node_modules/yaeti": { - "version": "0.0.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.32" - } - }, - "node_modules/ganache-core/node_modules/yallist": { - "version": "3.1.1", - "dev": true, - "license": "ISC" - }, - "node_modules/ganache/node_modules/@trufflesuite/bigint-buffer": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.9.tgz", - "integrity": "sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "4.3.0" - } - }, - "node_modules/ganache/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "node_modules/ganache/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/ganache/node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "node_modules/ganache/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/ganache/node_modules/bufferutil": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", - "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", - "dev": true, - "optional": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - } - }, - "node_modules/ganache/node_modules/catering": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.0.tgz", - "integrity": "sha512-M5imwzQn6y+ODBfgi+cfgZv2hIUI6oYU/0f35Mdb1ujGeqeoI5tOnl9Q13DTH7LW+7er+NYq8stNOKZD/Z3U/A==", - "dev": true, - "dependencies": { - "queue-tick": "^1.0.0" - } - }, - "node_modules/ganache/node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/ganache/node_modules/emittery": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", - "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", - "dev": true - }, - "node_modules/ganache/node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/ganache/node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/ganache/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "node_modules/ganache/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ganache/node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true - }, - "node_modules/ganache/node_modules/keccak": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", - "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "node_modules/ganache/node_modules/leveldown": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-6.1.0.tgz", - "integrity": "sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w==", - "dev": true, - "dependencies": { - "abstract-leveldown": "^7.2.0", - "napi-macros": "~2.0.0", - "node-gyp-build": "^4.3.0" - } - }, - "node_modules/ganache/node_modules/leveldown/node_modules/abstract-leveldown": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", - "integrity": "sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.0.0", - "is-buffer": "^2.0.5", - "level-concat-iterator": "^3.0.0", - "level-supports": "^2.0.1", - "queue-microtask": "^1.2.3" - } - }, - "node_modules/ganache/node_modules/leveldown/node_modules/level-concat-iterator": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz", - "integrity": "sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==", - "dev": true, - "dependencies": { - "catering": "^2.1.0" - } - }, - "node_modules/ganache/node_modules/leveldown/node_modules/level-supports": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz", - "integrity": "sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==", - "dev": true - }, - "node_modules/ganache/node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/ganache/node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "node_modules/ganache/node_modules/napi-macros": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "dev": true - }, - "node_modules/ganache/node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true - }, - "node_modules/ganache/node_modules/node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", - "dev": true - }, - "node_modules/ganache/node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "node_modules/ganache/node_modules/queue-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.0.tgz", - "integrity": "sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ==", - "dev": true - }, - "node_modules/ganache/node_modules/secp256k1": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", - "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", - "dev": true, - "dependencies": { - "elliptic": "^6.5.2", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "node_modules/ganache/node_modules/utf-8-validate": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz", - "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==", - "dev": true, - "optional": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - } - }, - "node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", - "dev": true, - "optional": true, - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "optional": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "optional": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "optional": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "dependencies": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-base/node_modules/glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "dependencies": { - "is-glob": "^2.0.0" - } - }, - "node_modules/glob-base/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-base/node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "dependencies": { - "min-document": "^2.19.0", - "process": "~0.5.1" - } - }, - "node_modules/globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/google-libphonenumber": { - "version": "3.2.16", - "resolved": "https://registry.npmjs.org/google-libphonenumber/-/google-libphonenumber-3.2.16.tgz", - "integrity": "sha512-9Gzn78fJvCuNPYnbmUFFLhL0A4qBbSBs11+3cLKNuZX3lWKJ+1pSVS0C2bq0Yjq00cW2e8LZkHAxl+MQRGxGWA==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "node_modules/graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - }, - "node_modules/graphql": { - "version": "15.8.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", - "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/graphql-tag": { - "version": "2.12.6", - "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", - "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", - "dev": true, - "optional": true, - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/graphql-tag/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true, - "optional": true - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "engines": { - "node": "*" - } - }, - "node_modules/has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "dependencies": { - "has-symbol-support-x": "^1.4.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true, - "optional": true - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-value/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/header-case": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", - "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", - "dev": true, - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.3" - } - }, - "node_modules/highlight.js": { - "version": "9.18.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.1.tgz", - "integrity": "sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg==", - "deprecated": "Version no longer supported. Upgrade to @latest", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/highlightjs-solidity": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-1.0.16.tgz", - "integrity": "sha512-uxdj3Qn4cBoY1zNIe8BSiwvw14G9Nq99HWEqPqFSu/rBCFaz84C+N/FChpPcUjd6q+cVsXOdyafCIAx5LHhBEQ==", - "dev": true - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/htmlparser2/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-basic": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", - "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", - "dev": true, - "dependencies": { - "caseless": "^0.12.0", - "concat-stream": "^1.6.2", - "http-response-object": "^3.0.1", - "parse-cache-control": "^1.0.1" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" - }, - "node_modules/http-response-object": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", - "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", - "dev": true, - "dependencies": { - "@types/node": "^10.0.3" - } - }, - "node_modules/http-response-object/node_modules/@types/node": { - "version": "10.17.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.26.tgz", - "integrity": "sha512-myMwkO2Cr82kirHY8uknNRHEVtn0wV3DTQfkrjx17jmkstDRZ24gNUdl8AHXVyVclTYI/bNjgTPTAWvWLqXqkw==", - "dev": true - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/husky": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz", - "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "is-ci": "^1.0.10", - "normalize-path": "^1.0.0", - "strip-indent": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", - "dependencies": { - "punycode": "2.1.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/idna-uts46-hx/node_modules/punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", - "engines": { - "node": ">=6" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "dev": true, - "optional": true, - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", - "dev": true - }, - "node_modules/import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "optional": true - }, - "node_modules/inquirer": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.2.0.tgz", - "integrity": "sha512-E0c4rPwr9ByePfNlTIB8z51kK1s2n6jrHuJeEHENl/sbq2G/S1auvibgEwNR4uSyiU+PiYHqSwsgGiXjG8p5ZQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "dependencies": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/io-ts": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-2.0.1.tgz", - "integrity": "sha512-RezD+WcCfW4VkMkEcQWL/Nmy/nqsWTvTYg7oUmTGzglvSSV2P9h2z1PVeREPFf0GWNzruYleAt1XCMQZSg1xxQ==", - "dev": true, - "peerDependencies": { - "fp-ts": "^2.0.0" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", - "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "dependencies": { - "ci-info": "^1.5.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "dependencies": { - "is-primitive": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz", - "integrity": "sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" - }, - "node_modules/is-generator-function": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", - "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=", - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/is-lower-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", - "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", - "dev": true, - "dependencies": { - "lower-case": "^1.1.0" - } - }, - "node_modules/is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" - }, - "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", - "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.0-next.2", - "foreach": "^2.0.5", - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array/node_modules/es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array/node_modules/es-abstract/node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array/node_modules/is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array/node_modules/object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array/node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array/node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array/node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-upper-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", - "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", - "dev": true, - "dependencies": { - "upper-case": "^1.1.0" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "dev": true, - "optional": true, - "peerDependencies": { - "ws": "*" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "node_modules/isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "dependencies": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - }, - "node_modules/js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, - "node_modules/json-pointer": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", - "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", - "dev": true, - "dependencies": { - "foreach": "^2.0.4" - } - }, - "node_modules/json-rpc-engine": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz", - "integrity": "sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==", - "dev": true, - "dependencies": { - "@metamask/safe-event-emitter": "^2.0.0", - "eth-rpc-errors": "^4.0.2" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/json-rpc-engine/node_modules/eth-rpc-errors": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz", - "integrity": "sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==", - "dev": true, - "dependencies": { - "fast-safe-stringify": "^2.0.6" - } - }, - "node_modules/json-rpc-random-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", - "integrity": "sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==", - "dev": true - }, - "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-schema-typed": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", - "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==", - "dev": true, - "optional": true - }, - "node_modules/json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha512-i/J297TW6xyj7sDFa7AmBPkQvLIxWr2kKPWI26tXydnZrzVAocNqn5DMNT1Mzk0vit1V5UkRM7C1KdVNp7Lmcg==", - "dev": true, - "dependencies": { - "jsonify": "~0.0.0" - } - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "node_modules/json-text-sequence": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", - "integrity": "sha1-py8hfcSvxGKf/1/rME3BvVGi89I=", - "dependencies": { - "delimit-stream": "0.1.0" - } - }, - "node_modules/json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "node_modules/keccak": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", - "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==", - "hasInstallScript": true, - "dependencies": { - "bindings": "^1.5.0", - "inherits": "^2.0.4", - "nan": "^2.14.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=5.12.0" - } - }, - "node_modules/keccak256": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/keccak256/-/keccak256-1.0.2.tgz", - "integrity": "sha512-f2EncSgmHmmQOkgxZ+/f2VaWTNkFL6f39VIrpoX+p8cEXJVyyCs/3h9GNz/ViHgwchxvv7oG5mjT2Tk4ZqInag==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.8", - "keccak": "^3.0.1" - } - }, - "node_modules/keccak256/node_modules/keccak": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", - "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kind-of/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.9" - } - }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/level": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/level/-/level-6.0.1.tgz", - "integrity": "sha512-psRSqJZCsC/irNhfHzrVZbmPYXDcEYhA5TVNwr+V92jF44rbf86hqGp8fiT702FyiArScYIlPSBTDUASCVNSpw==", - "dev": true, - "optional": true, - "dependencies": { - "level-js": "^5.0.0", - "level-packager": "^5.1.0", - "leveldown": "^5.4.0" - }, - "engines": { - "node": ">=8.6.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" - } - }, - "node_modules/level-codec": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", - "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", - "dev": true, - "optional": true, - "dependencies": { - "buffer": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-concat-iterator": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz", - "integrity": "sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==", - "dev": true, - "optional": true, - "dependencies": { - "catering": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/level-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", - "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", - "dev": true, - "optional": true, - "dependencies": { - "errno": "~0.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-iterator-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", - "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", - "dev": true, - "optional": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.4.0", - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-iterator-stream/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/level-js": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/level-js/-/level-js-5.0.2.tgz", - "integrity": "sha512-SnBIDo2pdO5VXh02ZmtAyPP6/+6YTJg2ibLtl9C34pWvmtMEmRTWpra+qO/hifkUtBTOtfx6S9vLDjBsBK4gRg==", - "dev": true, - "optional": true, - "dependencies": { - "abstract-leveldown": "~6.2.3", - "buffer": "^5.5.0", - "inherits": "^2.0.3", - "ltgt": "^2.1.2" - } - }, - "node_modules/level-js/node_modules/abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "dev": true, - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-js/node_modules/level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-js/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "optional": true, - "dependencies": { - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-packager": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", - "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", - "dev": true, - "optional": true, - "dependencies": { - "encoding-down": "^6.3.0", - "levelup": "^4.3.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-supports": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz", - "integrity": "sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/level-write-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/level-write-stream/-/level-write-stream-1.0.0.tgz", - "integrity": "sha512-bBNKOEOMl8msO+uIM9YX/gUO6ckokZ/4pCwTm/lwvs46x6Xs8Zy0sn3Vh37eDqse4mhy4fOMIb/JsSM2nyQFtw==", - "dev": true, - "optional": true, - "dependencies": { - "end-stream": "~0.1.0" - } - }, - "node_modules/level-ws": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", - "integrity": "sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==", - "dev": true, - "dependencies": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - } - }, - "node_modules/level-ws/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/level-ws/node_modules/object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==", - "dev": true - }, - "node_modules/level-ws/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/level-ws/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "node_modules/level-ws/node_modules/xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", - "dev": true, - "dependencies": { - "object-keys": "~0.4.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/leveldown": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-5.6.0.tgz", - "integrity": "sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "abstract-leveldown": "~6.2.1", - "napi-macros": "~2.0.0", - "node-gyp-build": "~4.1.0" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/leveldown/node_modules/abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "dev": true, - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/leveldown/node_modules/level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leveldown/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "optional": true, - "dependencies": { - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/leveldown/node_modules/node-gyp-build": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.1.1.tgz", - "integrity": "sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==", - "dev": true, - "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/levelup": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", - "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", - "dev": true, - "optional": true, - "dependencies": { - "deferred-leveldown": "~5.3.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~4.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/levelup/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "optional": true, - "dependencies": { - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", - "dev": true - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.partition": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.partition/-/lodash.partition-4.6.0.tgz", - "integrity": "sha1-o45GtzRp4EILDaEhLmbUFL42S6Q=", - "dev": true - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true, - "optional": true - }, - "node_modules/lodash.sum": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/lodash.sum/-/lodash.sum-4.0.2.tgz", - "integrity": "sha1-rZDjl5ZdgD1PH/eqWy0Bl/O0Y3s=", - "dev": true - }, - "node_modules/log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/loglevel": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", - "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - } - }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true, - "optional": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", - "dev": true - }, - "node_modules/lower-case-first": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", - "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", - "dev": true, - "dependencies": { - "lower-case": "^1.1.2" - } - }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/lru-cache/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "node_modules/ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", - "dev": true - }, - "node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/make-dir/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "engines": { - "node": ">=4" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/markdown-table": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", - "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", - "dev": true - }, - "node_modules/math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true - }, - "node_modules/md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", - "dev": true, - "dependencies": { - "charenc": "~0.0.1", - "crypt": "~0.0.1", - "is-buffer": "~1.1.1" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/md5/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mem/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/memdown": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", - "integrity": "sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==", - "dev": true, - "dependencies": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - } - }, - "node_modules/memdown/node_modules/abstract-leveldown": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", - "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", - "dev": true, - "dependencies": { - "xtend": "~4.0.0" - } - }, - "node_modules/memdown/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "node_modules/merkle-patricia-tree": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", - "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", - "dev": true, - "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" - } - }, - "node_modules/merkle-patricia-tree/node_modules/abstract-leveldown": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", - "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", - "dev": true, - "dependencies": { - "xtend": "~4.0.0" - } - }, - "node_modules/merkle-patricia-tree/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true - }, - "node_modules/merkle-patricia-tree/node_modules/deferred-leveldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", - "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", - "dev": true, - "dependencies": { - "abstract-leveldown": "~2.6.0" - } - }, - "node_modules/merkle-patricia-tree/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/merkle-patricia-tree/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/merkle-patricia-tree/node_modules/level-codec": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", - "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==", - "dev": true - }, - "node_modules/merkle-patricia-tree/node_modules/level-errors": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", - "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", - "dev": true, - "dependencies": { - "errno": "~0.1.1" - } - }, - "node_modules/merkle-patricia-tree/node_modules/level-iterator-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", - "integrity": "sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - } - }, - "node_modules/merkle-patricia-tree/node_modules/level-iterator-stream/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/merkle-patricia-tree/node_modules/levelup": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", - "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", - "dev": true, - "dependencies": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "node_modules/merkle-patricia-tree/node_modules/semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/merkle-patricia-tree/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "dependencies": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "dependencies": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dependencies": { - "mime-db": "1.44.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dependencies": { - "dom-walk": "^0.1.0" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dependencies": { - "minipass": "^2.9.0" - } - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", - "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", - "dependencies": { - "mkdirp": "*" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", - "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", - "dev": true, - "dependencies": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha-junit-reporter": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-1.23.3.tgz", - "integrity": "sha512-ed8LqbRj1RxZfjt/oC9t12sfrWsjZ3gNnbhV1nuj9R/Jb5/P3Xb4duv2eCfCDMYH+fEu0mqca7m4wsiVjsxsvA==", - "dev": true, - "dependencies": { - "debug": "^2.2.0", - "md5": "^2.1.0", - "mkdirp": "~0.5.1", - "strip-ansi": "^4.0.0", - "xml": "^1.0.0" - }, - "peerDependencies": { - "mocha": ">=2.2.5" - } - }, - "node_modules/mocha-junit-reporter/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha-junit-reporter/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/mocha-junit-reporter/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mocha-junit-reporter/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha/node_modules/ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/mocha/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/mocha/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "node_modules/mocha/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mock-fs": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.12.0.tgz", - "integrity": "sha512-/P/HtrlvBxY4o/PzXY9cCNBrdylDNxg7gnrv2sMNxj+UJ2m8jSpl0/A6fuJeNAWr99ZvGWH8XCbE0vmnM5KupQ==" - }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/multibase": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", - "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", - "deprecated": "This module has been superseded by the multiformats module", - "dev": true, - "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, - "node_modules/multicodec": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", - "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", - "deprecated": "This module has been superseded by the multiformats module", - "dev": true, - "dependencies": { - "varint": "^5.0.0" - } - }, - "node_modules/multihashes": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", - "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "multibase": "^0.7.0", - "varint": "^5.0.0" - } - }, - "node_modules/multihashes/node_modules/multibase": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", - "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", - "deprecated": "This module has been superseded by the multiformats module", - "dev": true, - "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" - }, - "node_modules/nano-json-stream-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" - }, - "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/napi-macros": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "dev": true, - "optional": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/needle": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", - "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", - "dev": true, - "optional": true, - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "optional": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/needle/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "optional": true - }, - "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "dependencies": { - "lower-case": "^1.1.1" - } - }, - "node_modules/node-abort-controller": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz", - "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==", - "dev": true, - "optional": true - }, - "node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true - }, - "node_modules/node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", - "dev": true, - "dependencies": { - "minimatch": "^3.0.2" - }, - "engines": { - "node": ">= 0.10.5" - } - }, - "node_modules/node-environment-flags": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", - "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", - "dev": true, - "dependencies": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp-build": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", - "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==", - "dev": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-interval-tree": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/node-interval-tree/-/node-interval-tree-1.3.3.tgz", - "integrity": "sha512-K9vk96HdTK5fEipJwxSvIIqwTqr4e3HRJeJrNxBSeVMNSC/JWARRaX7etOLOuTmrRMeOI/K5TCJu3aWIwZiNTw==", - "dev": true, - "dependencies": { - "shallowequal": "^1.0.2" - }, - "engines": { - "node": ">= 7.6.0" - } - }, - "node_modules/node-pre-gyp": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", - "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", - "deprecated": "Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future", - "dev": true, - "optional": true, - "dependencies": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/node-pre-gyp/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "optional": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", - "dev": true - }, - "node_modules/nofilter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", - "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/noop-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/noop-fn/-/noop-fn-1.0.0.tgz", - "integrity": "sha512-pQ8vODlgXt2e7A3mIbFDlizkr46r75V+BJxVAyat8Jl7YmI513gG5cfyRL0FedKraoZ+VAouI1h4/IWpus5pcQ==", - "dev": true, - "optional": true - }, - "node_modules/nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "dev": true, - "optional": true, - "dependencies": { - "abbrev": "1", - "osenv": "^0.1.4" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/normalize-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", - "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dev": true, - "optional": true, - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true, - "optional": true - }, - "node_modules/npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "dev": true, - "optional": true, - "dependencies": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", - "dependencies": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/number-to-bn/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "node_modules/numeral": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", - "integrity": "sha1-StCAk21EPCVhrtnyGX7//iX05QY=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-visit/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "dependencies": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/oboe": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz", - "integrity": "sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=", - "dependencies": { - "http-https": "^1.0.0" - } - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/openzeppelin-solidity": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/openzeppelin-solidity/-/openzeppelin-solidity-2.4.0.tgz", - "integrity": "sha512-533gc5jkspxW5YT0qJo02Za5q1LHwXK9CJCc48jNj/22ncNM/3M/3JfWLqfpB90uqLwOKOovpl0JfaMQTR+gXQ==" - }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/original-require": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/original-require/-/original-require-1.0.1.tgz", - "integrity": "sha512-5vdKMbE58WaE61uVD+PKyh8xdM398UnjPBLotW2sjG5MzHARwta/+NtMBCBA0t2WQblGYBvq5vsiZpWokwno+A==", - "dev": true - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "dependencies": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/p-queue/node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "engines": { - "node": ">=4" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", - "dev": true, - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", - "dependencies": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/parse-cache-control": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", - "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=", - "dev": true - }, - "node_modules/parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "dependencies": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-glob/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-glob/node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-headers": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", - "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" - }, - "node_modules/parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", - "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", - "dev": true, - "dependencies": { - "camel-case": "^3.0.0", - "upper-case-first": "^1.1.0" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", - "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", - "dev": true, - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "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" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/pegjs": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", - "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=", - "dev": true, - "bin": { - "pegjs": "bin/pegjs" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "optional": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "optional": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "optional": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "optional": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "optional": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pouchdb": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb/-/pouchdb-7.3.0.tgz", - "integrity": "sha512-OwsIQGXsfx3TrU1pLruj6PGSwFH+h5k4hGNxFkZ76Um7/ZI8F5TzUHFrpldVVIhfXYi2vP31q0q7ot1FSLFYOw==", - "dev": true, - "optional": true, - "dependencies": { - "abort-controller": "3.0.0", - "argsarray": "0.0.1", - "buffer-from": "1.1.2", - "clone-buffer": "1.0.0", - "double-ended-queue": "2.1.0-0", - "fetch-cookie": "0.11.0", - "immediate": "3.3.0", - "inherits": "2.0.4", - "level": "6.0.1", - "level-codec": "9.0.2", - "level-write-stream": "1.0.0", - "leveldown": "5.6.0", - "levelup": "4.4.0", - "ltgt": "2.2.1", - "node-fetch": "2.6.7", - "readable-stream": "1.1.14", - "spark-md5": "3.0.2", - "through2": "3.0.2", - "uuid": "8.3.2", - "vuvuzela": "1.0.3" - } - }, - "node_modules/pouchdb-abstract-mapreduce": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-abstract-mapreduce/-/pouchdb-abstract-mapreduce-7.3.0.tgz", - "integrity": "sha512-+2fVt3SDh7D776lIGbYZOsKX5js1aUyUw7iJaTGitxSdQ2ObWSTrr3SUrj5Qo1CkgPXwRM3Tdoq/53JYAa2qCA==", - "dev": true, - "optional": true, - "dependencies": { - "pouchdb-binary-utils": "7.3.0", - "pouchdb-collate": "7.3.0", - "pouchdb-collections": "7.3.0", - "pouchdb-errors": "7.3.0", - "pouchdb-fetch": "7.3.0", - "pouchdb-mapreduce-utils": "7.3.0", - "pouchdb-md5": "7.3.0", - "pouchdb-utils": "7.3.0" - } - }, - "node_modules/pouchdb-adapter-leveldb-core": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-adapter-leveldb-core/-/pouchdb-adapter-leveldb-core-7.3.0.tgz", - "integrity": "sha512-OyUsEae1JlqR2jSGMohP03gj6VANh9fDR/3nPIa1vYyoQWlwQzOS7knKqDaJm7Nui3JC5q/lWos7/FGZBFuF5Q==", - "dev": true, - "optional": true, - "dependencies": { - "argsarray": "0.0.1", - "buffer-from": "1.1.2", - "double-ended-queue": "2.1.0-0", - "levelup": "4.4.0", - "pouchdb-adapter-utils": "7.3.0", - "pouchdb-binary-utils": "7.3.0", - "pouchdb-collections": "7.3.0", - "pouchdb-errors": "7.3.0", - "pouchdb-json": "7.3.0", - "pouchdb-md5": "7.3.0", - "pouchdb-merge": "7.3.0", - "pouchdb-utils": "7.3.0", - "sublevel-pouchdb": "7.3.0", - "through2": "3.0.2" - } - }, - "node_modules/pouchdb-adapter-memory": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-adapter-memory/-/pouchdb-adapter-memory-7.3.0.tgz", - "integrity": "sha512-nUdYi5KpbUa0uv0L3IJorpiUnIOBPxX9qplCX9i7JE8OtLPeLyKuX3WC+3M1//8Lmmxg3b1wXSNIod6FJy4wAQ==", - "dev": true, - "optional": true, - "dependencies": { - "memdown": "1.4.1", - "pouchdb-adapter-leveldb-core": "7.3.0", - "pouchdb-utils": "7.3.0" - } - }, - "node_modules/pouchdb-adapter-node-websql": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-adapter-node-websql/-/pouchdb-adapter-node-websql-7.0.0.tgz", - "integrity": "sha512-fNaOMO8bvMrRTSfmH4RSLSpgnKahRcCA7Z0jg732PwRbGvvMdGbreZwvKPPD1fg2tm2ZwwiXWK2G3+oXyoqZYw==", - "dev": true, - "optional": true, - "dependencies": { - "pouchdb-adapter-websql-core": "7.0.0", - "pouchdb-utils": "7.0.0", - "websql": "1.0.0" - } - }, - "node_modules/pouchdb-adapter-node-websql/node_modules/buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", - "dev": true, - "optional": true - }, - "node_modules/pouchdb-adapter-node-websql/node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true, - "optional": true - }, - "node_modules/pouchdb-adapter-node-websql/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true, - "optional": true - }, - "node_modules/pouchdb-adapter-node-websql/node_modules/pouchdb-binary-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-binary-utils/-/pouchdb-binary-utils-7.0.0.tgz", - "integrity": "sha512-yUktdOPIPvOVouCjJN3uop+bCcpdPwePrLm9eUAZNgEYnUFu0njdx7Q0WRsZ7UJ6l75HinL5ZHk4bnvEt86FLw==", - "dev": true, - "optional": true, - "dependencies": { - "buffer-from": "1.1.0" - } - }, - "node_modules/pouchdb-adapter-node-websql/node_modules/pouchdb-collections": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-collections/-/pouchdb-collections-7.0.0.tgz", - "integrity": "sha512-DaoUr/vU24Q3gM6ghj0va9j/oBanPwkbhkvnqSyC3Dm5dgf5pculNxueLF9PKMo3ycApoWzHMh6N2N8KJbDU2Q==", - "dev": true, - "optional": true - }, - "node_modules/pouchdb-adapter-node-websql/node_modules/pouchdb-errors": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-errors/-/pouchdb-errors-7.0.0.tgz", - "integrity": "sha512-dTusY8nnTw4HIztCrNl7AoGgwvS1bVf/3/97hDaGc4ytn72V9/4dK8kTqlimi3UpaurohYRnqac0SGXYP8vgXA==", - "dev": true, - "optional": true, - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/pouchdb-adapter-node-websql/node_modules/pouchdb-md5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-md5/-/pouchdb-md5-7.0.0.tgz", - "integrity": "sha512-yaSJKhLA3QlgloKUQeb2hLdT3KmUmPfoYdryfwHZuPTpXIRKTnMQTR9qCIRUszc0ruBpDe53DRslCgNUhAyTNQ==", - "dev": true, - "optional": true, - "dependencies": { - "pouchdb-binary-utils": "7.0.0", - "spark-md5": "3.0.0" - } - }, - "node_modules/pouchdb-adapter-node-websql/node_modules/pouchdb-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-utils/-/pouchdb-utils-7.0.0.tgz", - "integrity": "sha512-1bnoX1KdZYHv9wicDIFdO0PLiVIMzNDUBUZ/yOJZ+6LW6niQCB8aCv09ZztmKfSQcU5nnN3fe656tScBgP6dOQ==", - "dev": true, - "optional": true, - "dependencies": { - "argsarray": "0.0.1", - "clone-buffer": "1.0.0", - "immediate": "3.0.6", - "inherits": "2.0.3", - "pouchdb-collections": "7.0.0", - "pouchdb-errors": "7.0.0", - "pouchdb-md5": "7.0.0", - "uuid": "3.2.1" - } - }, - "node_modules/pouchdb-adapter-node-websql/node_modules/spark-md5": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.0.tgz", - "integrity": "sha512-BpPFB0Oh83mi+6DRcFwxPx96f3OL8Tkq3hdvaHuXaQUsy5F3saI3zIPNQ/UsTQgyAXIHnML1waeCe1WoCPXbpQ==", - "dev": true, - "optional": true - }, - "node_modules/pouchdb-adapter-node-websql/node_modules/uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "optional": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/pouchdb-adapter-utils": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-adapter-utils/-/pouchdb-adapter-utils-7.3.0.tgz", - "integrity": "sha512-mU1+smcagWSpInVx/VQk7VVjjnJlyagKtusUS3OdCMFZY35L6RbXC8eIhoNVDbkBfEv3cIwqQ3t7fdvkaa1odQ==", - "dev": true, - "optional": true, - "dependencies": { - "pouchdb-binary-utils": "7.3.0", - "pouchdb-collections": "7.3.0", - "pouchdb-errors": "7.3.0", - "pouchdb-md5": "7.3.0", - "pouchdb-merge": "7.3.0", - "pouchdb-utils": "7.3.0" - } - }, - "node_modules/pouchdb-adapter-websql-core": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-adapter-websql-core/-/pouchdb-adapter-websql-core-7.0.0.tgz", - "integrity": "sha512-NyMaH0bl20SdJdOCzd+fwXo8JZ15a48/MAwMcIbXzsRHE4DjFNlRcWAcjUP6uN4Ezc+Gx+r2tkBBMf71mIz1Aw==", - "dev": true, - "optional": true, - "dependencies": { - "pouchdb-adapter-utils": "7.0.0", - "pouchdb-binary-utils": "7.0.0", - "pouchdb-collections": "7.0.0", - "pouchdb-errors": "7.0.0", - "pouchdb-json": "7.0.0", - "pouchdb-merge": "7.0.0", - "pouchdb-utils": "7.0.0" - } - }, - "node_modules/pouchdb-adapter-websql-core/node_modules/buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", - "dev": true, - "optional": true - }, - "node_modules/pouchdb-adapter-websql-core/node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true, - "optional": true - }, - "node_modules/pouchdb-adapter-websql-core/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true, - "optional": true - }, - "node_modules/pouchdb-adapter-websql-core/node_modules/pouchdb-adapter-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-adapter-utils/-/pouchdb-adapter-utils-7.0.0.tgz", - "integrity": "sha512-UWKPC6jkz6mHUzZefrU7P5X8ZGvBC8LSNZ7BIp0hWvJE6c20cnpDwedTVDpZORcCbVJpDmFOHBYnOqEIblPtbA==", - "dev": true, - "optional": true, - "dependencies": { - "pouchdb-binary-utils": "7.0.0", - "pouchdb-collections": "7.0.0", - "pouchdb-errors": "7.0.0", - "pouchdb-md5": "7.0.0", - "pouchdb-merge": "7.0.0", - "pouchdb-utils": "7.0.0" - } - }, - "node_modules/pouchdb-adapter-websql-core/node_modules/pouchdb-binary-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-binary-utils/-/pouchdb-binary-utils-7.0.0.tgz", - "integrity": "sha512-yUktdOPIPvOVouCjJN3uop+bCcpdPwePrLm9eUAZNgEYnUFu0njdx7Q0WRsZ7UJ6l75HinL5ZHk4bnvEt86FLw==", - "dev": true, - "optional": true, - "dependencies": { - "buffer-from": "1.1.0" - } - }, - "node_modules/pouchdb-adapter-websql-core/node_modules/pouchdb-collections": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-collections/-/pouchdb-collections-7.0.0.tgz", - "integrity": "sha512-DaoUr/vU24Q3gM6ghj0va9j/oBanPwkbhkvnqSyC3Dm5dgf5pculNxueLF9PKMo3ycApoWzHMh6N2N8KJbDU2Q==", - "dev": true, - "optional": true - }, - "node_modules/pouchdb-adapter-websql-core/node_modules/pouchdb-errors": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-errors/-/pouchdb-errors-7.0.0.tgz", - "integrity": "sha512-dTusY8nnTw4HIztCrNl7AoGgwvS1bVf/3/97hDaGc4ytn72V9/4dK8kTqlimi3UpaurohYRnqac0SGXYP8vgXA==", - "dev": true, - "optional": true, - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/pouchdb-adapter-websql-core/node_modules/pouchdb-json": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-json/-/pouchdb-json-7.0.0.tgz", - "integrity": "sha512-w0bNRu/7VmmCrFWMYAm62n30wvJJUT2SokyzeTyj3hRohj4GFwTRg1mSZ+iAmxgRKOFE8nzZstLG/WAB4Ymjew==", - "dev": true, - "optional": true, - "dependencies": { - "vuvuzela": "1.0.3" - } - }, - "node_modules/pouchdb-adapter-websql-core/node_modules/pouchdb-md5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-md5/-/pouchdb-md5-7.0.0.tgz", - "integrity": "sha512-yaSJKhLA3QlgloKUQeb2hLdT3KmUmPfoYdryfwHZuPTpXIRKTnMQTR9qCIRUszc0ruBpDe53DRslCgNUhAyTNQ==", - "dev": true, - "optional": true, - "dependencies": { - "pouchdb-binary-utils": "7.0.0", - "spark-md5": "3.0.0" - } - }, - "node_modules/pouchdb-adapter-websql-core/node_modules/pouchdb-merge": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-merge/-/pouchdb-merge-7.0.0.tgz", - "integrity": "sha512-tci5u6NpznQhGcPv4ho1h0miky9rs+ds/T9zQ9meQeDZbUojXNaX1Jxsb0uYEQQ+HMqdcQs3Akdl0/u0mgwPGg==", - "dev": true, - "optional": true - }, - "node_modules/pouchdb-adapter-websql-core/node_modules/pouchdb-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-utils/-/pouchdb-utils-7.0.0.tgz", - "integrity": "sha512-1bnoX1KdZYHv9wicDIFdO0PLiVIMzNDUBUZ/yOJZ+6LW6niQCB8aCv09ZztmKfSQcU5nnN3fe656tScBgP6dOQ==", - "dev": true, - "optional": true, - "dependencies": { - "argsarray": "0.0.1", - "clone-buffer": "1.0.0", - "immediate": "3.0.6", - "inherits": "2.0.3", - "pouchdb-collections": "7.0.0", - "pouchdb-errors": "7.0.0", - "pouchdb-md5": "7.0.0", - "uuid": "3.2.1" - } - }, - "node_modules/pouchdb-adapter-websql-core/node_modules/spark-md5": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.0.tgz", - "integrity": "sha512-BpPFB0Oh83mi+6DRcFwxPx96f3OL8Tkq3hdvaHuXaQUsy5F3saI3zIPNQ/UsTQgyAXIHnML1waeCe1WoCPXbpQ==", - "dev": true, - "optional": true - }, - "node_modules/pouchdb-adapter-websql-core/node_modules/uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "optional": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/pouchdb-binary-utils": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-binary-utils/-/pouchdb-binary-utils-7.3.0.tgz", - "integrity": "sha512-xvBH/XGHGcou2vkEzszJxkCc7YElfRUrkLUg51Jbdmh1mogLDUO0bU3Tj6TOIIJfRkQrU/HV+dDkMAhsil0amQ==", - "dev": true, - "optional": true, - "dependencies": { - "buffer-from": "1.1.2" - } - }, - "node_modules/pouchdb-collate": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-collate/-/pouchdb-collate-7.3.0.tgz", - "integrity": "sha512-ys7rXKtEr6cfghgUjknwFJiOkITebV6JmeTybJKCzMV0r2luXu0OoPQsKVpE/wbM/3F5LxfpbFKGFpPcfGMvTA==", - "dev": true, - "optional": true - }, - "node_modules/pouchdb-collections": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-collections/-/pouchdb-collections-7.3.0.tgz", - "integrity": "sha512-Xr54m2+fErShXn+qAT4xwqJ+8NwddNPeTMJT4z4k1sZsrwfHmZsWbsKAyGPMF04eQaaU+7DDRMciu2VzaBUXyg==", - "dev": true, - "optional": true - }, - "node_modules/pouchdb-debug": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/pouchdb-debug/-/pouchdb-debug-7.2.1.tgz", - "integrity": "sha512-eP3ht/AKavLF2RjTzBM6S9gaI2/apcW6xvaKRQhEdOfiANqerFuksFqHCal3aikVQuDO+cB/cw+a4RyJn/glBw==", - "dev": true, - "optional": true, - "dependencies": { - "debug": "3.1.0" - } - }, - "node_modules/pouchdb-errors": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-errors/-/pouchdb-errors-7.3.0.tgz", - "integrity": "sha512-dTBbIC1BbCy6J9W/Csg5xROgb3wJN3HpbgAJHHSEtAkb8oA45KZmU3ZwEpNhf0AfPuQm4XgW1936PvlDlGgJiw==", - "dev": true, - "optional": true, - "dependencies": { - "inherits": "2.0.4" - } - }, - "node_modules/pouchdb-fetch": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-fetch/-/pouchdb-fetch-7.3.0.tgz", - "integrity": "sha512-8/lcg8iMDG+GVs1dHNXA4ktJSEpH71dHU3xesMJ25tNQOqfAaaWrkfz9j71ZYDDkveLYE6UjUzl/sDacu2hSjw==", - "dev": true, - "optional": true, - "dependencies": { - "abort-controller": "3.0.0", - "fetch-cookie": "0.11.0", - "node-fetch": "2.6.7" - } - }, - "node_modules/pouchdb-find": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-find/-/pouchdb-find-7.3.0.tgz", - "integrity": "sha512-EwhnfyxCAkKf8PG4tfndTTygEmtuz+o1LiZkxfPrflfXA3m1jo1ithib0hwBYtEwEYWuZxH6B8pRZutbLoQCGA==", - "dev": true, - "optional": true, - "dependencies": { - "pouchdb-abstract-mapreduce": "7.3.0", - "pouchdb-collate": "7.3.0", - "pouchdb-errors": "7.3.0", - "pouchdb-fetch": "7.3.0", - "pouchdb-md5": "7.3.0", - "pouchdb-selector-core": "7.3.0", - "pouchdb-utils": "7.3.0" - } - }, - "node_modules/pouchdb-json": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-json/-/pouchdb-json-7.3.0.tgz", - "integrity": "sha512-D4wyi20ltyiFpuziQeMk3CbXs/Q58VoGTYTJQY8MWBw37OidtHGQAt1Kh5yJ435wJqDzJZyxMA5RxGZxEOBDVg==", - "dev": true, - "optional": true, - "dependencies": { - "vuvuzela": "1.0.3" - } - }, - "node_modules/pouchdb-mapreduce-utils": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-mapreduce-utils/-/pouchdb-mapreduce-utils-7.3.0.tgz", - "integrity": "sha512-KDVSd+H2r+XWTrQfKWV71SknDDYRjYXoeWs0ZQl3xITHCcTl+fIgqyagg/XN+Zy/U9LeLPGMe2JdgPx9H8lJgw==", - "dev": true, - "optional": true, - "dependencies": { - "argsarray": "0.0.1", - "inherits": "2.0.4", - "pouchdb-collections": "7.3.0", - "pouchdb-utils": "7.3.0" - } - }, - "node_modules/pouchdb-md5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-md5/-/pouchdb-md5-7.3.0.tgz", - "integrity": "sha512-wL04QgoKyd/L/TV5gxgcvlEyCJiZoXCOEFJklTzkdza/kBQNJGPH7i0ZhKa7Sb+AvZYoWZHddf1Zgv7rBScHkA==", - "dev": true, - "optional": true, - "dependencies": { - "pouchdb-binary-utils": "7.3.0", - "spark-md5": "3.0.2" - } - }, - "node_modules/pouchdb-merge": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-merge/-/pouchdb-merge-7.3.0.tgz", - "integrity": "sha512-E7LmchMzwYFm6V8OBxejzARLisanpksOju2LEfuiYnotGfNDeW7MByP0qBH0/zF8BfUyyjA1cl7ByaEpsapkeQ==", - "dev": true, - "optional": true - }, - "node_modules/pouchdb-selector-core": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-selector-core/-/pouchdb-selector-core-7.3.0.tgz", - "integrity": "sha512-sK/cCrIGeL9ImcMhKGcwa54+bzX7Wv4hhVV+oUW3T1Nasaoxh+Muem1GuA+x1+SbTCE8y37rUg8i6DIOhX51ew==", - "dev": true, - "optional": true, - "dependencies": { - "pouchdb-collate": "7.3.0", - "pouchdb-utils": "7.3.0" - } - }, - "node_modules/pouchdb-utils": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-utils/-/pouchdb-utils-7.3.0.tgz", - "integrity": "sha512-HH+5IXXWn/ZgVCSnrlydBMYn6MabT7RS7SNoo9w8qVH9efpZSp3eLchw6yMQNLw8LQefWmbbskiHV9VgJmSVWQ==", - "dev": true, - "optional": true, - "dependencies": { - "argsarray": "0.0.1", - "clone-buffer": "1.0.0", - "immediate": "3.3.0", - "inherits": "2.0.4", - "pouchdb-collections": "7.3.0", - "pouchdb-errors": "7.3.0", - "pouchdb-md5": "7.3.0", - "uuid": "8.3.2" - } - }, - "node_modules/pouchdb-utils/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/pouchdb/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true, - "optional": true - }, - "node_modules/pouchdb/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dev": true, - "optional": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/pouchdb/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true, - "optional": true - }, - "node_modules/pouchdb/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "engines": { - "node": ">=4" - } - }, - "node_modules/preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prettier": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", - "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/prettier-plugin-solidity": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.2.tgz", - "integrity": "sha512-afn8Q0E0fY2I26fbagiBo1XRe7Cv/vs3t/N5Xbndzjgln+TXrtNxgWzhdZcFoZLN92WrFbxqqDoP6Lk5L80Fmw==", - "dev": true, - "dependencies": { - "@solidity-parser/parser": "^0.10.1", - "dir-to-object": "^2.0.0", - "emoji-regex": "^9.0.0", - "escape-string-regexp": "^4.0.0", - "prettier": "^2.0.5", - "semver": "^7.3.2", - "solidity-comments-extractor": "^0.0.4", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/@solidity-parser/parser": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.10.2.tgz", - "integrity": "sha512-SFO5xlpR5rnqIds++4JDcXMG9b6KfslcxKoX+y19rizB0sNkv9mRs/TA5PhD4MrRbyaS60FkQ4updZtjPa4LjQ==", - "dev": true - }, - "node_modules/prettier-plugin-solidity/node_modules/emoji-regex": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.0.tgz", - "integrity": "sha512-DNc3KFPK18bPdElMJnf/Pkv5TXhxFU3YFDEuGLDRtPmV4rkmCjBkCSEp22u6rBHdSN9Vlp/GK7k98prmE1Jgug==", - "dev": true - }, - "node_modules/prettier-plugin-solidity/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", - "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", - "dev": true, - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/promise-to-callback": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz", - "integrity": "sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA==", - "dev": true, - "dependencies": { - "is-fn": "^1.0.0", - "set-immediate-shim": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "dependencies": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.1.tgz", - "integrity": "sha512-ksWccjmXOHU2gJBnH0cK1lSYdvSZ0zLoCMSz/nTGh6hDvCSgcRxDyIcOBD6KNxFz3xhMPm/T267Tbe2JRymKEQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - }, - "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "dependencies": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/querystring": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", - "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, - "node_modules/randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "dependencies": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/randomatic/node_modules/is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/randomatic/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomhex": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/randomhex/-/randomhex-0.1.5.tgz", - "integrity": "sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU=", - "dev": true - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", - "dev": true, - "dependencies": { - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/redux": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", - "dev": true, - "dependencies": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" - } - }, - "node_modules/redux-saga": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.0.0.tgz", - "integrity": "sha512-GvJWs/SzMvEQgeaw6sRMXnS2FghlvEGsHiEtTLpJqc/FHF3I5EE/B+Hq5lyHZ8LSoT2r/X/46uWvkdCnK9WgHA==", - "dev": true, - "dependencies": { - "@redux-saga/core": "^1.0.0" - } - }, - "node_modules/regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", - "dev": true - }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "dependencies": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "node_modules/regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "dependencies": { - "is-equal-shallow": "^0.1.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true, - "engines": { - "node": ">=6.5.0" - } - }, - "node_modules/regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "dependencies": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "node_modules/regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "dependencies": { - "is-finite": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/req-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", - "integrity": "sha1-1AgrTURZgDZkD7c93qAe1T20nrw=", - "dev": true, - "dependencies": { - "req-from": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/req-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", - "integrity": "sha1-10GI5H+TeW9Kpx327jWuaJ8+DnA=", - "dev": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/req-from/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.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.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", - "dev": true, - "dependencies": { - "lodash": "^4.17.15" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "request-promise-core": "1.1.3", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/reselect": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.6.tgz", - "integrity": "sha512-ZovIuXqto7elwnxyXbBtCPo9YFEr3uJqj2rRbcOOog1bmu2Ag85M4hixSwFWyaBMKXNgvPaJ9OSu9SkBPIeJHQ==", - "dev": true - }, - "node_modules/reselect-tree": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/reselect-tree/-/reselect-tree-1.3.7.tgz", - "integrity": "sha512-kZN+C1cVJ6fFN2smSb0l4UvYZlRzttgnu183svH4NrU22cBY++ikgr2QT75Uuk4MYpv5gXSVijw4c5U6cx6GKg==", - "dev": true, - "dependencies": { - "debug": "^3.1.0", - "json-pointer": "^0.6.1", - "reselect": "^4.0.0" - } - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/rlp": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.5.tgz", - "integrity": "sha512-y1QxTQOp0OZnjn19FxBmped4p+BSKPHwGndaqrESseyd2xXZtcgR3yuTIosh8CaMaOii9SKIYerBXnV/CpJ3qw==", - "dependencies": { - "bn.js": "^4.11.1" - }, - "bin": { - "rlp": "bin/rlp" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", - "dev": true - }, - "node_modules/rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-event-emitter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz", - "integrity": "sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==", - "deprecated": "Renamed to @metamask/safe-event-emitter", - "dev": true, - "dependencies": { - "events": "^3.0.0" - } - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "node_modules/scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" - }, - "node_modules/scrypt-shim": { - "name": "@web3-js/scrypt-shim", - "version": "0.1.0", - "resolved": "git+ssh://git@github.com/web3-js/scrypt-shim.git#aafdadda13e660e25e1c525d1f5b2443f5eb1ebb", - "integrity": "sha512-6IAk8+6BiN9lMNh5kgAYRPbi7+ejRsJIOX0jh4/I1V7phSsoaizjBGfDrZHpeAcq1IwOVlNetHS4/a+JR2hyZA==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "scryptsy": "^2.1.0", - "semver": "^6.3.0" - } - }, - "node_modules/scrypt-shim/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/scryptsy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", - "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" - }, - "node_modules/secp256k1": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz", - "integrity": "sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==", - "hasInstallScript": true, - "dependencies": { - "bindings": "^1.5.0", - "bip66": "^1.1.5", - "bn.js": "^4.11.8", - "create-hash": "^1.2.0", - "drbg.js": "^1.0.1", - "elliptic": "^6.5.2", - "nan": "^2.14.0", - "safe-buffer": "^5.1.2" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/seek-bzip": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", - "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", - "dependencies": { - "commander": "~2.8.1" - }, - "bin": { - "seek-bunzip": "bin/seek-bunzip", - "seek-table": "bin/seek-bzip-table" - } - }, - "node_modules/seek-bzip/node_modules/commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "dependencies": { - "graceful-readlink": ">= 1.0.0" - }, - "engines": { - "node": ">= 0.6.x" - } - }, - "node_modules/semaphore": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", - "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "node_modules/sentence-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", - "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", - "dev": true, - "dependencies": { - "no-case": "^2.2.0", - "upper-case-first": "^1.1.2" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/servify": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", - "dependencies": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "node_modules/set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" - }, - "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/sha1": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", - "integrity": "sha1-rdqnqTFo85PxnrKxUJFhjicA+Eg=", - "dev": true, - "dependencies": { - "charenc": ">= 0.0.1", - "crypt": ">= 0.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "node_modules/simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" - }, - "node_modules/simple-get": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", - "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", - "dependencies": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/snake-case": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", - "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", - "dev": true, - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sol-digger": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/sol-digger/-/sol-digger-0.0.2.tgz", - "integrity": "sha1-QGxKnTHiaef4jrHC6hATGOXgkCU=", - "dev": true - }, - "node_modules/sol-explore": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/sol-explore/-/sol-explore-1.6.1.tgz", - "integrity": "sha1-tZ8HPGn+MyVg1aEMMrqMp/KYbPs=", - "dev": true - }, - "node_modules/solc": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.5.17.tgz", - "integrity": "sha512-qpX+PGaU0Q3c6lh2vDzMoIbhv6bIrecI4bYsx+xUs01xsGFnY6Nr0L8y/QMyutTnrHN6Lb/Yl672ZVRqxka96w==", - "dev": true, - "dependencies": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "bin": { - "solcjs": "solcjs" - } - }, - "node_modules/solc/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "node_modules/solc/node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "dev": true - }, - "node_modules/solc/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/solidity-comments-extractor": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.4.tgz", - "integrity": "sha512-58glBODwXIKMaQ7rfcJOrWtFQMMOK28tJ0/LcB5Xhu7WtAxk4UX2fpgKPuaL41XjMp/y0gAa1MTLqk018wuSzA==", - "dev": true - }, - "node_modules/solium": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/solium/-/solium-1.2.5.tgz", - "integrity": "sha512-NuNrm7fp8JcDN/P+SAdM5TVa4wYDtwVtLY/rG4eBOZrC5qItsUhmQKR/YhjszaEW4c8tNUYhkhQcwOsS25znpw==", - "dev": true, - "dependencies": { - "ajv": "^5.2.2", - "chokidar": "^1.6.0", - "colors": "^1.1.2", - "commander": "^2.9.0", - "diff": "^3.5.0", - "eol": "^0.9.1", - "js-string-escape": "^1.0.1", - "lodash": "^4.14.2", - "sol-digger": "0.0.2", - "sol-explore": "1.6.1", - "solium-plugin-security": "0.1.1", - "solparse": "2.2.8", - "text-table": "^0.2.0" - }, - "bin": { - "solium": "bin/solium.js" - } - }, - "node_modules/solium-config-keep": { - "version": "0.1.0", - "resolved": "git+ssh://git@github.com/keep-network/solium-config-keep.git#7ea21310ee14f12d65532ff7e3c79b0492d238ce", - "integrity": "sha512-394C5+yo91PBdreNvXYX4A56KAJgEA3qMomE+WskW+u2Jf5sPnpH4UyRHGxRw98onQna4kUSwiFH4FUcbmoFLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "ethlint": ">=1.2.3" - } - }, - "node_modules/solium-plugin-security": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/solium-plugin-security/-/solium-plugin-security-0.1.1.tgz", - "integrity": "sha512-kpLirBwIq4mhxk0Y/nn5cQ6qdJTI+U1LO3gpoNIcqNaW+sI058moXBe2UiHs+9wvF9IzYD49jcKhFTxcR9u9SQ==", - "dev": true, - "peerDependencies": { - "solium": "^1.0.0" - } - }, - "node_modules/solium/node_modules/ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "dependencies": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "node_modules/solium/node_modules/anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "dependencies": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "node_modules/solium/node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", - "dev": true, - "dependencies": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - }, - "optionalDependencies": { - "fsevents": "^1.0.0" - } - }, - "node_modules/solium/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/solium/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/solium/node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "node_modules/solium/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/solium/node_modules/glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "dependencies": { - "is-glob": "^2.0.0" - } - }, - "node_modules/solium/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/solium/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "node_modules/solium/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/solium/node_modules/readdirp/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solium/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solparse": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/solparse/-/solparse-2.2.8.tgz", - "integrity": "sha512-Tm6hdfG72DOxD40SD+T5ddbekWglNWjzDRSNq7ZDIOHVsyaJSeeunUuWNj4DE7uDrJK3tGQuX0ZTDZWNYsGPMA==", - "dev": true, - "dependencies": { - "mocha": "^4.0.1", - "pegjs": "^0.10.0", - "yargs": "^10.0.3" - }, - "bin": { - "solidity-parser": "cli.js" - } - }, - "node_modules/solparse/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/solparse/node_modules/browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "node_modules/solparse/node_modules/cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "dependencies": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/solparse/node_modules/commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "node_modules/solparse/node_modules/diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/solparse/node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "node_modules/solparse/node_modules/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/solparse/node_modules/growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, - "node_modules/solparse/node_modules/has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solparse/node_modules/he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/solparse/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/solparse/node_modules/minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "node_modules/solparse/node_modules/mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dev": true, - "dependencies": { - "minimist": "0.0.8" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/solparse/node_modules/mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", - "dev": true, - "dependencies": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/solparse/node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "node_modules/solparse/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solparse/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solparse/node_modules/supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "dependencies": { - "has-flag": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solparse/node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solparse/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solparse/node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solparse/node_modules/wrap-ansi/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solparse/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solparse/node_modules/y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "node_modules/solparse/node_modules/yargs": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", - "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", - "dev": true, - "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": "^8.1.0" - } - }, - "node_modules/solparse/node_modules/yargs-parser": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", - "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", - "dev": true, - "dependencies": { - "camelcase": "^4.1.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, - "node_modules/spark-md5": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz", - "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==", - "dev": true, - "optional": true - }, - "node_modules/spinnies": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/spinnies/-/spinnies-0.4.3.tgz", - "integrity": "sha512-TTA2vWXrXJpfThWAl2t2hchBnCMI1JM5Wmb2uyI7Zkefdw/xO98LDy6/SBYwQPiYXL3swx3Eb44ZxgoS8X5wpA==", - "dependencies": { - "chalk": "^2.4.2", - "cli-cursor": "^3.0.0", - "strip-ansi": "^5.2.0" - } - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/sqlite3": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.2.0.tgz", - "integrity": "sha512-roEOz41hxui2Q7uYnWsjMOTry6TcNUNmp8audCx18gF10P2NknwdpF+E+HKvz/F2NvPKGGBF4NGc+ZPQ+AABwg==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.11.0" - } - }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "dependencies": { - "is-natural-number": "^4.0.1" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", - "dependencies": { - "is-hex-prefixed": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sublevel-pouchdb": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/sublevel-pouchdb/-/sublevel-pouchdb-7.3.0.tgz", - "integrity": "sha512-zp7u4jmv2N/s+dXZkWTtL4BjREs3SZ1nGBNNJ8RWX4yqN59oHgKmti4CfVOqfsAW9RMasmTqQAEPxL9hX8+CIA==", - "dev": true, - "optional": true, - "dependencies": { - "inherits": "2.0.4", - "level-codec": "9.0.2", - "ltgt": "2.2.1", - "readable-stream": "1.1.14" - } - }, - "node_modules/sublevel-pouchdb/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true, - "optional": true - }, - "node_modules/sublevel-pouchdb/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dev": true, - "optional": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/sublevel-pouchdb/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true, - "optional": true - }, - "node_modules/super-split": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/super-split/-/super-split-1.1.0.tgz", - "integrity": "sha512-I4bA5mgcb6Fw5UJ+EkpzqXfiuvVGS/7MuND+oBxNFmxu3ugLNrdIatzBLfhFRMVMLxgSsRy+TjIktgkF9RFSNQ==", - "dev": true - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/swap-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", - "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", - "dev": true, - "dependencies": { - "lower-case": "^1.1.1", - "upper-case": "^1.1.1" - } - }, - "node_modules/swarm-js": { - "version": "0.1.39", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.39.tgz", - "integrity": "sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg==", - "dependencies": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "decompress": "^4.0.0", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/swarm-js/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "engines": { - "node": ">=4" - } - }, - "node_modules/swarm-js/node_modules/got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dependencies": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/swarm-js/node_modules/p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/swarm-js/node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/swarm-js/node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "node_modules/swarm-js/node_modules/url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dependencies": { - "prepend-http": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sync-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", - "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", - "dev": true, - "dependencies": { - "http-response-object": "^3.0.1", - "sync-rpc": "^1.2.1", - "then-request": "^6.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/sync-rpc": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", - "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", - "dev": true, - "dependencies": { - "get-port": "^3.1.0" - } - }, - "node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/table/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", - "dependencies": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - }, - "engines": { - "node": ">=4.5" - } - }, - "node_modules/tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dependencies": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/then-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", - "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", - "dev": true, - "dependencies": { - "@types/concat-stream": "^1.6.0", - "@types/form-data": "0.0.33", - "@types/node": "^8.0.0", - "@types/qs": "^6.2.31", - "caseless": "~0.12.0", - "concat-stream": "^1.6.0", - "form-data": "^2.2.0", - "http-basic": "^8.1.1", - "http-response-object": "^3.0.1", - "promise": "^8.0.0", - "qs": "^6.4.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/then-request/node_modules/@types/node": { - "version": "8.10.61", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.61.tgz", - "integrity": "sha512-l+zSbvT8TPRaCxL1l9cwHCb0tSqGAGcjPJFItGGYat5oCTiq1uQQKYg5m7AF1mgnEBzFXGLJ2LRmNjtreRX76Q==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "node_modules/through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "dev": true, - "optional": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" - } - }, - "node_modules/timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tiny-queue": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tiny-queue/-/tiny-queue-0.2.1.tgz", - "integrity": "sha512-EijGsv7kzd9I9g0ByCl6h42BWNGUZrlCSejfrb3AKeHC33SGbASu1VDf5O3rRiiUOhAC9CHdZxFPbZu0HmR70A==", - "dev": true, - "optional": true - }, - "node_modules/tiny-secp256k1": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz", - "integrity": "sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "bindings": "^1.3.0", - "bn.js": "^4.11.8", - "create-hmac": "^1.1.7", - "elliptic": "^6.4.0", - "nan": "^2.13.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/tiny-typed-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", - "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==", - "dev": true, - "optional": true - }, - "node_modules/title-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", - "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", - "dev": true, - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.0.3" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", - "dev": true - }, - "node_modules/tomlify-j0.4": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tomlify-j0.4/-/tomlify-j0.4-3.0.0.tgz", - "integrity": "sha512-2Ulkc8T7mXJ2l0W476YC/A209PR38Nw8PuaCNtk9uI3t1zzFdGQeWYGQvmj2PZkVvRC/Yoi4xQKMRnWc/N29tQ==", - "dev": true - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/truffle": { - "version": "5.5.20", - "resolved": "https://registry.npmjs.org/truffle/-/truffle-5.5.20.tgz", - "integrity": "sha512-Ixh6tmK5s/fC4KNuu1zlYrSTkJWesKemXimf/L8UugBuU2RTSgmo/JI00Jq1EbqCSMAtbze6G5ca2UU2vZnCkQ==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@truffle/db-loader": "^0.1.22", - "@truffle/debugger": "^10.0.16", - "app-module-path": "^2.2.0", - "ganache": "7.2.0", - "mocha": "9.2.2", - "original-require": "^1.0.1" - }, - "bin": { - "truffle": "build/cli.bundled.js" - }, - "optionalDependencies": { - "@truffle/db": "^1.0.12" - } - }, - "node_modules/truffle-flattener": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/truffle-flattener/-/truffle-flattener-1.4.4.tgz", - "integrity": "sha512-S/WmvubzlUj1mn56wEI6yo1bmPpKDNdEe5rtyVC1C5iNfZWobD/V69pAYI15IBDJrDqUyh+iXgpTkzov50zpQw==", - "dependencies": { - "@resolver-engine/imports-fs": "^0.2.2", - "@solidity-parser/parser": "^0.6.0", - "find-up": "^2.1.0", - "mkdirp": "^1.0.4", - "tsort": "0.0.1" - }, - "bin": { - "truffle-flattener": "index.js" - } - }, - "node_modules/truffle-plugin-verify": { - "version": "0.5.26", - "resolved": "https://registry.npmjs.org/truffle-plugin-verify/-/truffle-plugin-verify-0.5.26.tgz", - "integrity": "sha512-TFpmh2vBNLLFo9GxV+vf91XPs5cox9C5yd+cTKeLF1j2e/C1izUsc+5upG7fLJhuDOvKMB8X8S8ELKmSKRh+/g==", - "dev": true, - "dependencies": { - "axios": "^0.26.1", - "cli-logger": "^0.5.40", - "delay": "^5.0.0", - "querystring": "^0.2.1", - "tunnel": "0.0.6" - } - }, - "node_modules/truffle-plugin-verify/node_modules/axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.8" - } - }, - "node_modules/truffle-plugin-verify/node_modules/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/truffle/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/truffle/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/truffle/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/truffle/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/truffle/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/truffle/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/truffle/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/truffle/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/truffle/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/truffle/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/truffle/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/truffle/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/truffle/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/truffle/node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/truffle/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/truffle/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/truffle/node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/truffle/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/truffle/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/truffle/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/truffle/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/truffle/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/truffle/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/truffle/node_modules/minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/truffle/node_modules/mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", - "dev": true, - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/truffle/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/truffle/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/truffle/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/truffle/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/truffle/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/truffle/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/truffle/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/truffle/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/truffle/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/truffle/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/truffle/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/truffle/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/truffle/node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/truffle/node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/try-require": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/try-require/-/try-require-1.2.1.tgz", - "integrity": "sha1-NEiaLKwMCcHMEO2RugEVlNQzO+I=", - "dev": true - }, - "node_modules/ts-node": { - "version": "8.10.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", - "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", - "dev": true, - "dependencies": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "typescript": ">=2.7" - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - }, - "node_modules/tsort": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y=" - }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true, - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "node_modules/tweetnacl-util": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", - "dev": true - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typeforce": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", - "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==", - "dev": true - }, - "node_modules/typescript": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", - "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/typescript-compare": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz", - "integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==", - "dev": true, - "dependencies": { - "typescript-logic": "^0.0.0" - } - }, - "node_modules/typescript-logic": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz", - "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==", - "dev": true - }, - "node_modules/typescript-tuple": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-2.2.1.tgz", - "integrity": "sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==", - "dev": true, - "dependencies": { - "typescript-compare": "^0.0.2" - } - }, - "node_modules/ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" - }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unbox-primitive/node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "node_modules/underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz", - "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", - "dev": true - }, - "node_modules/upper-case-first": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", - "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", - "dev": true, - "dependencies": { - "upper-case": "^1.1.1" - } - }, - "node_modules/uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/url-set-query": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" - }, - "node_modules/url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", - "engines": { - "node": ">= 4" - } - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/utf-8-validate": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.4.tgz", - "integrity": "sha512-MEF05cPSq3AwJ2C7B7sHAA6i53vONoZbMGX8My5auEVm6W+dJ2Jd/TZPyGJ5CH42V2XtbI5FD28HeHeqlPzZ3Q==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.2.0" - } - }, - "node_modules/utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" - }, - "node_modules/util": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", - "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." - }, - "node_modules/v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", - "dev": true - }, - "node_modules/value-or-promise": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz", - "integrity": "sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/varint": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==", - "dev": true - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/vuvuzela": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/vuvuzela/-/vuvuzela-1.0.3.tgz", - "integrity": "sha512-Tm7jR1xTzBbPW+6y1tknKiEhz04Wf/1iZkcTJjSFcpNko43+dFW6+OOeQe9taJIug3NdfUAjFKgUSyQrIKaDvQ==", - "dev": true, - "optional": true - }, - "node_modules/web3": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.3.0.tgz", - "integrity": "sha512-4q9dna0RecnrlgD/bD1C5S+81Untbd6Z/TBD7rb+D5Bvvc0Wxjr4OP70x+LlnwuRDjDtzBwJbNUblh2grlVArw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-bzz": "1.3.0", - "web3-core": "1.3.0", - "web3-eth": "1.3.0", - "web3-eth-personal": "1.3.0", - "web3-net": "1.3.0", - "web3-shh": "1.3.0", - "web3-utils": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-bzz": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.3.0.tgz", - "integrity": "sha512-ibYAnKab+sgTo/UdfbrvYfWblXjjgSMgyy9/FHa6WXS14n/HVB+HfWqGz2EM3fok8Wy5XoKGMvdqvERQ/mzq1w==", - "dev": true, - "dependencies": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40", - "underscore": "1.9.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-bzz/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "node_modules/web3-bzz/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/web3-bzz/node_modules/p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/web3-bzz/node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/web3-bzz/node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "node_modules/web3-bzz/node_modules/swarm-js": { - "version": "0.1.40", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", - "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - } - }, - "node_modules/web3-bzz/node_modules/swarm-js/node_modules/got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "dependencies": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/web3-bzz/node_modules/url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", - "dev": true, - "dependencies": { - "prepend-http": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/web3-core": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.2.tgz", - "integrity": "sha512-miHAX3qUgxV+KYfaOY93Hlc3kLW2j5fH8FJy6kSxAv+d4d5aH0wwrU2IIoJylQdT+FeenQ38sgsCnFu9iZ1hCQ==", - "dependencies": { - "@types/bn.js": "^4.11.4", - "@types/node": "^12.6.1", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-requestmanager": "1.2.2", - "web3-utils": "1.2.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-helpers": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.2.tgz", - "integrity": "sha512-HJrRsIGgZa1jGUIhvGz4S5Yh6wtOIo/TMIsSLe+Xay+KVnbseJpPprDI5W3s7H2ODhMQTbogmmUFquZweW2ImQ==", - "dependencies": { - "underscore": "1.9.1", - "web3-eth-iban": "1.2.2", - "web3-utils": "1.2.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-method": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.2.tgz", - "integrity": "sha512-szR4fDSBxNHaF1DFqE+j6sFR/afv9Aa36OW93saHZnrh+iXSrYeUUDfugeNcRlugEKeUCkd4CZylfgbK2SKYJA==", - "dependencies": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2", - "web3-core-promievent": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-utils": "1.2.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-promievent": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.2.tgz", - "integrity": "sha512-tKvYeT8bkUfKABcQswK6/X79blKTKYGk949urZKcLvLDEaWrM3uuzDwdQT3BNKzQ3vIvTggFPX9BwYh0F1WwqQ==", - "dependencies": { - "any-promise": "1.3.0", - "eventemitter3": "3.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-requestmanager": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.2.tgz", - "integrity": "sha512-a+gSbiBRHtHvkp78U2bsntMGYGF2eCb6219aMufuZWeAZGXJ63Wc2321PCbA8hF9cQrZI4EoZ4kVLRI4OF15Hw==", - "dependencies": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2", - "web3-providers-http": "1.2.2", - "web3-providers-ipc": "1.2.2", - "web3-providers-ws": "1.2.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-subscriptions": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.2.tgz", - "integrity": "sha512-QbTgigNuT4eicAWWr7ahVpJyM8GbICsR1Ys9mJqzBEwpqS+RXTRVSkwZ2IsxO+iqv6liMNwGregbJLq4urMFcQ==", - "dependencies": { - "eventemitter3": "3.1.2", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core/node_modules/@types/node": { - "version": "12.12.47", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.47.tgz", - "integrity": "sha512-yzBInQFhdY8kaZmqoL2+3U5dSTMrKaYcb561VU+lDzAYvqt+2lojvBEy+hmpSNuXnPTx7m9+04CzWYOUqWME2A==" - }, - "node_modules/web3-eth": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.2.tgz", - "integrity": "sha512-UXpC74mBQvZzd4b+baD4Ocp7g+BlwxhBHumy9seyE/LMIcMlePXwCKzxve9yReNpjaU16Mmyya6ZYlyiKKV8UA==", - "dependencies": { - "underscore": "1.9.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-eth-abi": "1.2.2", - "web3-eth-accounts": "1.2.2", - "web3-eth-contract": "1.2.2", - "web3-eth-ens": "1.2.2", - "web3-eth-iban": "1.2.2", - "web3-eth-personal": "1.2.2", - "web3-net": "1.2.2", - "web3-utils": "1.2.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-abi": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.2.tgz", - "integrity": "sha512-Yn/ZMgoOLxhTVxIYtPJ0eS6pnAnkTAaJgUJh1JhZS4ekzgswMfEYXOwpMaD5eiqPJLpuxmZFnXnBZlnQ1JMXsw==", - "dependencies": { - "ethers": "4.0.0-beta.3", - "underscore": "1.9.1", - "web3-utils": "1.2.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-abi/node_modules/@types/node": { - "version": "10.17.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.26.tgz", - "integrity": "sha512-myMwkO2Cr82kirHY8uknNRHEVtn0wV3DTQfkrjx17jmkstDRZ24gNUdl8AHXVyVclTYI/bNjgTPTAWvWLqXqkw==" - }, - "node_modules/web3-eth-abi/node_modules/elliptic": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", - "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", - "dependencies": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/web3-eth-abi/node_modules/ethers": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.3.tgz", - "integrity": "sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog==", - "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.3", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - }, - "node_modules/web3-eth-abi/node_modules/scrypt-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", - "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=" - }, - "node_modules/web3-eth-accounts": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.2.tgz", - "integrity": "sha512-KzHOEyXOEZ13ZOkWN3skZKqSo5f4Z1ogPFNn9uZbKCz+kSp+gCAEKxyfbOsB/JMAp5h7o7pb6eYsPCUBJmFFiA==", - "dependencies": { - "any-promise": "1.3.0", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.7", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", - "scrypt-shim": "github:web3-js/scrypt-shim", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-utils": "1.2.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-accounts/node_modules/eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/web3-eth-accounts/node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/web3-eth-contract": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.2.tgz", - "integrity": "sha512-EKT2yVFws3FEdotDQoNsXTYL798+ogJqR2//CaGwx3p0/RvQIgfzEwp8nbgA6dMxCsn9KOQi7OtklzpnJMkjtA==", - "dependencies": { - "@types/bn.js": "^4.11.4", - "underscore": "1.9.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-promievent": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-eth-abi": "1.2.2", - "web3-utils": "1.2.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-ens": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.2.tgz", - "integrity": "sha512-CFjkr2HnuyMoMFBoNUWojyguD4Ef+NkyovcnUc/iAb9GP4LHohKrODG4pl76R5u61TkJGobC2ij6TyibtsyVYg==", - "dependencies": { - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-promievent": "1.2.2", - "web3-eth-abi": "1.2.2", - "web3-eth-contract": "1.2.2", - "web3-utils": "1.2.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-iban": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.2.tgz", - "integrity": "sha512-gxKXBoUhaTFHr0vJB/5sd4i8ejF/7gIsbM/VvemHT3tF5smnmY6hcwSMmn7sl5Gs+83XVb/BngnnGkf+I/rsrQ==", - "dependencies": { - "bn.js": "4.11.8", - "web3-utils": "1.2.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-iban/node_modules/bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, - "node_modules/web3-eth-personal": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.2.tgz", - "integrity": "sha512-4w+GLvTlFqW3+q4xDUXvCEMU7kRZ+xm/iJC8gm1Li1nXxwwFbs+Y+KBK6ZYtoN1qqAnHR+plYpIoVo27ixI5Rg==", - "dependencies": { - "@types/node": "^12.6.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-net": "1.2.2", - "web3-utils": "1.2.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-personal/node_modules/@types/node": { - "version": "12.12.47", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.47.tgz", - "integrity": "sha512-yzBInQFhdY8kaZmqoL2+3U5dSTMrKaYcb561VU+lDzAYvqt+2lojvBEy+hmpSNuXnPTx7m9+04CzWYOUqWME2A==" - }, - "node_modules/web3-net": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.2.tgz", - "integrity": "sha512-K07j2DXq0x4UOJgae65rWZKraOznhk8v5EGSTdFqASTx7vWE/m+NqBijBYGEsQY1lSMlVaAY9UEQlcXK5HzXTw==", - "dependencies": { - "web3-core": "1.2.2", - "web3-core-method": "1.2.2", - "web3-utils": "1.2.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-provider-engine": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-16.0.3.tgz", - "integrity": "sha512-Q3bKhGqLfMTdLvkd4TtkGYJHcoVQ82D1l8jTIwwuJp/sAp7VHnRYb9YJ14SW/69VMWoOhSpPLZV2tWb9V0WJoA==", - "dev": true, - "dependencies": { - "@ethereumjs/tx": "^3.3.0", - "async": "^2.5.0", - "backoff": "^2.5.0", - "clone": "^2.0.0", - "cross-fetch": "^2.1.0", - "eth-block-tracker": "^4.4.2", - "eth-json-rpc-filters": "^4.2.1", - "eth-json-rpc-infura": "^5.1.0", - "eth-json-rpc-middleware": "^6.0.0", - "eth-rpc-errors": "^3.0.0", - "eth-sig-util": "^1.4.2", - "ethereumjs-block": "^1.2.2", - "ethereumjs-util": "^5.1.5", - "ethereumjs-vm": "^2.3.4", - "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" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/web3-provider-engine/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/web3-provider-engine/node_modules/ws": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", - "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", - "dev": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/web3-providers-http": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.2.tgz", - "integrity": "sha512-BNZ7Hguy3eBszsarH5gqr9SIZNvqk9eKwqwmGH1LQS1FL3NdoOn7tgPPdddrXec4fL94CwgNk4rCU+OjjZRNDg==", - "dependencies": { - "web3-core-helpers": "1.2.2", - "xhr2-cookies": "1.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-providers-ipc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.2.tgz", - "integrity": "sha512-t97w3zi5Kn/LEWGA6D9qxoO0LBOG+lK2FjlEdCwDQatffB/+vYrzZ/CLYVQSoyFZAlsDoBasVoYSWZK1n39aHA==", - "dependencies": { - "oboe": "2.1.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-providers-ws": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.2.tgz", - "integrity": "sha512-Wb1mrWTGMTXOpJkL0yGvL/WYLt8fUIXx8k/l52QB2IiKzvyd42dTWn4+j8IKXGSYYzOm7NMqv6nhA5VDk12VfA==", - "dependencies": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2", - "websocket": "github:web3-js/WebSocket-Node#polyfill/globalThis" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-providers-ws/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/web3-providers-ws/node_modules/websocket": { - "version": "1.0.29", - "resolved": "git+ssh://git@github.com/web3-js/WebSocket-Node.git#ef5ea2f41daf4a2113b80c9223df884b4d56c400", - "integrity": "sha512-fS64f2anyRmFjuEVoqTbtgtV4Ay1dQ6kP078yM1RxnF0+9hNYk4iirrtII6FIoNoNgmhhIqzQaadEU6ZRpGoEw==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "nan": "^2.14.0", - "typedarray-to-buffer": "^3.1.5", - "yaeti": "^0.0.6" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/web3-shh": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.3.0.tgz", - "integrity": "sha512-IZTojA4VCwVq+7eEIHuL1tJXtU+LJDhO8Y2QmuwetEWW1iBgWCGPHZasipWP+7kDpSm/5lo5GRxL72FF/Os/tA==", - "dev": true, - "dependencies": { - "web3-core": "1.3.0", - "web3-core-method": "1.3.0", - "web3-core-subscriptions": "1.3.0", - "web3-net": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-shh/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "node_modules/web3-shh/node_modules/bignumber.js": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", - "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/web3-shh/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/web3-shh/node_modules/eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true - }, - "node_modules/web3-shh/node_modules/oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", - "dev": true, - "dependencies": { - "http-https": "^1.0.0" - } - }, - "node_modules/web3-shh/node_modules/web3-core": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.3.0.tgz", - "integrity": "sha512-BwWvAaKJf4KFG9QsKRi3MNoNgzjI6szyUlgme1qNPxUdCkaS3Rdpa0VKYNHP7M/YTk82/59kNE66mH5vmoaXjA==", - "dev": true, - "dependencies": { - "@types/bn.js": "^4.11.5", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-core-requestmanager": "1.3.0", - "web3-utils": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-shh/node_modules/web3-core-helpers": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.3.0.tgz", - "integrity": "sha512-+MFb1kZCrRctf7UYE7NCG4rGhSXaQJ/KF07di9GVK1pxy1K0+rFi61ZobuV1ky9uQp+uhhSPts4Zp55kRDB5sw==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "web3-eth-iban": "1.3.0", - "web3-utils": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-shh/node_modules/web3-core-method": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.3.0.tgz", - "integrity": "sha512-h0yFDrYVzy5WkLxC/C3q+hiMnzxdWm9p1T1rslnuHgOp6nYfqzu/6mUIXrsS4h/OWiGJt+BZ0xVZmtC31HDWtg==", - "dev": true, - "dependencies": { - "@ethersproject/transactions": "^5.0.0-beta.135", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0", - "web3-core-promievent": "1.3.0", - "web3-core-subscriptions": "1.3.0", - "web3-utils": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-shh/node_modules/web3-core-promievent": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.3.0.tgz", - "integrity": "sha512-blv69wrXw447TP3iPvYJpllkhW6B18nfuEbrfcr3n2Y0v1Jx8VJacNZFDFsFIcgXcgUIVCtOpimU7w9v4+rtaw==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-shh/node_modules/web3-core-requestmanager": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.3.0.tgz", - "integrity": "sha512-3yMbuGcomtzlmvTVqNRydxsx7oPlw3ioRL6ReF9PeNYDkUsZaUib+6Dp5eBt7UXh5X+SIn/xa1smhDHz5/HpAw==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0", - "web3-providers-http": "1.3.0", - "web3-providers-ipc": "1.3.0", - "web3-providers-ws": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-shh/node_modules/web3-core-subscriptions": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.3.0.tgz", - "integrity": "sha512-MUUQUAhJDb+Nz3S97ExVWveH4utoUnsbPWP+q1HJH437hEGb4vunIb9KvN3hFHLB+aHJfPeStM/4yYTz5PeuyQ==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-shh/node_modules/web3-eth-iban": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.3.0.tgz", - "integrity": "sha512-v9mZWhR4fPF17/KhHLiWir4YHWLe09O3B/NTdhWqw3fdAMJNztzMHGzgHxA/4fU+rhrs/FhDzc4yt32zMEXBZw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "web3-utils": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-shh/node_modules/web3-net": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.3.0.tgz", - "integrity": "sha512-Xz02KylOyrB2YZzCkysEDrY7RbKxb7LADzx3Zlovfvuby7HBwtXVexXKtoGqksa+ns1lvjQLLQGb+OeLi7Sr7w==", - "dev": true, - "dependencies": { - "web3-core": "1.3.0", - "web3-core-method": "1.3.0", - "web3-utils": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-shh/node_modules/web3-providers-http": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.3.0.tgz", - "integrity": "sha512-cMKhUI6PqlY/EC+ZDacAxajySBu8AzW8jOjt1Pe/mbRQgS0rcZyvLePGTTuoyaA8C21F8UW+EE5jj7YsNgOuqA==", - "dev": true, - "dependencies": { - "web3-core-helpers": "1.3.0", - "xhr2-cookies": "1.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-shh/node_modules/web3-providers-ipc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.3.0.tgz", - "integrity": "sha512-0CrLuRofR+1J38nEj4WsId/oolwQEM6Yl1sOt41S/6bNI7htdkwgVhSloFIMJMDFHtRw229QIJ6wIaKQz0X1Og==", - "dev": true, - "dependencies": { - "oboe": "2.1.5", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-shh/node_modules/web3-providers-ws": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.3.0.tgz", - "integrity": "sha512-Im5MthhJnJst8nSoq0TgbyOdaiFQFa5r6sHPOVllhgIgViDqzbnlAFW9sNzQ0Q8VXPNfPIQKi9cOrHlSRNPjRw==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-shh/node_modules/web3-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz", - "integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-utils": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.2.tgz", - "integrity": "sha512-joF+s3243TY5cL7Z7y4h1JsJpUCf/kmFmj+eJar7Y2yNIGVcW961VyrAms75tjUysSuHaUQ3eQXjBEUJueT52A==", - "dependencies": { - "bn.js": "4.11.8", - "eth-lib": "0.2.7", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-utils/node_modules/bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, - "node_modules/web3-utils/node_modules/eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/web3/node_modules/@ethersproject/abi": { - "version": "5.0.0-beta.153", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz", - "integrity": "sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==", - "dev": true, - "dependencies": { - "@ethersproject/address": ">=5.0.0-beta.128", - "@ethersproject/bignumber": ">=5.0.0-beta.130", - "@ethersproject/bytes": ">=5.0.0-beta.129", - "@ethersproject/constants": ">=5.0.0-beta.128", - "@ethersproject/hash": ">=5.0.0-beta.128", - "@ethersproject/keccak256": ">=5.0.0-beta.127", - "@ethersproject/logger": ">=5.0.0-beta.129", - "@ethersproject/properties": ">=5.0.0-beta.131", - "@ethersproject/strings": ">=5.0.0-beta.130" - } - }, - "node_modules/web3/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "node_modules/web3/node_modules/bignumber.js": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", - "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/web3/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/web3/node_modules/eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true - }, - "node_modules/web3/node_modules/oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", - "dev": true, - "dependencies": { - "http-https": "^1.0.0" - } - }, - "node_modules/web3/node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true - }, - "node_modules/web3/node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/web3/node_modules/web3-core": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.3.0.tgz", - "integrity": "sha512-BwWvAaKJf4KFG9QsKRi3MNoNgzjI6szyUlgme1qNPxUdCkaS3Rdpa0VKYNHP7M/YTk82/59kNE66mH5vmoaXjA==", - "dev": true, - "dependencies": { - "@types/bn.js": "^4.11.5", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-core-requestmanager": "1.3.0", - "web3-utils": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3/node_modules/web3-core-helpers": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.3.0.tgz", - "integrity": "sha512-+MFb1kZCrRctf7UYE7NCG4rGhSXaQJ/KF07di9GVK1pxy1K0+rFi61ZobuV1ky9uQp+uhhSPts4Zp55kRDB5sw==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "web3-eth-iban": "1.3.0", - "web3-utils": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3/node_modules/web3-core-method": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.3.0.tgz", - "integrity": "sha512-h0yFDrYVzy5WkLxC/C3q+hiMnzxdWm9p1T1rslnuHgOp6nYfqzu/6mUIXrsS4h/OWiGJt+BZ0xVZmtC31HDWtg==", - "dev": true, - "dependencies": { - "@ethersproject/transactions": "^5.0.0-beta.135", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0", - "web3-core-promievent": "1.3.0", - "web3-core-subscriptions": "1.3.0", - "web3-utils": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3/node_modules/web3-core-promievent": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.3.0.tgz", - "integrity": "sha512-blv69wrXw447TP3iPvYJpllkhW6B18nfuEbrfcr3n2Y0v1Jx8VJacNZFDFsFIcgXcgUIVCtOpimU7w9v4+rtaw==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3/node_modules/web3-core-requestmanager": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.3.0.tgz", - "integrity": "sha512-3yMbuGcomtzlmvTVqNRydxsx7oPlw3ioRL6ReF9PeNYDkUsZaUib+6Dp5eBt7UXh5X+SIn/xa1smhDHz5/HpAw==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0", - "web3-providers-http": "1.3.0", - "web3-providers-ipc": "1.3.0", - "web3-providers-ws": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3/node_modules/web3-core-subscriptions": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.3.0.tgz", - "integrity": "sha512-MUUQUAhJDb+Nz3S97ExVWveH4utoUnsbPWP+q1HJH437hEGb4vunIb9KvN3hFHLB+aHJfPeStM/4yYTz5PeuyQ==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3/node_modules/web3-eth": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.3.0.tgz", - "integrity": "sha512-/bzJcxXPM9EM18JM5kO2JjZ3nEqVo3HxqU93aWAEgJNqaP/Lltmufl2GpvIB2Hvj+FXAjAXquxUdQ2/xP7BzHQ==", - "dev": true, - "dependencies": { - "underscore": "1.9.1", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-core-subscriptions": "1.3.0", - "web3-eth-abi": "1.3.0", - "web3-eth-accounts": "1.3.0", - "web3-eth-contract": "1.3.0", - "web3-eth-ens": "1.3.0", - "web3-eth-iban": "1.3.0", - "web3-eth-personal": "1.3.0", - "web3-net": "1.3.0", - "web3-utils": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3/node_modules/web3-eth-abi": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.3.0.tgz", - "integrity": "sha512-1OrZ9+KGrBeBRd3lO8upkpNua9+7cBsQAgor9wbA25UrcUYSyL8teV66JNRu9gFxaTbkpdrGqM7J/LXpraXWrg==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "5.0.0-beta.153", - "underscore": "1.9.1", - "web3-utils": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3/node_modules/web3-eth-accounts": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.3.0.tgz", - "integrity": "sha512-/Q7EVW4L2wWUbNRtOTwAIrYvJid/5UnKMw67x/JpvRMwYC+e+744P536Ja6SG4X3MnzFvd3E/jruV4qa6k+zIw==", - "dev": true, - "dependencies": { - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", - "scrypt-js": "^3.0.1", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-utils": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3/node_modules/web3-eth-contract": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.3.0.tgz", - "integrity": "sha512-3SCge4SRNCnzLxf0R+sXk6vyTOl05g80Z5+9/B5pERwtPpPWaQGw8w01vqYqsYBKC7zH+dxhMaUgVzU2Dgf7bQ==", - "dev": true, - "dependencies": { - "@types/bn.js": "^4.11.5", - "underscore": "1.9.1", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-core-promievent": "1.3.0", - "web3-core-subscriptions": "1.3.0", - "web3-eth-abi": "1.3.0", - "web3-utils": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3/node_modules/web3-eth-ens": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.3.0.tgz", - "integrity": "sha512-WnOru+EcuM5dteiVYJcHXo/I7Wq+ei8RrlS2nir49M0QpYvUPGbCGgTbifcjJQTWamgORtWdljSA1s2Asdb74w==", - "dev": true, - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-promievent": "1.3.0", - "web3-eth-abi": "1.3.0", - "web3-eth-contract": "1.3.0", - "web3-utils": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3/node_modules/web3-eth-iban": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.3.0.tgz", - "integrity": "sha512-v9mZWhR4fPF17/KhHLiWir4YHWLe09O3B/NTdhWqw3fdAMJNztzMHGzgHxA/4fU+rhrs/FhDzc4yt32zMEXBZw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "web3-utils": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3/node_modules/web3-eth-personal": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.3.0.tgz", - "integrity": "sha512-2czUhElsJdLpuNfun9GeLiClo5O6Xw+bLSjl3f4bNG5X2V4wcIjX2ygep/nfstLLtkz8jSkgl/bV7esANJyeRA==", - "dev": true, - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-net": "1.3.0", - "web3-utils": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3/node_modules/web3-net": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.3.0.tgz", - "integrity": "sha512-Xz02KylOyrB2YZzCkysEDrY7RbKxb7LADzx3Zlovfvuby7HBwtXVexXKtoGqksa+ns1lvjQLLQGb+OeLi7Sr7w==", - "dev": true, - "dependencies": { - "web3-core": "1.3.0", - "web3-core-method": "1.3.0", - "web3-utils": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3/node_modules/web3-providers-http": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.3.0.tgz", - "integrity": "sha512-cMKhUI6PqlY/EC+ZDacAxajySBu8AzW8jOjt1Pe/mbRQgS0rcZyvLePGTTuoyaA8C21F8UW+EE5jj7YsNgOuqA==", - "dev": true, - "dependencies": { - "web3-core-helpers": "1.3.0", - "xhr2-cookies": "1.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3/node_modules/web3-providers-ipc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.3.0.tgz", - "integrity": "sha512-0CrLuRofR+1J38nEj4WsId/oolwQEM6Yl1sOt41S/6bNI7htdkwgVhSloFIMJMDFHtRw229QIJ6wIaKQz0X1Og==", - "dev": true, - "dependencies": { - "oboe": "2.1.5", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3/node_modules/web3-providers-ws": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.3.0.tgz", - "integrity": "sha512-Im5MthhJnJst8nSoq0TgbyOdaiFQFa5r6sHPOVllhgIgViDqzbnlAFW9sNzQ0Q8VXPNfPIQKi9cOrHlSRNPjRw==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3/node_modules/web3-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz", - "integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/websocket": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", - "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", - "dev": true, - "dependencies": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/websocket/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/websql": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/websql/-/websql-1.0.0.tgz", - "integrity": "sha512-7iZ+u28Ljw5hCnMiq0BCOeSYf0vCFQe/ORY0HgscTiKjQed8WqugpBUggJ2NTnB9fahn1kEnPRX2jf8Px5PhJw==", - "dev": true, - "optional": true, - "dependencies": { - "argsarray": "^0.0.1", - "immediate": "^3.2.2", - "noop-fn": "^1.0.0", - "sqlite3": "^4.0.0", - "tiny-queue": "^0.2.1" - } - }, - "node_modules/whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", - "dev": true - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "optional": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "node_modules/which-typed-array": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", - "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.1", - "is-typed-array": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array/node_modules/es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array/node_modules/es-abstract/node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array/node_modules/is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array/node_modules/object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array/node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array/node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array/node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wif": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", - "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=", - "dev": true, - "dependencies": { - "bs58check": "<3.0.0" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/write-stream": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/write-stream/-/write-stream-0.4.3.tgz", - "integrity": "sha512-IJrvkhbAnj89W/GAVdVgbnPiVw5Ntg/B4tc/MUCIEwj/g6JIww1DWJyB/yBMT3yw2/TkT6IUZ0+IYef3flEw8A==", - "dev": true, - "optional": true, - "dependencies": { - "readable-stream": "~0.0.2" - } - }, - "node_modules/write-stream/node_modules/readable-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-0.0.4.tgz", - "integrity": "sha512-azrivNydKRYt7zwLV5wWUK7YzKTWs3q87xSmY6DlHapPrCvaT6ZrukvM5erV+yCSSPmZT8zkSdttOHQpWWm9zw==", - "dev": true, - "optional": true - }, - "node_modules/write/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - }, - "node_modules/ws/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/xhr": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", - "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", - "dependencies": { - "global": "~4.3.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/xhr-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "dependencies": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" - } - }, - "node_modules/xhr-request-promise": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", - "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", - "dependencies": { - "xhr-request": "^1.1.0" - } - }, - "node_modules/xhr2-cookies": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", - "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", - "dependencies": { - "cookiejar": "^2.1.1" - } - }, - "node_modules/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", - "dev": true - }, - "node_modules/xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/xss": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.13.tgz", - "integrity": "sha512-clu7dxTm1e8Mo5fz3n/oW3UCXBfV89xZ72jM8yzo1vR/pIS0w3sgB3XV2H8Vm6zfGnHL0FzvLJPJEBhd86/z4Q==", - "dev": true, - "optional": true, - "dependencies": { - "commander": "^2.20.3", - "cssfilter": "0.0.10" - }, - "bin": { - "xss": "bin/xss" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/xss/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "node_modules/yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=", - "engines": { - "node": ">=0.10.32" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/yargs/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@apollo/protobufjs": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.2.6.tgz", - "integrity": "sha512-Wqo1oSHNUj/jxmsVp4iR3I480p6qdqHikn38lKrFhfzcDJ7lwd7Ck7cHRl4JE81tWNArl77xhnG/OkZhxKBYOw==", - "dev": true, - "optional": true, - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.0", - "@types/node": "^10.1.0", - "long": "^4.0.0" - }, - "dependencies": { - "@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", - "dev": true, - "optional": true - } - } - }, - "@apollo/utils.dropunuseddefinitions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@apollo/utils.dropunuseddefinitions/-/utils.dropunuseddefinitions-1.1.0.tgz", - "integrity": "sha512-jU1XjMr6ec9pPoL+BFWzEPW7VHHulVdGKMkPAMiCigpVIT11VmCbnij0bWob8uS3ODJ65tZLYKAh/55vLw2rbg==", - "dev": true, - "optional": true - }, - "@apollo/utils.keyvaluecache": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-1.0.1.tgz", - "integrity": "sha512-nLgYLomqjVimEzQ4cdvVQkcryi970NDvcRVPfd0OPeXhBfda38WjBq+WhQFk+czSHrmrSp34YHBxpat0EtiowA==", - "dev": true, - "optional": true, - "requires": { - "@apollo/utils.logger": "^1.0.0", - "lru-cache": "^7.10.1" - }, - "dependencies": { - "lru-cache": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.12.0.tgz", - "integrity": "sha512-OIP3DwzRZDfLg9B9VP/huWBlpvbkmbfiBy8xmsXp4RPmE4A3MhwNozc5ZJ3fWnSg8fDcdlE/neRTPG2ycEKliw==", - "dev": true, - "optional": true - } - } - }, - "@apollo/utils.logger": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@apollo/utils.logger/-/utils.logger-1.0.0.tgz", - "integrity": "sha512-dx9XrjyisD2pOa+KsB5RcDbWIAdgC91gJfeyLCgy0ctJMjQe7yZK5kdWaWlaOoCeX0z6YI9iYlg7vMPyMpQF3Q==", - "dev": true, - "optional": true - }, - "@apollo/utils.printwithreducedwhitespace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@apollo/utils.printwithreducedwhitespace/-/utils.printwithreducedwhitespace-1.1.0.tgz", - "integrity": "sha512-GfFSkAv3n1toDZ4V6u2d7L4xMwLA+lv+6hqXicMN9KELSJ9yy9RzuEXaX73c/Ry+GzRsBy/fdSUGayGqdHfT2Q==", - "dev": true, - "optional": true - }, - "@apollo/utils.removealiases": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@apollo/utils.removealiases/-/utils.removealiases-1.0.0.tgz", - "integrity": "sha512-6cM8sEOJW2LaGjL/0vHV0GtRaSekrPQR4DiywaApQlL9EdROASZU5PsQibe2MWeZCOhNrPRuHh4wDMwPsWTn8A==", - "dev": true, - "optional": true - }, - "@apollo/utils.sortast": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@apollo/utils.sortast/-/utils.sortast-1.1.0.tgz", - "integrity": "sha512-VPlTsmUnOwzPK5yGZENN069y6uUHgeiSlpEhRnLFYwYNoJHsuJq2vXVwIaSmts015WTPa2fpz1inkLYByeuRQA==", - "dev": true, - "optional": true, - "requires": { - "lodash.sortby": "^4.7.0" - } - }, - "@apollo/utils.stripsensitiveliterals": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@apollo/utils.stripsensitiveliterals/-/utils.stripsensitiveliterals-1.2.0.tgz", - "integrity": "sha512-E41rDUzkz/cdikM5147d8nfCFVKovXxKBcjvLEQ7bjZm/cg9zEcXvS6vFY8ugTubI3fn6zoqo0CyU8zT+BGP9w==", - "dev": true, - "optional": true - }, - "@apollo/utils.usagereporting": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@apollo/utils.usagereporting/-/utils.usagereporting-1.0.0.tgz", - "integrity": "sha512-5PL7hJMkTPmdo3oxPtigRrIyPxDk/ddrUryHPDaezL1lSFExpNzsDd2f1j0XJoHOg350GRd3LyD64caLA2PU1w==", - "dev": true, - "optional": true, - "requires": { - "@apollo/utils.dropunuseddefinitions": "^1.1.0", - "@apollo/utils.printwithreducedwhitespace": "^1.1.0", - "@apollo/utils.removealiases": "1.0.0", - "@apollo/utils.sortast": "^1.1.0", - "@apollo/utils.stripsensitiveliterals": "^1.2.0", - "apollo-reporting-protobuf": "^3.3.1" - } - }, - "@apollographql/apollo-tools": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.5.4.tgz", - "integrity": "sha512-shM3q7rUbNyXVVRkQJQseXv6bnYM3BUma/eZhwXR4xsuM+bqWnJKvW7SAfRjP7LuSCocrexa5AXhjjawNHrIlw==", - "dev": true, - "optional": true - }, - "@apollographql/graphql-playground-html": { - "version": "1.6.29", - "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.29.tgz", - "integrity": "sha512-xCcXpoz52rI4ksJSdOCxeOCn2DLocxwHf9dVT/Q90Pte1LX+LY+91SFtJF3KXVHH8kEin+g1KKCQPKBjZJfWNA==", - "dev": true, - "optional": true, - "requires": { - "xss": "^1.0.8" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz", - "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==", - "dev": true - }, - "@babel/generator": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz", - "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", - "dev": true, - "requires": { - "@babel/types": "^7.18.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", - "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", - "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", - "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", - "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", - "dev": true - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - } - } - }, - "@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==", - "dev": true - }, - "@babel/plugin-transform-runtime": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.6.tgz", - "integrity": "sha512-8uRHk9ZmRSnWqUgyae249EJZ94b0yAGLBIqzZzl+0iEdbno55Pmlt/32JZsHwXD9k/uZj18Aqqk35wBX4CBTXA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-polyfill-corejs2": "^0.3.1", - "babel-plugin-polyfill-corejs3": "^0.5.2", - "babel-plugin-polyfill-regenerator": "^0.3.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/runtime": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", - "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/traverse": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz", - "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@celo/base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@celo/base/-/base-1.0.1.tgz", - "integrity": "sha512-DvWWFroRTHAnKEz2IaXJDzSl0CsctaLjvLaEaEDJ+998FMqu8iR1bbN6gV05ZwhdHOseS7j9eTkPTH4hBcHGrA==", - "dev": true - }, - "@celo/connect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@celo/connect/-/connect-1.0.1.tgz", - "integrity": "sha512-/jg1F4upqfYEqOnnp2vsE2MK8B9gdtGO+yuwRE1n3aenjCT8qAWFVqIL49tnVpQAyhfq0u4xvOaF40db5b6Qpw==", - "dev": true, - "requires": { - "@celo/utils": "1.0.1", - "@types/debug": "^4.1.5", - "@types/utf8": "^2.1.6", - "bignumber.js": "^9.0.0", - "debug": "^4.1.1", - "utf8": "3.0.0" - }, - "dependencies": { - "bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "dev": true - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@celo/contractkit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@celo/contractkit/-/contractkit-1.0.1.tgz", - "integrity": "sha512-iMXcRGj2X7sbkY2Cflxg4G4lhoTRYR4EEPbslLBjQMUJZ4SgelphD9hl6WgdN/h1xIbPBLNafhbqHgXfhqBrPg==", - "dev": true, - "requires": { - "@celo/base": "1.0.1", - "@celo/connect": "1.0.1", - "@celo/utils": "1.0.1", - "@celo/wallet-local": "1.0.1", - "@types/debug": "^4.1.5", - "bignumber.js": "^9.0.0", - "cross-fetch": "3.0.4", - "debug": "^4.1.1", - "fp-ts": "2.1.1", - "io-ts": "2.0.1", - "moment": "^2.29.0", - "web3": "1.3.0" - }, - "dependencies": { - "bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "dev": true - }, - "cross-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.4.tgz", - "integrity": "sha512-MSHgpjQqgbT/94D4CyADeNoYh52zMkCX4pcJvPP5WqPsLFMKjr2TCMg381ox5qI0ii2dPwaLx/00477knXqXVw==", - "dev": true, - "requires": { - "node-fetch": "2.6.0", - "whatwg-fetch": "3.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", - "dev": true - }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==", - "dev": true - } - } - }, - "@celo/utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@celo/utils/-/utils-1.0.1.tgz", - "integrity": "sha512-33Xuf1eB/Yhc/Sb+QmAv9L89IIfnYSkLwJqBcAauEY97u86T8gM/j8I1RxNSSQgVYSpV5VZJvshFUtD4m02YXw==", - "dev": true, - "requires": { - "@celo/base": "1.0.1", - "@types/country-data": "^0.0.0", - "@types/elliptic": "^6.4.9", - "@types/ethereumjs-util": "^5.2.0", - "@types/google-libphonenumber": "^7.4.17", - "@types/lodash": "^4.14.136", - "@types/node": "^10.12.18", - "@types/randombytes": "^2.0.0", - "@umpirsky/country-list": "https://github.com/umpirsky/country-list#05fda51", - "bigi": "^1.1.0", - "bignumber.js": "^9.0.0", - "bip32": "2.0.5", - "bip39": "3.0.2", - "bls12377js": "https://github.com/celo-org/bls12377js#cb38a4cfb643c778619d79b20ca3e5283a2122a6", - "bn.js": "4.11.8", - "buffer-reverse": "^1.0.1", - "country-data": "^0.0.31", - "crypto-js": "^3.1.9-1", - "elliptic": "^6.5.3", - "ethereumjs-util": "^5.2.0", - "fp-ts": "2.1.1", - "google-libphonenumber": "^3.2.15", - "io-ts": "2.0.1", - "keccak256": "^1.0.0", - "lodash": "^4.17.14", - "numeral": "^2.0.6", - "web3-eth-abi": "1.3.0", - "web3-utils": "1.3.0" - }, - "dependencies": { - "@ethersproject/abi": { - "version": "5.0.0-beta.153", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz", - "integrity": "sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==", - "dev": true, - "requires": { - "@ethersproject/address": ">=5.0.0-beta.128", - "@ethersproject/bignumber": ">=5.0.0-beta.130", - "@ethersproject/bytes": ">=5.0.0-beta.129", - "@ethersproject/constants": ">=5.0.0-beta.128", - "@ethersproject/hash": ">=5.0.0-beta.128", - "@ethersproject/keccak256": ">=5.0.0-beta.127", - "@ethersproject/logger": ">=5.0.0-beta.129", - "@ethersproject/properties": ">=5.0.0-beta.131", - "@ethersproject/strings": ">=5.0.0-beta.130" - } - }, - "@types/node": { - "version": "10.17.51", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.51.tgz", - "integrity": "sha512-KANw+MkL626tq90l++hGelbl67irOJzGhUJk6a1Bt8QHOeh9tztJx+L0AqttraWKinmZn7Qi5lJZJzx45Gq0dg==", - "dev": true - }, - "bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "web3-eth-abi": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.3.0.tgz", - "integrity": "sha512-1OrZ9+KGrBeBRd3lO8upkpNua9+7cBsQAgor9wbA25UrcUYSyL8teV66JNRu9gFxaTbkpdrGqM7J/LXpraXWrg==", - "dev": true, - "requires": { - "@ethersproject/abi": "5.0.0-beta.153", - "underscore": "1.9.1", - "web3-utils": "1.3.0" - } - }, - "web3-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz", - "integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - } - } - }, - "@celo/wallet-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@celo/wallet-base/-/wallet-base-1.0.1.tgz", - "integrity": "sha512-vrxJVGyxoJ48v03z28kjgSqhv5e/zr73RHDSJ2ZnBM++i+33Pz4ukshTdv9VEr3SFUoDAjJ1QLjxX29AcyaKcQ==", - "dev": true, - "requires": { - "@celo/base": "1.0.1", - "@celo/connect": "1.0.1", - "@celo/utils": "1.0.1", - "@types/debug": "^4.1.5", - "@types/ethereumjs-util": "^5.2.0", - "bignumber.js": "^9.0.0", - "debug": "^4.1.1", - "eth-lib": "^0.2.8", - "ethereumjs-util": "^5.2.0" - }, - "dependencies": { - "bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "dev": true - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@celo/wallet-local": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@celo/wallet-local/-/wallet-local-1.0.1.tgz", - "integrity": "sha512-VOXZZFmnsNa5JNwWjEos078IZ4VvYK458ZNt+pdlF2s/+F1aRSe1Oui9Ac60oLyVGl6ojGkW4lGCIck33Cxj1g==", - "dev": true, - "requires": { - "@celo/connect": "1.0.1", - "@celo/utils": "1.0.1", - "@celo/wallet-base": "1.0.1", - "@types/ethereumjs-util": "^5.2.0", - "eth-lib": "^0.2.8", - "ethereumjs-util": "^5.2.0" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", - "dev": true, - "requires": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" - }, - "dependencies": { - "@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - } - } - } - }, - "@ethereumjs/tx": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", - "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", - "dev": true, - "requires": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" - }, - "dependencies": { - "@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - } - } - } - }, - "@ethersproject/abi": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.6.4.tgz", - "integrity": "sha512-TTeZUlCeIHG6527/2goZA6gW5F8Emoc7MrZDC7hhP84aRGvW3TEdTnZR08Ls88YXM1m2SuK42Osw/jSi3uO8gg==", - "dev": true, - "requires": { - "@ethersproject/address": "^5.6.1", - "@ethersproject/bignumber": "^5.6.2", - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/constants": "^5.6.1", - "@ethersproject/hash": "^5.6.1", - "@ethersproject/keccak256": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "@ethersproject/properties": "^5.6.0", - "@ethersproject/strings": "^5.6.1" - } - }, - "@ethersproject/abstract-provider": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.6.1.tgz", - "integrity": "sha512-BxlIgogYJtp1FS8Muvj8YfdClk3unZH0vRMVX791Z9INBNT/kuACZ9GzaY1Y4yFq+YSy6/w4gzj3HCRKrK9hsQ==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.6.2", - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "@ethersproject/networks": "^5.6.3", - "@ethersproject/properties": "^5.6.0", - "@ethersproject/transactions": "^5.6.2", - "@ethersproject/web": "^5.6.1" - } - }, - "@ethersproject/abstract-signer": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.6.2.tgz", - "integrity": "sha512-n1r6lttFBG0t2vNiI3HoWaS/KdOt8xyDjzlP2cuevlWLG6EX0OwcKLyG/Kp/cuwNxdy/ous+R/DEMdTUwWQIjQ==", - "dev": true, - "requires": { - "@ethersproject/abstract-provider": "^5.6.1", - "@ethersproject/bignumber": "^5.6.2", - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "@ethersproject/properties": "^5.6.0" - } - }, - "@ethersproject/address": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.1.tgz", - "integrity": "sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.6.2", - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/keccak256": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "@ethersproject/rlp": "^5.6.1" - } - }, - "@ethersproject/base64": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.6.1.tgz", - "integrity": "sha512-qB76rjop6a0RIYYMiB4Eh/8n+Hxu2NIZm8S/Q7kNo5pmZfXhHGHmS4MinUainiBC54SCyRnwzL+KZjj8zbsSsw==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.6.1" - } - }, - "@ethersproject/bignumber": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.6.2.tgz", - "integrity": "sha512-v7+EEUbhGqT3XJ9LMPsKvXYHFc8eHxTowFCG/HgJErmq4XHJ2WR7aeyICg3uTOAQ7Icn0GFHAohXEhxQHq4Ubw==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "bn.js": "^5.2.1" - }, - "dependencies": { - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - } - } - }, - "@ethersproject/bytes": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.6.1.tgz", - "integrity": "sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.6.0" - } - }, - "@ethersproject/constants": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.6.1.tgz", - "integrity": "sha512-QSq9WVnZbxXYFftrjSjZDUshp6/eKp6qrtdBtUCm0QxCV5z1fG/w3kdlcsjMCQuQHUnAclKoK7XpXMezhRDOLg==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.6.2" - } - }, - "@ethersproject/hash": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.6.1.tgz", - "integrity": "sha512-L1xAHurbaxG8VVul4ankNX5HgQ8PNCTrnVXEiFnE9xoRnaUcgfD12tZINtDinSllxPLCtGwguQxJ5E6keE84pA==", - "dev": true, - "requires": { - "@ethersproject/abstract-signer": "^5.6.2", - "@ethersproject/address": "^5.6.1", - "@ethersproject/bignumber": "^5.6.2", - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/keccak256": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "@ethersproject/properties": "^5.6.0", - "@ethersproject/strings": "^5.6.1" - } - }, - "@ethersproject/keccak256": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.6.1.tgz", - "integrity": "sha512-bB7DQHCTRDooZZdL3lk9wpL0+XuG3XLGHLh3cePnybsO3V0rdCAOQGpn/0R3aODmnTOOkCATJiD2hnL+5bwthA==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.6.1", - "js-sha3": "0.8.0" - }, - "dependencies": { - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "dev": true - } - } - }, - "@ethersproject/logger": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.6.0.tgz", - "integrity": "sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg==", - "dev": true - }, - "@ethersproject/networks": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.6.4.tgz", - "integrity": "sha512-KShHeHPahHI2UlWdtDMn2lJETcbtaJge4k7XSjDR9h79QTd6yQJmv6Cp2ZA4JdqWnhszAOLSuJEd9C0PRw7hSQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.6.0" - } - }, - "@ethersproject/properties": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.6.0.tgz", - "integrity": "sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.6.0" - } - }, - "@ethersproject/rlp": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.6.1.tgz", - "integrity": "sha512-uYjmcZx+DKlFUk7a5/W9aQVaoEC7+1MOBgNtvNg13+RnuUwT4F0zTovC0tmay5SmRslb29V1B7Y5KCri46WhuQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/logger": "^5.6.0" - } - }, - "@ethersproject/signing-key": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.6.2.tgz", - "integrity": "sha512-jVbu0RuP7EFpw82vHcL+GP35+KaNruVAZM90GxgQnGqB6crhBqW/ozBfFvdeImtmb4qPko0uxXjn8l9jpn0cwQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "@ethersproject/properties": "^5.6.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" - }, - "dependencies": { - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - } - } - }, - "@ethersproject/strings": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.6.1.tgz", - "integrity": "sha512-2X1Lgk6Jyfg26MUnsHiT456U9ijxKUybz8IM1Vih+NJxYtXhmvKBcHOmvGqpFSVJ0nQ4ZCoIViR8XlRw1v/+Cw==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/constants": "^5.6.1", - "@ethersproject/logger": "^5.6.0" - } - }, - "@ethersproject/transactions": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.6.2.tgz", - "integrity": "sha512-BuV63IRPHmJvthNkkt9G70Ullx6AcM+SDc+a8Aw/8Yew6YwT51TcBKEp1P4oOQ/bP25I18JJr7rcFRgFtU9B2Q==", - "dev": true, - "requires": { - "@ethersproject/address": "^5.6.1", - "@ethersproject/bignumber": "^5.6.2", - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/constants": "^5.6.1", - "@ethersproject/keccak256": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "@ethersproject/properties": "^5.6.0", - "@ethersproject/rlp": "^5.6.1", - "@ethersproject/signing-key": "^5.6.2" - } - }, - "@ethersproject/web": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.6.1.tgz", - "integrity": "sha512-/vSyzaQlNXkO1WV+RneYKqCJwualcUdx/Z3gseVovZP0wIlOFcCE1hkRhKBH8ImKbGQbMl9EAAyJFrJu7V0aqA==", - "dev": true, - "requires": { - "@ethersproject/base64": "^5.6.1", - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "@ethersproject/properties": "^5.6.0", - "@ethersproject/strings": "^5.6.1" - } - }, - "@graphql-tools/batch-execute": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.5.0.tgz", - "integrity": "sha512-S9/76X4uYIbVlJyRzXhCBbTJvVD0VvaWNqGiKgkITxlq4aBsTOHVuE84OSi3E1QKP3PTiJYrgMIn220iFOkyQw==", - "dev": true, - "optional": true, - "requires": { - "@graphql-tools/utils": "8.8.0", - "dataloader": "2.1.0", - "tslib": "^2.4.0", - "value-or-promise": "1.0.11" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true, - "optional": true - } - } - }, - "@graphql-tools/delegate": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-8.8.0.tgz", - "integrity": "sha512-dbhfOI8rQXPcowXrbwHLOBY9oGi7qxtlrXF4RuRXmjqGTs2AgogdOE3Ep1+6wFD7qYTuFmHXZ8Cl0PmhoZUgrg==", - "dev": true, - "optional": true, - "requires": { - "@graphql-tools/batch-execute": "8.5.0", - "@graphql-tools/schema": "8.5.0", - "@graphql-tools/utils": "8.8.0", - "dataloader": "2.1.0", - "tslib": "~2.4.0", - "value-or-promise": "1.0.11" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true, - "optional": true - } - } - }, - "@graphql-tools/merge": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.3.0.tgz", - "integrity": "sha512-xRa7RAQok/0DD2YnjuqikMrr7dUAxTpdGtZ7BkvUUGhYs3B3p7reCAfvOVr1DJAqVToP7hdlMk+S5+Ylk+AaqA==", - "dev": true, - "optional": true, - "requires": { - "@graphql-tools/utils": "8.8.0", - "tslib": "^2.4.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true, - "optional": true - } - } - }, - "@graphql-tools/mock": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/mock/-/mock-8.7.0.tgz", - "integrity": "sha512-K/hqP442mXAvW36v/3TmqFpNzRw14P86xlsJZod88OXwpDfb97X09z1QsaMcvSe8E7ijcKWLlTRk15/vDQSL2Q==", - "dev": true, - "optional": true, - "requires": { - "@graphql-tools/schema": "8.5.0", - "@graphql-tools/utils": "8.8.0", - "fast-json-stable-stringify": "^2.1.0", - "tslib": "^2.4.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true, - "optional": true - } - } - }, - "@graphql-tools/schema": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-8.5.0.tgz", - "integrity": "sha512-VeFtKjM3SA9/hCJJfr95aEdC3G0xIKM9z0Qdz4i+eC1g2fdZYnfWFt2ucW4IME+2TDd0enHlKzaV0qk2SLVUww==", - "dev": true, - "optional": true, - "requires": { - "@graphql-tools/merge": "8.3.0", - "@graphql-tools/utils": "8.8.0", - "tslib": "^2.4.0", - "value-or-promise": "1.0.11" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true, - "optional": true - } - } - }, - "@graphql-tools/utils": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.8.0.tgz", - "integrity": "sha512-KJrtx05uSM/cPYFdTnGAS1doL5bftJLAiFCDMZ8Vkifztz3BFn3gpFiy/o4wDtM8s39G46mxmt2Km/RmeltfGw==", - "dev": true, - "optional": true, - "requires": { - "tslib": "^2.4.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true, - "optional": true - } - } - }, - "@josephg/resolvable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@josephg/resolvable/-/resolvable-1.0.1.tgz", - "integrity": "sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==", - "dev": true, - "optional": true - }, - "@jridgewell/resolve-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz", - "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@metamask/eth-sig-util": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", - "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", - "dev": true, - "requires": { - "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^6.2.1", - "ethjs-util": "^0.1.6", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.1" - }, - "dependencies": { - "ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, - "tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "dev": true - } - } - }, - "@metamask/safe-event-emitter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz", - "integrity": "sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==", - "dev": true - }, - "@noble/hashes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.0.0.tgz", - "integrity": "sha512-DZVbtY62kc3kkBtMHqwCOfXrT/hnoORy5BJ4+HU1IR59X0KWAOqsfzQPcUl/lQLlG7qXbe/fZ3r/emxtAl+sqg==", - "dev": true - }, - "@noble/secp256k1": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.5.5.tgz", - "integrity": "sha512-sZ1W6gQzYnu45wPrWx8D3kwI2/U29VYTx9OjbDAd7jwRItJ0cSTMPRL/C8AWZFn9kWFLQGqEXVEE86w4Z8LpIQ==", - "dev": true - }, - "@openzeppelin/contract-loader": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contract-loader/-/contract-loader-0.6.2.tgz", - "integrity": "sha512-/P8v8ZFVwK+Z7rHQH2N3hqzEmTzLFjhMtvNK4FeIak6DEeONZ92vdFaFb10CCCQtp390Rp/Y57Rtfrm50bUdMQ==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "fs-extra": "^8.1.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } - } - }, - "@openzeppelin/test-environment": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@openzeppelin/test-environment/-/test-environment-0.1.9.tgz", - "integrity": "sha512-QJ2TSRGbHMv4lrLChT7ghcoPGB3osXZvLXM3VqD8XhrJsYi/t5QJ8aHNYKa+A8EmCkH/rGZWgvRfhphVTFf0DA==", - "dev": true, - "requires": { - "@openzeppelin/contract-loader": "^0.6.1", - "@truffle/contract": "^4.0.38", - "ansi-colors": "^4.1.1", - "ethereumjs-wallet": "^0.6.3", - "exit-hook": "^2.2.0", - "find-up": "^4.1.0", - "fs-extra": "^9.0.1", - "ganache-core": "^2.11.2", - "lodash.merge": "^4.6.2", - "p-queue": "^6.2.0", - "semver": "^7.1.3", - "try-require": "^1.2.1", - "web3": "^1.3.0" - }, - "dependencies": { - "@ethersproject/abi": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz", - "integrity": "sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==", - "dev": true, - "requires": { - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/hash": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/strings": "^5.0.4" - } - }, - "@types/node": { - "version": "12.20.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.13.tgz", - "integrity": "sha512-1x8W5OpxPq+T85OUsHRP6BqXeosKmeXRtjoF39STcdf/UWLqUsoehstZKOi0CunhVqHG17AyZgpj20eRVooK6A==", - "dev": true - }, - "bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=", - "dev": true, - "requires": { - "http-https": "^1.0.0" - } - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "swarm-js": { - "version": "0.1.40", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", - "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", - "dev": true, - "requires": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - }, - "dependencies": { - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, - "underscore": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", - "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "web3": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.3.6.tgz", - "integrity": "sha512-jEpPhnL6GDteifdVh7ulzlPrtVQeA30V9vnki9liYlUvLV82ZM7BNOQJiuzlDePuE+jZETZSP/0G/JlUVt6pOA==", - "dev": true, - "requires": { - "web3-bzz": "1.3.6", - "web3-core": "1.3.6", - "web3-eth": "1.3.6", - "web3-eth-personal": "1.3.6", - "web3-net": "1.3.6", - "web3-shh": "1.3.6", - "web3-utils": "1.3.6" - } - }, - "web3-bzz": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.3.6.tgz", - "integrity": "sha512-ibHdx1wkseujFejrtY7ZyC0QxQ4ATXjzcNUpaLrvM6AEae8prUiyT/OloG9FWDgFD2CPLwzKwfSQezYQlANNlw==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40", - "underscore": "1.12.1" - } - }, - "web3-core": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.3.6.tgz", - "integrity": "sha512-gkLDM4T1Sc0T+HZIwxrNrwPg0IfWI0oABSglP2X5ZbBAYVUeEATA0o92LWV8BeF+okvKXLK1Fek/p6axwM/h3Q==", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.5", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.3.6", - "web3-core-method": "1.3.6", - "web3-core-requestmanager": "1.3.6", - "web3-utils": "1.3.6" - } - }, - "web3-core-helpers": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.3.6.tgz", - "integrity": "sha512-nhtjA2ZbkppjlxTSwG0Ttu6FcPkVu1rCN5IFAOVpF/L0SEt+jy+O5l90+cjDq0jAYvlBwUwnbh2mR9hwDEJCNA==", - "dev": true, - "requires": { - "underscore": "1.12.1", - "web3-eth-iban": "1.3.6", - "web3-utils": "1.3.6" - } - }, - "web3-core-method": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.3.6.tgz", - "integrity": "sha512-RyegqVGxn0cyYW5yzAwkPlsSEynkdPiegd7RxgB4ak1eKk2Cv1q2x4C7D2sZjeeCEF+q6fOkVmo2OZNqS2iQxg==", - "dev": true, - "requires": { - "@ethersproject/transactions": "^5.0.0-beta.135", - "underscore": "1.12.1", - "web3-core-helpers": "1.3.6", - "web3-core-promievent": "1.3.6", - "web3-core-subscriptions": "1.3.6", - "web3-utils": "1.3.6" - } - }, - "web3-core-promievent": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.3.6.tgz", - "integrity": "sha512-Z+QzfyYDTXD5wJmZO5wwnRO8bAAHEItT1XNSPVb4J1CToV/I/SbF7CuF8Uzh2jns0Cm1109o666H7StFFvzVKw==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-core-requestmanager": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.3.6.tgz", - "integrity": "sha512-2rIaeuqeo7QN1Eex7aXP0ZqeteJEPWXYFS/M3r3LXMiV8R4STQBKE+//dnHJXoo2ctzEB5cgd+7NaJM8S3gPyA==", - "dev": true, - "requires": { - "underscore": "1.12.1", - "util": "^0.12.0", - "web3-core-helpers": "1.3.6", - "web3-providers-http": "1.3.6", - "web3-providers-ipc": "1.3.6", - "web3-providers-ws": "1.3.6" - } - }, - "web3-core-subscriptions": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.3.6.tgz", - "integrity": "sha512-wi9Z9X5X75OKvxAg42GGIf81ttbNR2TxzkAsp1g+nnp5K8mBwgZvXrIsDuj7Z7gx72Y45mWJADCWjk/2vqNu8g==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "underscore": "1.12.1", - "web3-core-helpers": "1.3.6" - } - }, - "web3-eth": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.3.6.tgz", - "integrity": "sha512-9+rnywRRpyX3C4hfsAQXPQh6vHh9XzQkgLxo3gyeXfbhbShUoq2gFVuy42vsRs//6JlsKdyZS7Z3hHPHz2wreA==", - "dev": true, - "requires": { - "underscore": "1.12.1", - "web3-core": "1.3.6", - "web3-core-helpers": "1.3.6", - "web3-core-method": "1.3.6", - "web3-core-subscriptions": "1.3.6", - "web3-eth-abi": "1.3.6", - "web3-eth-accounts": "1.3.6", - "web3-eth-contract": "1.3.6", - "web3-eth-ens": "1.3.6", - "web3-eth-iban": "1.3.6", - "web3-eth-personal": "1.3.6", - "web3-net": "1.3.6", - "web3-utils": "1.3.6" - } - }, - "web3-eth-abi": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.3.6.tgz", - "integrity": "sha512-Or5cRnZu6WzgScpmbkvC6bfNxR26hqiKK4i8sMPFeTUABQcb/FU3pBj7huBLYbp9dH+P5W79D2MqwbWwjj9DoQ==", - "dev": true, - "requires": { - "@ethersproject/abi": "5.0.7", - "underscore": "1.12.1", - "web3-utils": "1.3.6" - } - }, - "web3-eth-accounts": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.3.6.tgz", - "integrity": "sha512-Ilr0hG6ONbCdSlVKffasCmNwftD5HsNpwyQASevocIQwHdTlvlwO0tb3oGYuajbKOaDzNTwXfz25bttAEoFCGA==", - "dev": true, - "requires": { - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", - "scrypt-js": "^3.0.1", - "underscore": "1.12.1", - "uuid": "3.3.2", - "web3-core": "1.3.6", - "web3-core-helpers": "1.3.6", - "web3-core-method": "1.3.6", - "web3-utils": "1.3.6" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - } - } - }, - "web3-eth-contract": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.3.6.tgz", - "integrity": "sha512-8gDaRrLF2HCg+YEZN1ov0zN35vmtPnGf3h1DxmJQK5Wm2lRMLomz9rsWsuvig3UJMHqZAQKD7tOl3ocJocQsmA==", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.5", - "underscore": "1.12.1", - "web3-core": "1.3.6", - "web3-core-helpers": "1.3.6", - "web3-core-method": "1.3.6", - "web3-core-promievent": "1.3.6", - "web3-core-subscriptions": "1.3.6", - "web3-eth-abi": "1.3.6", - "web3-utils": "1.3.6" - } - }, - "web3-eth-ens": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.3.6.tgz", - "integrity": "sha512-n27HNj7lpSkRxTgSx+Zo7cmKAgyg2ElFilaFlUu/X2CNH23lXfcPm2bWssivH9z0ndhg0OyR4AYFZqPaqDHkJA==", - "dev": true, - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "underscore": "1.12.1", - "web3-core": "1.3.6", - "web3-core-helpers": "1.3.6", - "web3-core-promievent": "1.3.6", - "web3-eth-abi": "1.3.6", - "web3-eth-contract": "1.3.6", - "web3-utils": "1.3.6" - } - }, - "web3-eth-iban": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.3.6.tgz", - "integrity": "sha512-nfMQaaLA/zsg5W4Oy/EJQbs8rSs1vBAX6b/35xzjYoutXlpHMQadujDx2RerTKhSHqFXSJeQAfE+2f6mdhYkRQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "web3-utils": "1.3.6" - } - }, - "web3-eth-personal": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.3.6.tgz", - "integrity": "sha512-pOHU0+/h1RFRYoh1ehYBehRbcKWP4OSzd4F7mDljhHngv6W8ewMHrAN8O1ol9uysN2MuCdRE19qkRg5eNgvzFQ==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.3.6", - "web3-core-helpers": "1.3.6", - "web3-core-method": "1.3.6", - "web3-net": "1.3.6", - "web3-utils": "1.3.6" - } - }, - "web3-net": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.3.6.tgz", - "integrity": "sha512-KhzU3wMQY/YYjyMiQzbaLPt2kut88Ncx2iqjy3nw28vRux3gVX0WOCk9EL/KVJBiAA/fK7VklTXvgy9dZnnipw==", - "dev": true, - "requires": { - "web3-core": "1.3.6", - "web3-core-method": "1.3.6", - "web3-utils": "1.3.6" - } - }, - "web3-providers-http": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.3.6.tgz", - "integrity": "sha512-OQkT32O1A06dISIdazpGLveZcOXhEo5cEX6QyiSQkiPk/cjzDrXMw4SKZOGQbbS1+0Vjizm1Hrp7O8Vp2D1M5Q==", - "dev": true, - "requires": { - "web3-core-helpers": "1.3.6", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.3.6.tgz", - "integrity": "sha512-+TVsSd2sSVvVgHG4s6FXwwYPPT91boKKcRuEFXqEfAbUC5t52XOgmyc2LNiD9LzPhed65FbV4LqICpeYGUvSwA==", - "dev": true, - "requires": { - "oboe": "2.1.5", - "underscore": "1.12.1", - "web3-core-helpers": "1.3.6" - } - }, - "web3-providers-ws": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.3.6.tgz", - "integrity": "sha512-bk7MnJf5or0Re2zKyhR3L3CjGululLCHXx4vlbc/drnaTARUVvi559OI5uLytc/1k5HKUUyENAxLvetz2G1dnQ==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "underscore": "1.12.1", - "web3-core-helpers": "1.3.6", - "websocket": "^1.0.32" - } - }, - "web3-shh": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.3.6.tgz", - "integrity": "sha512-9zRo415O0iBslxBnmu9OzYjNErzLnzOsy+IOvSpIreLYbbAw0XkDWxv3SfcpKnTIWIACBR4AYMIxmmyi5iB3jw==", - "dev": true, - "requires": { - "web3-core": "1.3.6", - "web3-core-method": "1.3.6", - "web3-core-subscriptions": "1.3.6", - "web3-net": "1.3.6" - } - }, - "web3-utils": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", - "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.12.1", - "utf8": "3.0.0" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - } - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@openzeppelin/test-helpers": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@openzeppelin/test-helpers/-/test-helpers-0.5.10.tgz", - "integrity": "sha512-agXr5Rn/q0MCDaU0ioYMGQVjY32Ln3Ae3cyQKtESuKdDoEZ7g3Y7x4eUbT779OE9nQ+xQCytmVqjKvZvajURug==", - "dev": true, - "requires": { - "@openzeppelin/contract-loader": "^0.6.2", - "@truffle/contract": "^4.0.35", - "ansi-colors": "^3.2.3", - "chai": "^4.2.0", - "chai-bn": "^0.2.1", - "ethjs-abi": "^0.2.1", - "lodash.flatten": "^4.4.0", - "semver": "^5.6.0", - "web3": "^1.2.5", - "web3-utils": "^1.2.5" - }, - "dependencies": { - "@ethersproject/abi": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz", - "integrity": "sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==", - "dev": true, - "requires": { - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/hash": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/strings": "^5.0.4" - } - }, - "@types/node": { - "version": "12.20.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.8.tgz", - "integrity": "sha512-uxDkaUGwXNDHu5MHqs+FAsmOjNoNibDF1cu4668QG96mQldQfgV3M+UyntXWWrtXSh13jFxEdNUdoLWH46mLKQ==", - "dev": true - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - }, - "bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=", - "dev": true, - "requires": { - "http-https": "^1.0.0" - } - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "swarm-js": { - "version": "0.1.40", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", - "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", - "dev": true, - "requires": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - }, - "dependencies": { - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - } - } - } - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "web3": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.3.5.tgz", - "integrity": "sha512-UyQW/MT5EIGBrXPCh/FDIaD7RtJTn5/rJUNw2FOglp0qoXnCQHNKvntiR1ylztk05fYxIF6UgsC76IrazlKJjw==", - "dev": true, - "requires": { - "web3-bzz": "1.3.5", - "web3-core": "1.3.5", - "web3-eth": "1.3.5", - "web3-eth-personal": "1.3.5", - "web3-net": "1.3.5", - "web3-shh": "1.3.5", - "web3-utils": "1.3.5" - } - }, - "web3-bzz": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.3.5.tgz", - "integrity": "sha512-XiEUAbB1uKm/agqfwBsCW8fbw+sma85TfwuDpdcy591vinVk0S9TfWgLxro6v1KJ6nSELySIbKGbAJbh2GSyxw==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40", - "underscore": "1.9.1" - } - }, - "web3-core": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.3.5.tgz", - "integrity": "sha512-VQjTvnGTqJwDwjKEHSApea3RmgtFGLDSJ6bqrOyHROYNyTyKYjFQ/drG9zs3rjDkND9mgh8foI1ty37Qua3QCQ==", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.5", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.3.5", - "web3-core-method": "1.3.5", - "web3-core-requestmanager": "1.3.5", - "web3-utils": "1.3.5" - } - }, - "web3-core-helpers": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.3.5.tgz", - "integrity": "sha512-HYh3ix5FjysgT0jyzD8s/X5ym0b4BGU7I2QtuBiydMnE0mQEWy7GcT9XKpTySA8FTOHHIAQYvQS07DN/ky3UzA==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-eth-iban": "1.3.5", - "web3-utils": "1.3.5" - } - }, - "web3-core-method": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.3.5.tgz", - "integrity": "sha512-hCbmgQ+At6OTuaNGAdjXMsCr4eUCmp9yGKSuaB5HdkNVDpqFso4HHjVxcjNrTyJp3OZnyjKBzQzK1ZWLpLl84Q==", - "dev": true, - "requires": { - "@ethersproject/transactions": "^5.0.0-beta.135", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.5", - "web3-core-promievent": "1.3.5", - "web3-core-subscriptions": "1.3.5", - "web3-utils": "1.3.5" - } - }, - "web3-core-promievent": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.3.5.tgz", - "integrity": "sha512-K0j8x3ZJr0eAyNvyUCxOUsSTd4hco0/9nxxlyOuijcsa6YV8l9NL6eqhniWbSyxCJT8ka5Mb7yAiUZe69EDLBQ==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-core-requestmanager": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.3.5.tgz", - "integrity": "sha512-9l294U3Ga8qmvv8E37BqjQREfMs+kFnkU3PY28g9DZGYzKvl3V1dgDYqxyrOBdCFhc7rNSpHdgC4PrVHjouspg==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "util": "^0.12.0", - "web3-core-helpers": "1.3.5", - "web3-providers-http": "1.3.5", - "web3-providers-ipc": "1.3.5", - "web3-providers-ws": "1.3.5" - } - }, - "web3-core-subscriptions": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.3.5.tgz", - "integrity": "sha512-6mtXdaEB1V1zKLqYBq7RF2W75AK5ZJNGpW6QYC7Zvbku7zq1ZlgaUkJo88JKMWJ7etfaHaYqQ/7VveHk5sQynA==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.5" - } - }, - "web3-eth": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.3.5.tgz", - "integrity": "sha512-5qqDPMMD+D0xRqOV2ePU2G7/uQmhn0FgCEhFzKDMHrssDQJyQLW/VgfA0NLn64lWnuUrGnQStGvNxrWf7MgsfA==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-core": "1.3.5", - "web3-core-helpers": "1.3.5", - "web3-core-method": "1.3.5", - "web3-core-subscriptions": "1.3.5", - "web3-eth-abi": "1.3.5", - "web3-eth-accounts": "1.3.5", - "web3-eth-contract": "1.3.5", - "web3-eth-ens": "1.3.5", - "web3-eth-iban": "1.3.5", - "web3-eth-personal": "1.3.5", - "web3-net": "1.3.5", - "web3-utils": "1.3.5" - } - }, - "web3-eth-abi": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.3.5.tgz", - "integrity": "sha512-bkbG2v/mOW5DH6rF/SEgqunusjYoEi2IBw+fkmD3rzWDaEY7+/i1xY94AeO257d06QMgld75GtV/N+aEs7A6vQ==", - "dev": true, - "requires": { - "@ethersproject/abi": "5.0.7", - "underscore": "1.9.1", - "web3-utils": "1.3.5" - } - }, - "web3-eth-accounts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.3.5.tgz", - "integrity": "sha512-r3WOR21rgm6Cd6OFnifr3Tizdm5K+g2TsSOPySwX4FrgLrYDL6ck4zr5VXUPz+llpSExb/JztpE8pqEHr3U2NA==", - "dev": true, - "requires": { - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", - "scrypt-js": "^3.0.1", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.3.5", - "web3-core-helpers": "1.3.5", - "web3-core-method": "1.3.5", - "web3-utils": "1.3.5" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - } - } - }, - "web3-eth-contract": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.3.5.tgz", - "integrity": "sha512-WfGVeQquN3D7Qm+KEIN9EI7yrm/fL2V9Y4+YhDWiKA/ns1pX1LYcEWojTOnBXCnPF3tcvoKKL+KBxXg1iKm38A==", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.5", - "underscore": "1.9.1", - "web3-core": "1.3.5", - "web3-core-helpers": "1.3.5", - "web3-core-method": "1.3.5", - "web3-core-promievent": "1.3.5", - "web3-core-subscriptions": "1.3.5", - "web3-eth-abi": "1.3.5", - "web3-utils": "1.3.5" - } - }, - "web3-eth-ens": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.3.5.tgz", - "integrity": "sha512-5bkpFTXV18CvaVP8kCbLZZm2r1TWUv9AsXH+80yz8bTZulUGvXsBMRfK6e5nfEr2Yv59xlIXCFoalmmySI9EJw==", - "dev": true, - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.3.5", - "web3-core-helpers": "1.3.5", - "web3-core-promievent": "1.3.5", - "web3-eth-abi": "1.3.5", - "web3-eth-contract": "1.3.5", - "web3-utils": "1.3.5" - } - }, - "web3-eth-iban": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.3.5.tgz", - "integrity": "sha512-x+BI/d2Vt0J1cKK8eFd4W0f1TDjgEOYCwiViTb28lLE+tqrgyPqWDA+l6UlKYLF/yMFX3Dym4ofcCOtgcn4q4g==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "web3-utils": "1.3.5" - } - }, - "web3-eth-personal": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.3.5.tgz", - "integrity": "sha512-xELQHNZ8p3VoO1582ghCaq+Bx7pSkOOalc6/ACOCGtHDMelqgVejrmSIZGScYl+k0HzngmQAzURZWQocaoGM1g==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.3.5", - "web3-core-helpers": "1.3.5", - "web3-core-method": "1.3.5", - "web3-net": "1.3.5", - "web3-utils": "1.3.5" - } - }, - "web3-net": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.3.5.tgz", - "integrity": "sha512-usbFbuUpKK8s7jPLGoUzi/WpNnefGFPTj948aJv8BZ04UQA4L/XS5NNkkhk358zNMmhGfEFW8wrWy+0Oy0njtA==", - "dev": true, - "requires": { - "web3-core": "1.3.5", - "web3-core-method": "1.3.5", - "web3-utils": "1.3.5" - } - }, - "web3-providers-http": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.3.5.tgz", - "integrity": "sha512-ZQOmceFjcajEZdiuqciXjijwIYWNmEJ1oxMtbrwB2eGxHRCMXEH2xGRUZuhOFNF88yQC/VXVi14yvYg5ZlFJlA==", - "dev": true, - "requires": { - "web3-core-helpers": "1.3.5", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.3.5.tgz", - "integrity": "sha512-cbZOeb/sALiHjzMolJjIyHla/J5wdL2JKUtRO66Nh/uLALBCpU8JUgzNvpAdJ1ae3+A33+EdFStdzuDYHKtQew==", - "dev": true, - "requires": { - "oboe": "2.1.5", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.5" - } - }, - "web3-providers-ws": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.3.5.tgz", - "integrity": "sha512-zeZ4LMvKhYaJBDCqA//Bzgp4r/T0tNq5U/xvN0axA4YflzF7yqlsbzGwCkcZYDbrUaK3Ltl2uOmvwjbWALOZ1A==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.5", - "websocket": "^1.0.32" - } - }, - "web3-shh": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.3.5.tgz", - "integrity": "sha512-aRwzCduXvuGVslLL/Y15VcOHa70Qr2kxZI7UwOzQVhaaOdxuRRvo3AK/cmyln1Tsd54/n93Yk8I3qg5I2+6alw==", - "dev": true, - "requires": { - "web3-core": "1.3.5", - "web3-core-method": "1.3.5", - "web3-core-subscriptions": "1.3.5", - "web3-net": "1.3.5" - } - }, - "web3-utils": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.5.tgz", - "integrity": "sha512-5apMRm8ElYjI/92GHqijmaLC+s+d5lgjpjHft+rJSs/dsnX8I8tQreqev0dmU+wzU+2EEe4Sx9a/OwGWHhQv3A==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - } - } - } - } - }, - "@openzeppelin/upgrades": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades/-/upgrades-2.8.0.tgz", - "integrity": "sha512-LzjTQPeljPsgHDPdZyH9cMCbIHZILgd2cpNcYEkdsC2IylBYRHShlbEDXJV9snnqg9JWfzPiKIqyj3XVliwtqQ==", - "requires": { - "@types/cbor": "^2.0.0", - "axios": "^0.18.0", - "bignumber.js": "^7.2.0", - "cbor": "^4.1.5", - "chalk": "^2.4.1", - "ethers": "^4.0.20", - "glob": "^7.1.3", - "lodash": "^4.17.15", - "semver": "^5.5.1", - "spinnies": "^0.4.2", - "truffle-flattener": "^1.4.0", - "web3": "1.2.2", - "web3-eth": "1.2.2", - "web3-eth-contract": "1.2.2", - "web3-utils": "1.2.2" - }, - "dependencies": { - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" - }, - "web3": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.2.tgz", - "integrity": "sha512-/ChbmB6qZpfGx6eNpczt5YSUBHEA5V2+iUCbn85EVb3Zv6FVxrOo5Tv7Lw0gE2tW7EEjASbCyp3mZeiZaCCngg==", - "requires": { - "@types/node": "^12.6.1", - "web3-bzz": "1.2.2", - "web3-core": "1.2.2", - "web3-eth": "1.2.2", - "web3-eth-personal": "1.2.2", - "web3-net": "1.2.2", - "web3-shh": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-bzz": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.2.tgz", - "integrity": "sha512-b1O2ObsqUN1lJxmFSjvnEC4TsaCbmh7Owj3IAIWTKqL9qhVgx7Qsu5O9cD13pBiSPNZJ68uJPaKq380QB4NWeA==", - "requires": { - "@types/node": "^10.12.18", - "got": "9.6.0", - "swarm-js": "0.1.39", - "underscore": "1.9.1" - }, - "dependencies": { - "@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" - } - } - }, - "web3-shh": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.2.tgz", - "integrity": "sha512-og258NPhlBn8yYrDWjoWBBb6zo1OlBgoWGT+LL5/LPqRbjPe09hlOYHgscAAr9zZGtohTOty7RrxYw6Z6oDWCg==", - "requires": { - "web3-core": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-net": "1.2.2" - } - } - } - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "dev": true, - "optional": true - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "dev": true, - "optional": true - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "dev": true, - "optional": true - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "dev": true, - "optional": true - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dev": true, - "optional": true, - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "dev": true, - "optional": true - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "dev": true, - "optional": true - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "dev": true, - "optional": true - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "dev": true, - "optional": true - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "dev": true, - "optional": true - }, - "@redux-saga/core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.1.3.tgz", - "integrity": "sha512-8tInBftak8TPzE6X13ABmEtRJGjtK17w7VUs7qV17S8hCO5S3+aUTWZ/DBsBJPdE8Z5jOPwYALyvofgq1Ws+kg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.6.3", - "@redux-saga/deferred": "^1.1.2", - "@redux-saga/delay-p": "^1.1.2", - "@redux-saga/is": "^1.1.2", - "@redux-saga/symbols": "^1.1.2", - "@redux-saga/types": "^1.1.0", - "redux": "^4.0.4", - "typescript-tuple": "^2.2.1" - }, - "dependencies": { - "redux": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", - "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.9.2" - } - } - } - }, - "@redux-saga/deferred": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@redux-saga/deferred/-/deferred-1.1.2.tgz", - "integrity": "sha512-908rDLHFN2UUzt2jb4uOzj6afpjgJe3MjICaUNO3bvkV/kN/cNeI9PMr8BsFXB/MR8WTAZQq/PlTq8Kww3TBSQ==", - "dev": true - }, - "@redux-saga/delay-p": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.1.2.tgz", - "integrity": "sha512-ojc+1IoC6OP65Ts5+ZHbEYdrohmIw1j9P7HS9MOJezqMYtCDgpkoqB5enAAZrNtnbSL6gVCWPHaoaTY5KeO0/g==", - "dev": true, - "requires": { - "@redux-saga/symbols": "^1.1.2" - } - }, - "@redux-saga/is": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@redux-saga/is/-/is-1.1.2.tgz", - "integrity": "sha512-OLbunKVsCVNTKEf2cH4TYyNbbPgvmZ52iaxBD4I1fTif4+MTXMa4/Z07L83zW/hTCXwpSZvXogqMqLfex2Tg6w==", - "dev": true, - "requires": { - "@redux-saga/symbols": "^1.1.2", - "@redux-saga/types": "^1.1.0" - } - }, - "@redux-saga/symbols": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@redux-saga/symbols/-/symbols-1.1.2.tgz", - "integrity": "sha512-EfdGnF423glv3uMwLsGAtE6bg+R9MdqlHEzExnfagXPrIiuxwr3bdiAwz3gi+PsrQ3yBlaBpfGLtDG8rf3LgQQ==", - "dev": true - }, - "@redux-saga/types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@redux-saga/types/-/types-1.1.0.tgz", - "integrity": "sha512-afmTuJrylUU/0OtqzaRkbyYFFNgCF73Bvel/sw90pvGrWIZ+vyoIJqA6eMSoA6+nb443kTmulmBtC9NerXboNg==", - "dev": true - }, - "@resolver-engine/core": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@resolver-engine/core/-/core-0.2.1.tgz", - "integrity": "sha512-nsLQHmPJ77QuifqsIvqjaF5B9aHnDzJjp73Q1z6apY3e9nqYrx4Dtowhpsf7Jwftg/XzVDEMQC+OzUBNTS+S1A==", - "requires": { - "debug": "^3.1.0", - "request": "^2.85.0" - } - }, - "@resolver-engine/fs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.2.1.tgz", - "integrity": "sha512-7kJInM1Qo2LJcKyDhuYzh9ZWd+mal/fynfL9BNjWOiTcOpX+jNfqb/UmGUqros5pceBITlWGqS4lU709yHFUbg==", - "requires": { - "@resolver-engine/core": "^0.2.1", - "debug": "^3.1.0" - } - }, - "@resolver-engine/imports": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.2.2.tgz", - "integrity": "sha512-u5/HUkvo8q34AA+hnxxqqXGfby5swnH0Myw91o3Sm2TETJlNKXibFGSKBavAH+wvWdBi4Z5gS2Odu0PowgVOUg==", - "requires": { - "@resolver-engine/core": "^0.2.1", - "debug": "^3.1.0", - "hosted-git-info": "^2.6.0" - } - }, - "@resolver-engine/imports-fs": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.2.2.tgz", - "integrity": "sha512-gFCgMvCwyppjwq0UzIjde/WI+yDs3oatJhozG9xdjJdewwtd7LiF0T5i9lrHAUtqrQbqoFE4E+ZMRVHWpWHpKQ==", - "requires": { - "@resolver-engine/fs": "^0.2.1", - "@resolver-engine/imports": "^0.2.2", - "debug": "^3.1.0" - } - }, - "@scure/base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.0.0.tgz", - "integrity": "sha512-gIVaYhUsy+9s58m/ETjSJVKHhKTBMmcRb9cEV5/5dwvfDlfORjKrFsDeDHWRrm6RjcPvCLZFwGJjAjLj1gg4HA==", - "dev": true - }, - "@scure/bip32": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.0.1.tgz", - "integrity": "sha512-AU88KKTpQ+YpTLoicZ/qhFhRRIo96/tlb+8YmDDHR9yiKVjSsFZiefJO4wjS2PMTkz5/oIcw84uAq/8pleQURA==", - "dev": true, - "requires": { - "@noble/hashes": "~1.0.0", - "@noble/secp256k1": "~1.5.2", - "@scure/base": "~1.0.0" - } - }, - "@scure/bip39": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.0.0.tgz", - "integrity": "sha512-HrtcikLbd58PWOkl02k9V6nXWQyoa7A0+Ek9VF7z17DDk9XZAFUcIdqfh0jJXLypmizc5/8P6OxoUeKliiWv4w==", - "dev": true, - "requires": { - "@noble/hashes": "~1.0.0", - "@scure/base": "~1.0.0" - } - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" - }, - "@solidity-parser/parser": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.6.2.tgz", - "integrity": "sha512-kUVUvrqttndeprLoXjI5arWHeiP3uh4XODAKbG+ZaWHCVQeelxCbnXBeWxZ2BPHdXgH0xR9dU1b916JhDhbgAA==" - }, - "@stablelib/binary": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@stablelib/binary/-/binary-0.7.2.tgz", - "integrity": "sha1-GzOSFwyKh0HIuPhD6ilN5xrrLPc=", - "dev": true, - "requires": { - "@stablelib/int": "^0.5.0" - } - }, - "@stablelib/blake2s": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@stablelib/blake2s/-/blake2s-0.10.4.tgz", - "integrity": "sha512-IasdklC7YfXXLmVbnsxqmd66+Ki+Ysbp0BtcrNxAtrGx/HRGjkUZbSTbEa7HxFhBWIstJRcE5ExgY+RCqAiULQ==", - "dev": true, - "requires": { - "@stablelib/binary": "^0.7.2", - "@stablelib/hash": "^0.5.0", - "@stablelib/wipe": "^0.5.0" - } - }, - "@stablelib/blake2xs": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@stablelib/blake2xs/-/blake2xs-0.10.4.tgz", - "integrity": "sha512-1N0S4cruso/StV9TmoujPGj3RU0Cy42wlZneBWLWby7m2ssnY57l/CsYQSm03TshOoYss4hqc5kwSy5pmWAdUA==", - "dev": true, - "requires": { - "@stablelib/blake2s": "^0.10.4", - "@stablelib/hash": "^0.5.0", - "@stablelib/wipe": "^0.5.0" - } - }, - "@stablelib/hash": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@stablelib/hash/-/hash-0.5.0.tgz", - "integrity": "sha1-if6QQKPUODsZIcfYpglIvDCEYGg=", - "dev": true - }, - "@stablelib/int": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@stablelib/int/-/int-0.5.0.tgz", - "integrity": "sha1-zKkiWVHVXS3khlZ1V4R4hjNmDCs=", - "dev": true - }, - "@stablelib/wipe": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@stablelib/wipe/-/wipe-0.5.0.tgz", - "integrity": "sha1-poLV+USOlQ4JnlN+b3L8lgJ10VE=", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@truffle/abi-utils": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.2.14.tgz", - "integrity": "sha512-2eHoWSFVutt+xAN8+g2x6N3+TM0AMUmGS4iW7KJNfxDsGdMBNe+qqUrDKM0NnA16yxqk95yQztO5EmWPiXw3+Q==", - "dev": true, - "requires": { - "change-case": "3.0.2", - "faker": "5.5.3", - "fast-check": "^2.12.1" - } - }, - "@truffle/blockchain-utils": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.0.20.tgz", - "integrity": "sha512-BZY31tWdmf7QFc9ejzsqJ3zSsjIrJyiAYdjJfRBt1JFG/VBmYer4QiZgMQjlVE/1gB/RZAy2XOA91XlxkyfEMw==", - "dev": true, - "requires": { - "source-map-support": "^0.5.19" - } - }, - "@truffle/code-utils": { - "version": "1.2.34", - "resolved": "https://registry.npmjs.org/@truffle/code-utils/-/code-utils-1.2.34.tgz", - "integrity": "sha512-Ie+PTdJIvK90voInSvn7WEdAsXd1VUw0TsX2225OMGVyYRWiQdX0K6Vfkib7RSZvdUEaURFAaHo5r57l2RacWg==", - "dev": true, - "requires": { - "cbor": "^5.1.0" - }, - "dependencies": { - "bignumber.js": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", - "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", - "dev": true - }, - "cbor": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", - "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", - "dev": true, - "requires": { - "bignumber.js": "^9.0.1", - "nofilter": "^1.0.4" - } - } - } - }, - "@truffle/codec": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.5.5.tgz", - "integrity": "sha512-RcpUnsWn3UoaBYL7jXOsJOLPnMzojQZEMW1LK7Wnc8ZNGWxL9fG6C3qcHepBogNyXy0Fhr1S4NaxgXTAFVRXHg==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "bn.js": "^4.11.8", - "debug": "^4.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.escaperegexp": "^4.1.2", - "lodash.partition": "^4.6.0", - "lodash.sum": "^4.0.2", - "semver": "^6.3.0", - "source-map-support": "^0.5.19", - "utf8": "^3.0.0", - "web3-utils": "1.2.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "web3-utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.1.tgz", - "integrity": "sha512-Mrcn3l58L+yCKz3zBryM6JZpNruWuT0OCbag8w+reeNROSGVlXzUQkU+gtAwc9JCZ7tKUyg67+2YUGqUjVcyBA==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "eth-lib": "0.2.7", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randomhex": "0.1.5", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - } - } - } - } - }, - "@truffle/compile-common": { - "version": "0.7.32", - "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.7.32.tgz", - "integrity": "sha512-SzIxwwQj8mJwoa7/kjkAslGenB4NejhmRHmdWdxNS5fqg2XqKhmSJcjir5qFjjvNzjcFZGecLg4EOm1Hj6letw==", - "dev": true, - "requires": { - "@truffle/error": "^0.1.0", - "colors": "1.4.0" - }, - "dependencies": { - "@truffle/error": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.0.tgz", - "integrity": "sha512-RbUfp5VreNhsa2Q4YbBjz18rOQI909pG32bghl1hulO7IpvcqTS+C3Ge5cNbiWQ1WGzy1wIeKLW0tmQtHFB7qg==", - "dev": true - } - } - }, - "@truffle/config": { - "version": "1.3.31", - "resolved": "https://registry.npmjs.org/@truffle/config/-/config-1.3.31.tgz", - "integrity": "sha512-RTXtRiFrzUT1WVmP8KdBl/DJ2b9GV77gOYSZ3NILuSrEL8IzWq57F1G/9rg5jq1v8b5JLDd7db5Yitn53ipBdA==", - "dev": true, - "optional": true, - "requires": { - "@truffle/error": "^0.1.0", - "@truffle/events": "^0.1.8", - "@truffle/provider": "^0.2.56", - "conf": "^10.0.2", - "find-up": "^2.1.0", - "lodash": "^4.17.21", - "original-require": "^1.0.1" - }, - "dependencies": { - "@truffle/error": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.0.tgz", - "integrity": "sha512-RbUfp5VreNhsa2Q4YbBjz18rOQI909pG32bghl1hulO7IpvcqTS+C3Ge5cNbiWQ1WGzy1wIeKLW0tmQtHFB7qg==", - "dev": true, - "optional": true - } - } - }, - "@truffle/contract": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.2.10.tgz", - "integrity": "sha512-86h1qyw9reJRWmYiGkMreAIZaG5bnP4VHniBe/ufMvspQVhgVPHQtpuVJD9hr1BkXwBH9WHBFdLx6z9eeiFm4w==", - "dev": true, - "requires": { - "@truffle/blockchain-utils": "^0.0.20", - "@truffle/contract-schema": "^3.2.0", - "@truffle/debug-utils": "^4.1.7", - "@truffle/error": "^0.0.8", - "@truffle/interface-adapter": "^0.4.9", - "bignumber.js": "^7.2.1", - "ethereum-ens": "^0.8.0", - "ethers": "^4.0.0-beta.1", - "source-map-support": "^0.5.19", - "web3": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-promievent": "1.2.1", - "web3-eth-abi": "1.2.1", - "web3-utils": "1.2.1" - }, - "dependencies": { - "@types/node": { - "version": "10.17.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.26.tgz", - "integrity": "sha512-myMwkO2Cr82kirHY8uknNRHEVtn0wV3DTQfkrjx17jmkstDRZ24gNUdl8AHXVyVclTYI/bNjgTPTAWvWLqXqkw==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "scrypt-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", - "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=", - "dev": true - }, - "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", - "dev": true - }, - "web3": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.1.tgz", - "integrity": "sha512-nNMzeCK0agb5i/oTWNdQ1aGtwYfXzHottFP2Dz0oGIzavPMGSKyVlr8ibVb1yK5sJBjrWVnTdGaOC2zKDFuFRw==", - "dev": true, - "requires": { - "web3-bzz": "1.2.1", - "web3-core": "1.2.1", - "web3-eth": "1.2.1", - "web3-eth-personal": "1.2.1", - "web3-net": "1.2.1", - "web3-shh": "1.2.1", - "web3-utils": "1.2.1" - } - }, - "web3-bzz": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.1.tgz", - "integrity": "sha512-LdOO44TuYbGIPfL4ilkuS89GQovxUpmLz6C1UC7VYVVRILeZS740FVB3j9V4P4FHUk1RenaDfKhcntqgVCHtjw==", - "dev": true, - "requires": { - "got": "9.6.0", - "swarm-js": "0.1.39", - "underscore": "1.9.1" - } - }, - "web3-core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.1.tgz", - "integrity": "sha512-5ODwIqgl8oIg/0+Ai4jsLxkKFWJYE0uLuE1yUKHNVCL4zL6n3rFjRMpKPokd6id6nJCNgeA64KdWQ4XfpnjdMg==", - "dev": true, - "requires": { - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-core-requestmanager": "1.2.1", - "web3-utils": "1.2.1" - } - }, - "web3-core-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.1.tgz", - "integrity": "sha512-Gx3sTEajD5r96bJgfuW377PZVFmXIH4TdqDhgGwd2lZQCcMi+DA4TgxJNJGxn0R3aUVzyyE76j4LBrh412mXrw==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-eth-iban": "1.2.1", - "web3-utils": "1.2.1" - } - }, - "web3-core-method": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.1.tgz", - "integrity": "sha512-Ghg2WS23qi6Xj8Od3VCzaImLHseEA7/usvnOItluiIc5cKs00WYWsNy2YRStzU9a2+z8lwQywPYp0nTzR/QXdQ==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1", - "web3-core-promievent": "1.2.1", - "web3-core-subscriptions": "1.2.1", - "web3-utils": "1.2.1" - } - }, - "web3-core-promievent": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.1.tgz", - "integrity": "sha512-IVUqgpIKoeOYblwpex4Hye6npM0aMR+kU49VP06secPeN0rHMyhGF0ZGveWBrGvf8WDPI7jhqPBFIC6Jf3Q3zw==", - "dev": true, - "requires": { - "any-promise": "1.3.0", - "eventemitter3": "3.1.2" - } - }, - "web3-core-requestmanager": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.1.tgz", - "integrity": "sha512-xfknTC69RfYmLKC+83Jz73IC3/sS2ZLhGtX33D4Q5nQ8yc39ElyAolxr9sJQS8kihOcM6u4J+8gyGMqsLcpIBg==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1", - "web3-providers-http": "1.2.1", - "web3-providers-ipc": "1.2.1", - "web3-providers-ws": "1.2.1" - } - }, - "web3-core-subscriptions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.1.tgz", - "integrity": "sha512-nmOwe3NsB8V8UFsY1r+sW6KjdOS68h8nuh7NzlWxBQT/19QSUGiERRTaZXWu5BYvo1EoZRMxCKyCQpSSXLc08g==", - "dev": true, - "requires": { - "eventemitter3": "3.1.2", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1" - } - }, - "web3-eth": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.1.tgz", - "integrity": "sha512-/2xly4Yry5FW1i+uygPjhfvgUP/MS/Dk+PDqmzp5M88tS86A+j8BzKc23GrlA8sgGs0645cpZK/999LpEF5UdA==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-core-subscriptions": "1.2.1", - "web3-eth-abi": "1.2.1", - "web3-eth-accounts": "1.2.1", - "web3-eth-contract": "1.2.1", - "web3-eth-ens": "1.2.1", - "web3-eth-iban": "1.2.1", - "web3-eth-personal": "1.2.1", - "web3-net": "1.2.1", - "web3-utils": "1.2.1" - } - }, - "web3-eth-abi": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.1.tgz", - "integrity": "sha512-jI/KhU2a/DQPZXHjo2GW0myEljzfiKOn+h1qxK1+Y9OQfTcBMxrQJyH5AP89O6l6NZ1QvNdq99ThAxBFoy5L+g==", - "dev": true, - "requires": { - "ethers": "4.0.0-beta.3", - "underscore": "1.9.1", - "web3-utils": "1.2.1" - }, - "dependencies": { - "elliptic": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", - "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "ethers": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.3.tgz", - "integrity": "sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog==", - "dev": true, - "requires": { - "@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.3", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - } - } - }, - "web3-eth-accounts": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.1.tgz", - "integrity": "sha512-26I4qq42STQ8IeKUyur3MdQ1NzrzCqPsmzqpux0j6X/XBD7EjZ+Cs0lhGNkSKH5dI3V8CJasnQ5T1mNKeWB7nQ==", - "dev": true, - "requires": { - "any-promise": "1.3.0", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.7", - "scryptsy": "2.1.0", - "semver": "6.2.0", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-utils": "1.2.1" - }, - "dependencies": { - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } - } - }, - "web3-eth-contract": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.1.tgz", - "integrity": "sha512-kYFESbQ3boC9bl2rYVghj7O8UKMiuKaiMkxvRH5cEDHil8V7MGEGZNH0slSdoyeftZVlaWSMqkRP/chfnKND0g==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-core-promievent": "1.2.1", - "web3-core-subscriptions": "1.2.1", - "web3-eth-abi": "1.2.1", - "web3-utils": "1.2.1" - } - }, - "web3-eth-ens": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.1.tgz", - "integrity": "sha512-lhP1kFhqZr2nnbu3CGIFFrAnNxk2veXpOXBY48Tub37RtobDyHijHgrj+xTh+mFiPokyrapVjpFsbGa+Xzye4Q==", - "dev": true, - "requires": { - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-promievent": "1.2.1", - "web3-eth-abi": "1.2.1", - "web3-eth-contract": "1.2.1", - "web3-utils": "1.2.1" - } - }, - "web3-eth-iban": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.1.tgz", - "integrity": "sha512-9gkr4QPl1jCU+wkgmZ8EwODVO3ovVj6d6JKMos52ggdT2YCmlfvFVF6wlGLwi0VvNa/p+0BjJzaqxnnG/JewjQ==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "web3-utils": "1.2.1" - } - }, - "web3-eth-personal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.1.tgz", - "integrity": "sha512-RNDVSiaSoY4aIp8+Hc7z+X72H7lMb3fmAChuSBADoEc7DsJrY/d0R5qQDK9g9t2BO8oxgLrLNyBP/9ub2Hc6Bg==", - "dev": true, - "requires": { - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-net": "1.2.1", - "web3-utils": "1.2.1" - } - }, - "web3-net": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.1.tgz", - "integrity": "sha512-Yt1Bs7WgnLESPe0rri/ZoPWzSy55ovioaP35w1KZydrNtQ5Yq4WcrAdhBzcOW7vAkIwrsLQsvA+hrOCy7mNauw==", - "dev": true, - "requires": { - "web3-core": "1.2.1", - "web3-core-method": "1.2.1", - "web3-utils": "1.2.1" - } - }, - "web3-providers-http": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.1.tgz", - "integrity": "sha512-BDtVUVolT9b3CAzeGVA/np1hhn7RPUZ6YYGB/sYky+GjeO311Yoq8SRDUSezU92x8yImSC2B+SMReGhd1zL+bQ==", - "dev": true, - "requires": { - "web3-core-helpers": "1.2.1", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.1.tgz", - "integrity": "sha512-oPEuOCwxVx8L4CPD0TUdnlOUZwGBSRKScCz/Ws2YHdr9Ium+whm+0NLmOZjkjQp5wovQbyBzNa6zJz1noFRvFA==", - "dev": true, - "requires": { - "oboe": "2.1.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1" - } - }, - "web3-providers-ws": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.1.tgz", - "integrity": "sha512-oqsQXzu+ejJACVHy864WwIyw+oB21nw/pI65/sD95Zi98+/HQzFfNcIFneF1NC4bVF3VNX4YHTNq2I2o97LAiA==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1", - "websocket": "github:web3-js/WebSocket-Node#polyfill/globalThis" - } - }, - "web3-shh": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.1.tgz", - "integrity": "sha512-/3Cl04nza5kuFn25bV3FJWa0s3Vafr5BlT933h26xovQ6HIIz61LmvNQlvX1AhFL+SNJOTcQmK1SM59vcyC8bA==", - "dev": true, - "requires": { - "web3-core": "1.2.1", - "web3-core-method": "1.2.1", - "web3-core-subscriptions": "1.2.1", - "web3-net": "1.2.1" - } - }, - "web3-utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.1.tgz", - "integrity": "sha512-Mrcn3l58L+yCKz3zBryM6JZpNruWuT0OCbag8w+reeNROSGVlXzUQkU+gtAwc9JCZ7tKUyg67+2YUGqUjVcyBA==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "eth-lib": "0.2.7", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randomhex": "0.1.5", - "underscore": "1.9.1", - "utf8": "3.0.0" - } - }, - "websocket": { - "version": "git+ssh://git@github.com/web3-js/WebSocket-Node.git#ef5ea2f41daf4a2113b80c9223df884b4d56c400", - "integrity": "sha512-fS64f2anyRmFjuEVoqTbtgtV4Ay1dQ6kP078yM1RxnF0+9hNYk4iirrtII6FIoNoNgmhhIqzQaadEU6ZRpGoEw==", - "dev": true, - "from": "websocket@github:web3-js/WebSocket-Node#polyfill/globalThis", - "requires": { - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "nan": "^2.14.0", - "typedarray-to-buffer": "^3.1.5", - "yaeti": "^0.0.6" - } - } - } - }, - "@truffle/contract-schema": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.2.0.tgz", - "integrity": "sha512-yeb4UoK9cbrT5/Nuz0I0p2XKbf0K1wEmyyBQmo3Q4JOrLidxf59LtDupo9Uq74RtlTAxZC0cy9DnsfWeWVma4A==", - "dev": true, - "requires": { - "ajv": "^6.10.0", - "crypto-js": "^3.1.9-1", - "debug": "^4.1.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@truffle/dashboard-message-bus-client": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@truffle/dashboard-message-bus-client/-/dashboard-message-bus-client-0.1.1.tgz", - "integrity": "sha512-tLcLxfnk8fa8m6gnnIiuIkJXMwOnm1gX60hXis091bEokJaR1/RYEdDQsFxy8/XkJmOOEfQ0NRD5ZPXn0KYvjA==", - "dev": true, - "optional": true, - "requires": { - "@truffle/dashboard-message-bus-common": "^0.1.1", - "@truffle/promise-tracker": "^0.1.0", - "axios": "^0.24.0", - "debug": "^4.3.1", - "delay": "^5.0.0", - "isomorphic-ws": "^4.0.1", - "tiny-typed-emitter": "^2.1.0", - "ws": "^7.2.0" - }, - "dependencies": { - "axios": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", - "dev": true, - "optional": true, - "requires": { - "follow-redirects": "^1.14.4" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "2.1.2" - } - }, - "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", - "dev": true, - "optional": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "optional": true - }, - "ws": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz", - "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==", - "dev": true, - "optional": true - } - } - }, - "@truffle/dashboard-message-bus-common": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@truffle/dashboard-message-bus-common/-/dashboard-message-bus-common-0.1.1.tgz", - "integrity": "sha512-DqrP2IQeao2u3en/csj9MwmEk7KKgLfvyHMwxrU6NyFXQ0Rs6F0AycpGTDivnoowVxqJohA+aut4IYHQuvwH8A==", - "dev": true, - "optional": true - }, - "@truffle/db": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@truffle/db/-/db-1.0.12.tgz", - "integrity": "sha512-/7T3kHsMgih/QjtcTInllyo5W9OmAPCA+faHHGLgm0G76gML738NOwz3T/JZhjMKnQabYulZeWid0sjUlzlIPg==", - "dev": true, - "optional": true, - "requires": { - "@graphql-tools/delegate": "^8.4.3", - "@graphql-tools/schema": "^8.3.1", - "@truffle/abi-utils": "^0.2.14", - "@truffle/code-utils": "^1.2.34", - "@truffle/config": "^1.3.31", - "abstract-leveldown": "^7.2.0", - "apollo-server": "^3.6.3", - "debug": "^4.3.1", - "fs-extra": "^9.1.0", - "graphql": "^15.3.0", - "graphql-tag": "^2.11.0", - "json-stable-stringify": "^1.0.1", - "pascal-case": "^2.0.1", - "pluralize": "^8.0.0", - "pouchdb": "7.3.0", - "pouchdb-adapter-memory": "^7.1.1", - "pouchdb-adapter-node-websql": "^7.0.0", - "pouchdb-debug": "^7.1.1", - "pouchdb-find": "^7.0.0", - "web3-utils": "1.7.4" - }, - "dependencies": { - "@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true, - "optional": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "2.1.2" - } - }, - "ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "optional": true, - "requires": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "optional": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "optional": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "optional": true - }, - "web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - } - } - } - }, - "@truffle/db-loader": { - "version": "0.1.22", - "resolved": "https://registry.npmjs.org/@truffle/db-loader/-/db-loader-0.1.22.tgz", - "integrity": "sha512-n1ljxscIaci6r0qbJMw34ng2IQGK3lXMoowO5ohP9Gwaqxv+atNLsV7s/6YVmGgsLV8cDNIEZoKKnRh/EDJO4g==", - "dev": true, - "requires": { - "@truffle/db": "^1.0.12" - } - }, - "@truffle/debug-utils": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-4.1.7.tgz", - "integrity": "sha512-KV3OQPKud0Ymzntfb9Jxz/X6Ndz34m9qgcmmtqy/u7SRacOXHKs6Ov6QPT05QAUZdT6XgpegpSOiZCzbz+jpSQ==", - "dev": true, - "requires": { - "@truffle/codec": "^0.5.5", - "@trufflesuite/chromafi": "^2.1.2", - "chalk": "^2.4.2", - "debug": "^4.1.0", - "highlight.js": "^9.15.8", - "highlightjs-solidity": "^1.0.16", - "node-dir": "0.1.17" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@truffle/debugger": { - "version": "10.0.16", - "resolved": "https://registry.npmjs.org/@truffle/debugger/-/debugger-10.0.16.tgz", - "integrity": "sha512-poXnJ+fLA2oTMHBhfuML4o1bMtersDVWypATi+YXxCvebVMUQMgOv1baVYDl0pK/J3FaLQSI1W7x8B6415f7cQ==", - "dev": true, - "requires": { - "@truffle/abi-utils": "^0.2.14", - "@truffle/codec": "^0.13.2", - "@truffle/source-map-utils": "^1.3.88", - "bn.js": "^5.1.3", - "debug": "^4.3.1", - "json-pointer": "^0.6.1", - "json-stable-stringify": "^1.0.1", - "lodash": "^4.17.21", - "redux": "^3.7.2", - "redux-saga": "1.0.0", - "reselect-tree": "^1.3.7", - "semver": "^7.3.4", - "web3": "1.7.4", - "web3-eth-abi": "1.7.4" - }, - "dependencies": { - "@truffle/codec": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.13.2.tgz", - "integrity": "sha512-iViBnh6WV2BKaLboFC3xd9FGgC2Iybx4CHI+A5PPPqFkjnEycigdN8wnV2eqic9ptE1Ix7wsj9urZitnsnLhCA==", - "dev": true, - "requires": { - "@truffle/abi-utils": "^0.2.14", - "@truffle/compile-common": "^0.7.32", - "big.js": "^6.0.3", - "bn.js": "^5.1.3", - "cbor": "^5.1.0", - "debug": "^4.3.1", - "lodash": "^4.17.21", - "semver": "^7.3.4", - "utf8": "^3.0.0", - "web3-utils": "1.7.4" - } - }, - "@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "big.js": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.0.tgz", - "integrity": "sha512-paIKvJiAaOYdLt6MfnvxkDo64lTOV257XYJyX3oJnJQocIclUn+48k6ZerH/c5FxWE6DGJu1TKDYis7tqHg9kg==", - "dev": true - }, - "bignumber.js": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", - "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", - "dev": true - }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "cbor": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", - "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", - "dev": true, - "requires": { - "bignumber.js": "^9.0.1", - "nofilter": "^1.0.4" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - } - }, - "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", - "dev": true, - "requires": { - "http-https": "^1.0.0" - } - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", - "dev": true - }, - "scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "swarm-js": { - "version": "0.1.40", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", - "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", - "dev": true, - "requires": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - }, - "dependencies": { - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - } - } - } - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "web3": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.4.tgz", - "integrity": "sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A==", - "dev": true, - "requires": { - "web3-bzz": "1.7.4", - "web3-core": "1.7.4", - "web3-eth": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-shh": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-bzz": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.4.tgz", - "integrity": "sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40" - } - }, - "web3-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz", - "integrity": "sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-requestmanager": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-core-helpers": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz", - "integrity": "sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg==", - "dev": true, - "requires": { - "web3-eth-iban": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-core-method": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz", - "integrity": "sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ==", - "dev": true, - "requires": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-core-promievent": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz", - "integrity": "sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-core-requestmanager": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz", - "integrity": "sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA==", - "dev": true, - "requires": { - "util": "^0.12.0", - "web3-core-helpers": "1.7.4", - "web3-providers-http": "1.7.4", - "web3-providers-ipc": "1.7.4", - "web3-providers-ws": "1.7.4" - } - }, - "web3-core-subscriptions": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz", - "integrity": "sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4" - } - }, - "web3-eth": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz", - "integrity": "sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug==", - "dev": true, - "requires": { - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-accounts": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-eth-ens": "1.7.4", - "web3-eth-iban": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-abi": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz", - "integrity": "sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.4" - } - }, - "web3-eth-accounts": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz", - "integrity": "sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw==", - "dev": true, - "requires": { - "@ethereumjs/common": "^2.5.0", - "@ethereumjs/tx": "^3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - } - } - }, - "web3-eth-contract": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz", - "integrity": "sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-ens": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz", - "integrity": "sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA==", - "dev": true, - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-iban": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz", - "integrity": "sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.7.4" - } - }, - "web3-eth-personal": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz", - "integrity": "sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-net": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz", - "integrity": "sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg==", - "dev": true, - "requires": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-providers-http": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz", - "integrity": "sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA==", - "dev": true, - "requires": { - "web3-core-helpers": "1.7.4", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz", - "integrity": "sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw==", - "dev": true, - "requires": { - "oboe": "2.1.5", - "web3-core-helpers": "1.7.4" - } - }, - "web3-providers-ws": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz", - "integrity": "sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4", - "websocket": "^1.0.32" - } - }, - "web3-shh": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz", - "integrity": "sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A==", - "dev": true, - "requires": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-net": "1.7.4" - } - }, - "web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@truffle/error": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.0.8.tgz", - "integrity": "sha512-x55rtRuNfRO1azmZ30iR0pf0OJ6flQqbax1hJz+Avk1K5fdmOv5cr22s9qFnwTWnS6Bw0jvJEoR0ITsM7cPKtQ==", - "dev": true - }, - "@truffle/events": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@truffle/events/-/events-0.1.8.tgz", - "integrity": "sha512-oK+nnV9ToCk1qKW01l+bojV61sCj1zljcS5+xBZ9Dteb52mQ9tpsy6xuQXVcsHAhZOQ4Gz2S3bTrlvjU4AyeCQ==", - "dev": true, - "optional": true, - "requires": { - "@truffle/dashboard-message-bus-client": "^0.1.1", - "@truffle/spinners": "^0.2.0", - "debug": "^4.3.1", - "emittery": "^0.4.1", - "web3-utils": "1.7.4" - }, - "dependencies": { - "@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true, - "optional": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "2.1.2" - } - }, - "ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "optional": true, - "requires": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "optional": true - }, - "web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - } - } - } - }, - "@truffle/hdwallet-provider": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@truffle/hdwallet-provider/-/hdwallet-provider-2.0.10.tgz", - "integrity": "sha512-0wOdWYciTEKy3doZCzkhcKbYN4QnwtLx/ihRelIsZZyklNe++fppOqjKKa4t+8t2g5r0Ji3i5xPFOc2CAdS+fQ==", - "dev": true, - "requires": { - "@ethereumjs/common": "^2.4.0", - "@ethereumjs/tx": "^3.3.0", - "@metamask/eth-sig-util": "4.0.1", - "ethereum-cryptography": "1.0.3", - "ethereum-protocol": "^1.0.1", - "ethereumjs-util": "^6.1.0", - "ethereumjs-wallet": "^1.0.1", - "web3-provider-engine": "16.0.3" - }, - "dependencies": { - "@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "aes-js": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "ethereum-cryptography": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.0.3.tgz", - "integrity": "sha512-NQLTW0x0CosoVb/n79x/TRHtfvS3hgNUPTUSCu0vM+9k6IIhHFFrAOJReneexjZsoZxMjJHnJn4lrE8EbnSyqQ==", - "dev": true, - "requires": { - "@noble/hashes": "1.0.0", - "@noble/secp256k1": "1.5.5", - "@scure/bip32": "1.0.1", - "@scure/bip39": "1.0.0" - } - }, - "ethereumjs-wallet": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-1.0.1.tgz", - "integrity": "sha512-3Z5g1hG1das0JWU6cQ9HWWTY2nt9nXCcwj7eXVNAHKbo00XAZO8+NHlwdgXDWrL0SXVQMvTWN8Q/82DRH/JhPw==", - "dev": true, - "requires": { - "aes-js": "^3.1.1", - "bs58check": "^2.1.2", - "ethereum-cryptography": "^0.1.3", - "ethereumjs-util": "^7.0.2", - "randombytes": "^2.0.6", - "scrypt-js": "^3.0.1", - "utf8": "^3.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "dev": true - }, - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "ethereumjs-util": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz", - "integrity": "sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.4" - } - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "keccak": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", - "dev": true, - "requires": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true - }, - "secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "dev": true, - "requires": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "@truffle/interface-adapter": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.4.9.tgz", - "integrity": "sha512-2dYccf7lAwx90NVYmn89QABpd3dx7BxvDAaHgzVa2YVOUkTUpkZiaIsD2YlsVQ1rew17wMNi5WXH2RFnmzQ82A==", - "dev": true, - "requires": { - "bn.js": "^4.11.8", - "ethers": "^4.0.32", - "source-map-support": "^0.5.19", - "web3": "1.2.1" - }, - "dependencies": { - "@types/node": { - "version": "10.17.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.26.tgz", - "integrity": "sha512-myMwkO2Cr82kirHY8uknNRHEVtn0wV3DTQfkrjx17jmkstDRZ24gNUdl8AHXVyVclTYI/bNjgTPTAWvWLqXqkw==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "scrypt-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", - "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=", - "dev": true - }, - "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", - "dev": true - }, - "web3": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.1.tgz", - "integrity": "sha512-nNMzeCK0agb5i/oTWNdQ1aGtwYfXzHottFP2Dz0oGIzavPMGSKyVlr8ibVb1yK5sJBjrWVnTdGaOC2zKDFuFRw==", - "dev": true, - "requires": { - "web3-bzz": "1.2.1", - "web3-core": "1.2.1", - "web3-eth": "1.2.1", - "web3-eth-personal": "1.2.1", - "web3-net": "1.2.1", - "web3-shh": "1.2.1", - "web3-utils": "1.2.1" - } - }, - "web3-bzz": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.1.tgz", - "integrity": "sha512-LdOO44TuYbGIPfL4ilkuS89GQovxUpmLz6C1UC7VYVVRILeZS740FVB3j9V4P4FHUk1RenaDfKhcntqgVCHtjw==", - "dev": true, - "requires": { - "got": "9.6.0", - "swarm-js": "0.1.39", - "underscore": "1.9.1" - } - }, - "web3-core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.1.tgz", - "integrity": "sha512-5ODwIqgl8oIg/0+Ai4jsLxkKFWJYE0uLuE1yUKHNVCL4zL6n3rFjRMpKPokd6id6nJCNgeA64KdWQ4XfpnjdMg==", - "dev": true, - "requires": { - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-core-requestmanager": "1.2.1", - "web3-utils": "1.2.1" - } - }, - "web3-core-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.1.tgz", - "integrity": "sha512-Gx3sTEajD5r96bJgfuW377PZVFmXIH4TdqDhgGwd2lZQCcMi+DA4TgxJNJGxn0R3aUVzyyE76j4LBrh412mXrw==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-eth-iban": "1.2.1", - "web3-utils": "1.2.1" - } - }, - "web3-core-method": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.1.tgz", - "integrity": "sha512-Ghg2WS23qi6Xj8Od3VCzaImLHseEA7/usvnOItluiIc5cKs00WYWsNy2YRStzU9a2+z8lwQywPYp0nTzR/QXdQ==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1", - "web3-core-promievent": "1.2.1", - "web3-core-subscriptions": "1.2.1", - "web3-utils": "1.2.1" - } - }, - "web3-core-promievent": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.1.tgz", - "integrity": "sha512-IVUqgpIKoeOYblwpex4Hye6npM0aMR+kU49VP06secPeN0rHMyhGF0ZGveWBrGvf8WDPI7jhqPBFIC6Jf3Q3zw==", - "dev": true, - "requires": { - "any-promise": "1.3.0", - "eventemitter3": "3.1.2" - } - }, - "web3-core-requestmanager": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.1.tgz", - "integrity": "sha512-xfknTC69RfYmLKC+83Jz73IC3/sS2ZLhGtX33D4Q5nQ8yc39ElyAolxr9sJQS8kihOcM6u4J+8gyGMqsLcpIBg==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1", - "web3-providers-http": "1.2.1", - "web3-providers-ipc": "1.2.1", - "web3-providers-ws": "1.2.1" - } - }, - "web3-core-subscriptions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.1.tgz", - "integrity": "sha512-nmOwe3NsB8V8UFsY1r+sW6KjdOS68h8nuh7NzlWxBQT/19QSUGiERRTaZXWu5BYvo1EoZRMxCKyCQpSSXLc08g==", - "dev": true, - "requires": { - "eventemitter3": "3.1.2", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1" - } - }, - "web3-eth": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.1.tgz", - "integrity": "sha512-/2xly4Yry5FW1i+uygPjhfvgUP/MS/Dk+PDqmzp5M88tS86A+j8BzKc23GrlA8sgGs0645cpZK/999LpEF5UdA==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-core-subscriptions": "1.2.1", - "web3-eth-abi": "1.2.1", - "web3-eth-accounts": "1.2.1", - "web3-eth-contract": "1.2.1", - "web3-eth-ens": "1.2.1", - "web3-eth-iban": "1.2.1", - "web3-eth-personal": "1.2.1", - "web3-net": "1.2.1", - "web3-utils": "1.2.1" - } - }, - "web3-eth-abi": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.1.tgz", - "integrity": "sha512-jI/KhU2a/DQPZXHjo2GW0myEljzfiKOn+h1qxK1+Y9OQfTcBMxrQJyH5AP89O6l6NZ1QvNdq99ThAxBFoy5L+g==", - "dev": true, - "requires": { - "ethers": "4.0.0-beta.3", - "underscore": "1.9.1", - "web3-utils": "1.2.1" - }, - "dependencies": { - "elliptic": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", - "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "ethers": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.3.tgz", - "integrity": "sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog==", - "dev": true, - "requires": { - "@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.3", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - } - } - }, - "web3-eth-accounts": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.1.tgz", - "integrity": "sha512-26I4qq42STQ8IeKUyur3MdQ1NzrzCqPsmzqpux0j6X/XBD7EjZ+Cs0lhGNkSKH5dI3V8CJasnQ5T1mNKeWB7nQ==", - "dev": true, - "requires": { - "any-promise": "1.3.0", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.7", - "scryptsy": "2.1.0", - "semver": "6.2.0", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-utils": "1.2.1" - }, - "dependencies": { - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } - } - }, - "web3-eth-contract": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.1.tgz", - "integrity": "sha512-kYFESbQ3boC9bl2rYVghj7O8UKMiuKaiMkxvRH5cEDHil8V7MGEGZNH0slSdoyeftZVlaWSMqkRP/chfnKND0g==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-core-promievent": "1.2.1", - "web3-core-subscriptions": "1.2.1", - "web3-eth-abi": "1.2.1", - "web3-utils": "1.2.1" - } - }, - "web3-eth-ens": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.1.tgz", - "integrity": "sha512-lhP1kFhqZr2nnbu3CGIFFrAnNxk2veXpOXBY48Tub37RtobDyHijHgrj+xTh+mFiPokyrapVjpFsbGa+Xzye4Q==", - "dev": true, - "requires": { - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-promievent": "1.2.1", - "web3-eth-abi": "1.2.1", - "web3-eth-contract": "1.2.1", - "web3-utils": "1.2.1" - } - }, - "web3-eth-iban": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.1.tgz", - "integrity": "sha512-9gkr4QPl1jCU+wkgmZ8EwODVO3ovVj6d6JKMos52ggdT2YCmlfvFVF6wlGLwi0VvNa/p+0BjJzaqxnnG/JewjQ==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "web3-utils": "1.2.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - } - } - }, - "web3-eth-personal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.1.tgz", - "integrity": "sha512-RNDVSiaSoY4aIp8+Hc7z+X72H7lMb3fmAChuSBADoEc7DsJrY/d0R5qQDK9g9t2BO8oxgLrLNyBP/9ub2Hc6Bg==", - "dev": true, - "requires": { - "web3-core": "1.2.1", - "web3-core-helpers": "1.2.1", - "web3-core-method": "1.2.1", - "web3-net": "1.2.1", - "web3-utils": "1.2.1" - } - }, - "web3-net": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.1.tgz", - "integrity": "sha512-Yt1Bs7WgnLESPe0rri/ZoPWzSy55ovioaP35w1KZydrNtQ5Yq4WcrAdhBzcOW7vAkIwrsLQsvA+hrOCy7mNauw==", - "dev": true, - "requires": { - "web3-core": "1.2.1", - "web3-core-method": "1.2.1", - "web3-utils": "1.2.1" - } - }, - "web3-providers-http": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.1.tgz", - "integrity": "sha512-BDtVUVolT9b3CAzeGVA/np1hhn7RPUZ6YYGB/sYky+GjeO311Yoq8SRDUSezU92x8yImSC2B+SMReGhd1zL+bQ==", - "dev": true, - "requires": { - "web3-core-helpers": "1.2.1", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.1.tgz", - "integrity": "sha512-oPEuOCwxVx8L4CPD0TUdnlOUZwGBSRKScCz/Ws2YHdr9Ium+whm+0NLmOZjkjQp5wovQbyBzNa6zJz1noFRvFA==", - "dev": true, - "requires": { - "oboe": "2.1.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1" - } - }, - "web3-providers-ws": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.1.tgz", - "integrity": "sha512-oqsQXzu+ejJACVHy864WwIyw+oB21nw/pI65/sD95Zi98+/HQzFfNcIFneF1NC4bVF3VNX4YHTNq2I2o97LAiA==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.1", - "websocket": "github:web3-js/WebSocket-Node#polyfill/globalThis" - } - }, - "web3-shh": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.1.tgz", - "integrity": "sha512-/3Cl04nza5kuFn25bV3FJWa0s3Vafr5BlT933h26xovQ6HIIz61LmvNQlvX1AhFL+SNJOTcQmK1SM59vcyC8bA==", - "dev": true, - "requires": { - "web3-core": "1.2.1", - "web3-core-method": "1.2.1", - "web3-core-subscriptions": "1.2.1", - "web3-net": "1.2.1" - } - }, - "web3-utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.1.tgz", - "integrity": "sha512-Mrcn3l58L+yCKz3zBryM6JZpNruWuT0OCbag8w+reeNROSGVlXzUQkU+gtAwc9JCZ7tKUyg67+2YUGqUjVcyBA==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "eth-lib": "0.2.7", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randomhex": "0.1.5", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - } - } - }, - "websocket": { - "version": "git+ssh://git@github.com/web3-js/WebSocket-Node.git#ef5ea2f41daf4a2113b80c9223df884b4d56c400", - "integrity": "sha512-fS64f2anyRmFjuEVoqTbtgtV4Ay1dQ6kP078yM1RxnF0+9hNYk4iirrtII6FIoNoNgmhhIqzQaadEU6ZRpGoEw==", - "dev": true, - "from": "websocket@github:web3-js/WebSocket-Node#polyfill/globalThis", - "requires": { - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "nan": "^2.14.0", - "typedarray-to-buffer": "^3.1.5", - "yaeti": "^0.0.6" - } - } - } - }, - "@truffle/promise-tracker": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@truffle/promise-tracker/-/promise-tracker-0.1.0.tgz", - "integrity": "sha512-XH9gf7Vfgn4iPnERpJJPFSob85LXeKg8tkoUZku8JdAYUNIjVztLVJQwh54exsz7Npe6RPh/Hcj8Tiw65uooiA==", - "dev": true, - "optional": true - }, - "@truffle/provider": { - "version": "0.2.56", - "resolved": "https://registry.npmjs.org/@truffle/provider/-/provider-0.2.56.tgz", - "integrity": "sha512-9mz03psTeWkL45IrF3NUTiKO46HUi+9Lkco3rVjqzUQ+5rAhld0TwOljKbLvVKbDFtHl5LVuC+H4uQP8fpoXSg==", - "dev": true, - "optional": true, - "requires": { - "@truffle/error": "^0.1.0", - "@truffle/interface-adapter": "^0.5.18", - "debug": "^4.3.1", - "web3": "1.7.4" - }, - "dependencies": { - "@truffle/error": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.0.tgz", - "integrity": "sha512-RbUfp5VreNhsa2Q4YbBjz18rOQI909pG32bghl1hulO7IpvcqTS+C3Ge5cNbiWQ1WGzy1wIeKLW0tmQtHFB7qg==", - "dev": true, - "optional": true - }, - "@truffle/interface-adapter": { - "version": "0.5.18", - "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.18.tgz", - "integrity": "sha512-OPrz7bf+TDjZGruXzm6d08SpFNGERctf4O9uC6IJjNmjvKtdEYcLY3DTXOZT6I9PmrViCJ+dC5VlZD5IaamQnQ==", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^5.1.3", - "ethers": "^4.0.32", - "web3": "1.7.4" - } - }, - "@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true, - "optional": true - }, - "bignumber.js": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", - "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", - "dev": true, - "optional": true - }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true, - "optional": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "2.1.2" - } - }, - "ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "optional": true, - "requires": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - } - }, - "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true, - "optional": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true, - "optional": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "optional": true - }, - "oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", - "dev": true, - "optional": true, - "requires": { - "http-https": "^1.0.0" - } - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true, - "optional": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", - "dev": true, - "optional": true - }, - "scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true, - "optional": true - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true, - "optional": true - }, - "swarm-js": { - "version": "0.1.40", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", - "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", - "dev": true, - "optional": true, - "requires": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - }, - "dependencies": { - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "optional": true, - "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - } - } - } - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", - "dev": true, - "optional": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true, - "optional": true - }, - "web3": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.4.tgz", - "integrity": "sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A==", - "dev": true, - "optional": true, - "requires": { - "web3-bzz": "1.7.4", - "web3-core": "1.7.4", - "web3-eth": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-shh": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-bzz": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.4.tgz", - "integrity": "sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40" - } - }, - "web3-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz", - "integrity": "sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q==", - "dev": true, - "optional": true, - "requires": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-requestmanager": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-core-helpers": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz", - "integrity": "sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg==", - "dev": true, - "optional": true, - "requires": { - "web3-eth-iban": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-core-method": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz", - "integrity": "sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ==", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-core-promievent": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz", - "integrity": "sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA==", - "dev": true, - "optional": true, - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-core-requestmanager": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz", - "integrity": "sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA==", - "dev": true, - "optional": true, - "requires": { - "util": "^0.12.0", - "web3-core-helpers": "1.7.4", - "web3-providers-http": "1.7.4", - "web3-providers-ipc": "1.7.4", - "web3-providers-ws": "1.7.4" - } - }, - "web3-core-subscriptions": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz", - "integrity": "sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g==", - "dev": true, - "optional": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4" - } - }, - "web3-eth": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz", - "integrity": "sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug==", - "dev": true, - "optional": true, - "requires": { - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-accounts": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-eth-ens": "1.7.4", - "web3-eth-iban": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-abi": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz", - "integrity": "sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg==", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.4" - } - }, - "web3-eth-accounts": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz", - "integrity": "sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw==", - "dev": true, - "optional": true, - "requires": { - "@ethereumjs/common": "^2.5.0", - "@ethereumjs/tx": "^3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "optional": true - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - } - } - }, - "web3-eth-contract": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz", - "integrity": "sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ==", - "dev": true, - "optional": true, - "requires": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-ens": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz", - "integrity": "sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA==", - "dev": true, - "optional": true, - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-iban": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz", - "integrity": "sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w==", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.7.4" - } - }, - "web3-eth-personal": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz", - "integrity": "sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-net": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz", - "integrity": "sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg==", - "dev": true, - "optional": true, - "requires": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-providers-http": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz", - "integrity": "sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA==", - "dev": true, - "optional": true, - "requires": { - "web3-core-helpers": "1.7.4", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz", - "integrity": "sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw==", - "dev": true, - "optional": true, - "requires": { - "oboe": "2.1.5", - "web3-core-helpers": "1.7.4" - } - }, - "web3-providers-ws": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz", - "integrity": "sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ==", - "dev": true, - "optional": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4", - "websocket": "^1.0.32" - } - }, - "web3-shh": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz", - "integrity": "sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A==", - "dev": true, - "optional": true, - "requires": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-net": "1.7.4" - } - }, - "web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - } - } - } - }, - "@truffle/source-map-utils": { - "version": "1.3.88", - "resolved": "https://registry.npmjs.org/@truffle/source-map-utils/-/source-map-utils-1.3.88.tgz", - "integrity": "sha512-8PMvCR+l2TpyEO5CV5uA6w87w7Nqqhd5zM0ukwYhfrTAmBqNNPk+pWYAjaL7fVThDeaOkVy+aoOo0rUW5SzAfw==", - "dev": true, - "requires": { - "@truffle/code-utils": "^1.2.34", - "@truffle/codec": "^0.13.2", - "debug": "^4.3.1", - "json-pointer": "^0.6.1", - "node-interval-tree": "^1.3.3", - "web3-utils": "1.7.4" - }, - "dependencies": { - "@truffle/codec": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.13.2.tgz", - "integrity": "sha512-iViBnh6WV2BKaLboFC3xd9FGgC2Iybx4CHI+A5PPPqFkjnEycigdN8wnV2eqic9ptE1Ix7wsj9urZitnsnLhCA==", - "dev": true, - "requires": { - "@truffle/abi-utils": "^0.2.14", - "@truffle/compile-common": "^0.7.32", - "big.js": "^6.0.3", - "bn.js": "^5.1.3", - "cbor": "^5.1.0", - "debug": "^4.3.1", - "lodash": "^4.17.21", - "semver": "^7.3.4", - "utf8": "^3.0.0", - "web3-utils": "1.7.4" - } - }, - "@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "big.js": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.0.tgz", - "integrity": "sha512-paIKvJiAaOYdLt6MfnvxkDo64lTOV257XYJyX3oJnJQocIclUn+48k6ZerH/c5FxWE6DGJu1TKDYis7tqHg9kg==", - "dev": true - }, - "bignumber.js": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", - "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", - "dev": true - }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "cbor": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", - "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", - "dev": true, - "requires": { - "bignumber.js": "^9.0.1", - "nofilter": "^1.0.4" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@truffle/spinners": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@truffle/spinners/-/spinners-0.2.0.tgz", - "integrity": "sha512-rX0qA7GRDzN2ILClUIifMrVzF9EMR9b23CNasJkBgLBvqp1xKwdMbHG3IwUTYelGQtnGQmZ4UZQsBdDb6wf1Tw==", - "dev": true, - "optional": true, - "requires": { - "@trufflesuite/spinnies": "^0.1.0" - } - }, - "@trufflesuite/chromafi": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-2.1.2.tgz", - "integrity": "sha512-KcfjcH3B8+lHfSTfugFPBpMZmppLNCnM6/PP8ByrQLSACyjh9UOMUWHAW3FDHKEt1cOCzIFXrx2f4AFFrQFxSg==", - "dev": true, - "requires": { - "ansi-mark": "^1.0.0", - "ansi-regex": "^3.0.0", - "array-uniq": "^1.0.3", - "camelcase": "^4.1.0", - "chalk": "^2.3.2", - "cheerio": "^1.0.0-rc.2", - "detect-indent": "^5.0.0", - "he": "^1.1.1", - "highlight.js": "^9.12.0", - "husky": "^0.14.3", - "lodash.merge": "^4.6.2", - "min-indent": "^1.0.0", - "strip-ansi": "^4.0.0", - "strip-indent": "^2.0.0", - "super-split": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "@trufflesuite/spinnies": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@trufflesuite/spinnies/-/spinnies-0.1.0.tgz", - "integrity": "sha512-22rVi7rECyAg9vsopa9jR84xQ9kSbjRxCYI9SPbHx4jjfRQODDzmVZtXLobUuXEQZYLgP1pXBtgY5kReb72E2g==", - "dev": true, - "optional": true, - "requires": { - "chalk": "^4.1.2", - "cli-cursor": "^3.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "optional": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "optional": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@types/accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "requires": { - "@types/node": "*" - } - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "optional": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/cbor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/cbor/-/cbor-2.0.0.tgz", - "integrity": "sha1-xievwu4i8j8jN/7LNGKKT5fGr7s=", - "requires": { - "@types/node": "*" - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "@types/concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", - "dev": true, - "optional": true - }, - "@types/country-data": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@types/country-data/-/country-data-0.0.0.tgz", - "integrity": "sha512-lIxCk6G7AwmUagQ4gIQGxUBnvAq664prFD9nSAz6dgd1XmBXBtZABV/op+QsJsIyaP1GZsf/iXhYKHX3azSRCw==", - "dev": true - }, - "@types/debug": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", - "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==", - "dev": true - }, - "@types/elliptic": { - "version": "6.4.12", - "resolved": "https://registry.npmjs.org/@types/elliptic/-/elliptic-6.4.12.tgz", - "integrity": "sha512-gP1KsqoouLJGH6IJa28x7PXb3cRqh83X8HCLezd2dF+XcAIMKYv53KV+9Zn6QA561E120uOqZBQ+Jy/cl+fviw==", - "dev": true, - "requires": { - "@types/bn.js": "*" - } - }, - "@types/ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@types/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-qwQgQqXXTRv2h2AlJef+tMEszLFkCB9dWnrJYIdAwqjubERXEc/geB+S3apRw0yQyTVnsBf8r6BhlrE8vx+3WQ==", - "dev": true, - "requires": { - "@types/bn.js": "*", - "@types/node": "*" - } - }, - "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "dev": true, - "optional": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.29", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", - "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/form-data": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", - "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/google-libphonenumber": { - "version": "7.4.19", - "resolved": "https://registry.npmjs.org/@types/google-libphonenumber/-/google-libphonenumber-7.4.19.tgz", - "integrity": "sha512-Rm2VhKzu4UofafuTrNTG6fy+385x1PIomnTGGSzOXGbKLpXAhNlUG+7F6UdcIosM5JMvXcJBnwUW/u4qQmt0yg==", - "dev": true - }, - "@types/lodash": { - "version": "4.14.168", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", - "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==", - "dev": true - }, - "@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "dev": true, - "optional": true - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true, - "optional": true - }, - "@types/node": { - "version": "14.0.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.14.tgz", - "integrity": "sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ==" - }, - "@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/qs": { - "version": "6.9.3", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.3.tgz", - "integrity": "sha512-7s9EQWupR1fTc2pSMtXRQ9w9gLOcrJn+h7HOXw4evxyvVqMi4f+q7d2tnFe3ng3SNHjtK+0EzGMGFUQX4/AQRA==", - "dev": true - }, - "@types/randombytes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/randombytes/-/randombytes-2.0.0.tgz", - "integrity": "sha512-bz8PhAVlwN72vqefzxa14DKNT8jK/mV66CSjwdVQM/k3Th3EPKfUtdMniwZgMedQTFuywAsfjnZsg+pEnltaMA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true, - "optional": true - }, - "@types/secp256k1": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.1.tgz", - "integrity": "sha512-+ZjSA8ELlOp8SlKi0YLB2tz9d5iPNEmOBd+8Rz21wTMdaXQIa9b6TEnD6l5qKOCypE7FSyPyck12qZJxSDNoog==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "dev": true, - "optional": true, - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/utf8": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@types/utf8/-/utf8-2.1.6.tgz", - "integrity": "sha512-pRs2gYF5yoKYrgSaira0DJqVg2tFuF+Qjp838xS7K+mJyY2jJzjsrl6y17GbIa4uMRogMbxs+ghNCvKg6XyNrA==", - "dev": true - }, - "@umpirsky/country-list": { - "version": "git+ssh://git@github.com/umpirsky/country-list.git#05fda51cd97b3294e8175ffed06104c44b3c71d7", - "integrity": "sha512-iJcpUOtwOC1xLIp7yyK3ZLYjT/zCrf0BT+e5BGTUYkIF4FpC+W+8WVwm2nJNXiWqbiOLI7z3jtvCR3qJYnU5kA==", - "dev": true, - "from": "@umpirsky/country-list@https://github.com/umpirsky/country-list#05fda51" - }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "optional": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "abstract-leveldown": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", - "integrity": "sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==", - "dev": true, - "optional": true, - "requires": { - "buffer": "^6.0.3", - "catering": "^2.0.0", - "is-buffer": "^2.0.5", - "level-concat-iterator": "^3.0.0", - "level-supports": "^2.0.1", - "queue-microtask": "^1.2.3" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "optional": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - } - } - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", - "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", - "dev": true - }, - "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", - "dev": true - }, - "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" - }, - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "optional": true, - "requires": { - "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "optional": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "optional": true - } - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - } - } - }, - "ansi-mark": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ansi-mark/-/ansi-mark-1.0.4.tgz", - "integrity": "sha1-HNS6jVfxXxCdaq9uycqXhsik7mw=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0", - "array-uniq": "^1.0.3", - "chalk": "^2.3.2", - "strip-ansi": "^4.0.0", - "super-split": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - } - } - }, - "apollo-datasource": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-3.3.2.tgz", - "integrity": "sha512-L5TiS8E2Hn/Yz7SSnWIVbZw0ZfEIXZCa5VUiVxD9P53JvSrf4aStvsFDlGWPvpIdCR+aly2CfoB79B9/JjKFqg==", - "dev": true, - "optional": true, - "requires": { - "@apollo/utils.keyvaluecache": "^1.0.1", - "apollo-server-env": "^4.2.1" - } - }, - "apollo-reporting-protobuf": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.3.3.tgz", - "integrity": "sha512-L3+DdClhLMaRZWVmMbBcwl4Ic77CnEBPXLW53F7hkYhkaZD88ivbCVB1w/x5gunO6ZHrdzhjq0FHmTsBvPo7aQ==", - "dev": true, - "optional": true, - "requires": { - "@apollo/protobufjs": "1.2.6" - } - }, - "apollo-server": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/apollo-server/-/apollo-server-3.9.0.tgz", - "integrity": "sha512-g80gXDuK8fl2W0fQF/hEyeoO9AU+sO2gBzeJAYUyGLotYc+oL/Y3mTRk5GB8C7cXUXCg5uvWbUj8va0E5UZE7w==", - "dev": true, - "optional": true, - "requires": { - "@types/express": "4.17.13", - "apollo-server-core": "^3.9.0", - "apollo-server-express": "^3.9.0", - "express": "^4.17.1" - } - }, - "apollo-server-core": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-3.11.1.tgz", - "integrity": "sha512-t/eCKrRFK1lYZlc5pHD99iG7Np7CEm3SmbDiONA7fckR3EaB/pdsEdIkIwQ5QBBpT5JLp/nwvrZRVwhaWmaRvw==", - "dev": true, - "optional": true, - "requires": { - "@apollo/utils.keyvaluecache": "^1.0.1", - "@apollo/utils.logger": "^1.0.0", - "@apollo/utils.usagereporting": "^1.0.0", - "@apollographql/apollo-tools": "^0.5.3", - "@apollographql/graphql-playground-html": "1.6.29", - "@graphql-tools/mock": "^8.1.2", - "@graphql-tools/schema": "^8.0.0", - "@josephg/resolvable": "^1.0.0", - "apollo-datasource": "^3.3.2", - "apollo-reporting-protobuf": "^3.3.3", - "apollo-server-env": "^4.2.1", - "apollo-server-errors": "^3.3.1", - "apollo-server-plugin-base": "^3.7.1", - "apollo-server-types": "^3.7.1", - "async-retry": "^1.2.1", - "fast-json-stable-stringify": "^2.1.0", - "graphql-tag": "^2.11.0", - "loglevel": "^1.6.8", - "lru-cache": "^6.0.0", - "node-abort-controller": "^3.0.1", - "sha.js": "^2.4.11", - "uuid": "^9.0.0", - "whatwg-mimetype": "^3.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "optional": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true, - "optional": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "optional": true - } - } - }, - "apollo-server-env": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-4.2.1.tgz", - "integrity": "sha512-vm/7c7ld+zFMxibzqZ7SSa5tBENc4B0uye9LTfjJwGoQFY5xsUPH5FpO5j0bMUDZ8YYNbrF9SNtzc5Cngcr90g==", - "dev": true, - "optional": true, - "requires": { - "node-fetch": "^2.6.7" - } - }, - "apollo-server-errors": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-3.3.1.tgz", - "integrity": "sha512-xnZJ5QWs6FixHICXHxUfm+ZWqqxrNuPlQ+kj5m6RtEgIpekOPssH/SD9gf2B4HuWV0QozorrygwZnux8POvyPA==", - "dev": true, - "optional": true - }, - "apollo-server-express": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-3.9.0.tgz", - "integrity": "sha512-scSeHy9iB7W3OiF3uLQEzad9Jm9tEfDF8ACsJb2P+xX69uqg6zizsrQvj3qRhazCO7FKMcMu9zQFR0hy7zKbUA==", - "dev": true, - "optional": true, - "requires": { - "@types/accepts": "^1.3.5", - "@types/body-parser": "1.19.2", - "@types/cors": "2.8.12", - "@types/express": "4.17.13", - "@types/express-serve-static-core": "4.17.29", - "accepts": "^1.3.5", - "apollo-server-core": "^3.9.0", - "apollo-server-types": "^3.6.1", - "body-parser": "^1.19.0", - "cors": "^2.8.5", - "parseurl": "^1.3.3" - } - }, - "apollo-server-plugin-base": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-3.7.1.tgz", - "integrity": "sha512-g3vJStmQtQvjGI289UkLMfThmOEOddpVgHLHT2bNj0sCD/bbisj4xKbBHETqaURokteqSWyyd4RDTUe0wAUDNQ==", - "dev": true, - "optional": true, - "requires": { - "apollo-server-types": "^3.7.1" - } - }, - "apollo-server-types": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-3.7.1.tgz", - "integrity": "sha512-aE9RDVplmkaOj/OduNmGa+0a1B5RIWI0o3zC1zLvBTVWMKTpo0ifVf11TyMkLCY+T7cnZqVqwyShziOyC3FyUw==", - "dev": true, - "optional": true, - "requires": { - "@apollo/utils.keyvaluecache": "^1.0.1", - "@apollo/utils.logger": "^1.0.0", - "apollo-reporting-protobuf": "^3.3.3", - "apollo-server-env": "^4.2.1" - } - }, - "app-module-path": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", - "integrity": "sha1-ZBqlXft9am8KgUHEucCqULbCTdU=", - "dev": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "argsarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/argsarray/-/argsarray-0.0.1.tgz", - "integrity": "sha512-u96dg2GcAKtpTrBdDoFIM7PjcBA+6rSP0OR94MOReNRyUECL6MtQt5XXmRr4qrftYaef9+l5hcpO5te7sML1Cg==", - "dev": true, - "optional": true - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-eventemitter": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", - "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "dev": true, - "requires": { - "async": "^2.4.0" - } - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "async-mutex": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.2.6.tgz", - "integrity": "sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==", - "dev": true, - "requires": { - "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - } - } - }, - "async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "dev": true, - "optional": true, - "requires": { - "retry": "0.13.1" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "atomically": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", - "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", - "dev": true, - "optional": true - }, - "available-typed-arrays": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", - "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", - "dev": true, - "requires": { - "array-filter": "^1.0.0" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" - }, - "axios": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", - "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", - "requires": { - "follow-redirects": "1.5.10", - "is-buffer": "^2.0.2" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-helper-bindify-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", - "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-explode-class": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", - "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", - "dev": true, - "requires": { - "babel-helper-bindify-decorators": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", - "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-async-generators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", - "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", - "dev": true - }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", - "dev": true - }, - "babel-plugin-syntax-decorators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", - "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", - "dev": true - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "babel-plugin-transform-async-generator-functions": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-generators": "^6.5.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-plugin-syntax-class-properties": "^6.8.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", - "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "dev": true, - "requires": { - "babel-helper-explode-class": "^6.24.1", - "babel-plugin-syntax-decorators": "^6.13.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "requires": { - "regenerator-transform": "^0.10.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - } - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.24.1", - "babel-plugin-transform-es2015-classes": "^6.24.1", - "babel-plugin-transform-es2015-computed-properties": "^6.24.1", - "babel-plugin-transform-es2015-destructuring": "^6.22.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", - "babel-plugin-transform-es2015-for-of": "^6.22.0", - "babel-plugin-transform-es2015-function-name": "^6.24.1", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-umd": "^6.24.1", - "babel-plugin-transform-es2015-object-super": "^6.24.1", - "babel-plugin-transform-es2015-parameters": "^6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", - "babel-plugin-transform-regenerator": "^6.24.1" - } - }, - "babel-preset-stage-2": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", - "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "dev": true, - "requires": { - "babel-plugin-syntax-dynamic-import": "^6.18.0", - "babel-plugin-transform-class-properties": "^6.24.1", - "babel-plugin-transform-decorators": "^6.24.1", - "babel-preset-stage-3": "^6.24.1" - } - }, - "babel-preset-stage-3": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", - "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "dev": true, - "requires": { - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-generator-functions": "^6.24.1", - "babel-plugin-transform-async-to-generator": "^6.24.1", - "babel-plugin-transform-exponentiation-operator": "^6.24.1", - "babel-plugin-transform-object-rest-spread": "^6.22.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", - "dev": true, - "requires": { - "precond": "0.2" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "base-x": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", - "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big-integer": { - "version": "1.6.48", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", - "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "bigi": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/bigi/-/bigi-1.4.2.tgz", - "integrity": "sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU=", - "dev": true - }, - "bignumber.js": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", - "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bip32": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.5.tgz", - "integrity": "sha512-zVY4VvJV+b2fS0/dcap/5XLlpqtgwyN8oRkuGgAS1uLOeEp0Yo6Tw2yUTozTtlrMJO3G8n4g/KX/XGFHW6Pq3g==", - "dev": true, - "requires": { - "@types/node": "10.12.18", - "bs58check": "^2.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "tiny-secp256k1": "^1.1.3", - "typeforce": "^1.11.5", - "wif": "^2.0.6" - }, - "dependencies": { - "@types/node": { - "version": "10.12.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", - "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", - "dev": true - } - } - }, - "bip39": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.2.tgz", - "integrity": "sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ==", - "dev": true, - "requires": { - "@types/node": "11.11.6", - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" - }, - "dependencies": { - "@types/node": { - "version": "11.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", - "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==", - "dev": true - } - } - }, - "bip66": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "blakejs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz", - "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=", - "dev": true - }, - "bls12377js": { - "version": "git+ssh://git@github.com/celo-org/bls12377js.git#cb38a4cfb643c778619d79b20ca3e5283a2122a6", - "integrity": "sha512-genS+AxHQKkrKA2xa1C1HCzSlZM8S/ZQEnjqET9u78/fpbHrNbXWvFYypYA3h7ukTD+WpF0hh+S9yxH6mhx4iA==", - "dev": true, - "from": "bls12377js@https://github.com/celo-org/bls12377js#cb38a4cfb643c778619d79b20ca3e5283a2122a6", - "requires": { - "@stablelib/blake2xs": "0.10.4", - "@types/node": "^12.11.7", - "big-integer": "^1.6.44", - "chai": "^4.2.0", - "mocha": "^6.2.2", - "ts-node": "^8.4.1", - "typescript": "^3.6.4" - }, - "dependencies": { - "@types/node": { - "version": "12.19.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.16.tgz", - "integrity": "sha512-7xHmXm/QJ7cbK2laF+YYD7gb5MggHIIQwqyjin3bpEGiSuvScMQ5JZZXPvRipi1MwckTQbJZROMns/JxdnIL1Q==", - "dev": true - }, - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mocha": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", - "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.4", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "bn-chai": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bn-chai/-/bn-chai-1.0.1.tgz", - "integrity": "sha512-7rJXt21DwYiLLpvzLaACixBBoUGkRV1iuFD3wElEhw8Ji9IiY/QsJRtvW+c7ChRgEOyLQkGaSGFUUqBKm21SNA==", - "dev": true - }, - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - } - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", - "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.2", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "browserslist": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.1.tgz", - "integrity": "sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001359", - "electron-to-chromium": "^1.4.172", - "node-releases": "^2.0.5", - "update-browserslist-db": "^1.0.4" - } - }, - "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", - "dev": true, - "requires": { - "base-x": "^3.0.2" - } - }, - "bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dev": true, - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "btoa": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", - "dev": true - }, - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "buffer-reverse": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-reverse/-/buffer-reverse-1.0.1.tgz", - "integrity": "sha1-SSg8jvpvkBvAH6MwTQYCeXGuL2A=", - "dev": true - }, - "buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "bufferutil": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz", - "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==", - "dev": true, - "requires": { - "node-gyp-build": "^4.2.0" - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.1.1", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001363", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001363.tgz", - "integrity": "sha512-HpQhpzTGGPVMnCjIomjt+jvyUu8vNFo3TaDiZ/RcoTrlOq/5+tC8zHdsbgFB6MxmaY+jCpsH09aD80Bb4Ow3Sg==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "dev": true, - "optional": true - }, - "cbor": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-4.3.0.tgz", - "integrity": "sha512-CvzaxQlaJVa88sdtTWvLJ++MbdtPHtZOBBNjm7h3YKUHILMs9nQyD4AC6hvFZy7GBVB3I6bRibJcxeHydyT2IQ==", - "requires": { - "bignumber.js": "^9.0.0", - "commander": "^3.0.0", - "json-text-sequence": "^0.1", - "nofilter": "^1.0.3" - }, - "dependencies": { - "bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" - } - } - }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.2", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" - } - }, - "chai-bn": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/chai-bn/-/chai-bn-0.2.1.tgz", - "integrity": "sha512-01jt2gSXAw7UYFPT5K8d7HYjdXj2vyeIuE+0T/34FWzlNcVbs1JkPxRu7rYMfQnJhrHT8Nr6qjSf5ZwwLU2EYg==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "change-case": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", - "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", - "dev": true, - "requires": { - "camel-case": "^3.0.0", - "constant-case": "^2.0.0", - "dot-case": "^2.1.0", - "header-case": "^1.0.0", - "is-lower-case": "^1.1.0", - "is-upper-case": "^1.1.0", - "lower-case": "^1.1.1", - "lower-case-first": "^1.0.0", - "no-case": "^2.3.2", - "param-case": "^2.1.0", - "pascal-case": "^2.0.0", - "path-case": "^2.1.0", - "sentence-case": "^2.1.0", - "snake-case": "^2.1.0", - "swap-case": "^1.1.0", - "title-case": "^2.1.0", - "upper-case": "^1.1.1", - "upper-case-first": "^1.1.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "checkpoint-store": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", - "integrity": "sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg==", - "dev": true, - "requires": { - "functional-red-black-tree": "^1.0.1" - } - }, - "cheerio": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", - "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.1", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - } - }, - "chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - } - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - }, - "cids": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", - "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "^1.0.0", - "multihashes": "~0.4.15" - }, - "dependencies": { - "multicodec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", - "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", - "dev": true, - "requires": { - "buffer": "^5.6.0", - "varint": "^5.0.0" - } - } - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "circular": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/circular/-/circular-1.0.5.tgz", - "integrity": "sha1-fad6+Yu96c5LWzWM1Va13e0tMUk=", - "dev": true - }, - "class-is": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-logger": { - "version": "0.5.40", - "resolved": "https://registry.npmjs.org/cli-logger/-/cli-logger-0.5.40.tgz", - "integrity": "sha1-CX8OEbByx8aYomxH9YiinCC0iws=", - "dev": true, - "requires": { - "circular": "^1.0.5", - "cli-util": "~1.1.27" - } - }, - "cli-regexp": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/cli-regexp/-/cli-regexp-0.1.2.tgz", - "integrity": "sha1-a82TsJ+y7RAl0woRVdWZeVSlNRI=", - "dev": true - }, - "cli-table3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", - "dev": true, - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "cli-util": { - "version": "1.1.27", - "resolved": "https://registry.npmjs.org/cli-util/-/cli-util-1.1.27.tgz", - "integrity": "sha1-QtaeNqBAoyH8nPhRwVE8rcUJMFQ=", - "dev": true, - "requires": { - "cli-regexp": "~0.1.0" - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", - "dev": true, - "optional": true - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true - }, - "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "conf": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/conf/-/conf-10.1.2.tgz", - "integrity": "sha512-o9Fv1Mv+6A0JpoayQ8JleNp3hhkbOJP/Re/Q+QqxMPHPkABVsRjQGWZn9A5GcqLiTNC6d89p2PB5ZhHVDSMwyg==", - "dev": true, - "optional": true, - "requires": { - "ajv": "^8.6.3", - "ajv-formats": "^2.1.1", - "atomically": "^1.7.0", - "debounce-fn": "^4.0.0", - "dot-prop": "^6.0.1", - "env-paths": "^2.2.1", - "json-schema-typed": "^7.0.3", - "onetime": "^5.1.2", - "pkg-up": "^3.1.0", - "semver": "^7.3.5" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "optional": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "optional": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "optional": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "optional": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "optional": true - } - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true, - "optional": true - }, - "constant-case": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", - "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", - "dev": true, - "requires": { - "snake-case": "^2.1.0", - "upper-case": "^1.1.1" - } - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "content-hash": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", - "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", - "dev": true, - "requires": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true - }, - "core-js-compat": { - "version": "3.23.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.3.tgz", - "integrity": "sha512-WSzUs2h2vvmKsacLHNTdpyOC9k43AEhcGoFlVgCY4L7aw98oSBKtPL6vD0/TqZjRWRQYdDSLkzZIni4Crbbiqw==", - "dev": true, - "requires": { - "browserslist": "^4.21.0", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "country-data": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/country-data/-/country-data-0.0.31.tgz", - "integrity": "sha1-gJZrjh0Uf6bWpYnTKTP4eTd0lW0=", - "dev": true, - "requires": { - "currency-symbol-map": "~2", - "underscore": ">1.4.4" - } - }, - "crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-fetch": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.6.tgz", - "integrity": "sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA==", - "dev": true, - "requires": { - "node-fetch": "^2.6.7", - "whatwg-fetch": "^2.0.4" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", - "dev": true - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "crypto-js": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", - "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==", - "dev": true - }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true - }, - "cssfilter": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", - "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==", - "dev": true, - "optional": true - }, - "currency-symbol-map": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/currency-symbol-map/-/currency-symbol-map-2.2.0.tgz", - "integrity": "sha1-KzwYcv8aws5ZXYJz5Y4f/wJyrqI=", - "dev": true - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "dataloader": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.1.0.tgz", - "integrity": "sha512-qTcEYLen3r7ojZNgVUaRggOI+KM7jrKxXeSHhogh/TWxYMeONEMqY+hmkobiYQozsGIyg9OYVzO4ZIfoB4I0pQ==", - "dev": true, - "optional": true - }, - "debounce-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", - "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", - "dev": true, - "optional": true, - "requires": { - "mimic-fn": "^3.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "decompress": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", - "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", - "requires": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "requires": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - } - }, - "decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "requires": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" - }, - "dependencies": { - "file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" - } - } - }, - "decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "requires": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" - } - }, - "decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", - "requires": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" - }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" - }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - } - } - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, - "deferred-leveldown": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", - "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", - "dev": true, - "optional": true, - "requires": { - "abstract-leveldown": "~6.2.1", - "inherits": "^2.0.3" - }, - "dependencies": { - "abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "dev": true, - "optional": true, - "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - } - }, - "level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", - "dev": true, - "optional": true - }, - "level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "optional": true, - "requires": { - "xtend": "^4.0.2" - } - } - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "delay": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", - "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true, - "optional": true - }, - "delimit-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", - "integrity": "sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", - "dev": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "optional": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-to-object": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-to-object/-/dir-to-object-2.0.0.tgz", - "integrity": "sha512-sXs0JKIhymON7T1UZuO2Ud6VTNAx/VTBXIl4+3mjb2RgfOpt+hectX0x04YqPOPdkeOAKoJuKqwqnXXURNPNEA==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", - "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "optional": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "double-ended-queue": { - "version": "2.1.0-0", - "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", - "integrity": "sha512-+BNfZ+deCo8hMNpDqDnvT+c0XpJ5cUa6mqYq89bho2Ifze4URTqRkcwR399hWoTrTkbZ/XJYDgP6rc7pRgffEQ==", - "dev": true, - "optional": true - }, - "drbg.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", - "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", - "requires": { - "browserify-aes": "^1.0.6", - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.4.179", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.179.tgz", - "integrity": "sha512-1XeTb/U/8Xgh2YgPOqhakLYsvCcU4U7jUjTMbEnhIJoIWd/Qt3yC8y0cbG+fHzn4zUNF99Ey1xiPf20bwgLO3Q==", - "dev": true - }, - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "emittery": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.4.1.tgz", - "integrity": "sha512-r4eRSeStEGf6M5SKdrQhhLK5bOwOBxQhIE3YSTnZE3GpKiLfnnhE+tPtrJE79+eDJgm39BM6LSoI8SCx4HbwlQ==", - "dev": true, - "optional": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "encoding-down": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", - "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", - "dev": true, - "optional": true, - "requires": { - "abstract-leveldown": "^6.2.1", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", - "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", - "dev": true, - "optional": true, - "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - } - }, - "level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", - "dev": true, - "optional": true - }, - "level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "optional": true, - "requires": { - "xtend": "^4.0.2" - } - } - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "end-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/end-stream/-/end-stream-0.1.0.tgz", - "integrity": "sha512-Brl10T8kYnc75IepKizW6Y9liyW8ikz1B7n/xoHrJxoVSSjoqPn30sb7XVFfQERK4QfUMYRGs9dhWwtt2eu6uA==", - "dev": true, - "optional": true, - "requires": { - "write-stream": "~0.4.3" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "optional": true - }, - "eol": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", - "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==", - "dev": true - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-config-google": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.13.0.tgz", - "integrity": "sha512-ELgMdOIpn0CFdsQS+FuxO+Ttu4p+aLaXHv9wA9yVnzqlUGV7oN/eRRnJekk7TCur6Cu2FXX0fqfIXRBaM14lpQ==", - "dev": true - }, - "eslint-config-keep": { - "version": "git+ssh://git@github.com/keep-network/eslint-config-keep.git#fed0f9a92d4bb4abbf738266d7521b56a08987ee", - "integrity": "sha512-Cz7kreFZ5CNsg1CvLKO+3a6q/q+/tb0QcXIluhe8iT1VqJ8Haif0GHW1pX/xYJ5VcfBxTysvXJIH2wwAjn9sBw==", - "dev": true, - "from": "eslint-config-keep@github:keep-network/eslint-config-keep#0.3.0", - "requires": { - "eslint-config-google": "^0.13.0", - "eslint-config-prettier": "^6.10.0", - "eslint-plugin-no-only-tests": "^2.3.1", - "eslint-plugin-prettier": "^3.1.2" - } - }, - "eslint-config-prettier": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", - "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", - "dev": true, - "requires": { - "get-stdin": "^6.0.0" - } - }, - "eslint-plugin-no-only-tests": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.6.0.tgz", - "integrity": "sha512-T9SmE/g6UV1uZo1oHAqOvL86XWl7Pl2EpRpnLI8g/bkJu+h7XBCB+1LnubRZ2CUQXj805vh4/CYZdnqtVaEo2Q==", - "dev": true - }, - "eslint-plugin-prettier": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", - "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", - "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "eth-block-tracker": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz", - "integrity": "sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw==", - "dev": true, - "requires": { - "@babel/plugin-transform-runtime": "^7.5.5", - "@babel/runtime": "^7.5.5", - "eth-query": "^2.1.0", - "json-rpc-random-id": "^1.0.1", - "pify": "^3.0.0", - "safe-event-emitter": "^1.0.1" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - } - } - }, - "eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=", - "requires": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" - } - }, - "eth-gas-reporter": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.17.tgz", - "integrity": "sha512-MsrUqeXTAFU9QEdAIdaVu+QeU1XwFsKvPDEC68iheppVR5xUP11h4SyPhSRZiGfOzXr1CfTtPM/B6wPGtt7/LA==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.0.0-beta.146", - "@solidity-parser/parser": "^0.5.2", - "cli-table3": "^0.5.0", - "colors": "^1.1.2", - "ethereumjs-util": "6.2.0", - "ethers": "^4.0.40", - "fs-readdir-recursive": "^1.1.0", - "lodash": "^4.17.14", - "markdown-table": "^1.1.3", - "mocha": "^7.1.1", - "req-cwd": "^2.0.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "sha1": "^1.1.1", - "sync-request": "^6.0.0" - }, - "dependencies": { - "@solidity-parser/parser": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.5.2.tgz", - "integrity": "sha512-uRyvnvVYmgNmTBpWDbBsH/0kPESQhQpEc4KsvMRLVzFJ1o1s0uIv0Y6Y9IB5vI1Dwz2CbS4X/y4Wyw/75cTFnQ==", - "dev": true - } - } - }, - "eth-json-rpc-filters": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz", - "integrity": "sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw==", - "dev": true, - "requires": { - "@metamask/safe-event-emitter": "^2.0.0", - "async-mutex": "^0.2.6", - "eth-json-rpc-middleware": "^6.0.0", - "eth-query": "^2.1.2", - "json-rpc-engine": "^6.1.0", - "pify": "^5.0.0" - }, - "dependencies": { - "pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true - } - } - }, - "eth-json-rpc-infura": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz", - "integrity": "sha512-THzLye3PHUSGn1EXMhg6WTLW9uim7LQZKeKaeYsS9+wOBcamRiCQVGHa6D2/4P0oS0vSaxsBnU/J6qvn0MPdow==", - "dev": true, - "requires": { - "eth-json-rpc-middleware": "^6.0.0", - "eth-rpc-errors": "^3.0.0", - "json-rpc-engine": "^5.3.0", - "node-fetch": "^2.6.0" - }, - "dependencies": { - "json-rpc-engine": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz", - "integrity": "sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g==", - "dev": true, - "requires": { - "eth-rpc-errors": "^3.0.0", - "safe-event-emitter": "^1.0.1" - } - } - } - }, - "eth-json-rpc-middleware": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz", - "integrity": "sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ==", - "dev": true, - "requires": { - "btoa": "^1.2.1", - "clone": "^2.1.1", - "eth-query": "^2.1.2", - "eth-rpc-errors": "^3.0.0", - "eth-sig-util": "^1.4.2", - "ethereumjs-util": "^5.1.2", - "json-rpc-engine": "^5.3.0", - "json-stable-stringify": "^1.0.1", - "node-fetch": "^2.6.1", - "pify": "^3.0.0", - "safe-event-emitter": "^1.0.1" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "json-rpc-engine": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz", - "integrity": "sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g==", - "dev": true, - "requires": { - "eth-rpc-errors": "^3.0.0", - "safe-event-emitter": "^1.0.1" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - } - } - }, - "eth-lib": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", - "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" - } - }, - "eth-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", - "integrity": "sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==", - "dev": true, - "requires": { - "json-rpc-random-id": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "eth-rpc-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz", - "integrity": "sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg==", - "dev": true, - "requires": { - "fast-safe-stringify": "^2.0.6" - } - }, - "eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha512-iNZ576iTOGcfllftB73cPB5AN+XUQAT/T8xzsILsghXC1o8gJUqe3RHlcDqagu+biFpYQ61KQrZZJza8eRSYqw==", - "dev": true, - "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "ethereumjs-util": "^5.1.1" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "ethereum-bloom-filters": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.7.tgz", - "integrity": "sha512-cDcJJSJ9GMAcURiAWO3DxIEhTL/uWqlQnvgKpuYQzYPrt/izuGU+1ntQmHt0IRq6ADoSYHFnB+aCEFIldjhkMQ==", - "requires": { - "js-sha3": "^0.8.0" - }, - "dependencies": { - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - } - } - }, - "ethereum-common": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", - "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==", - "dev": true - }, - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - }, - "dependencies": { - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "keccak": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", - "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", - "dev": true, - "requires": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true - }, - "secp256k1": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", - "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", - "dev": true, - "requires": { - "elliptic": "^6.5.2", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - } - } - }, - "ethereum-ens": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/ethereum-ens/-/ethereum-ens-0.8.0.tgz", - "integrity": "sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==", - "dev": true, - "requires": { - "bluebird": "^3.4.7", - "eth-ens-namehash": "^2.0.0", - "js-sha3": "^0.5.7", - "pako": "^1.0.4", - "underscore": "^1.8.3", - "web3": "^1.0.0-beta.34" - } - }, - "ethereum-protocol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ethereum-protocol/-/ethereum-protocol-1.0.1.tgz", - "integrity": "sha512-3KLX1mHuEsBW0dKG+c6EOJS1NBNqdCICvZW9sInmZTt5aY0oxmHVggYRE0lJu1tcnMD1K+AKHdLi6U43Awm1Vg==", - "dev": true - }, - "ethereumjs-abi": { - "version": "git+ssh://git@github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0", - "dev": true, - "from": "ethereumjs-abi@^0.6.5", - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-account": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", - "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", - "dev": true, - "requires": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "ethereumjs-block": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", - "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereumjs-tx": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", - "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", - "dev": true, - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - }, - "dependencies": { - "ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ==", - "dev": true - } - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "ethereumjs-common": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.1.tgz", - "integrity": "sha512-aVUPRLgmXORGXXEVkFYgPhr9TGtpBY2tGhZ9Uh0A3lIUzUDr1x6kQx33SbjPUkLkX3eniPQnIL/2psjkjrOfcQ==" - }, - "ethereumjs-tx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", - "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-util": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz", - "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==", - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^2.0.0", - "rlp": "^2.2.3", - "secp256k1": "^3.0.1" - } - }, - "ethereumjs-vm": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", - "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", - "dev": true, - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-block": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", - "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - } - } - }, - "ethereumjs-wallet": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz", - "integrity": "sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA==", - "dev": true, - "requires": { - "aes-js": "^3.1.1", - "bs58check": "^2.1.2", - "ethereum-cryptography": "^0.1.3", - "ethereumjs-util": "^6.0.0", - "randombytes": "^2.0.6", - "safe-buffer": "^5.1.2", - "scryptsy": "^1.2.1", - "utf8": "^3.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "aes-js": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==", - "dev": true - }, - "scryptsy": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", - "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", - "dev": true, - "requires": { - "pbkdf2": "^3.0.3" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "ethers": { - "version": "4.0.47", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.47.tgz", - "integrity": "sha512-hssRYhngV4hiDNeZmVU/k5/E8xmLG8UpcNUzg6mb7lqhgpFPH/t7nuv20RjRrEf0gblzvi2XwR5Te+V3ZFc9pQ==", - "requires": { - "aes-js": "3.0.0", - "bn.js": "^4.4.0", - "elliptic": "6.5.2", - "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" - } - }, - "ethjs-abi": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.2.1.tgz", - "integrity": "sha1-4KepOn6BFjqUR3utVu3lJKtt5TM=", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "js-sha3": "0.5.5", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true - }, - "js-sha3": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", - "integrity": "sha1-uvDA6MVK1ZA0R9+Wreekobynmko=", - "dev": true - } - } - }, - "ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", - "requires": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, - "optional": true - }, - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - } - } - }, - "exit-hook": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", - "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "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.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fake-merkle-patricia-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz", - "integrity": "sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA==", - "dev": true, - "requires": { - "checkpoint-store": "^1.1.0" - } - }, - "faker": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", - "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==", - "dev": true - }, - "fast-check": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-2.25.0.tgz", - "integrity": "sha512-wRUT2KD2lAmT75WNIJIHECawoUUMHM0I5jrlLXGtGeqmPL8jl/EldUDjY1VCp6fDY8yflyfUeIOsOBrIbIiArg==", - "dev": true, - "requires": { - "pure-rand": "^5.0.1" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "requires": { - "pend": "~1.2.0" - } - }, - "fetch-cookie": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-0.11.0.tgz", - "integrity": "sha512-BQm7iZLFhMWFy5CZ/162sAGjBfdNWb7a8LEqqnzsHFhxT/X/SVj/z2t2nu3aJvjlbQkrAlTUApplPRjWyH4mhA==", - "dev": true, - "optional": true, - "requires": { - "tough-cookie": "^2.3.3 || ^3.0.1 || ^4.0.0" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "requires": { - "debug": "=3.1.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fp-ts": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.1.1.tgz", - "integrity": "sha512-YcWhMdDCFCja0MmaDroTgNu+NWWrrnUEn92nvDgrtVy9Z71YFnhNVIghoHPt8gs82ijoMzFGeWKvArbyICiJgw==", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "requires": { - "minipass": "^2.6.0" - } - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "ganache": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/ganache/-/ganache-7.2.0.tgz", - "integrity": "sha512-KsKysVeVN6CALALOkIPSIxNZbl5s2/DE6Z0lFpj05gH1XsvYMit3djP4LxpxdjUfSSyb9gIPEOzqMw7v56ihJg==", - "dev": true, - "requires": { - "@trufflesuite/bigint-buffer": "1.1.9", - "bufferutil": "4.0.5", - "emittery": "0.10.0", - "keccak": "3.0.1", - "leveldown": "6.1.0", - "secp256k1": "4.0.2", - "utf-8-validate": "5.0.7" - }, - "dependencies": { - "@trufflesuite/bigint-buffer": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.9.tgz", - "integrity": "sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==", - "dev": true, - "requires": { - "node-gyp-build": "4.3.0" - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "bufferutil": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", - "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", - "dev": true, - "optional": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "catering": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.0.tgz", - "integrity": "sha512-M5imwzQn6y+ODBfgi+cfgZv2hIUI6oYU/0f35Mdb1ujGeqeoI5tOnl9Q13DTH7LW+7er+NYq8stNOKZD/Z3U/A==", - "dev": true, - "requires": { - "queue-tick": "^1.0.0" - } - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "emittery": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", - "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", - "dev": true - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true - }, - "keccak": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", - "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", - "dev": true, - "requires": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "leveldown": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-6.1.0.tgz", - "integrity": "sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w==", - "dev": true, - "requires": { - "abstract-leveldown": "^7.2.0", - "napi-macros": "~2.0.0", - "node-gyp-build": "^4.3.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", - "integrity": "sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==", - "dev": true, - "requires": { - "buffer": "^6.0.3", - "catering": "^2.0.0", - "is-buffer": "^2.0.5", - "level-concat-iterator": "^3.0.0", - "level-supports": "^2.0.1", - "queue-microtask": "^1.2.3" - } - }, - "level-concat-iterator": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz", - "integrity": "sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==", - "dev": true, - "requires": { - "catering": "^2.1.0" - } - }, - "level-supports": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz", - "integrity": "sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==", - "dev": true - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "napi-macros": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "dev": true - }, - "node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true - }, - "node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "queue-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.0.tgz", - "integrity": "sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ==", - "dev": true - }, - "secp256k1": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", - "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", - "dev": true, - "requires": { - "elliptic": "^6.5.2", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "utf-8-validate": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz", - "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==", - "dev": true, - "optional": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - } - } - }, - "ganache-core": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/ganache-core/-/ganache-core-2.13.2.tgz", - "integrity": "sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw==", - "dev": true, - "requires": { - "abstract-leveldown": "3.0.0", - "async": "2.6.2", - "bip39": "2.5.0", - "cachedown": "1.0.0", - "clone": "2.1.2", - "debug": "3.2.6", - "encoding-down": "5.0.4", - "eth-sig-util": "3.0.0", - "ethereumjs-abi": "0.6.8", - "ethereumjs-account": "3.0.0", - "ethereumjs-block": "2.2.2", - "ethereumjs-common": "1.5.0", - "ethereumjs-tx": "2.1.2", - "ethereumjs-util": "6.2.1", - "ethereumjs-vm": "4.2.0", - "ethereumjs-wallet": "0.6.5", - "heap": "0.2.6", - "keccak": "3.0.1", - "level-sublevel": "6.6.4", - "levelup": "3.1.1", - "lodash": "4.17.20", - "lru-cache": "5.1.1", - "merkle-patricia-tree": "3.0.0", - "patch-package": "6.2.2", - "seedrandom": "3.0.1", - "source-map-support": "0.5.12", - "tmp": "0.1.0", - "web3": "1.2.11", - "web3-provider-engine": "14.2.1", - "websocket": "1.0.32" - }, - "dependencies": { - "@ethersproject/abi": { - "version": "5.0.0-beta.153", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/address": ">=5.0.0-beta.128", - "@ethersproject/bignumber": ">=5.0.0-beta.130", - "@ethersproject/bytes": ">=5.0.0-beta.129", - "@ethersproject/constants": ">=5.0.0-beta.128", - "@ethersproject/hash": ">=5.0.0-beta.128", - "@ethersproject/keccak256": ">=5.0.0-beta.127", - "@ethersproject/logger": ">=5.0.0-beta.129", - "@ethersproject/properties": ">=5.0.0-beta.131", - "@ethersproject/strings": ">=5.0.0-beta.130" - } - }, - "@ethersproject/abstract-provider": { - "version": "5.0.8", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/networks": "^5.0.7", - "@ethersproject/properties": "^5.0.7", - "@ethersproject/transactions": "^5.0.9", - "@ethersproject/web": "^5.0.12" - } - }, - "@ethersproject/abstract-signer": { - "version": "5.0.10", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/abstract-provider": "^5.0.8", - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7" - } - }, - "@ethersproject/address": { - "version": "5.0.9", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/keccak256": "^5.0.7", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/rlp": "^5.0.7" - } - }, - "@ethersproject/base64": { - "version": "5.0.7", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/bytes": "^5.0.9" - } - }, - "@ethersproject/bignumber": { - "version": "5.0.13", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bytes": { - "version": "5.0.9", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/logger": "^5.0.8" - } - }, - "@ethersproject/constants": { - "version": "5.0.8", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/bignumber": "^5.0.13" - } - }, - "@ethersproject/hash": { - "version": "5.0.10", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/abstract-signer": "^5.0.10", - "@ethersproject/address": "^5.0.9", - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/keccak256": "^5.0.7", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7", - "@ethersproject/strings": "^5.0.8" - } - }, - "@ethersproject/keccak256": { - "version": "5.0.7", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/bytes": "^5.0.9", - "js-sha3": "0.5.7" - } - }, - "@ethersproject/logger": { - "version": "5.0.8", - "dev": true, - "optional": true - }, - "@ethersproject/networks": { - "version": "5.0.7", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/logger": "^5.0.8" - } - }, - "@ethersproject/properties": { - "version": "5.0.7", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/logger": "^5.0.8" - } - }, - "@ethersproject/rlp": { - "version": "5.0.7", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8" - } - }, - "@ethersproject/signing-key": { - "version": "5.0.8", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7", - "elliptic": "6.5.3" - } - }, - "@ethersproject/strings": { - "version": "5.0.8", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/constants": "^5.0.8", - "@ethersproject/logger": "^5.0.8" - } - }, - "@ethersproject/transactions": { - "version": "5.0.9", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/address": "^5.0.9", - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/constants": "^5.0.8", - "@ethersproject/keccak256": "^5.0.7", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7", - "@ethersproject/rlp": "^5.0.7", - "@ethersproject/signing-key": "^5.0.8" - } - }, - "@ethersproject/web": { - "version": "5.0.12", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/base64": "^5.0.7", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7", - "@ethersproject/strings": "^5.0.8" - } - }, - "@sindresorhus/is": { - "version": "0.14.0", - "dev": true, - "optional": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "dev": true, - "optional": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@types/bn.js": { - "version": "4.11.6", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "14.14.20", - "dev": true - }, - "@types/pbkdf2": { - "version": "3.1.0", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/secp256k1": { - "version": "4.0.1", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "dev": true - }, - "abstract-leveldown": { - "version": "3.0.0", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "accepts": { - "version": "1.3.7", - "dev": true, - "optional": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "aes-js": { - "version": "3.1.2", - "dev": true, - "optional": true - }, - "ajv": { - "version": "6.12.6", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-styles": { - "version": "3.2.1", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "arr-diff": { - "version": "4.0.0", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "dev": true, - "optional": true - }, - "array-unique": { - "version": "0.3.2", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "5.4.1", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "dev": true - }, - "async": { - "version": "2.6.2", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "async-eventemitter": { - "version": "0.2.4", - "dev": true, - "requires": { - "async": "^2.4.0" - } - }, - "async-limiter": { - "version": "1.0.1", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "dev": true - }, - "atob": { - "version": "2.1.2", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "dev": true - } - } - }, - "babel-core": { - "version": "6.26.3", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "json5": { - "version": "0.5.1", - "dev": true - }, - "ms": { - "version": "2.0.0", - "dev": true - }, - "slash": { - "version": "1.0.0", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.26.1", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "dev": true - } - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helpers": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "dev": true - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "dev": true, - "requires": { - "regenerator-transform": "^0.10.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-preset-env": { - "version": "1.7.0", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "dev": true - } - } - }, - "babel-register": { - "version": "6.26.0", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - }, - "dependencies": { - "source-map-support": { - "version": "0.4.18", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "globals": { - "version": "9.18.0", - "dev": true - }, - "ms": { - "version": "2.0.0", - "dev": true - } - } - }, - "babel-types": { - "version": "6.26.0", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "to-fast-properties": { - "version": "1.0.3", - "dev": true - } - } - }, - "babelify": { - "version": "7.3.0", - "dev": true, - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "babylon": { - "version": "6.18.0", - "dev": true - }, - "backoff": { - "version": "2.5.0", - "dev": true, - "requires": { - "precond": "0.2" - } - }, - "balanced-match": { - "version": "1.0.0", - "dev": true - }, - "base": { - "version": "0.11.2", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "base-x": { - "version": "3.0.8", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "base64-js": { - "version": "1.5.1", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "dev": true - } - } - }, - "bignumber.js": { - "version": "9.0.1", - "dev": true, - "optional": true - }, - "bip39": { - "version": "2.5.0", - "dev": true, - "requires": { - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1", - "safe-buffer": "^5.0.1", - "unorm": "^1.3.3" - } - }, - "blakejs": { - "version": "1.1.0", - "dev": true - }, - "bluebird": { - "version": "3.7.2", - "dev": true, - "optional": true - }, - "bn.js": { - "version": "4.11.9", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "dev": true, - "optional": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.7.0", - "dev": true, - "optional": true - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "dev": true, - "optional": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "dev": true, - "optional": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "5.1.3", - "dev": true, - "optional": true - } - } - }, - "browserify-sign": { - "version": "4.2.1", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "bn.js": { - "version": "5.1.3", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "3.6.0", - "dev": true, - "optional": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "browserslist": { - "version": "3.2.8", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" - } - }, - "bs58": { - "version": "4.0.1", - "dev": true, - "requires": { - "base-x": "^3.0.2" - } - }, - "bs58check": { - "version": "2.1.2", - "dev": true, - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "buffer": { - "version": "5.7.1", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-from": { - "version": "1.1.1", - "dev": true - }, - "buffer-to-arraybuffer": { - "version": "0.0.5", - "dev": true, - "optional": true - }, - "buffer-xor": { - "version": "1.0.3", - "dev": true - }, - "bufferutil": { - "version": "4.0.3", - "dev": true, - "requires": { - "node-gyp-build": "^4.2.0" - } - }, - "bytes": { - "version": "3.1.0", - "dev": true, - "optional": true - }, - "bytewise": { - "version": "1.1.0", - "dev": true, - "requires": { - "bytewise-core": "^1.2.2", - "typewise": "^1.0.3" - } - }, - "bytewise-core": { - "version": "1.2.3", - "dev": true, - "requires": { - "typewise-core": "^1.2" - } - }, - "cache-base": { - "version": "1.0.1", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cacheable-request": { - "version": "6.1.0", - "dev": true, - "optional": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.1.1", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "lowercase-keys": { - "version": "2.0.0", - "dev": true, - "optional": true - } - } - }, - "cachedown": { - "version": "1.0.0", - "dev": true, - "requires": { - "abstract-leveldown": "^2.4.1", - "lru-cache": "^3.2.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "lru-cache": { - "version": "3.2.0", - "dev": true, - "requires": { - "pseudomap": "^1.0.1" - } - } - } - }, - "call-bind": { - "version": "1.0.2", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "caniuse-lite": { - "version": "1.0.30001174", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "checkpoint-store": { - "version": "1.1.0", - "dev": true, - "requires": { - "functional-red-black-tree": "^1.0.1" - } - }, - "chownr": { - "version": "1.1.4", - "dev": true, - "optional": true - }, - "ci-info": { - "version": "2.0.0", - "dev": true - }, - "cids": { - "version": "0.7.5", - "dev": true, - "optional": true, - "requires": { - "buffer": "^5.5.0", - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "^1.0.0", - "multihashes": "~0.4.15" - }, - "dependencies": { - "multicodec": { - "version": "1.0.4", - "dev": true, - "optional": true, - "requires": { - "buffer": "^5.6.0", - "varint": "^5.0.0" - } - } - } - }, - "cipher-base": { - "version": "1.0.4", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-is": { - "version": "1.1.0", - "dev": true, - "optional": true - }, - "class-utils": { - "version": "0.3.6", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "dev": true - } - } - }, - "clone": { - "version": "2.1.2", - "dev": true - }, - "clone-response": { - "version": "1.0.2", - "dev": true, - "optional": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "collection-visit": { - "version": "1.0.0", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "component-emitter": { - "version": "1.3.0", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "content-disposition": { - "version": "0.5.3", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "dev": true, - "optional": true - } - } - }, - "content-hash": { - "version": "2.5.2", - "dev": true, - "optional": true, - "requires": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" - } - }, - "content-type": { - "version": "1.0.4", - "dev": true, - "optional": true - }, - "convert-source-map": { - "version": "1.7.0", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "dev": true - } - } - }, - "cookie": { - "version": "0.4.0", - "dev": true, - "optional": true - }, - "cookie-signature": { - "version": "1.0.6", - "dev": true, - "optional": true - }, - "cookiejar": { - "version": "2.1.2", - "dev": true, - "optional": true - }, - "copy-descriptor": { - "version": "0.1.1", - "dev": true - }, - "core-js": { - "version": "2.6.12", - "dev": true - }, - "core-js-pure": { - "version": "3.8.2", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "dev": true - }, - "cors": { - "version": "2.8.5", - "dev": true, - "optional": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "create-ecdh": { - "version": "4.0.4", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "create-hash": { - "version": "1.2.0", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-fetch": { - "version": "2.2.3", - "dev": true, - "requires": { - "node-fetch": "2.1.2", - "whatwg-fetch": "2.0.4" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "dev": true, - "optional": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "d": { - "version": "1.0.1", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "3.2.6", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decode-uri-component": { - "version": "0.2.0", - "dev": true - }, - "decompress-response": { - "version": "3.3.0", - "dev": true, - "optional": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "defer-to-connect": { - "version": "1.1.3", - "dev": true, - "optional": true - }, - "deferred-leveldown": { - "version": "4.0.2", - "dev": true, - "requires": { - "abstract-leveldown": "~5.0.0", - "inherits": "^2.0.3" - }, - "dependencies": { - "abstract-leveldown": { - "version": "5.0.0", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "define-properties": { - "version": "1.1.3", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "defined": { - "version": "1.0.0", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "dev": true - }, - "depd": { - "version": "1.1.2", - "dev": true, - "optional": true - }, - "des.js": { - "version": "1.0.1", - "dev": true, - "optional": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "dev": true, - "optional": true - }, - "detect-indent": { - "version": "4.0.0", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "diffie-hellman": { - "version": "5.0.3", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dom-walk": { - "version": "0.1.2", - "dev": true - }, - "dotignore": { - "version": "0.1.2", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "duplexer3": { - "version": "0.1.4", - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "dev": true, - "optional": true - }, - "electron-to-chromium": { - "version": "1.3.636", - "dev": true - }, - "elliptic": { - "version": "6.5.3", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "encodeurl": { - "version": "1.0.2", - "dev": true, - "optional": true - }, - "encoding": { - "version": "0.1.13", - "dev": true, - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.2", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "encoding-down": { - "version": "5.0.4", - "dev": true, - "requires": { - "abstract-leveldown": "^5.0.0", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "5.0.0", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "end-of-stream": { - "version": "1.4.4", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "errno": { - "version": "0.1.8", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "es-abstract": { - "version": "1.18.0-next.1", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.53", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "escape-html": { - "version": "1.0.3", - "dev": true, - "optional": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "dev": true - }, - "etag": { - "version": "1.8.1", - "dev": true, - "optional": true - }, - "eth-block-tracker": { - "version": "3.0.1", - "dev": true, - "requires": { - "eth-query": "^2.1.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.3", - "ethjs-util": "^0.1.3", - "json-rpc-engine": "^3.6.0", - "pify": "^2.3.0", - "tape": "^4.6.3" - }, - "dependencies": { - "ethereumjs-tx": { - "version": "1.3.7", - "dev": true, - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "pify": { - "version": "2.3.0", - "dev": true - } - } - }, - "eth-ens-namehash": { - "version": "2.0.8", - "dev": true, - "optional": true, - "requires": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" - } - }, - "eth-json-rpc-infura": { - "version": "3.2.1", - "dev": true, - "requires": { - "cross-fetch": "^2.1.1", - "eth-json-rpc-middleware": "^1.5.0", - "json-rpc-engine": "^3.4.0", - "json-rpc-error": "^2.0.0" - } - }, - "eth-json-rpc-middleware": { - "version": "1.6.0", - "dev": true, - "requires": { - "async": "^2.5.0", - "eth-query": "^2.1.2", - "eth-tx-summary": "^3.1.2", - "ethereumjs-block": "^1.6.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.2", - "ethereumjs-vm": "^2.1.0", - "fetch-ponyfill": "^4.0.0", - "json-rpc-engine": "^3.6.0", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "tape": "^4.6.3" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.6.3", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "deferred-leveldown": { - "version": "1.2.2", - "dev": true, - "requires": { - "abstract-leveldown": "~2.6.0" - } - }, - "ethereumjs-account": { - "version": "2.0.5", - "dev": true, - "requires": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-block": { - "version": "1.7.1", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereum-common": { - "version": "0.2.0", - "dev": true - } - } - }, - "ethereumjs-tx": { - "version": "1.3.7", - "dev": true, - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-vm": { - "version": "2.6.0", - "dev": true, - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-block": { - "version": "2.2.2", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "ethereumjs-tx": { - "version": "2.1.2", - "dev": true, - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-util": { - "version": "6.2.1", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - } - } - }, - "isarray": { - "version": "0.0.1", - "dev": true - }, - "level-codec": { - "version": "7.0.1", - "dev": true - }, - "level-errors": { - "version": "1.0.5", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "1.3.1", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "level-ws": { - "version": "0.0.0", - "dev": true, - "requires": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "xtend": { - "version": "2.1.2", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "levelup": { - "version": "1.3.9", - "dev": true, - "requires": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "ltgt": { - "version": "2.2.1", - "dev": true - }, - "memdown": { - "version": "1.4.1", - "dev": true, - "requires": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "merkle-patricia-tree": { - "version": "2.3.2", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "dev": true - } - } - }, - "object-keys": { - "version": "0.4.0", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "dev": true - }, - "semver": { - "version": "5.4.1", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "dev": true - } - } - }, - "eth-lib": { - "version": "0.1.29", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" - } - }, - "eth-query": { - "version": "2.1.2", - "dev": true, - "requires": { - "json-rpc-random-id": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "eth-sig-util": { - "version": "3.0.0", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "ethereumjs-abi": { - "version": "0.6.5", - "dev": true, - "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^4.3.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "4.5.1", - "dev": true, - "requires": { - "bn.js": "^4.8.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.0.0" - } - } - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "eth-tx-summary": { - "version": "3.2.4", - "dev": true, - "requires": { - "async": "^2.1.2", - "clone": "^2.0.0", - "concat-stream": "^1.5.1", - "end-of-stream": "^1.1.0", - "eth-query": "^2.0.2", - "ethereumjs-block": "^1.4.1", - "ethereumjs-tx": "^1.1.1", - "ethereumjs-util": "^5.0.1", - "ethereumjs-vm": "^2.6.0", - "through2": "^2.0.3" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.6.3", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "deferred-leveldown": { - "version": "1.2.2", - "dev": true, - "requires": { - "abstract-leveldown": "~2.6.0" - } - }, - "ethereumjs-account": { - "version": "2.0.5", - "dev": true, - "requires": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-block": { - "version": "1.7.1", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereum-common": { - "version": "0.2.0", - "dev": true - } - } - }, - "ethereumjs-tx": { - "version": "1.3.7", - "dev": true, - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-vm": { - "version": "2.6.0", - "dev": true, - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-block": { - "version": "2.2.2", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "ethereumjs-tx": { - "version": "2.1.2", - "dev": true, - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-util": { - "version": "6.2.1", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - } - } - }, - "isarray": { - "version": "0.0.1", - "dev": true - }, - "level-codec": { - "version": "7.0.1", - "dev": true - }, - "level-errors": { - "version": "1.0.5", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "1.3.1", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "level-ws": { - "version": "0.0.0", - "dev": true, - "requires": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "xtend": { - "version": "2.1.2", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "levelup": { - "version": "1.3.9", - "dev": true, - "requires": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "ltgt": { - "version": "2.2.1", - "dev": true - }, - "memdown": { - "version": "1.4.1", - "dev": true, - "requires": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "merkle-patricia-tree": { - "version": "2.3.2", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "dev": true - } - } - }, - "object-keys": { - "version": "0.4.0", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "dev": true - }, - "semver": { - "version": "5.4.1", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "dev": true - } - } - }, - "ethashjs": { - "version": "0.0.8", - "dev": true, - "requires": { - "async": "^2.1.2", - "buffer-xor": "^2.0.1", - "ethereumjs-util": "^7.0.2", - "miller-rabin": "^4.0.0" - }, - "dependencies": { - "bn.js": { - "version": "5.1.3", - "dev": true - }, - "buffer-xor": { - "version": "2.0.2", - "dev": true, - "requires": { - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-util": { - "version": "7.0.7", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.4" - } - } - } - }, - "ethereum-bloom-filters": { - "version": "1.0.7", - "dev": true, - "optional": true, - "requires": { - "js-sha3": "^0.8.0" - }, - "dependencies": { - "js-sha3": { - "version": "0.8.0", - "dev": true, - "optional": true - } - } - }, - "ethereum-common": { - "version": "0.0.18", - "dev": true - }, - "ethereum-cryptography": { - "version": "0.1.3", - "dev": true, - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "ethereumjs-abi": { - "version": "0.6.8", - "dev": true, - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-account": { - "version": "3.0.0", - "dev": true, - "requires": { - "ethereumjs-util": "^6.0.0", - "rlp": "^2.2.1", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-block": { - "version": "2.2.2", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.6.3", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "deferred-leveldown": { - "version": "1.2.2", - "dev": true, - "requires": { - "abstract-leveldown": "~2.6.0" - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "isarray": { - "version": "0.0.1", - "dev": true - }, - "level-codec": { - "version": "7.0.1", - "dev": true - }, - "level-errors": { - "version": "1.0.5", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "1.3.1", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "level-ws": { - "version": "0.0.0", - "dev": true, - "requires": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "xtend": { - "version": "2.1.2", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "levelup": { - "version": "1.3.9", - "dev": true, - "requires": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "ltgt": { - "version": "2.2.1", - "dev": true - }, - "memdown": { - "version": "1.4.1", - "dev": true, - "requires": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "merkle-patricia-tree": { - "version": "2.3.2", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "dev": true - } - } - }, - "object-keys": { - "version": "0.4.0", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "dev": true - }, - "semver": { - "version": "5.4.1", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "dev": true - } - } - }, - "ethereumjs-blockchain": { - "version": "4.0.4", - "dev": true, - "requires": { - "async": "^2.6.1", - "ethashjs": "~0.0.7", - "ethereumjs-block": "~2.2.2", - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.1.0", - "flow-stoplight": "^1.0.0", - "level-mem": "^3.0.1", - "lru-cache": "^5.1.1", - "rlp": "^2.2.2", - "semaphore": "^1.1.0" - } - }, - "ethereumjs-common": { - "version": "1.5.0", - "dev": true - }, - "ethereumjs-tx": { - "version": "2.1.2", - "dev": true, - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-util": { - "version": "6.2.1", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, - "ethereumjs-vm": { - "version": "4.2.0", - "dev": true, - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "core-js-pure": "^3.0.1", - "ethereumjs-account": "^3.0.0", - "ethereumjs-block": "^2.2.2", - "ethereumjs-blockchain": "^4.0.3", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.2", - "ethereumjs-util": "^6.2.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1", - "util.promisify": "^1.0.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.6.3", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "deferred-leveldown": { - "version": "1.2.2", - "dev": true, - "requires": { - "abstract-leveldown": "~2.6.0" - } - }, - "isarray": { - "version": "0.0.1", - "dev": true - }, - "level-codec": { - "version": "7.0.1", - "dev": true - }, - "level-errors": { - "version": "1.0.5", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "1.3.1", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "level-ws": { - "version": "0.0.0", - "dev": true, - "requires": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "xtend": { - "version": "2.1.2", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "levelup": { - "version": "1.3.9", - "dev": true, - "requires": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "ltgt": { - "version": "2.2.1", - "dev": true - }, - "memdown": { - "version": "1.4.1", - "dev": true, - "requires": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "merkle-patricia-tree": { - "version": "2.3.2", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "dev": true - }, - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "object-keys": { - "version": "0.4.0", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "dev": true - }, - "semver": { - "version": "5.4.1", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "dev": true - } - } - }, - "ethereumjs-wallet": { - "version": "0.6.5", - "dev": true, - "optional": true, - "requires": { - "aes-js": "^3.1.1", - "bs58check": "^2.1.2", - "ethereum-cryptography": "^0.1.3", - "ethereumjs-util": "^6.0.0", - "randombytes": "^2.0.6", - "safe-buffer": "^5.1.2", - "scryptsy": "^1.2.1", - "utf8": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "ethjs-unit": { - "version": "0.1.6", - "dev": true, - "optional": true, - "requires": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "dev": true, - "optional": true - } - } - }, - "ethjs-util": { - "version": "0.1.6", - "dev": true, - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "eventemitter3": { - "version": "4.0.4", - "dev": true, - "optional": true - }, - "events": { - "version": "3.2.0", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "expand-brackets": { - "version": "2.1.4", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "dev": true - }, - "ms": { - "version": "2.0.0", - "dev": true - } - } - }, - "express": { - "version": "4.17.1", - "dev": true, - "optional": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "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.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.7.0", - "dev": true, - "optional": true - }, - "safe-buffer": { - "version": "5.1.2", - "dev": true, - "optional": true - } - } - }, - "ext": { - "version": "1.4.0", - "dev": true, - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.1.0", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "extglob": { - "version": "2.0.4", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "dev": true - } - } - }, - "extsprintf": { - "version": "1.3.0", - "dev": true - }, - "fake-merkle-patricia-tree": { - "version": "1.0.1", - "dev": true, - "requires": { - "checkpoint-store": "^1.1.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true - }, - "fetch-ponyfill": { - "version": "4.1.0", - "dev": true, - "requires": { - "node-fetch": "~1.7.1" - }, - "dependencies": { - "is-stream": { - "version": "1.1.0", - "dev": true - }, - "node-fetch": { - "version": "1.7.3", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "dev": true, - "optional": true - } - } - }, - "find-yarn-workspace-root": { - "version": "1.2.1", - "dev": true, - "requires": { - "fs-extra": "^4.0.3", - "micromatch": "^3.1.4" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fs-extra": { - "version": "4.0.3", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "flow-stoplight": { - "version": "1.0.0", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "for-in": { - "version": "1.0.2", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "dev": true, - "optional": true - }, - "fragment-cache": { - "version": "0.2.1", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "dev": true, - "optional": true - }, - "fs-extra": { - "version": "7.0.1", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "dev": true - }, - "get-intrinsic": { - "version": "1.0.2", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-stream": { - "version": "5.2.0", - "dev": true, - "optional": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.3", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "global": { - "version": "4.4.0", - "dev": true, - "requires": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "got": { - "version": "9.6.0", - "dev": true, - "optional": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "dependencies": { - "get-stream": { - "version": "4.1.0", - "dev": true, - "optional": true, - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "graceful-fs": { - "version": "4.2.4", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "dev": true - } - } - }, - "has-flag": { - "version": "3.0.0", - "dev": true - }, - "has-symbol-support-x": { - "version": "1.4.2", - "dev": true, - "optional": true - }, - "has-symbols": { - "version": "1.0.1", - "dev": true - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "dev": true, - "optional": true, - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, - "has-value": { - "version": "1.0.0", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.1.0", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "hash.js": { - "version": "1.1.7", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "heap": { - "version": "0.2.6", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "home-or-tmp": { - "version": "2.0.0", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "dev": true, - "optional": true - }, - "http-errors": { - "version": "1.7.2", - "dev": true, - "optional": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "dev": true, - "optional": true - } - } - }, - "http-https": { - "version": "1.0.0", - "dev": true, - "optional": true - }, - "http-signature": { - "version": "1.2.0", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "idna-uts46-hx": { - "version": "2.3.1", - "dev": true, - "optional": true, - "requires": { - "punycode": "2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.0", - "dev": true, - "optional": true - } - } - }, - "ieee754": { - "version": "1.2.1", - "dev": true - }, - "immediate": { - "version": "3.2.3", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "ipaddr.js": { - "version": "1.9.1", - "dev": true, - "optional": true - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-arguments": { - "version": "1.1.0", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.2", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-date-object": { - "version": "1.0.2", - "dev": true - }, - "is-descriptor": { - "version": "1.0.2", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-extendable": { - "version": "1.0.1", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "is-finite": { - "version": "1.1.0", - "dev": true - }, - "is-fn": { - "version": "1.0.0", - "dev": true - }, - "is-function": { - "version": "1.0.2", - "dev": true - }, - "is-hex-prefixed": { - "version": "1.0.0", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.1", - "dev": true - }, - "is-object": { - "version": "1.0.2", - "dev": true, - "optional": true - }, - "is-plain-obj": { - "version": "1.1.0", - "dev": true, - "optional": true - }, - "is-plain-object": { - "version": "2.0.4", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.1", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-retry-allowed": { - "version": "1.2.0", - "dev": true, - "optional": true - }, - "is-symbol": { - "version": "1.0.3", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "dev": true - }, - "isurl": { - "version": "1.0.0", - "dev": true, - "optional": true, - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, - "js-sha3": { - "version": "0.5.7", - "dev": true, - "optional": true - }, - "js-tokens": { - "version": "4.0.0", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "dev": true - }, - "json-buffer": { - "version": "3.0.0", - "dev": true, - "optional": true - }, - "json-rpc-engine": { - "version": "3.8.0", - "dev": true, - "requires": { - "async": "^2.0.1", - "babel-preset-env": "^1.7.0", - "babelify": "^7.3.0", - "json-rpc-error": "^2.0.0", - "promise-to-callback": "^1.0.0", - "safe-event-emitter": "^1.0.1" - } - }, - "json-rpc-error": { - "version": "2.0.0", - "dev": true, - "requires": { - "inherits": "^2.0.1" - } - }, - "json-rpc-random-id": { - "version": "1.0.1", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "keccak": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "keyv": { - "version": "3.1.0", - "dev": true, - "optional": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "kind-of": { - "version": "6.0.3", - "dev": true - }, - "klaw-sync": { - "version": "6.0.0", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11" - } - }, - "level-codec": { - "version": "9.0.2", - "dev": true, - "requires": { - "buffer": "^5.6.0" - } - }, - "level-errors": { - "version": "2.0.1", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "2.0.3", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.5", - "xtend": "^4.0.0" - } - }, - "level-mem": { - "version": "3.0.1", - "dev": true, - "requires": { - "level-packager": "~4.0.0", - "memdown": "~3.0.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "5.0.0", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "ltgt": { - "version": "2.2.1", - "dev": true - }, - "memdown": { - "version": "3.0.0", - "dev": true, - "requires": { - "abstract-leveldown": "~5.0.0", - "functional-red-black-tree": "~1.0.1", - "immediate": "~3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "dev": true - } - } - }, - "level-packager": { - "version": "4.0.1", - "dev": true, - "requires": { - "encoding-down": "~5.0.0", - "levelup": "^3.0.0" - } - }, - "level-post": { - "version": "1.0.7", - "dev": true, - "requires": { - "ltgt": "^2.1.2" - } - }, - "level-sublevel": { - "version": "6.6.4", - "dev": true, - "requires": { - "bytewise": "~1.1.0", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0", - "level-iterator-stream": "^2.0.3", - "ltgt": "~2.1.1", - "pull-defer": "^0.2.2", - "pull-level": "^2.0.3", - "pull-stream": "^3.6.8", - "typewiselite": "~1.0.0", - "xtend": "~4.0.0" - } - }, - "level-ws": { - "version": "1.0.0", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.2.8", - "xtend": "^4.0.1" - } - }, - "levelup": { - "version": "3.1.1", - "dev": true, - "requires": { - "deferred-leveldown": "~4.0.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~3.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "level-iterator-stream": { - "version": "3.0.1", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "xtend": "^4.0.0" - } - } - } - }, - "lodash": { - "version": "4.17.20", - "dev": true - }, - "looper": { - "version": "2.0.0", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "dev": true, - "optional": true - }, - "lru-cache": { - "version": "5.1.1", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "ltgt": { - "version": "2.1.3", - "dev": true - }, - "map-cache": { - "version": "0.2.2", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "media-typer": { - "version": "0.3.0", - "dev": true, - "optional": true - }, - "merge-descriptors": { - "version": "1.0.1", - "dev": true, - "optional": true - }, - "merkle-patricia-tree": { - "version": "3.0.0", - "dev": true, - "requires": { - "async": "^2.6.1", - "ethereumjs-util": "^5.2.0", - "level-mem": "^3.0.1", - "level-ws": "^1.0.0", - "readable-stream": "^3.0.6", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "readable-stream": { - "version": "3.6.0", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "methods": { - "version": "1.1.2", - "dev": true, - "optional": true - }, - "miller-rabin": { - "version": "4.0.1", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.6.0", - "dev": true, - "optional": true - }, - "mime-db": { - "version": "1.45.0", - "dev": true - }, - "mime-types": { - "version": "2.1.28", - "dev": true, - "requires": { - "mime-db": "1.45.0" - } - }, - "mimic-response": { - "version": "1.0.1", - "dev": true, - "optional": true - }, - "min-document": { - "version": "2.19.0", - "dev": true, - "requires": { - "dom-walk": "^0.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "dev": true - }, - "minizlib": { - "version": "1.3.3", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - }, - "dependencies": { - "minipass": { - "version": "2.9.0", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - } - } - }, - "mixin-deep": { - "version": "1.3.2", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - } - }, - "mkdirp": { - "version": "0.5.5", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mkdirp-promise": { - "version": "5.0.1", - "dev": true, - "optional": true, - "requires": { - "mkdirp": "*" - } - }, - "mock-fs": { - "version": "4.13.0", - "dev": true, - "optional": true - }, - "ms": { - "version": "2.1.3", - "dev": true - }, - "multibase": { - "version": "0.6.1", - "dev": true, - "optional": true, - "requires": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, - "multicodec": { - "version": "0.5.7", - "dev": true, - "optional": true, - "requires": { - "varint": "^5.0.0" - } - }, - "multihashes": { - "version": "0.4.21", - "dev": true, - "optional": true, - "requires": { - "buffer": "^5.5.0", - "multibase": "^0.7.0", - "varint": "^5.0.0" - }, - "dependencies": { - "multibase": { - "version": "0.7.0", - "dev": true, - "optional": true, - "requires": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - } - } - }, - "nano-json-stream-parser": { - "version": "0.1.2", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "negotiator": { - "version": "0.6.2", - "dev": true, - "optional": true - }, - "next-tick": { - "version": "1.0.0", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "dev": true - }, - "node-addon-api": { - "version": "2.0.2", - "bundled": true, - "dev": true - }, - "node-fetch": { - "version": "2.1.2", - "dev": true - }, - "node-gyp-build": { - "version": "4.2.3", - "bundled": true, - "dev": true - }, - "normalize-url": { - "version": "4.5.0", - "dev": true, - "optional": true - }, - "number-to-bn": { - "version": "1.7.0", - "dev": true, - "optional": true, - "requires": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "dev": true, - "optional": true - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-buffer": { - "version": "1.1.6", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "dev": true - } - } - }, - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.9.0", - "dev": true - }, - "object-is": { - "version": "1.1.4", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.2", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.1", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, - "object.pick": { - "version": "1.3.0", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "oboe": { - "version": "2.1.4", - "dev": true, - "optional": true, - "requires": { - "http-https": "^1.0.0" - } - }, - "on-finished": { - "version": "2.3.0", - "dev": true, - "optional": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "dev": true - }, - "p-cancelable": { - "version": "1.1.0", - "dev": true, - "optional": true - }, - "p-timeout": { - "version": "1.2.1", - "dev": true, - "optional": true, - "requires": { - "p-finally": "^1.0.0" - }, - "dependencies": { - "p-finally": { - "version": "1.0.0", - "dev": true, - "optional": true - } - } - }, - "parse-asn1": { - "version": "5.1.6", - "dev": true, - "optional": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-headers": { - "version": "2.0.3", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "dev": true, - "optional": true - }, - "pascalcase": { - "version": "0.1.1", - "dev": true - }, - "patch-package": { - "version": "6.2.2", - "dev": true, - "requires": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^1.2.1", - "fs-extra": "^7.0.1", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.0", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "path-key": { - "version": "2.0.1", - "dev": true - }, - "semver": { - "version": "5.7.1", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "dev": true - }, - "slash": { - "version": "2.0.0", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "which": { - "version": "1.3.1", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "path-is-absolute": { - "version": "1.0.1", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "dev": true, - "optional": true - }, - "pbkdf2": { - "version": "3.1.1", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "dev": true - }, - "precond": { - "version": "0.2.3", - "dev": true - }, - "prepend-http": { - "version": "2.0.0", - "dev": true, - "optional": true - }, - "private": { - "version": "0.1.8", - "dev": true - }, - "process": { - "version": "0.11.10", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "dev": true - }, - "promise-to-callback": { - "version": "1.0.0", - "dev": true, - "requires": { - "is-fn": "^1.0.0", - "set-immediate-shim": "^1.0.1" - } - }, - "proxy-addr": { - "version": "2.0.6", - "dev": true, - "optional": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "dev": true - }, - "psl": { - "version": "1.8.0", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pull-cat": { - "version": "1.1.11", - "dev": true - }, - "pull-defer": { - "version": "0.2.3", - "dev": true - }, - "pull-level": { - "version": "2.0.4", - "dev": true, - "requires": { - "level-post": "^1.0.7", - "pull-cat": "^1.1.9", - "pull-live": "^1.0.1", - "pull-pushable": "^2.0.0", - "pull-stream": "^3.4.0", - "pull-window": "^2.1.4", - "stream-to-pull-stream": "^1.7.1" - } - }, - "pull-live": { - "version": "1.0.1", - "dev": true, - "requires": { - "pull-cat": "^1.1.9", - "pull-stream": "^3.4.0" - } - }, - "pull-pushable": { - "version": "2.2.0", - "dev": true - }, - "pull-stream": { - "version": "3.6.14", - "dev": true - }, - "pull-window": { - "version": "2.1.4", - "dev": true, - "requires": { - "looper": "^2.0.0" - } - }, - "pump": { - "version": "3.0.0", - "dev": true, - "optional": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "dev": true - }, - "qs": { - "version": "6.5.2", - "dev": true - }, - "query-string": { - "version": "5.1.1", - "dev": true, - "optional": true, - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "randombytes": { - "version": "2.1.0", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "dev": true, - "optional": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "dev": true, - "optional": true - }, - "raw-body": { - "version": "2.4.0", - "dev": true, - "optional": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "dev": true - } - } - }, - "regenerate": { - "version": "1.4.2", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "dev": true - }, - "regenerator-transform": { - "version": "0.10.1", - "dev": true, - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } - } - }, - "regexpu-core": { - "version": "2.0.0", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "dev": true - } - } - }, - "repeat-element": { - "version": "1.1.3", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.2", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.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.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "resolve-url": { - "version": "0.2.1", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "dev": true, - "optional": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "resumer": { - "version": "0.0.0", - "dev": true, - "requires": { - "through": "~2.3.4" - } - }, - "ret": { - "version": "0.1.15", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rlp": { - "version": "2.2.6", - "dev": true, - "requires": { - "bn.js": "^4.11.1" - } - }, - "rustbn.js": { - "version": "0.2.0", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "dev": true - }, - "safe-event-emitter": { - "version": "1.0.1", - "dev": true, - "requires": { - "events": "^3.0.0" - } - }, - "safe-regex": { - "version": "1.1.0", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "dev": true - }, - "scrypt-js": { - "version": "3.0.1", - "dev": true - }, - "scryptsy": { - "version": "1.2.1", - "dev": true, - "optional": true, - "requires": { - "pbkdf2": "^3.0.3" - } - }, - "secp256k1": { - "version": "4.0.2", - "dev": true, - "requires": { - "elliptic": "^6.5.2", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "seedrandom": { - "version": "3.0.1", - "dev": true - }, - "semaphore": { - "version": "1.1.0", - "dev": true - }, - "send": { - "version": "0.17.1", - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "dev": true, - "optional": true - } - } - }, - "ms": { - "version": "2.1.1", - "dev": true, - "optional": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "dev": true, - "optional": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "servify": { - "version": "0.1.12", - "dev": true, - "optional": true, - "requires": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" - } - }, - "set-immediate-shim": { - "version": "1.0.1", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "dev": true - } - } - }, - "setimmediate": { - "version": "1.0.5", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "dev": true, - "optional": true - }, - "sha.js": { - "version": "2.4.11", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "simple-concat": { - "version": "1.0.1", - "dev": true, - "optional": true - }, - "simple-get": { - "version": "2.8.1", - "dev": true, - "optional": true, - "requires": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "dev": true - }, - "ms": { - "version": "2.0.0", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.12", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sshpk": { - "version": "1.16.1", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "dev": true - } - } - }, - "static-extend": { - "version": "0.1.2", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "dev": true - } - } - }, - "statuses": { - "version": "1.5.0", - "dev": true, - "optional": true - }, - "stream-to-pull-stream": { - "version": "1.7.3", - "dev": true, - "requires": { - "looper": "^3.0.0", - "pull-stream": "^3.2.3" - }, - "dependencies": { - "looper": { - "version": "3.0.0", - "dev": true - } - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "dev": true, - "optional": true - }, - "string_decoder": { - "version": "1.1.1", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "dev": true - } - } - }, - "string.prototype.trim": { - "version": "1.2.3", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.3", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.3", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "strip-hex-prefix": { - "version": "1.0.0", - "dev": true, - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "swarm-js": { - "version": "0.1.40", - "dev": true, - "optional": true, - "requires": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - }, - "dependencies": { - "fs-extra": { - "version": "4.0.3", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "get-stream": { - "version": "3.0.0", - "dev": true, - "optional": true - }, - "got": { - "version": "7.1.0", - "dev": true, - "optional": true, - "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - } - }, - "is-stream": { - "version": "1.1.0", - "dev": true, - "optional": true - }, - "p-cancelable": { - "version": "0.3.0", - "dev": true, - "optional": true - }, - "prepend-http": { - "version": "1.0.4", - "dev": true, - "optional": true - }, - "url-parse-lax": { - "version": "1.0.0", - "dev": true, - "optional": true, - "requires": { - "prepend-http": "^1.0.1" - } - } - } - }, - "tape": { - "version": "4.13.3", - "dev": true, - "requires": { - "deep-equal": "~1.1.1", - "defined": "~1.0.0", - "dotignore": "~0.1.2", - "for-each": "~0.3.3", - "function-bind": "~1.1.1", - "glob": "~7.1.6", - "has": "~1.0.3", - "inherits": "~2.0.4", - "is-regex": "~1.0.5", - "minimist": "~1.2.5", - "object-inspect": "~1.7.0", - "resolve": "~1.17.0", - "resumer": "~0.0.0", - "string.prototype.trim": "~1.2.1", - "through": "~2.3.8" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "is-regex": { - "version": "1.0.5", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "object-inspect": { - "version": "1.7.0", - "dev": true - }, - "resolve": { - "version": "1.17.0", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "tar": { - "version": "4.4.13", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - }, - "dependencies": { - "fs-minipass": { - "version": "1.2.7", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "minipass": { - "version": "2.9.0", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - } - } - }, - "through": { - "version": "2.3.8", - "dev": true - }, - "through2": { - "version": "2.0.5", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "timed-out": { - "version": "4.0.1", - "dev": true, - "optional": true - }, - "tmp": { - "version": "0.1.0", - "dev": true, - "requires": { - "rimraf": "^2.6.3" - } - }, - "to-object-path": { - "version": "0.3.0", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-readable-stream": { - "version": "1.0.0", - "dev": true, - "optional": true - }, - "to-regex": { - "version": "3.0.2", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "dev": true, - "optional": true - }, - "tough-cookie": { - "version": "2.5.0", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "trim-right": { - "version": "1.0.1", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "1.0.3", - "dev": true - }, - "tweetnacl-util": { - "version": "0.15.1", - "dev": true - }, - "type": { - "version": "1.2.0", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "dev": true, - "optional": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typewise": { - "version": "1.0.3", - "dev": true, - "requires": { - "typewise-core": "^1.2.0" - } - }, - "typewise-core": { - "version": "1.2.0", - "dev": true - }, - "typewiselite": { - "version": "1.0.0", - "dev": true - }, - "ultron": { - "version": "1.1.1", - "dev": true, - "optional": true - }, - "underscore": { - "version": "1.9.1", - "dev": true, - "optional": true - }, - "union-value": { - "version": "1.0.1", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "dev": true - } - } - }, - "universalify": { - "version": "0.1.2", - "dev": true - }, - "unorm": { - "version": "1.6.0", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "dev": true, - "optional": true - }, - "unset-value": { - "version": "1.0.0", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "dev": true - } - } - }, - "uri-js": { - "version": "4.4.1", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "dev": true - }, - "url-parse-lax": { - "version": "3.0.0", - "dev": true, - "optional": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "url-set-query": { - "version": "1.0.0", - "dev": true, - "optional": true - }, - "url-to-options": { - "version": "1.0.1", - "dev": true, - "optional": true - }, - "use": { - "version": "3.1.1", - "dev": true - }, - "utf-8-validate": { - "version": "5.0.4", - "dev": true, - "requires": { - "node-gyp-build": "^4.2.0" - } - }, - "utf8": { - "version": "3.0.0", - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "dev": true - }, - "util.promisify": { - "version": "1.1.1", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "for-each": "^0.3.3", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.1" - } - }, - "utils-merge": { - "version": "1.0.1", - "dev": true, - "optional": true - }, - "uuid": { - "version": "3.4.0", - "dev": true - }, - "varint": { - "version": "5.0.2", - "dev": true, - "optional": true - }, - "vary": { - "version": "1.1.2", - "dev": true, - "optional": true - }, - "verror": { - "version": "1.10.0", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "web3": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "web3-bzz": "1.2.11", - "web3-core": "1.2.11", - "web3-eth": "1.2.11", - "web3-eth-personal": "1.2.11", - "web3-net": "1.2.11", - "web3-shh": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-bzz": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40", - "underscore": "1.9.1" - }, - "dependencies": { - "@types/node": { - "version": "12.19.12", - "dev": true, - "optional": true - } - } - }, - "web3-core": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "@types/bn.js": "^4.11.5", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-requestmanager": "1.2.11", - "web3-utils": "1.2.11" - }, - "dependencies": { - "@types/node": { - "version": "12.19.12", - "dev": true, - "optional": true - } - } - }, - "web3-core-helpers": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "underscore": "1.9.1", - "web3-eth-iban": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-core-method": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/transactions": "^5.0.0-beta.135", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-core-promievent": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-core-requestmanager": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "web3-providers-http": "1.2.11", - "web3-providers-ipc": "1.2.11", - "web3-providers-ws": "1.2.11" - } - }, - "web3-core-subscriptions": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11" - } - }, - "web3-eth": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-eth-accounts": "1.2.11", - "web3-eth-contract": "1.2.11", - "web3-eth-ens": "1.2.11", - "web3-eth-iban": "1.2.11", - "web3-eth-personal": "1.2.11", - "web3-net": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-eth-abi": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/abi": "5.0.0-beta.153", - "underscore": "1.9.1", - "web3-utils": "1.2.11" - } - }, - "web3-eth-accounts": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", - "scrypt-js": "^3.0.1", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-utils": "1.2.11" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "uuid": { - "version": "3.3.2", - "dev": true, - "optional": true - } - } - }, - "web3-eth-contract": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "@types/bn.js": "^4.11.5", - "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-eth-ens": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-eth-contract": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-eth-iban": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.11.9", - "web3-utils": "1.2.11" - } - }, - "web3-eth-personal": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-net": "1.2.11", - "web3-utils": "1.2.11" - }, - "dependencies": { - "@types/node": { - "version": "12.19.12", - "dev": true, - "optional": true - } - } - }, - "web3-net": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "web3-core": "1.2.11", - "web3-core-method": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-provider-engine": { - "version": "14.2.1", - "dev": true, - "requires": { - "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": "3.0.0", - "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" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.6.3", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "deferred-leveldown": { - "version": "1.2.2", - "dev": true, - "requires": { - "abstract-leveldown": "~2.6.0" - } - }, - "eth-sig-util": { - "version": "1.4.2", - "dev": true, - "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "ethereumjs-util": "^5.1.1" - } - }, - "ethereumjs-account": { - "version": "2.0.5", - "dev": true, - "requires": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-block": { - "version": "1.7.1", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereum-common": { - "version": "0.2.0", - "dev": true - } - } - }, - "ethereumjs-tx": { - "version": "1.3.7", - "dev": true, - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-vm": { - "version": "2.6.0", - "dev": true, - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-block": { - "version": "2.2.2", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "ethereumjs-tx": { - "version": "2.1.2", - "dev": true, - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-util": { - "version": "6.2.1", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - } - } - }, - "isarray": { - "version": "0.0.1", - "dev": true - }, - "level-codec": { - "version": "7.0.1", - "dev": true - }, - "level-errors": { - "version": "1.0.5", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "1.3.1", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "level-ws": { - "version": "0.0.0", - "dev": true, - "requires": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "xtend": { - "version": "2.1.2", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "levelup": { - "version": "1.3.9", - "dev": true, - "requires": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "ltgt": { - "version": "2.2.1", - "dev": true - }, - "memdown": { - "version": "1.4.1", - "dev": true, - "requires": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "merkle-patricia-tree": { - "version": "2.3.2", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "dev": true - } - } - }, - "object-keys": { - "version": "0.4.0", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "dev": true - }, - "semver": { - "version": "5.4.1", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "dev": true - }, - "ws": { - "version": "5.2.2", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "web3-providers-http": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "web3-core-helpers": "1.2.11", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "oboe": "2.1.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11" - } - }, - "web3-providers-ws": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "websocket": "^1.0.31" - } - }, - "web3-shh": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "web3-core": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-net": "1.2.11" - } - }, - "web3-utils": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - } - } - }, - "websocket": { - "version": "1.0.32", - "dev": true, - "requires": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "dev": true - } - } - }, - "whatwg-fetch": { - "version": "2.0.4", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "dev": true - }, - "ws": { - "version": "3.3.3", - "dev": true, - "optional": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "dev": true, - "optional": true - } - } - }, - "xhr": { - "version": "2.6.0", - "dev": true, - "requires": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "xhr-request": { - "version": "1.1.0", - "dev": true, - "optional": true, - "requires": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" - } - }, - "xhr-request-promise": { - "version": "0.1.3", - "dev": true, - "optional": true, - "requires": { - "xhr-request": "^1.1.0" - } - }, - "xhr2-cookies": { - "version": "1.1.0", - "dev": true, - "optional": true, - "requires": { - "cookiejar": "^2.1.1" - } - }, - "xtend": { - "version": "4.0.2", - "dev": true - }, - "yaeti": { - "version": "0.0.6", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "dev": true - } - } - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", - "dev": true - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "requires": { - "min-document": "^2.19.0", - "process": "~0.5.1" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "google-libphonenumber": { - "version": "3.2.16", - "resolved": "https://registry.npmjs.org/google-libphonenumber/-/google-libphonenumber-3.2.16.tgz", - "integrity": "sha512-9Gzn78fJvCuNPYnbmUFFLhL0A4qBbSBs11+3cLKNuZX3lWKJ+1pSVS0C2bq0Yjq00cW2e8LZkHAxl+MQRGxGWA==", - "dev": true - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - }, - "graphql": { - "version": "15.8.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", - "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==", - "dev": true, - "optional": true - }, - "graphql-tag": { - "version": "2.12.6", - "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", - "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", - "dev": true, - "optional": true, - "requires": { - "tslib": "^2.1.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true, - "optional": true - } - } - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true, - "optional": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "header-case": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", - "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.3" - } - }, - "highlight.js": { - "version": "9.18.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.1.tgz", - "integrity": "sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg==", - "dev": true - }, - "highlightjs-solidity": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-1.0.16.tgz", - "integrity": "sha512-uxdj3Qn4cBoY1zNIe8BSiwvw14G9Nq99HWEqPqFSu/rBCFaz84C+N/FChpPcUjd6q+cVsXOdyafCIAx5LHhBEQ==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "http-basic": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", - "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", - "dev": true, - "requires": { - "caseless": "^0.12.0", - "concat-stream": "^1.6.2", - "http-response-object": "^3.0.1", - "parse-cache-control": "^1.0.1" - } - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" - }, - "http-response-object": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", - "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", - "dev": true, - "requires": { - "@types/node": "^10.0.3" - }, - "dependencies": { - "@types/node": { - "version": "10.17.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.26.tgz", - "integrity": "sha512-myMwkO2Cr82kirHY8uknNRHEVtn0wV3DTQfkrjx17jmkstDRZ24gNUdl8AHXVyVclTYI/bNjgTPTAWvWLqXqkw==", - "dev": true - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "husky": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz", - "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==", - "dev": true, - "requires": { - "is-ci": "^1.0.10", - "normalize-path": "^1.0.0", - "strip-indent": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", - "requires": { - "punycode": "2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" - } - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", - "dev": true - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "optional": true - }, - "inquirer": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.2.0.tgz", - "integrity": "sha512-E0c4rPwr9ByePfNlTIB8z51kK1s2n6jrHuJeEHENl/sbq2G/S1auvibgEwNR4uSyiU+PiYHqSwsgGiXjG8p5ZQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "io-ts": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-2.0.1.tgz", - "integrity": "sha512-RezD+WcCfW4VkMkEcQWL/Nmy/nqsWTvTYg7oUmTGzglvSSV2P9h2z1PVeREPFf0GWNzruYleAt1XCMQZSg1xxQ==", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", - "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" - }, - "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", - "dev": true - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "requires": { - "ci-info": "^1.5.0" - } - }, - "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true - }, - "is-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz", - "integrity": "sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" - }, - "is-generator-function": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", - "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" - }, - "is-lower-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", - "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", - "dev": true, - "requires": { - "lower-case": "^1.1.0" - } - }, - "is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", - "dev": true - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "optional": true - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" - } - }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typed-array": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", - "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.0-next.2", - "foreach": "^2.0.5", - "has-symbols": "^1.0.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - } - } - }, - "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", - "dev": true - }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - } - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-upper-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", - "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", - "dev": true, - "requires": { - "upper-case": "^1.1.0" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "dev": true, - "optional": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - }, - "js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, - "json-pointer": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", - "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", - "dev": true, - "requires": { - "foreach": "^2.0.4" - } - }, - "json-rpc-engine": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz", - "integrity": "sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==", - "dev": true, - "requires": { - "@metamask/safe-event-emitter": "^2.0.0", - "eth-rpc-errors": "^4.0.2" - }, - "dependencies": { - "eth-rpc-errors": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz", - "integrity": "sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==", - "dev": true, - "requires": { - "fast-safe-stringify": "^2.0.6" - } - } - } - }, - "json-rpc-random-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", - "integrity": "sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-schema-typed": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", - "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==", - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha512-i/J297TW6xyj7sDFa7AmBPkQvLIxWr2kKPWI26tXydnZrzVAocNqn5DMNT1Mzk0vit1V5UkRM7C1KdVNp7Lmcg==", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json-text-sequence": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", - "integrity": "sha1-py8hfcSvxGKf/1/rME3BvVGi89I=", - "requires": { - "delimit-stream": "0.1.0" - } - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "keccak": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", - "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==", - "requires": { - "bindings": "^1.5.0", - "inherits": "^2.0.4", - "nan": "^2.14.0", - "safe-buffer": "^5.2.0" - } - }, - "keccak256": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/keccak256/-/keccak256-1.0.2.tgz", - "integrity": "sha512-f2EncSgmHmmQOkgxZ+/f2VaWTNkFL6f39VIrpoX+p8cEXJVyyCs/3h9GNz/ViHgwchxvv7oG5mjT2Tk4ZqInag==", - "dev": true, - "requires": { - "bn.js": "^4.11.8", - "keccak": "^3.0.1" - }, - "dependencies": { - "keccak": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", - "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", - "dev": true, - "requires": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - } - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "requires": { - "json-buffer": "3.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - } - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "level": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/level/-/level-6.0.1.tgz", - "integrity": "sha512-psRSqJZCsC/irNhfHzrVZbmPYXDcEYhA5TVNwr+V92jF44rbf86hqGp8fiT702FyiArScYIlPSBTDUASCVNSpw==", - "dev": true, - "optional": true, - "requires": { - "level-js": "^5.0.0", - "level-packager": "^5.1.0", - "leveldown": "^5.4.0" - } - }, - "level-codec": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", - "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", - "dev": true, - "optional": true, - "requires": { - "buffer": "^5.6.0" - } - }, - "level-concat-iterator": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz", - "integrity": "sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==", - "dev": true, - "optional": true, - "requires": { - "catering": "^2.1.0" - } - }, - "level-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", - "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", - "dev": true, - "optional": true, - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", - "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", - "dev": true, - "optional": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.4.0", - "xtend": "^4.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "optional": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "level-js": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/level-js/-/level-js-5.0.2.tgz", - "integrity": "sha512-SnBIDo2pdO5VXh02ZmtAyPP6/+6YTJg2ibLtl9C34pWvmtMEmRTWpra+qO/hifkUtBTOtfx6S9vLDjBsBK4gRg==", - "dev": true, - "optional": true, - "requires": { - "abstract-leveldown": "~6.2.3", - "buffer": "^5.5.0", - "inherits": "^2.0.3", - "ltgt": "^2.1.2" - }, - "dependencies": { - "abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "dev": true, - "optional": true, - "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - } - }, - "level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", - "dev": true, - "optional": true - }, - "level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "optional": true, - "requires": { - "xtend": "^4.0.2" - } - } - } - }, - "level-packager": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", - "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", - "dev": true, - "optional": true, - "requires": { - "encoding-down": "^6.3.0", - "levelup": "^4.3.2" - } - }, - "level-supports": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz", - "integrity": "sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==", - "dev": true, - "optional": true - }, - "level-write-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/level-write-stream/-/level-write-stream-1.0.0.tgz", - "integrity": "sha512-bBNKOEOMl8msO+uIM9YX/gUO6ckokZ/4pCwTm/lwvs46x6Xs8Zy0sn3Vh37eDqse4mhy4fOMIb/JsSM2nyQFtw==", - "dev": true, - "optional": true, - "requires": { - "end-stream": "~0.1.0" - } - }, - "level-ws": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", - "integrity": "sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==", - "dev": true, - "requires": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "leveldown": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-5.6.0.tgz", - "integrity": "sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==", - "dev": true, - "optional": true, - "requires": { - "abstract-leveldown": "~6.2.1", - "napi-macros": "~2.0.0", - "node-gyp-build": "~4.1.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "dev": true, - "optional": true, - "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - } - }, - "level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", - "dev": true, - "optional": true - }, - "level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "optional": true, - "requires": { - "xtend": "^4.0.2" - } - }, - "node-gyp-build": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.1.1.tgz", - "integrity": "sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==", - "dev": true, - "optional": true - } - } - }, - "levelup": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", - "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", - "dev": true, - "optional": true, - "requires": { - "deferred-leveldown": "~5.3.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~4.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "optional": true, - "requires": { - "xtend": "^4.0.2" - } - } - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.partition": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.partition/-/lodash.partition-4.6.0.tgz", - "integrity": "sha1-o45GtzRp4EILDaEhLmbUFL42S6Q=", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true, - "optional": true - }, - "lodash.sum": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/lodash.sum/-/lodash.sum-4.0.2.tgz", - "integrity": "sha1-rZDjl5ZdgD1PH/eqWy0Bl/O0Y3s=", - "dev": true - }, - "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2" - } - }, - "loglevel": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", - "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", - "dev": true, - "optional": true - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true, - "optional": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", - "dev": true - }, - "lower-case-first": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", - "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", - "dev": true, - "requires": { - "lower-case": "^1.1.2" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - }, - "dependencies": { - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", - "dev": true - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "markdown-table": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", - "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", - "dev": true - }, - "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true - }, - "md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", - "dev": true, - "requires": { - "charenc": "~0.0.1", - "crypt": "~0.0.1", - "is-buffer": "~1.1.1" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - } - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - } - } - }, - "memdown": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", - "integrity": "sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==", - "dev": true, - "requires": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", - "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merkle-patricia-tree": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", - "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", - "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true - }, - "deferred-leveldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", - "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", - "dev": true, - "requires": { - "abstract-leveldown": "~2.6.0" - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "level-codec": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", - "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==", - "dev": true - }, - "level-errors": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", - "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", - "integrity": "sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "levelup": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", - "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", - "dev": true, - "requires": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - } - } - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "requires": { - "mime-db": "1.44.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "requires": { - "dom-walk": "^0.1.0" - } - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "requires": { - "minipass": "^2.9.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", - "requires": { - "mkdirp": "*" - } - }, - "mocha": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", - "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "mocha-junit-reporter": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-1.23.3.tgz", - "integrity": "sha512-ed8LqbRj1RxZfjt/oC9t12sfrWsjZ3gNnbhV1nuj9R/Jb5/P3Xb4duv2eCfCDMYH+fEu0mqca7m4wsiVjsxsvA==", - "dev": true, - "requires": { - "debug": "^2.2.0", - "md5": "^2.1.0", - "mkdirp": "~0.5.1", - "strip-ansi": "^4.0.0", - "xml": "^1.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "mock-fs": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.12.0.tgz", - "integrity": "sha512-/P/HtrlvBxY4o/PzXY9cCNBrdylDNxg7gnrv2sMNxj+UJ2m8jSpl0/A6fuJeNAWr99ZvGWH8XCbE0vmnM5KupQ==" - }, - "moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multibase": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", - "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", - "dev": true, - "requires": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, - "multicodec": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", - "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", - "dev": true, - "requires": { - "varint": "^5.0.0" - } - }, - "multihashes": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", - "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "multibase": "^0.7.0", - "varint": "^5.0.0" - }, - "dependencies": { - "multibase": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", - "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", - "dev": true, - "requires": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - } - } - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" - }, - "nano-json-stream-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" - }, - "nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "napi-macros": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "dev": true, - "optional": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "needle": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", - "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "optional": true - } - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - }, - "node-abort-controller": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz", - "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==", - "dev": true, - "optional": true - }, - "node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true - }, - "node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", - "dev": true, - "requires": { - "minimatch": "^3.0.2" - } - }, - "node-environment-flags": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", - "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-gyp-build": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", - "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==", - "dev": true - }, - "node-interval-tree": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/node-interval-tree/-/node-interval-tree-1.3.3.tgz", - "integrity": "sha512-K9vk96HdTK5fEipJwxSvIIqwTqr4e3HRJeJrNxBSeVMNSC/JWARRaX7etOLOuTmrRMeOI/K5TCJu3aWIwZiNTw==", - "dev": true, - "requires": { - "shallowequal": "^1.0.2" - } - }, - "node-pre-gyp": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", - "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.6" - } - } - } - }, - "node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", - "dev": true - }, - "nofilter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", - "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==" - }, - "noop-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/noop-fn/-/noop-fn-1.0.0.tgz", - "integrity": "sha512-pQ8vODlgXt2e7A3mIbFDlizkr46r75V+BJxVAyat8Jl7YmI513gG5cfyRL0FedKraoZ+VAouI1h4/IWpus5pcQ==", - "dev": true, - "optional": true - }, - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "normalize-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", - "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", - "dev": true - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" - }, - "npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", - "requires": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "numeral": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", - "integrity": "sha1-StCAk21EPCVhrtnyGX7//iX05QY=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "oboe": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz", - "integrity": "sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=", - "requires": { - "http-https": "^1.0.0" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "openzeppelin-solidity": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/openzeppelin-solidity/-/openzeppelin-solidity-2.4.0.tgz", - "integrity": "sha512-533gc5jkspxW5YT0qJo02Za5q1LHwXK9CJCc48jNj/22ncNM/3M/3JfWLqfpB90uqLwOKOovpl0JfaMQTR+gXQ==" - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "original-require": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/original-require/-/original-require-1.0.1.tgz", - "integrity": "sha512-5vdKMbE58WaE61uVD+PKyh8xdM398UnjPBLotW2sjG5MzHARwta/+NtMBCBA0t2WQblGYBvq5vsiZpWokwno+A==", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "dependencies": { - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - } - } - }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "requires": { - "p-finally": "^1.0.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-cache-control": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", - "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=", - "dev": true - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "parse-headers": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", - "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" - }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascal-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", - "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", - "dev": true, - "requires": { - "camel-case": "^3.0.0", - "upper-case-first": "^1.1.0" - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", - "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pegjs": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", - "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=", - "dev": true - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "optional": true, - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "optional": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "optional": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "optional": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "optional": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "optional": true - } - } - }, - "pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, - "optional": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "pouchdb": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb/-/pouchdb-7.3.0.tgz", - "integrity": "sha512-OwsIQGXsfx3TrU1pLruj6PGSwFH+h5k4hGNxFkZ76Um7/ZI8F5TzUHFrpldVVIhfXYi2vP31q0q7ot1FSLFYOw==", - "dev": true, - "optional": true, - "requires": { - "abort-controller": "3.0.0", - "argsarray": "0.0.1", - "buffer-from": "1.1.2", - "clone-buffer": "1.0.0", - "double-ended-queue": "2.1.0-0", - "fetch-cookie": "0.11.0", - "immediate": "3.3.0", - "inherits": "2.0.4", - "level": "6.0.1", - "level-codec": "9.0.2", - "level-write-stream": "1.0.0", - "leveldown": "5.6.0", - "levelup": "4.4.0", - "ltgt": "2.2.1", - "node-fetch": "2.6.7", - "readable-stream": "1.1.14", - "spark-md5": "3.0.2", - "through2": "3.0.2", - "uuid": "8.3.2", - "vuvuzela": "1.0.3" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true, - "optional": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true - } - } - }, - "pouchdb-abstract-mapreduce": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-abstract-mapreduce/-/pouchdb-abstract-mapreduce-7.3.0.tgz", - "integrity": "sha512-+2fVt3SDh7D776lIGbYZOsKX5js1aUyUw7iJaTGitxSdQ2ObWSTrr3SUrj5Qo1CkgPXwRM3Tdoq/53JYAa2qCA==", - "dev": true, - "optional": true, - "requires": { - "pouchdb-binary-utils": "7.3.0", - "pouchdb-collate": "7.3.0", - "pouchdb-collections": "7.3.0", - "pouchdb-errors": "7.3.0", - "pouchdb-fetch": "7.3.0", - "pouchdb-mapreduce-utils": "7.3.0", - "pouchdb-md5": "7.3.0", - "pouchdb-utils": "7.3.0" - } - }, - "pouchdb-adapter-leveldb-core": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-adapter-leveldb-core/-/pouchdb-adapter-leveldb-core-7.3.0.tgz", - "integrity": "sha512-OyUsEae1JlqR2jSGMohP03gj6VANh9fDR/3nPIa1vYyoQWlwQzOS7knKqDaJm7Nui3JC5q/lWos7/FGZBFuF5Q==", - "dev": true, - "optional": true, - "requires": { - "argsarray": "0.0.1", - "buffer-from": "1.1.2", - "double-ended-queue": "2.1.0-0", - "levelup": "4.4.0", - "pouchdb-adapter-utils": "7.3.0", - "pouchdb-binary-utils": "7.3.0", - "pouchdb-collections": "7.3.0", - "pouchdb-errors": "7.3.0", - "pouchdb-json": "7.3.0", - "pouchdb-md5": "7.3.0", - "pouchdb-merge": "7.3.0", - "pouchdb-utils": "7.3.0", - "sublevel-pouchdb": "7.3.0", - "through2": "3.0.2" - } - }, - "pouchdb-adapter-memory": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-adapter-memory/-/pouchdb-adapter-memory-7.3.0.tgz", - "integrity": "sha512-nUdYi5KpbUa0uv0L3IJorpiUnIOBPxX9qplCX9i7JE8OtLPeLyKuX3WC+3M1//8Lmmxg3b1wXSNIod6FJy4wAQ==", - "dev": true, - "optional": true, - "requires": { - "memdown": "1.4.1", - "pouchdb-adapter-leveldb-core": "7.3.0", - "pouchdb-utils": "7.3.0" - } - }, - "pouchdb-adapter-node-websql": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-adapter-node-websql/-/pouchdb-adapter-node-websql-7.0.0.tgz", - "integrity": "sha512-fNaOMO8bvMrRTSfmH4RSLSpgnKahRcCA7Z0jg732PwRbGvvMdGbreZwvKPPD1fg2tm2ZwwiXWK2G3+oXyoqZYw==", - "dev": true, - "optional": true, - "requires": { - "pouchdb-adapter-websql-core": "7.0.0", - "pouchdb-utils": "7.0.0", - "websql": "1.0.0" - }, - "dependencies": { - "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", - "dev": true, - "optional": true - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true, - "optional": true - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true, - "optional": true - }, - "pouchdb-binary-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-binary-utils/-/pouchdb-binary-utils-7.0.0.tgz", - "integrity": "sha512-yUktdOPIPvOVouCjJN3uop+bCcpdPwePrLm9eUAZNgEYnUFu0njdx7Q0WRsZ7UJ6l75HinL5ZHk4bnvEt86FLw==", - "dev": true, - "optional": true, - "requires": { - "buffer-from": "1.1.0" - } - }, - "pouchdb-collections": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-collections/-/pouchdb-collections-7.0.0.tgz", - "integrity": "sha512-DaoUr/vU24Q3gM6ghj0va9j/oBanPwkbhkvnqSyC3Dm5dgf5pculNxueLF9PKMo3ycApoWzHMh6N2N8KJbDU2Q==", - "dev": true, - "optional": true - }, - "pouchdb-errors": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-errors/-/pouchdb-errors-7.0.0.tgz", - "integrity": "sha512-dTusY8nnTw4HIztCrNl7AoGgwvS1bVf/3/97hDaGc4ytn72V9/4dK8kTqlimi3UpaurohYRnqac0SGXYP8vgXA==", - "dev": true, - "optional": true, - "requires": { - "inherits": "2.0.3" - } - }, - "pouchdb-md5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-md5/-/pouchdb-md5-7.0.0.tgz", - "integrity": "sha512-yaSJKhLA3QlgloKUQeb2hLdT3KmUmPfoYdryfwHZuPTpXIRKTnMQTR9qCIRUszc0ruBpDe53DRslCgNUhAyTNQ==", - "dev": true, - "optional": true, - "requires": { - "pouchdb-binary-utils": "7.0.0", - "spark-md5": "3.0.0" - } - }, - "pouchdb-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-utils/-/pouchdb-utils-7.0.0.tgz", - "integrity": "sha512-1bnoX1KdZYHv9wicDIFdO0PLiVIMzNDUBUZ/yOJZ+6LW6niQCB8aCv09ZztmKfSQcU5nnN3fe656tScBgP6dOQ==", - "dev": true, - "optional": true, - "requires": { - "argsarray": "0.0.1", - "clone-buffer": "1.0.0", - "immediate": "3.0.6", - "inherits": "2.0.3", - "pouchdb-collections": "7.0.0", - "pouchdb-errors": "7.0.0", - "pouchdb-md5": "7.0.0", - "uuid": "3.2.1" - } - }, - "spark-md5": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.0.tgz", - "integrity": "sha512-BpPFB0Oh83mi+6DRcFwxPx96f3OL8Tkq3hdvaHuXaQUsy5F3saI3zIPNQ/UsTQgyAXIHnML1waeCe1WoCPXbpQ==", - "dev": true, - "optional": true - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", - "dev": true, - "optional": true - } - } - }, - "pouchdb-adapter-utils": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-adapter-utils/-/pouchdb-adapter-utils-7.3.0.tgz", - "integrity": "sha512-mU1+smcagWSpInVx/VQk7VVjjnJlyagKtusUS3OdCMFZY35L6RbXC8eIhoNVDbkBfEv3cIwqQ3t7fdvkaa1odQ==", - "dev": true, - "optional": true, - "requires": { - "pouchdb-binary-utils": "7.3.0", - "pouchdb-collections": "7.3.0", - "pouchdb-errors": "7.3.0", - "pouchdb-md5": "7.3.0", - "pouchdb-merge": "7.3.0", - "pouchdb-utils": "7.3.0" - } - }, - "pouchdb-adapter-websql-core": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-adapter-websql-core/-/pouchdb-adapter-websql-core-7.0.0.tgz", - "integrity": "sha512-NyMaH0bl20SdJdOCzd+fwXo8JZ15a48/MAwMcIbXzsRHE4DjFNlRcWAcjUP6uN4Ezc+Gx+r2tkBBMf71mIz1Aw==", - "dev": true, - "optional": true, - "requires": { - "pouchdb-adapter-utils": "7.0.0", - "pouchdb-binary-utils": "7.0.0", - "pouchdb-collections": "7.0.0", - "pouchdb-errors": "7.0.0", - "pouchdb-json": "7.0.0", - "pouchdb-merge": "7.0.0", - "pouchdb-utils": "7.0.0" - }, - "dependencies": { - "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", - "dev": true, - "optional": true - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true, - "optional": true - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true, - "optional": true - }, - "pouchdb-adapter-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-adapter-utils/-/pouchdb-adapter-utils-7.0.0.tgz", - "integrity": "sha512-UWKPC6jkz6mHUzZefrU7P5X8ZGvBC8LSNZ7BIp0hWvJE6c20cnpDwedTVDpZORcCbVJpDmFOHBYnOqEIblPtbA==", - "dev": true, - "optional": true, - "requires": { - "pouchdb-binary-utils": "7.0.0", - "pouchdb-collections": "7.0.0", - "pouchdb-errors": "7.0.0", - "pouchdb-md5": "7.0.0", - "pouchdb-merge": "7.0.0", - "pouchdb-utils": "7.0.0" - } - }, - "pouchdb-binary-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-binary-utils/-/pouchdb-binary-utils-7.0.0.tgz", - "integrity": "sha512-yUktdOPIPvOVouCjJN3uop+bCcpdPwePrLm9eUAZNgEYnUFu0njdx7Q0WRsZ7UJ6l75HinL5ZHk4bnvEt86FLw==", - "dev": true, - "optional": true, - "requires": { - "buffer-from": "1.1.0" - } - }, - "pouchdb-collections": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-collections/-/pouchdb-collections-7.0.0.tgz", - "integrity": "sha512-DaoUr/vU24Q3gM6ghj0va9j/oBanPwkbhkvnqSyC3Dm5dgf5pculNxueLF9PKMo3ycApoWzHMh6N2N8KJbDU2Q==", - "dev": true, - "optional": true - }, - "pouchdb-errors": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-errors/-/pouchdb-errors-7.0.0.tgz", - "integrity": "sha512-dTusY8nnTw4HIztCrNl7AoGgwvS1bVf/3/97hDaGc4ytn72V9/4dK8kTqlimi3UpaurohYRnqac0SGXYP8vgXA==", - "dev": true, - "optional": true, - "requires": { - "inherits": "2.0.3" - } - }, - "pouchdb-json": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-json/-/pouchdb-json-7.0.0.tgz", - "integrity": "sha512-w0bNRu/7VmmCrFWMYAm62n30wvJJUT2SokyzeTyj3hRohj4GFwTRg1mSZ+iAmxgRKOFE8nzZstLG/WAB4Ymjew==", - "dev": true, - "optional": true, - "requires": { - "vuvuzela": "1.0.3" - } - }, - "pouchdb-md5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-md5/-/pouchdb-md5-7.0.0.tgz", - "integrity": "sha512-yaSJKhLA3QlgloKUQeb2hLdT3KmUmPfoYdryfwHZuPTpXIRKTnMQTR9qCIRUszc0ruBpDe53DRslCgNUhAyTNQ==", - "dev": true, - "optional": true, - "requires": { - "pouchdb-binary-utils": "7.0.0", - "spark-md5": "3.0.0" - } - }, - "pouchdb-merge": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-merge/-/pouchdb-merge-7.0.0.tgz", - "integrity": "sha512-tci5u6NpznQhGcPv4ho1h0miky9rs+ds/T9zQ9meQeDZbUojXNaX1Jxsb0uYEQQ+HMqdcQs3Akdl0/u0mgwPGg==", - "dev": true, - "optional": true - }, - "pouchdb-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pouchdb-utils/-/pouchdb-utils-7.0.0.tgz", - "integrity": "sha512-1bnoX1KdZYHv9wicDIFdO0PLiVIMzNDUBUZ/yOJZ+6LW6niQCB8aCv09ZztmKfSQcU5nnN3fe656tScBgP6dOQ==", - "dev": true, - "optional": true, - "requires": { - "argsarray": "0.0.1", - "clone-buffer": "1.0.0", - "immediate": "3.0.6", - "inherits": "2.0.3", - "pouchdb-collections": "7.0.0", - "pouchdb-errors": "7.0.0", - "pouchdb-md5": "7.0.0", - "uuid": "3.2.1" - } - }, - "spark-md5": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.0.tgz", - "integrity": "sha512-BpPFB0Oh83mi+6DRcFwxPx96f3OL8Tkq3hdvaHuXaQUsy5F3saI3zIPNQ/UsTQgyAXIHnML1waeCe1WoCPXbpQ==", - "dev": true, - "optional": true - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", - "dev": true, - "optional": true - } - } - }, - "pouchdb-binary-utils": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-binary-utils/-/pouchdb-binary-utils-7.3.0.tgz", - "integrity": "sha512-xvBH/XGHGcou2vkEzszJxkCc7YElfRUrkLUg51Jbdmh1mogLDUO0bU3Tj6TOIIJfRkQrU/HV+dDkMAhsil0amQ==", - "dev": true, - "optional": true, - "requires": { - "buffer-from": "1.1.2" - } - }, - "pouchdb-collate": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-collate/-/pouchdb-collate-7.3.0.tgz", - "integrity": "sha512-ys7rXKtEr6cfghgUjknwFJiOkITebV6JmeTybJKCzMV0r2luXu0OoPQsKVpE/wbM/3F5LxfpbFKGFpPcfGMvTA==", - "dev": true, - "optional": true - }, - "pouchdb-collections": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-collections/-/pouchdb-collections-7.3.0.tgz", - "integrity": "sha512-Xr54m2+fErShXn+qAT4xwqJ+8NwddNPeTMJT4z4k1sZsrwfHmZsWbsKAyGPMF04eQaaU+7DDRMciu2VzaBUXyg==", - "dev": true, - "optional": true - }, - "pouchdb-debug": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/pouchdb-debug/-/pouchdb-debug-7.2.1.tgz", - "integrity": "sha512-eP3ht/AKavLF2RjTzBM6S9gaI2/apcW6xvaKRQhEdOfiANqerFuksFqHCal3aikVQuDO+cB/cw+a4RyJn/glBw==", - "dev": true, - "optional": true, - "requires": { - "debug": "3.1.0" - } - }, - "pouchdb-errors": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-errors/-/pouchdb-errors-7.3.0.tgz", - "integrity": "sha512-dTBbIC1BbCy6J9W/Csg5xROgb3wJN3HpbgAJHHSEtAkb8oA45KZmU3ZwEpNhf0AfPuQm4XgW1936PvlDlGgJiw==", - "dev": true, - "optional": true, - "requires": { - "inherits": "2.0.4" - } - }, - "pouchdb-fetch": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-fetch/-/pouchdb-fetch-7.3.0.tgz", - "integrity": "sha512-8/lcg8iMDG+GVs1dHNXA4ktJSEpH71dHU3xesMJ25tNQOqfAaaWrkfz9j71ZYDDkveLYE6UjUzl/sDacu2hSjw==", - "dev": true, - "optional": true, - "requires": { - "abort-controller": "3.0.0", - "fetch-cookie": "0.11.0", - "node-fetch": "2.6.7" - } - }, - "pouchdb-find": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-find/-/pouchdb-find-7.3.0.tgz", - "integrity": "sha512-EwhnfyxCAkKf8PG4tfndTTygEmtuz+o1LiZkxfPrflfXA3m1jo1ithib0hwBYtEwEYWuZxH6B8pRZutbLoQCGA==", - "dev": true, - "optional": true, - "requires": { - "pouchdb-abstract-mapreduce": "7.3.0", - "pouchdb-collate": "7.3.0", - "pouchdb-errors": "7.3.0", - "pouchdb-fetch": "7.3.0", - "pouchdb-md5": "7.3.0", - "pouchdb-selector-core": "7.3.0", - "pouchdb-utils": "7.3.0" - } - }, - "pouchdb-json": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-json/-/pouchdb-json-7.3.0.tgz", - "integrity": "sha512-D4wyi20ltyiFpuziQeMk3CbXs/Q58VoGTYTJQY8MWBw37OidtHGQAt1Kh5yJ435wJqDzJZyxMA5RxGZxEOBDVg==", - "dev": true, - "optional": true, - "requires": { - "vuvuzela": "1.0.3" - } - }, - "pouchdb-mapreduce-utils": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-mapreduce-utils/-/pouchdb-mapreduce-utils-7.3.0.tgz", - "integrity": "sha512-KDVSd+H2r+XWTrQfKWV71SknDDYRjYXoeWs0ZQl3xITHCcTl+fIgqyagg/XN+Zy/U9LeLPGMe2JdgPx9H8lJgw==", - "dev": true, - "optional": true, - "requires": { - "argsarray": "0.0.1", - "inherits": "2.0.4", - "pouchdb-collections": "7.3.0", - "pouchdb-utils": "7.3.0" - } - }, - "pouchdb-md5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-md5/-/pouchdb-md5-7.3.0.tgz", - "integrity": "sha512-wL04QgoKyd/L/TV5gxgcvlEyCJiZoXCOEFJklTzkdza/kBQNJGPH7i0ZhKa7Sb+AvZYoWZHddf1Zgv7rBScHkA==", - "dev": true, - "optional": true, - "requires": { - "pouchdb-binary-utils": "7.3.0", - "spark-md5": "3.0.2" - } - }, - "pouchdb-merge": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-merge/-/pouchdb-merge-7.3.0.tgz", - "integrity": "sha512-E7LmchMzwYFm6V8OBxejzARLisanpksOju2LEfuiYnotGfNDeW7MByP0qBH0/zF8BfUyyjA1cl7ByaEpsapkeQ==", - "dev": true, - "optional": true - }, - "pouchdb-selector-core": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-selector-core/-/pouchdb-selector-core-7.3.0.tgz", - "integrity": "sha512-sK/cCrIGeL9ImcMhKGcwa54+bzX7Wv4hhVV+oUW3T1Nasaoxh+Muem1GuA+x1+SbTCE8y37rUg8i6DIOhX51ew==", - "dev": true, - "optional": true, - "requires": { - "pouchdb-collate": "7.3.0", - "pouchdb-utils": "7.3.0" - } - }, - "pouchdb-utils": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/pouchdb-utils/-/pouchdb-utils-7.3.0.tgz", - "integrity": "sha512-HH+5IXXWn/ZgVCSnrlydBMYn6MabT7RS7SNoo9w8qVH9efpZSp3eLchw6yMQNLw8LQefWmbbskiHV9VgJmSVWQ==", - "dev": true, - "optional": true, - "requires": { - "argsarray": "0.0.1", - "clone-buffer": "1.0.0", - "immediate": "3.3.0", - "inherits": "2.0.4", - "pouchdb-collections": "7.3.0", - "pouchdb-errors": "7.3.0", - "pouchdb-md5": "7.3.0", - "uuid": "8.3.2" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true - } - } - }, - "precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "prettier": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", - "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "prettier-plugin-solidity": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.2.tgz", - "integrity": "sha512-afn8Q0E0fY2I26fbagiBo1XRe7Cv/vs3t/N5Xbndzjgln+TXrtNxgWzhdZcFoZLN92WrFbxqqDoP6Lk5L80Fmw==", - "dev": true, - "requires": { - "@solidity-parser/parser": "^0.10.1", - "dir-to-object": "^2.0.0", - "emoji-regex": "^9.0.0", - "escape-string-regexp": "^4.0.0", - "prettier": "^2.0.5", - "semver": "^7.3.2", - "solidity-comments-extractor": "^0.0.4", - "string-width": "^4.2.0" - }, - "dependencies": { - "@solidity-parser/parser": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.10.2.tgz", - "integrity": "sha512-SFO5xlpR5rnqIds++4JDcXMG9b6KfslcxKoX+y19rizB0sNkv9mRs/TA5PhD4MrRbyaS60FkQ4updZtjPa4LjQ==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.0.tgz", - "integrity": "sha512-DNc3KFPK18bPdElMJnf/Pkv5TXhxFU3YFDEuGLDRtPmV4rkmCjBkCSEp22u6rBHdSN9Vlp/GK7k98prmE1Jgug==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", - "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", - "dev": true, - "requires": { - "asap": "~2.0.6" - } - }, - "promise-to-callback": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz", - "integrity": "sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA==", - "dev": true, - "requires": { - "is-fn": "^1.0.0", - "set-immediate-shim": "^1.0.1" - } - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "pure-rand": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.1.tgz", - "integrity": "sha512-ksWccjmXOHU2gJBnH0cK1lSYdvSZ0zLoCMSz/nTGh6hDvCSgcRxDyIcOBD6KNxFz3xhMPm/T267Tbe2JRymKEQ==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", - "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "optional": true - }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "randomhex": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/randomhex/-/randomhex-0.1.5.tgz", - "integrity": "sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU=", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", - "dev": true, - "requires": { - "picomatch": "^2.0.4" - } - }, - "redux": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", - "dev": true, - "requires": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" - } - }, - "redux-saga": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.0.0.tgz", - "integrity": "sha512-GvJWs/SzMvEQgeaw6sRMXnS2FghlvEGsHiEtTLpJqc/FHF3I5EE/B+Hq5lyHZ8LSoT2r/X/46uWvkdCnK9WgHA==", - "dev": true, - "requires": { - "@redux-saga/core": "^1.0.0" - } - }, - "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "req-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", - "integrity": "sha1-1AgrTURZgDZkD7c93qAe1T20nrw=", - "dev": true, - "requires": { - "req-from": "^2.0.0" - } - }, - "req-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", - "integrity": "sha1-10GI5H+TeW9Kpx327jWuaJ8+DnA=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.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.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", - "dev": true, - "requires": { - "request-promise-core": "1.1.3", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "reselect": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.6.tgz", - "integrity": "sha512-ZovIuXqto7elwnxyXbBtCPo9YFEr3uJqj2rRbcOOog1bmu2Ag85M4hixSwFWyaBMKXNgvPaJ9OSu9SkBPIeJHQ==", - "dev": true - }, - "reselect-tree": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/reselect-tree/-/reselect-tree-1.3.7.tgz", - "integrity": "sha512-kZN+C1cVJ6fFN2smSb0l4UvYZlRzttgnu183svH4NrU22cBY++ikgr2QT75Uuk4MYpv5gXSVijw4c5U6cx6GKg==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "json-pointer": "^0.6.1", - "reselect": "^4.0.0" - } - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "optional": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rlp": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.5.tgz", - "integrity": "sha512-y1QxTQOp0OZnjn19FxBmped4p+BSKPHwGndaqrESseyd2xXZtcgR3yuTIosh8CaMaOii9SKIYerBXnV/CpJ3qw==", - "requires": { - "bn.js": "^4.11.1" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", - "dev": true - }, - "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safe-event-emitter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz", - "integrity": "sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==", - "dev": true, - "requires": { - "events": "^3.0.0" - } - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" - }, - "scrypt-shim": { - "version": "git+ssh://git@github.com/web3-js/scrypt-shim.git#aafdadda13e660e25e1c525d1f5b2443f5eb1ebb", - "integrity": "sha512-6IAk8+6BiN9lMNh5kgAYRPbi7+ejRsJIOX0jh4/I1V7phSsoaizjBGfDrZHpeAcq1IwOVlNetHS4/a+JR2hyZA==", - "from": "scrypt-shim@github:web3-js/scrypt-shim", - "requires": { - "scryptsy": "^2.1.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "scryptsy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", - "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" - }, - "secp256k1": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz", - "integrity": "sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==", - "requires": { - "bindings": "^1.5.0", - "bip66": "^1.1.5", - "bn.js": "^4.11.8", - "create-hash": "^1.2.0", - "drbg.js": "^1.0.1", - "elliptic": "^6.5.2", - "nan": "^2.14.0", - "safe-buffer": "^5.1.2" - } - }, - "seek-bzip": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", - "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", - "requires": { - "commander": "~2.8.1" - }, - "dependencies": { - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "requires": { - "graceful-readlink": ">= 1.0.0" - } - } - } - }, - "semaphore": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", - "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "sentence-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", - "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case-first": "^1.1.2" - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "servify": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", - "requires": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "sha1": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", - "integrity": "sha1-rdqnqTFo85PxnrKxUJFhjicA+Eg=", - "dev": true, - "requires": { - "charenc": ">= 0.0.1", - "crypt": ">= 0.0.1" - } - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" - }, - "simple-get": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", - "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", - "requires": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - } - } - }, - "snake-case": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", - "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - } - }, - "sol-digger": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/sol-digger/-/sol-digger-0.0.2.tgz", - "integrity": "sha1-QGxKnTHiaef4jrHC6hATGOXgkCU=", - "dev": true - }, - "sol-explore": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/sol-explore/-/sol-explore-1.6.1.tgz", - "integrity": "sha1-tZ8HPGn+MyVg1aEMMrqMp/KYbPs=", - "dev": true - }, - "solc": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.5.17.tgz", - "integrity": "sha512-qpX+PGaU0Q3c6lh2vDzMoIbhv6bIrecI4bYsx+xUs01xsGFnY6Nr0L8y/QMyutTnrHN6Lb/Yl672ZVRqxka96w==", - "dev": true, - "requires": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "dependencies": { - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "dev": true - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - } - } - }, - "solidity-comments-extractor": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.4.tgz", - "integrity": "sha512-58glBODwXIKMaQ7rfcJOrWtFQMMOK28tJ0/LcB5Xhu7WtAxk4UX2fpgKPuaL41XjMp/y0gAa1MTLqk018wuSzA==", - "dev": true - }, - "solium": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/solium/-/solium-1.2.5.tgz", - "integrity": "sha512-NuNrm7fp8JcDN/P+SAdM5TVa4wYDtwVtLY/rG4eBOZrC5qItsUhmQKR/YhjszaEW4c8tNUYhkhQcwOsS25znpw==", - "dev": true, - "requires": { - "ajv": "^5.2.2", - "chokidar": "^1.6.0", - "colors": "^1.1.2", - "commander": "^2.9.0", - "diff": "^3.5.0", - "eol": "^0.9.1", - "js-string-escape": "^1.0.1", - "lodash": "^4.14.2", - "sol-digger": "0.0.2", - "sol-explore": "1.6.1", - "solium-plugin-security": "0.1.1", - "solparse": "2.2.8", - "text-table": "^0.2.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - } - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "solium-config-keep": { - "version": "git+ssh://git@github.com/keep-network/solium-config-keep.git#7ea21310ee14f12d65532ff7e3c79b0492d238ce", - "integrity": "sha512-394C5+yo91PBdreNvXYX4A56KAJgEA3qMomE+WskW+u2Jf5sPnpH4UyRHGxRw98onQna4kUSwiFH4FUcbmoFLA==", - "dev": true, - "from": "solium-config-keep@github:keep-network/solium-config-keep#0.1.2" - }, - "solium-plugin-security": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/solium-plugin-security/-/solium-plugin-security-0.1.1.tgz", - "integrity": "sha512-kpLirBwIq4mhxk0Y/nn5cQ6qdJTI+U1LO3gpoNIcqNaW+sI058moXBe2UiHs+9wvF9IzYD49jcKhFTxcR9u9SQ==", - "dev": true - }, - "solparse": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/solparse/-/solparse-2.2.8.tgz", - "integrity": "sha512-Tm6hdfG72DOxD40SD+T5ddbekWglNWjzDRSNq7ZDIOHVsyaJSeeunUuWNj4DE7uDrJK3tGQuX0ZTDZWNYsGPMA==", - "dev": true, - "requires": { - "mocha": "^4.0.1", - "pegjs": "^0.10.0", - "yargs": "^10.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - } - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", - "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", - "dev": true, - "requires": { - "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": "^8.1.0" - } - }, - "yargs-parser": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", - "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spark-md5": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz", - "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==", - "dev": true, - "optional": true - }, - "spinnies": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/spinnies/-/spinnies-0.4.3.tgz", - "integrity": "sha512-TTA2vWXrXJpfThWAl2t2hchBnCMI1JM5Wmb2uyI7Zkefdw/xO98LDy6/SBYwQPiYXL3swx3Eb44ZxgoS8X5wpA==", - "requires": { - "chalk": "^2.4.2", - "cli-cursor": "^3.0.0", - "strip-ansi": "^5.2.0" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sqlite3": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.2.0.tgz", - "integrity": "sha512-roEOz41hxui2Q7uYnWsjMOTry6TcNUNmp8audCx18gF10P2NknwdpF+E+HKvz/F2NvPKGGBF4NGc+ZPQ+AABwg==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.11.0" - } - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "requires": { - "is-natural-number": "^4.0.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "sublevel-pouchdb": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/sublevel-pouchdb/-/sublevel-pouchdb-7.3.0.tgz", - "integrity": "sha512-zp7u4jmv2N/s+dXZkWTtL4BjREs3SZ1nGBNNJ8RWX4yqN59oHgKmti4CfVOqfsAW9RMasmTqQAEPxL9hX8+CIA==", - "dev": true, - "optional": true, - "requires": { - "inherits": "2.0.4", - "level-codec": "9.0.2", - "ltgt": "2.2.1", - "readable-stream": "1.1.14" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true, - "optional": true - } - } - }, - "super-split": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/super-split/-/super-split-1.1.0.tgz", - "integrity": "sha512-I4bA5mgcb6Fw5UJ+EkpzqXfiuvVGS/7MuND+oBxNFmxu3ugLNrdIatzBLfhFRMVMLxgSsRy+TjIktgkF9RFSNQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "swap-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", - "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", - "dev": true, - "requires": { - "lower-case": "^1.1.1", - "upper-case": "^1.1.1" - } - }, - "swarm-js": { - "version": "0.1.39", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.39.tgz", - "integrity": "sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg==", - "requires": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "decompress": "^4.0.0", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request-promise": "^0.1.2" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - } - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { - "prepend-http": "^1.0.1" - } - } - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true - }, - "sync-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", - "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", - "dev": true, - "requires": { - "http-response-object": "^3.0.1", - "sync-rpc": "^1.2.1", - "then-request": "^6.0.0" - } - }, - "sync-rpc": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", - "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", - "dev": true, - "requires": { - "get-port": "^3.1.0" - } - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "tar": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", - "requires": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "then-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", - "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", - "dev": true, - "requires": { - "@types/concat-stream": "^1.6.0", - "@types/form-data": "0.0.33", - "@types/node": "^8.0.0", - "@types/qs": "^6.2.31", - "caseless": "~0.12.0", - "concat-stream": "^1.6.0", - "form-data": "^2.2.0", - "http-basic": "^8.1.1", - "http-response-object": "^3.0.1", - "promise": "^8.0.0", - "qs": "^6.4.0" - }, - "dependencies": { - "@types/node": { - "version": "8.10.61", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.61.tgz", - "integrity": "sha512-l+zSbvT8TPRaCxL1l9cwHCb0tSqGAGcjPJFItGGYat5oCTiq1uQQKYg5m7AF1mgnEBzFXGLJ2LRmNjtreRX76Q==", - "dev": true - } - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "dev": true, - "optional": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" - } - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "tiny-queue": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tiny-queue/-/tiny-queue-0.2.1.tgz", - "integrity": "sha512-EijGsv7kzd9I9g0ByCl6h42BWNGUZrlCSejfrb3AKeHC33SGbASu1VDf5O3rRiiUOhAC9CHdZxFPbZu0HmR70A==", - "dev": true, - "optional": true - }, - "tiny-secp256k1": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz", - "integrity": "sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==", - "dev": true, - "requires": { - "bindings": "^1.3.0", - "bn.js": "^4.11.8", - "create-hmac": "^1.1.7", - "elliptic": "^6.4.0", - "nan": "^2.13.2" - } - }, - "tiny-typed-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", - "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==", - "dev": true, - "optional": true - }, - "title-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", - "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.0.3" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", - "dev": true - }, - "tomlify-j0.4": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tomlify-j0.4/-/tomlify-j0.4-3.0.0.tgz", - "integrity": "sha512-2Ulkc8T7mXJ2l0W476YC/A209PR38Nw8PuaCNtk9uI3t1zzFdGQeWYGQvmj2PZkVvRC/Yoi4xQKMRnWc/N29tQ==", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "truffle": { - "version": "5.5.20", - "resolved": "https://registry.npmjs.org/truffle/-/truffle-5.5.20.tgz", - "integrity": "sha512-Ixh6tmK5s/fC4KNuu1zlYrSTkJWesKemXimf/L8UugBuU2RTSgmo/JI00Jq1EbqCSMAtbze6G5ca2UU2vZnCkQ==", - "dev": true, - "requires": { - "@truffle/db": "^1.0.12", - "@truffle/db-loader": "^0.1.22", - "@truffle/debugger": "^10.0.16", - "app-module-path": "^2.2.0", - "ganache": "7.2.0", - "mocha": "9.2.2", - "original-require": "^1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", - "dev": true, - "requires": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - } - } - } - }, - "truffle-flattener": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/truffle-flattener/-/truffle-flattener-1.4.4.tgz", - "integrity": "sha512-S/WmvubzlUj1mn56wEI6yo1bmPpKDNdEe5rtyVC1C5iNfZWobD/V69pAYI15IBDJrDqUyh+iXgpTkzov50zpQw==", - "requires": { - "@resolver-engine/imports-fs": "^0.2.2", - "@solidity-parser/parser": "^0.6.0", - "find-up": "^2.1.0", - "mkdirp": "^1.0.4", - "tsort": "0.0.1" - } - }, - "truffle-plugin-verify": { - "version": "0.5.26", - "resolved": "https://registry.npmjs.org/truffle-plugin-verify/-/truffle-plugin-verify-0.5.26.tgz", - "integrity": "sha512-TFpmh2vBNLLFo9GxV+vf91XPs5cox9C5yd+cTKeLF1j2e/C1izUsc+5upG7fLJhuDOvKMB8X8S8ELKmSKRh+/g==", - "dev": true, - "requires": { - "axios": "^0.26.1", - "cli-logger": "^0.5.40", - "delay": "^5.0.0", - "querystring": "^0.2.1", - "tunnel": "0.0.6" - }, - "dependencies": { - "axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", - "dev": true, - "requires": { - "follow-redirects": "^1.14.8" - } - }, - "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", - "dev": true - } - } - }, - "try-require": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/try-require/-/try-require-1.2.1.tgz", - "integrity": "sha1-NEiaLKwMCcHMEO2RugEVlNQzO+I=", - "dev": true - }, - "ts-node": { - "version": "8.10.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", - "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", - "dev": true, - "requires": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - } - } - }, - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - }, - "tsort": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y=" - }, - "tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "tweetnacl-util": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", - "dev": true - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typeforce": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", - "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==", - "dev": true - }, - "typescript": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", - "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", - "dev": true - }, - "typescript-compare": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz", - "integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==", - "dev": true, - "requires": { - "typescript-logic": "^0.0.0" - } - }, - "typescript-logic": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz", - "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==", - "dev": true - }, - "typescript-tuple": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-2.2.1.tgz", - "integrity": "sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==", - "dev": true, - "requires": { - "typescript-compare": "^0.0.2" - } - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - } - } - }, - "unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "update-browserslist-db": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz", - "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", - "dev": true - }, - "upper-case-first": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", - "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", - "dev": true, - "requires": { - "upper-case": "^1.1.1" - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "requires": { - "prepend-http": "^2.0.0" - } - }, - "url-set-query": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "utf-8-validate": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.4.tgz", - "integrity": "sha512-MEF05cPSq3AwJ2C7B7sHAA6i53vONoZbMGX8My5auEVm6W+dJ2Jd/TZPyGJ5CH42V2XtbI5FD28HeHeqlPzZ3Q==", - "dev": true, - "requires": { - "node-gyp-build": "^4.2.0" - } - }, - "utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" - }, - "util": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", - "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" - }, - "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", - "dev": true - }, - "value-or-promise": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz", - "integrity": "sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg==", - "dev": true, - "optional": true - }, - "varint": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vuvuzela": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/vuvuzela/-/vuvuzela-1.0.3.tgz", - "integrity": "sha512-Tm7jR1xTzBbPW+6y1tknKiEhz04Wf/1iZkcTJjSFcpNko43+dFW6+OOeQe9taJIug3NdfUAjFKgUSyQrIKaDvQ==", - "dev": true, - "optional": true - }, - "web3": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.3.0.tgz", - "integrity": "sha512-4q9dna0RecnrlgD/bD1C5S+81Untbd6Z/TBD7rb+D5Bvvc0Wxjr4OP70x+LlnwuRDjDtzBwJbNUblh2grlVArw==", - "dev": true, - "requires": { - "web3-bzz": "1.3.0", - "web3-core": "1.3.0", - "web3-eth": "1.3.0", - "web3-eth-personal": "1.3.0", - "web3-net": "1.3.0", - "web3-shh": "1.3.0", - "web3-utils": "1.3.0" - }, - "dependencies": { - "@ethersproject/abi": { - "version": "5.0.0-beta.153", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz", - "integrity": "sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==", - "dev": true, - "requires": { - "@ethersproject/address": ">=5.0.0-beta.128", - "@ethersproject/bignumber": ">=5.0.0-beta.130", - "@ethersproject/bytes": ">=5.0.0-beta.129", - "@ethersproject/constants": ">=5.0.0-beta.128", - "@ethersproject/hash": ">=5.0.0-beta.128", - "@ethersproject/keccak256": ">=5.0.0-beta.127", - "@ethersproject/logger": ">=5.0.0-beta.129", - "@ethersproject/properties": ">=5.0.0-beta.131", - "@ethersproject/strings": ">=5.0.0-beta.130" - } - }, - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "bignumber.js": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", - "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", - "dev": true - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true - }, - "oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", - "dev": true, - "requires": { - "http-https": "^1.0.0" - } - }, - "scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "web3-core": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.3.0.tgz", - "integrity": "sha512-BwWvAaKJf4KFG9QsKRi3MNoNgzjI6szyUlgme1qNPxUdCkaS3Rdpa0VKYNHP7M/YTk82/59kNE66mH5vmoaXjA==", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.5", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-core-requestmanager": "1.3.0", - "web3-utils": "1.3.0" - } - }, - "web3-core-helpers": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.3.0.tgz", - "integrity": "sha512-+MFb1kZCrRctf7UYE7NCG4rGhSXaQJ/KF07di9GVK1pxy1K0+rFi61ZobuV1ky9uQp+uhhSPts4Zp55kRDB5sw==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-eth-iban": "1.3.0", - "web3-utils": "1.3.0" - } - }, - "web3-core-method": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.3.0.tgz", - "integrity": "sha512-h0yFDrYVzy5WkLxC/C3q+hiMnzxdWm9p1T1rslnuHgOp6nYfqzu/6mUIXrsS4h/OWiGJt+BZ0xVZmtC31HDWtg==", - "dev": true, - "requires": { - "@ethersproject/transactions": "^5.0.0-beta.135", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0", - "web3-core-promievent": "1.3.0", - "web3-core-subscriptions": "1.3.0", - "web3-utils": "1.3.0" - } - }, - "web3-core-promievent": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.3.0.tgz", - "integrity": "sha512-blv69wrXw447TP3iPvYJpllkhW6B18nfuEbrfcr3n2Y0v1Jx8VJacNZFDFsFIcgXcgUIVCtOpimU7w9v4+rtaw==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-core-requestmanager": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.3.0.tgz", - "integrity": "sha512-3yMbuGcomtzlmvTVqNRydxsx7oPlw3ioRL6ReF9PeNYDkUsZaUib+6Dp5eBt7UXh5X+SIn/xa1smhDHz5/HpAw==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0", - "web3-providers-http": "1.3.0", - "web3-providers-ipc": "1.3.0", - "web3-providers-ws": "1.3.0" - } - }, - "web3-core-subscriptions": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.3.0.tgz", - "integrity": "sha512-MUUQUAhJDb+Nz3S97ExVWveH4utoUnsbPWP+q1HJH437hEGb4vunIb9KvN3hFHLB+aHJfPeStM/4yYTz5PeuyQ==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0" - } - }, - "web3-eth": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.3.0.tgz", - "integrity": "sha512-/bzJcxXPM9EM18JM5kO2JjZ3nEqVo3HxqU93aWAEgJNqaP/Lltmufl2GpvIB2Hvj+FXAjAXquxUdQ2/xP7BzHQ==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-core-subscriptions": "1.3.0", - "web3-eth-abi": "1.3.0", - "web3-eth-accounts": "1.3.0", - "web3-eth-contract": "1.3.0", - "web3-eth-ens": "1.3.0", - "web3-eth-iban": "1.3.0", - "web3-eth-personal": "1.3.0", - "web3-net": "1.3.0", - "web3-utils": "1.3.0" - } - }, - "web3-eth-abi": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.3.0.tgz", - "integrity": "sha512-1OrZ9+KGrBeBRd3lO8upkpNua9+7cBsQAgor9wbA25UrcUYSyL8teV66JNRu9gFxaTbkpdrGqM7J/LXpraXWrg==", - "dev": true, - "requires": { - "@ethersproject/abi": "5.0.0-beta.153", - "underscore": "1.9.1", - "web3-utils": "1.3.0" - } - }, - "web3-eth-accounts": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.3.0.tgz", - "integrity": "sha512-/Q7EVW4L2wWUbNRtOTwAIrYvJid/5UnKMw67x/JpvRMwYC+e+744P536Ja6SG4X3MnzFvd3E/jruV4qa6k+zIw==", - "dev": true, - "requires": { - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", - "scrypt-js": "^3.0.1", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-utils": "1.3.0" - } - }, - "web3-eth-contract": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.3.0.tgz", - "integrity": "sha512-3SCge4SRNCnzLxf0R+sXk6vyTOl05g80Z5+9/B5pERwtPpPWaQGw8w01vqYqsYBKC7zH+dxhMaUgVzU2Dgf7bQ==", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.5", - "underscore": "1.9.1", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-core-promievent": "1.3.0", - "web3-core-subscriptions": "1.3.0", - "web3-eth-abi": "1.3.0", - "web3-utils": "1.3.0" - } - }, - "web3-eth-ens": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.3.0.tgz", - "integrity": "sha512-WnOru+EcuM5dteiVYJcHXo/I7Wq+ei8RrlS2nir49M0QpYvUPGbCGgTbifcjJQTWamgORtWdljSA1s2Asdb74w==", - "dev": true, - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-promievent": "1.3.0", - "web3-eth-abi": "1.3.0", - "web3-eth-contract": "1.3.0", - "web3-utils": "1.3.0" - } - }, - "web3-eth-iban": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.3.0.tgz", - "integrity": "sha512-v9mZWhR4fPF17/KhHLiWir4YHWLe09O3B/NTdhWqw3fdAMJNztzMHGzgHxA/4fU+rhrs/FhDzc4yt32zMEXBZw==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "web3-utils": "1.3.0" - } - }, - "web3-eth-personal": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.3.0.tgz", - "integrity": "sha512-2czUhElsJdLpuNfun9GeLiClo5O6Xw+bLSjl3f4bNG5X2V4wcIjX2ygep/nfstLLtkz8jSkgl/bV7esANJyeRA==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-net": "1.3.0", - "web3-utils": "1.3.0" - } - }, - "web3-net": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.3.0.tgz", - "integrity": "sha512-Xz02KylOyrB2YZzCkysEDrY7RbKxb7LADzx3Zlovfvuby7HBwtXVexXKtoGqksa+ns1lvjQLLQGb+OeLi7Sr7w==", - "dev": true, - "requires": { - "web3-core": "1.3.0", - "web3-core-method": "1.3.0", - "web3-utils": "1.3.0" - } - }, - "web3-providers-http": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.3.0.tgz", - "integrity": "sha512-cMKhUI6PqlY/EC+ZDacAxajySBu8AzW8jOjt1Pe/mbRQgS0rcZyvLePGTTuoyaA8C21F8UW+EE5jj7YsNgOuqA==", - "dev": true, - "requires": { - "web3-core-helpers": "1.3.0", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.3.0.tgz", - "integrity": "sha512-0CrLuRofR+1J38nEj4WsId/oolwQEM6Yl1sOt41S/6bNI7htdkwgVhSloFIMJMDFHtRw229QIJ6wIaKQz0X1Og==", - "dev": true, - "requires": { - "oboe": "2.1.5", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0" - } - }, - "web3-providers-ws": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.3.0.tgz", - "integrity": "sha512-Im5MthhJnJst8nSoq0TgbyOdaiFQFa5r6sHPOVllhgIgViDqzbnlAFW9sNzQ0Q8VXPNfPIQKi9cOrHlSRNPjRw==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0", - "websocket": "^1.0.32" - } - }, - "web3-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz", - "integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - } - } - } - }, - "web3-bzz": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.3.0.tgz", - "integrity": "sha512-ibYAnKab+sgTo/UdfbrvYfWblXjjgSMgyy9/FHa6WXS14n/HVB+HfWqGz2EM3fok8Wy5XoKGMvdqvERQ/mzq1w==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40", - "underscore": "1.9.1" - }, - "dependencies": { - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", - "dev": true - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "swarm-js": { - "version": "0.1.40", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", - "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", - "dev": true, - "requires": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - }, - "dependencies": { - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - } - } - } - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - } - } - }, - "web3-core": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.2.tgz", - "integrity": "sha512-miHAX3qUgxV+KYfaOY93Hlc3kLW2j5fH8FJy6kSxAv+d4d5aH0wwrU2IIoJylQdT+FeenQ38sgsCnFu9iZ1hCQ==", - "requires": { - "@types/bn.js": "^4.11.4", - "@types/node": "^12.6.1", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-requestmanager": "1.2.2", - "web3-utils": "1.2.2" - }, - "dependencies": { - "@types/node": { - "version": "12.12.47", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.47.tgz", - "integrity": "sha512-yzBInQFhdY8kaZmqoL2+3U5dSTMrKaYcb561VU+lDzAYvqt+2lojvBEy+hmpSNuXnPTx7m9+04CzWYOUqWME2A==" - } - } - }, - "web3-core-helpers": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.2.tgz", - "integrity": "sha512-HJrRsIGgZa1jGUIhvGz4S5Yh6wtOIo/TMIsSLe+Xay+KVnbseJpPprDI5W3s7H2ODhMQTbogmmUFquZweW2ImQ==", - "requires": { - "underscore": "1.9.1", - "web3-eth-iban": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-core-method": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.2.tgz", - "integrity": "sha512-szR4fDSBxNHaF1DFqE+j6sFR/afv9Aa36OW93saHZnrh+iXSrYeUUDfugeNcRlugEKeUCkd4CZylfgbK2SKYJA==", - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2", - "web3-core-promievent": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-core-promievent": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.2.tgz", - "integrity": "sha512-tKvYeT8bkUfKABcQswK6/X79blKTKYGk949urZKcLvLDEaWrM3uuzDwdQT3BNKzQ3vIvTggFPX9BwYh0F1WwqQ==", - "requires": { - "any-promise": "1.3.0", - "eventemitter3": "3.1.2" - } - }, - "web3-core-requestmanager": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.2.tgz", - "integrity": "sha512-a+gSbiBRHtHvkp78U2bsntMGYGF2eCb6219aMufuZWeAZGXJ63Wc2321PCbA8hF9cQrZI4EoZ4kVLRI4OF15Hw==", - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2", - "web3-providers-http": "1.2.2", - "web3-providers-ipc": "1.2.2", - "web3-providers-ws": "1.2.2" - } - }, - "web3-core-subscriptions": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.2.tgz", - "integrity": "sha512-QbTgigNuT4eicAWWr7ahVpJyM8GbICsR1Ys9mJqzBEwpqS+RXTRVSkwZ2IsxO+iqv6liMNwGregbJLq4urMFcQ==", - "requires": { - "eventemitter3": "3.1.2", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2" - } - }, - "web3-eth": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.2.tgz", - "integrity": "sha512-UXpC74mBQvZzd4b+baD4Ocp7g+BlwxhBHumy9seyE/LMIcMlePXwCKzxve9yReNpjaU16Mmyya6ZYlyiKKV8UA==", - "requires": { - "underscore": "1.9.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-eth-abi": "1.2.2", - "web3-eth-accounts": "1.2.2", - "web3-eth-contract": "1.2.2", - "web3-eth-ens": "1.2.2", - "web3-eth-iban": "1.2.2", - "web3-eth-personal": "1.2.2", - "web3-net": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-eth-abi": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.2.tgz", - "integrity": "sha512-Yn/ZMgoOLxhTVxIYtPJ0eS6pnAnkTAaJgUJh1JhZS4ekzgswMfEYXOwpMaD5eiqPJLpuxmZFnXnBZlnQ1JMXsw==", - "requires": { - "ethers": "4.0.0-beta.3", - "underscore": "1.9.1", - "web3-utils": "1.2.2" - }, - "dependencies": { - "@types/node": { - "version": "10.17.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.26.tgz", - "integrity": "sha512-myMwkO2Cr82kirHY8uknNRHEVtn0wV3DTQfkrjx17jmkstDRZ24gNUdl8AHXVyVclTYI/bNjgTPTAWvWLqXqkw==" - }, - "elliptic": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", - "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "ethers": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.3.tgz", - "integrity": "sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog==", - "requires": { - "@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.3", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - }, - "scrypt-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", - "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=" - } - } - }, - "web3-eth-accounts": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.2.tgz", - "integrity": "sha512-KzHOEyXOEZ13ZOkWN3skZKqSo5f4Z1ogPFNn9uZbKCz+kSp+gCAEKxyfbOsB/JMAp5h7o7pb6eYsPCUBJmFFiA==", - "requires": { - "any-promise": "1.3.0", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.7", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", - "scrypt-shim": "github:web3-js/scrypt-shim", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-utils": "1.2.2" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - } - } - }, - "web3-eth-contract": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.2.tgz", - "integrity": "sha512-EKT2yVFws3FEdotDQoNsXTYL798+ogJqR2//CaGwx3p0/RvQIgfzEwp8nbgA6dMxCsn9KOQi7OtklzpnJMkjtA==", - "requires": { - "@types/bn.js": "^4.11.4", - "underscore": "1.9.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-promievent": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-eth-abi": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-eth-ens": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.2.tgz", - "integrity": "sha512-CFjkr2HnuyMoMFBoNUWojyguD4Ef+NkyovcnUc/iAb9GP4LHohKrODG4pl76R5u61TkJGobC2ij6TyibtsyVYg==", - "requires": { - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-promievent": "1.2.2", - "web3-eth-abi": "1.2.2", - "web3-eth-contract": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-eth-iban": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.2.tgz", - "integrity": "sha512-gxKXBoUhaTFHr0vJB/5sd4i8ejF/7gIsbM/VvemHT3tF5smnmY6hcwSMmn7sl5Gs+83XVb/BngnnGkf+I/rsrQ==", - "requires": { - "bn.js": "4.11.8", - "web3-utils": "1.2.2" - }, - "dependencies": { - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - } - } - }, - "web3-eth-personal": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.2.tgz", - "integrity": "sha512-4w+GLvTlFqW3+q4xDUXvCEMU7kRZ+xm/iJC8gm1Li1nXxwwFbs+Y+KBK6ZYtoN1qqAnHR+plYpIoVo27ixI5Rg==", - "requires": { - "@types/node": "^12.6.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-net": "1.2.2", - "web3-utils": "1.2.2" - }, - "dependencies": { - "@types/node": { - "version": "12.12.47", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.47.tgz", - "integrity": "sha512-yzBInQFhdY8kaZmqoL2+3U5dSTMrKaYcb561VU+lDzAYvqt+2lojvBEy+hmpSNuXnPTx7m9+04CzWYOUqWME2A==" - } - } - }, - "web3-net": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.2.tgz", - "integrity": "sha512-K07j2DXq0x4UOJgae65rWZKraOznhk8v5EGSTdFqASTx7vWE/m+NqBijBYGEsQY1lSMlVaAY9UEQlcXK5HzXTw==", - "requires": { - "web3-core": "1.2.2", - "web3-core-method": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-provider-engine": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-16.0.3.tgz", - "integrity": "sha512-Q3bKhGqLfMTdLvkd4TtkGYJHcoVQ82D1l8jTIwwuJp/sAp7VHnRYb9YJ14SW/69VMWoOhSpPLZV2tWb9V0WJoA==", - "dev": true, - "requires": { - "@ethereumjs/tx": "^3.3.0", - "async": "^2.5.0", - "backoff": "^2.5.0", - "clone": "^2.0.0", - "cross-fetch": "^2.1.0", - "eth-block-tracker": "^4.4.2", - "eth-json-rpc-filters": "^4.2.1", - "eth-json-rpc-infura": "^5.1.0", - "eth-json-rpc-middleware": "^6.0.0", - "eth-rpc-errors": "^3.0.0", - "eth-sig-util": "^1.4.2", - "ethereumjs-block": "^1.2.2", - "ethereumjs-util": "^5.1.5", - "ethereumjs-vm": "^2.3.4", - "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" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ws": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", - "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "web3-providers-http": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.2.tgz", - "integrity": "sha512-BNZ7Hguy3eBszsarH5gqr9SIZNvqk9eKwqwmGH1LQS1FL3NdoOn7tgPPdddrXec4fL94CwgNk4rCU+OjjZRNDg==", - "requires": { - "web3-core-helpers": "1.2.2", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.2.tgz", - "integrity": "sha512-t97w3zi5Kn/LEWGA6D9qxoO0LBOG+lK2FjlEdCwDQatffB/+vYrzZ/CLYVQSoyFZAlsDoBasVoYSWZK1n39aHA==", - "requires": { - "oboe": "2.1.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2" - } - }, - "web3-providers-ws": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.2.tgz", - "integrity": "sha512-Wb1mrWTGMTXOpJkL0yGvL/WYLt8fUIXx8k/l52QB2IiKzvyd42dTWn4+j8IKXGSYYzOm7NMqv6nhA5VDk12VfA==", - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2", - "websocket": "github:web3-js/WebSocket-Node#polyfill/globalThis" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "websocket": { - "version": "git+ssh://git@github.com/web3-js/WebSocket-Node.git#ef5ea2f41daf4a2113b80c9223df884b4d56c400", - "integrity": "sha512-fS64f2anyRmFjuEVoqTbtgtV4Ay1dQ6kP078yM1RxnF0+9hNYk4iirrtII6FIoNoNgmhhIqzQaadEU6ZRpGoEw==", - "from": "websocket@github:web3-js/WebSocket-Node#polyfill/globalThis", - "requires": { - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "nan": "^2.14.0", - "typedarray-to-buffer": "^3.1.5", - "yaeti": "^0.0.6" - } - } - } - }, - "web3-shh": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.3.0.tgz", - "integrity": "sha512-IZTojA4VCwVq+7eEIHuL1tJXtU+LJDhO8Y2QmuwetEWW1iBgWCGPHZasipWP+7kDpSm/5lo5GRxL72FF/Os/tA==", - "dev": true, - "requires": { - "web3-core": "1.3.0", - "web3-core-method": "1.3.0", - "web3-core-subscriptions": "1.3.0", - "web3-net": "1.3.0" - }, - "dependencies": { - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "bignumber.js": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", - "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", - "dev": true - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true - }, - "oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", - "dev": true, - "requires": { - "http-https": "^1.0.0" - } - }, - "web3-core": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.3.0.tgz", - "integrity": "sha512-BwWvAaKJf4KFG9QsKRi3MNoNgzjI6szyUlgme1qNPxUdCkaS3Rdpa0VKYNHP7M/YTk82/59kNE66mH5vmoaXjA==", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.5", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-core-requestmanager": "1.3.0", - "web3-utils": "1.3.0" - } - }, - "web3-core-helpers": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.3.0.tgz", - "integrity": "sha512-+MFb1kZCrRctf7UYE7NCG4rGhSXaQJ/KF07di9GVK1pxy1K0+rFi61ZobuV1ky9uQp+uhhSPts4Zp55kRDB5sw==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-eth-iban": "1.3.0", - "web3-utils": "1.3.0" - } - }, - "web3-core-method": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.3.0.tgz", - "integrity": "sha512-h0yFDrYVzy5WkLxC/C3q+hiMnzxdWm9p1T1rslnuHgOp6nYfqzu/6mUIXrsS4h/OWiGJt+BZ0xVZmtC31HDWtg==", - "dev": true, - "requires": { - "@ethersproject/transactions": "^5.0.0-beta.135", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0", - "web3-core-promievent": "1.3.0", - "web3-core-subscriptions": "1.3.0", - "web3-utils": "1.3.0" - } - }, - "web3-core-promievent": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.3.0.tgz", - "integrity": "sha512-blv69wrXw447TP3iPvYJpllkhW6B18nfuEbrfcr3n2Y0v1Jx8VJacNZFDFsFIcgXcgUIVCtOpimU7w9v4+rtaw==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-core-requestmanager": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.3.0.tgz", - "integrity": "sha512-3yMbuGcomtzlmvTVqNRydxsx7oPlw3ioRL6ReF9PeNYDkUsZaUib+6Dp5eBt7UXh5X+SIn/xa1smhDHz5/HpAw==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0", - "web3-providers-http": "1.3.0", - "web3-providers-ipc": "1.3.0", - "web3-providers-ws": "1.3.0" - } - }, - "web3-core-subscriptions": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.3.0.tgz", - "integrity": "sha512-MUUQUAhJDb+Nz3S97ExVWveH4utoUnsbPWP+q1HJH437hEGb4vunIb9KvN3hFHLB+aHJfPeStM/4yYTz5PeuyQ==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0" - } - }, - "web3-eth-iban": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.3.0.tgz", - "integrity": "sha512-v9mZWhR4fPF17/KhHLiWir4YHWLe09O3B/NTdhWqw3fdAMJNztzMHGzgHxA/4fU+rhrs/FhDzc4yt32zMEXBZw==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "web3-utils": "1.3.0" - } - }, - "web3-net": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.3.0.tgz", - "integrity": "sha512-Xz02KylOyrB2YZzCkysEDrY7RbKxb7LADzx3Zlovfvuby7HBwtXVexXKtoGqksa+ns1lvjQLLQGb+OeLi7Sr7w==", - "dev": true, - "requires": { - "web3-core": "1.3.0", - "web3-core-method": "1.3.0", - "web3-utils": "1.3.0" - } - }, - "web3-providers-http": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.3.0.tgz", - "integrity": "sha512-cMKhUI6PqlY/EC+ZDacAxajySBu8AzW8jOjt1Pe/mbRQgS0rcZyvLePGTTuoyaA8C21F8UW+EE5jj7YsNgOuqA==", - "dev": true, - "requires": { - "web3-core-helpers": "1.3.0", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.3.0.tgz", - "integrity": "sha512-0CrLuRofR+1J38nEj4WsId/oolwQEM6Yl1sOt41S/6bNI7htdkwgVhSloFIMJMDFHtRw229QIJ6wIaKQz0X1Og==", - "dev": true, - "requires": { - "oboe": "2.1.5", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0" - } - }, - "web3-providers-ws": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.3.0.tgz", - "integrity": "sha512-Im5MthhJnJst8nSoq0TgbyOdaiFQFa5r6sHPOVllhgIgViDqzbnlAFW9sNzQ0Q8VXPNfPIQKi9cOrHlSRNPjRw==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0", - "websocket": "^1.0.32" - } - }, - "web3-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz", - "integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - } - } - } - }, - "web3-utils": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.2.tgz", - "integrity": "sha512-joF+s3243TY5cL7Z7y4h1JsJpUCf/kmFmj+eJar7Y2yNIGVcW961VyrAms75tjUysSuHaUQ3eQXjBEUJueT52A==", - "requires": { - "bn.js": "4.11.8", - "eth-lib": "0.2.7", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, - "eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - } - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "websocket": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", - "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", - "dev": true, - "requires": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "websql": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/websql/-/websql-1.0.0.tgz", - "integrity": "sha512-7iZ+u28Ljw5hCnMiq0BCOeSYf0vCFQe/ORY0HgscTiKjQed8WqugpBUggJ2NTnB9fahn1kEnPRX2jf8Px5PhJw==", - "dev": true, - "optional": true, - "requires": { - "argsarray": "^0.0.1", - "immediate": "^3.2.2", - "noop-fn": "^1.0.0", - "sqlite3": "^4.0.0", - "tiny-queue": "^0.2.1" - } - }, - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", - "dev": true - }, - "whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "optional": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "which-typed-array": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", - "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.1", - "is-typed-array": "^1.1.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - } - } - }, - "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", - "dev": true - }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - } - } - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "wif": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", - "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=", - "dev": true, - "requires": { - "bs58check": "<3.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "write-stream": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/write-stream/-/write-stream-0.4.3.tgz", - "integrity": "sha512-IJrvkhbAnj89W/GAVdVgbnPiVw5Ntg/B4tc/MUCIEwj/g6JIww1DWJyB/yBMT3yw2/TkT6IUZ0+IYef3flEw8A==", - "dev": true, - "optional": true, - "requires": { - "readable-stream": "~0.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-0.0.4.tgz", - "integrity": "sha512-azrivNydKRYt7zwLV5wWUK7YzKTWs3q87xSmY6DlHapPrCvaT6ZrukvM5erV+yCSSPmZT8zkSdttOHQpWWm9zw==", - "dev": true, - "optional": true - } - } - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "xhr": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", - "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", - "requires": { - "global": "~4.3.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "xhr-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "requires": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" - } - }, - "xhr-request-promise": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", - "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", - "requires": { - "xhr-request": "^1.1.0" - } - }, - "xhr2-cookies": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", - "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", - "requires": { - "cookiejar": "^2.1.1" - } - }, - "xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", - "dev": true - }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" - }, - "xss": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.13.tgz", - "integrity": "sha512-clu7dxTm1e8Mo5fz3n/oW3UCXBfV89xZ72jM8yzo1vR/pIS0w3sgB3XV2H8Vm6zfGnHL0FzvLJPJEBhd86/z4Q==", - "dev": true, - "optional": true, - "requires": { - "commander": "^2.20.3", - "cssfilter": "0.0.10" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true - } - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } - }, - "yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} diff --git a/solidity-v1/package.json b/solidity-v1/package.json deleted file mode 100644 index 50126dd514..0000000000 --- a/solidity-v1/package.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "name": "@keep-network/keep-core", - "version": "1.8.1-dev", - "description": "Smart Contracts for the Keep Network Core", - "repository": { - "type": "git", - "url": "https://github.com/keep-network/keep-core.git" - }, - "files": [ - "contracts/**/*.sol", - "artifacts" - ], - "scripts": { - "truffle": "truffle", - "clean": "rm -rf build", - "compile": "npm run clean && truffle compile --contracts_build_directory=./build/truffle", - "test": "truffle compile && mocha --exit --recursive --timeout 75000", - "test:quick": "mocha --exit --recursive --timeout 45000", - "test:quick:watch": "mocha --watch --exit --recursive --timeout 45000", - "demo": "truffle migrate --reset && truffle exec ./scripts/delegate-tokens.js", - "lint": "npm run lint:js && npm run lint:sol", - "lint:js": "eslint .", - "lint:fix:js": "eslint . --fix", - "lint:sol": "solium -d contracts/ && prettier --check '**/*.sol'", - "lint:fix:sol": "solium -d contracts/ --fix && prettier --write '**/*.sol'" - }, - "author": "Satoshi Nakamoto 🤪", - "license": "MIT", - "bugs": { - "url": "https://github.com/keep-network/keep-core/issues" - }, - "homepage": "https://github.com/keep-network/keep-core/contracts/solidity-v1", - "dependencies": { - "@openzeppelin/upgrades": "^2.7.2", - "openzeppelin-solidity": "2.4.0" - }, - "devDependencies": { - "@celo/contractkit": "^1.0.1", - "@openzeppelin/test-environment": "^0.1.9", - "@openzeppelin/test-helpers": "^0.5.5", - "@truffle/hdwallet-provider": "^2.0.10", - "babel-polyfill": "^6.26.0", - "babel-preset-es2015": "^6.18.0", - "babel-preset-stage-2": "^6.18.0", - "babel-preset-stage-3": "^6.17.0", - "babel-register": "^6.26.0", - "bn-chai": "^1.0.1", - "chai": "^4.2.0", - "eslint": "^6.8.0", - "eslint-config-keep": "github:keep-network/eslint-config-keep#0.3.0", - "eth-gas-reporter": "^0.2.14", - "ethereumjs-abi": "^0.6.5", - "mocha": "^7.1.1", - "mocha-junit-reporter": "^1.23.1", - "prettier": "^2.2.1", - "prettier-plugin-solidity": "^1.0.0-beta.2 ", - "solc": "0.5.17", - "solium": "^1.2.5", - "solium-config-keep": "github:keep-network/solium-config-keep#0.1.2", - "toml": "^3.0.0", - "tomlify-j0.4": "^3.0.0", - "truffle": "^5.5.20", - "truffle-plugin-verify": "^0.5.26", - "websocket": "^1.0.28" - }, - "overrides": { - "http-cache-semantics": "^4.1.1", - "get-func-name": "^2.0.2" - } -} diff --git a/solidity-v1/requirements.txt b/solidity-v1/requirements.txt deleted file mode 100644 index 988e676e4d..0000000000 --- a/solidity-v1/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -git+git://github.com/keep-network/solidity-flattener diff --git a/solidity-v1/scripts/create-grants.js b/solidity-v1/scripts/create-grants.js deleted file mode 100644 index 032374976b..0000000000 --- a/solidity-v1/scripts/create-grants.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * This script creates various types of grants. - */ - -const KeepToken = artifacts.require("./KeepToken.sol") -const ManagedGrantFactory = artifacts.require("./ManagedGrantFactory.sol") -const ManagedGrant = artifacts.require("./ManagedGrant.sol") -const GuaranteedMinimumStakingPolicy = artifacts.require( - "./GuaranteedMinimumStakingPolicy.sol" -) - -function formatAmount(amount, decimals) { - return web3.utils - .toBN(amount) - .mul(web3.utils.toBN(10).pow(web3.utils.toBN(decimals))) -} - -function getAccounts() { - return new Promise((resolve, reject) => { - web3.eth.getAccounts((error, accounts) => { - resolve(accounts) - }) - }) -} - -module.exports = async function () { - try { - const accounts = await getAccounts() - const token = await KeepToken.deployed() - const managedGrantFactoryContract = await ManagedGrantFactory.deployed() - const policy = await GuaranteedMinimumStakingPolicy.deployed() - - const owner = accounts[0] - const newGrantee = accounts[1] - const grantee = owner - const duration = 1 - const start = (await web3.eth.getBlock("latest")).timestamp - const cliff = 1 - const revocable = false - const policyAddress = policy.address - - const managedGrantExtraData = web3.eth.abi.encodeParameters( - ["address", "uint256", "uint256", "uint256", "bool", "address"], - [grantee, duration, start, cliff, revocable, policyAddress] - ) - // Create managed grant - await token.approveAndCall( - managedGrantFactoryContract.address, - formatAmount(12300000, 18), - managedGrantExtraData, - { from: owner } - ) - // Get the address of managed grant contract from an event. - const managedGrant1Event = ( - await managedGrantFactoryContract.getPastEvents() - )[0] - const managedGrant1Address = managedGrant1Event.args["grantAddress"] - const managedGrant1 = await ManagedGrant.at(managedGrant1Address) - - // Reeasign grantee - await managedGrant1.requestGranteeReassignment(newGrantee, { from: owner }) - await managedGrant1.confirmGranteeReassignment(newGrantee, { from: owner }) - - // Create a second managed grant - await token.approveAndCall( - managedGrantFactoryContract.address, - formatAmount(456000000, 18), - managedGrantExtraData, - { from: owner } - ) - } catch (err) { - console.error("unexpected error:", err) - process.exit(1) - } - - process.exit() -} diff --git a/solidity-v1/scripts/delegate-tokens.js b/solidity-v1/scripts/delegate-tokens.js deleted file mode 100644 index f6a8b7023f..0000000000 --- a/solidity-v1/scripts/delegate-tokens.js +++ /dev/null @@ -1,81 +0,0 @@ -const KeepToken = artifacts.require("./KeepToken.sol") -const TokenStaking = artifacts.require("./TokenStaking.sol") -const KeepRandomBeaconOperator = artifacts.require( - "./KeepRandomBeaconOperator.sol" -) - -function formatAmount(amount, decimals) { - return web3.utils - .toBN(amount) - .mul(web3.utils.toBN(10).pow(web3.utils.toBN(decimals))) -} - -function getAccounts() { - return new Promise((resolve, reject) => { - web3.eth.getAccounts((error, accounts) => { - resolve(accounts) - }) - }) -} - -module.exports = async function () { - try { - const accounts = await getAccounts() - const token = await KeepToken.deployed() - const tokenStaking = await TokenStaking.deployed() - const operatorContract = await KeepRandomBeaconOperator.deployed() - - const owner = accounts[0] // The address of an owner of the staked tokens. - // accounts[1] up to [4] are the operators for the owner delegated stake and - // receivers of the rewards. - - // The number of accounts depends on the local setup of how many accounts were - // created. We limit the number of accounts to 5 for the testing purposes, but - // it might happen that there would be less than 5 accounts and in this case - // we take them all. - - // Stake delegate tokens for the first accounts (up to 5) as operators, - // including the first account where the owner is operating for itself. - const numberOfAccounts = Math.min(accounts.length, 5) - for (let i = 0; i < numberOfAccounts; i++) { - const operator = accounts[i] - const beneficiary = accounts[i] // The address where the rewards for participation are sent. - const authorizer = accounts[i] // Authorizer authorizes operator contracts the staker operates on. - - // The owner provides to the contract a beneficiary address and the operator address. - const delegation = - "0x" + - Buffer.concat([ - Buffer.from(beneficiary.substr(2), "hex"), - Buffer.from(operator.substr(2), "hex"), - Buffer.from(authorizer.substr(2), "hex"), - ]).toString("hex") - - staked = await token - .approveAndCall( - tokenStaking.address, - formatAmount(20000000, 18), - delegation, - { from: owner } - ) - .catch((err) => { - console.log(`could not stake KEEP tokens for ${operator}: ${err}`) - }) - - await tokenStaking.authorizeOperatorContract( - operator, - operatorContract.address, - { from: authorizer } - ) - - if (staked) { - console.log(`successfully staked KEEP tokens for account ${operator}`) - } - } - } catch (err) { - console.error("unexpected error:", err) - process.exit(1) - } - - process.exit() -} diff --git a/solidity-v1/scripts/etherscan-verify.sh b/solidity-v1/scripts/etherscan-verify.sh deleted file mode 100755 index 494d9299fd..0000000000 --- a/solidity-v1/scripts/etherscan-verify.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -set -e - -echo "Verifying contracts on Etherscan..." - -npx truffle run verify \ - AltBn128 \ - BeaconRewards \ - BLS \ - DelayFactor \ - DKGResultVerification \ - GasPriceOracle \ - GrantStaking \ - Groups \ - GroupSelection \ - GuaranteedMinimumStakingPolicy \ - KeepRandomBeaconOperator \ - KeepRandomBeaconOperatorStatistics \ - KeepRandomBeaconService \ - KeepRandomBeaconServiceImplV1 \ - KeepRegistry \ - KeepToken \ - KeepVault \ - Locks \ - ManagedGrantFactory \ - Migrations \ - MinimumStakeSchedule \ - ModUtils \ - OldTokenStaking \ - PermissiveStakingPolicy \ - Reimbursements \ - StakingPortBacker \ - TokenGrant \ - TokenStaking \ - TopUps \ - --network $TRUFFLE_NETWORK diff --git a/solidity-v1/scripts/gas-used-test.js b/solidity-v1/scripts/gas-used-test.js deleted file mode 100644 index e43339488c..0000000000 --- a/solidity-v1/scripts/gas-used-test.js +++ /dev/null @@ -1,41 +0,0 @@ -const KeepRandomBeaconOperator = artifacts.require( - "KeepRandomBeaconOperator.sol" -) - -module.exports = async function () { - try { - const contract = await KeepRandomBeaconOperator.deployed() - - for (let block = await web3.eth.getBlockNumber(); ; block++) { - while (block > (await web3.eth.getBlockNumber())) { - await wait(1000) - } - - const events = await contract.getPastEvents("allEvents", { - fromBlock: block, - toBlock: block, - }) - - for (let i = 0; i < events.length; i++) { - const event = events[i] - const transactionHash = event.transactionHash - const gasUsed = (await web3.eth.getTransactionReceipt(transactionHash)) - .gasUsed - console.log( - `Event [${ - event.event - }] with transaction [${transactionHash}] - gas used: ${parseInt( - gasUsed, - 16 - )}` - ) - } - } - } catch (error) { - console.log(error) - } -} - -function wait(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)) -} diff --git a/solidity-v1/scripts/generate-api-docs.js b/solidity-v1/scripts/generate-api-docs.js deleted file mode 100644 index 16aebc1165..0000000000 --- a/solidity-v1/scripts/generate-api-docs.js +++ /dev/null @@ -1,54 +0,0 @@ -const fs = require("fs") - -let doc = `:toc: true -:toclevels: 2 - -= Keep Random Beacon API Documentation - -Welcome to the Keep Random Beacon API Documentation. The primary contracts involved -are listed below, along with their public methods. - -toc::[] -` - -const jsonFiles = [ - "./build/contracts/KeepRandomBeaconServiceImplV1.json", - "./build/contracts/KeepRandomBeaconOperator.json", - "./build/contracts/KeepToken.json", - "./build/contracts/TokenStaking.json", - "./build/contracts/TokenGrant.json", -] - -jsonFiles.forEach((file) => { - const json = JSON.parse(fs.readFileSync(file, { encoding: "utf8" })) - let section = "== `" + json.contractName + "`\n\n" - - for (let i = 0; i < json.devdoc.methods.length; i++) { - const signature = json.devdoc.methods[i] - const props = json.devdoc.methods[signature] - - let subsection = "=== `" + signature + "`\n\n" - if (props.details) { - subsection += `${props.details}\n\n` - } - - if (props.params) { - for (let j = 0; j < props.params.length; j++) { - const paramName = props.params[j] - const paramDoc = props.params[paramName] - subsection += `\`${paramName}\`:: ` + paramDoc + "\n" - } - } - - if (props.return) { - subsection += `Returns:: ${props["return"]}` - } - - subsection += "\n\n" - section += subsection - } - - doc += section -}) - -console.log(doc) diff --git a/solidity-v1/scripts/genesis.js b/solidity-v1/scripts/genesis.js deleted file mode 100644 index e0f8c80434..0000000000 --- a/solidity-v1/scripts/genesis.js +++ /dev/null @@ -1,20 +0,0 @@ -const KeepRandomBeaconOperator = artifacts.require( - "KeepRandomBeaconOperator.sol" -) - -module.exports = async function () { - try { - const contract = await KeepRandomBeaconOperator.deployed() - - const dkgGas = await contract.dkgGasEstimate() - const gasPrice = await contract.gasPriceCeiling() - const dkgFee = dkgGas.mul(gasPrice) - - await contract.genesis({ value: dkgFee }) - console.log("Genesis successfully triggered.") - } catch (error) { - console.error("Could not trigger genesis", error) - } - - process.exit() -} diff --git a/solidity-v1/scripts/keep-token-geyser-init.js b/solidity-v1/scripts/keep-token-geyser-init.js deleted file mode 100644 index 1003fabb4d..0000000000 --- a/solidity-v1/scripts/keep-token-geyser-init.js +++ /dev/null @@ -1,58 +0,0 @@ -const KeepVault = artifacts.require("./geyser/KeepVault.sol") -const KeepToken = artifacts.require("./KeepToken.sol") -const BatchedPhasedEscrow = artifacts.require("./BatchedPhasedEscrow") -const KeepTokenGeyserRewardsEscrowBeneficiary = artifacts.require( - "./KeepTokenGeyserRewardsEscrowBeneficiary" -) - -module.exports = async function () { - try { - const accounts = await web3.eth.getAccounts() - const keepToken = await KeepToken.deployed() - const tokenGeyser = await KeepVault.deployed() - const rewardsAmount = web3.utils.toWei("100000", "ether") - - const owner = accounts[0] - - const initialEscrowBalance = web3.utils.toWei("500000", "ether") // 500k KEEP - - const escrow = await BatchedPhasedEscrow.new(keepToken.address, { - from: owner, - }) - - // Configure escrow beneficiary. - const escrowBeneficiary = await KeepTokenGeyserRewardsEscrowBeneficiary.new( - keepToken.address, - tokenGeyser.address, - { - from: owner, - } - ) - - await escrowBeneficiary.transferOwnership(escrow.address, { - from: owner, - }) - - await escrow.approveBeneficiary(escrowBeneficiary.address, { - from: owner, - }) - - await tokenGeyser.setRewardDistribution(escrowBeneficiary.address, { - from: owner, - }) - - await keepToken.approveAndCall(escrow.address, initialEscrowBalance, [], { - from: owner, - }) - - // Initiate withdraw. - await escrow.batchedWithdraw([escrowBeneficiary.address], [rewardsAmount], { - from: owner, - }) - } catch (err) { - console.error("unexpected error:", err) - process.exit(1) - } - - process.exit() -} diff --git a/solidity-v1/scripts/lcl-client-config.js b/solidity-v1/scripts/lcl-client-config.js deleted file mode 100644 index 7cecf926c6..0000000000 --- a/solidity-v1/scripts/lcl-client-config.js +++ /dev/null @@ -1,87 +0,0 @@ -/* -This script is used to update client configuration file with latest deployed contracts -addresses. - -Example: -KEEP_CORE_CONFIG_FILE_PATH=~go/src/github.com/keep-network/keep-core/config.toml \ - truffle exec scripts/lcl-client-config.js --network local -*/ -const fs = require("fs") -const toml = require("toml") -const tomlify = require("tomlify-j0.4") - -const KeepRandomBeaconOperator = artifacts.require("KeepRandomBeaconOperator") -const TokenStaking = artifacts.require("TokenStaking") -const KeepRandomBeaconService = artifacts.require("KeepRandomBeaconService") - -module.exports = async function () { - try { - const configFilePath = process.env.KEEP_CORE_CONFIG_FILE_PATH - - try { - await KeepRandomBeaconOperator.deployed() - await TokenStaking.deployed() - await KeepRandomBeaconService.deployed() - } catch (err) { - console.error("failed to get deployed contracts", err) - process.exit(1) - } - - try { - const fileContent = toml.parse(fs.readFileSync(configFilePath, "utf8")) - - fileContent.ethereum.ContractAddresses.KeepRandomBeaconOperator = - KeepRandomBeaconOperator.address - fileContent.ethereum.ContractAddresses.TokenStaking = TokenStaking.address - fileContent.ethereum.ContractAddresses.KeepRandomBeaconService = - KeepRandomBeaconService.address - - /* - tomlify.toToml() writes our Seed/Port values as a float. The added precision renders our config - file unreadable by the keep-client as it interprets 3919.0 as a string when it expects an int. - Here we format the default rendering to write the config file with Seed/Port values as needed. - */ - const formattedConfigFile = tomlify.toToml(fileContent, { - space: 2, - replace: (key, value) => { - let result - try { - result = - // We expect the config file to contain arrays, in such case key for - // each entry is its' index number. We verify if the key is a string - // so we can run the following match check. - typeof key === "string" && - // Find keys that match exactly `Port`, `MiningCheckInterval`, - // `MaxGasPrice`, `BalanceAlertThreshold` or end with - // `MetricsTick` or `Limit`. - key.match( - /(^Port|^MiningCheckInterval|^MaxGasPrice|^BalanceAlertThreshold|MetricsTick|Limit)$/ - ) - ? value.toFixed(0) // convert float to integer - : false // do nothing - } catch (err) { - console.error( - `tomlify replace failed for key ${key} and value ${value} with error: [${err}]` - ) - process.exit(1) - } - - return result - }, - }) - - fs.writeFileSync(configFilePath, formattedConfigFile, (err) => { - if (err) throw err - }) - - console.log(`keep-core config written to ${configFilePath}`) - } catch (err) { - console.error("failed to update keep-core client config", err) - process.exit(1) - } - } catch (err) { - console.error(err) - process.exit(1) - } - process.exit(0) -} diff --git a/solidity-v1/scripts/manage-stake.js b/solidity-v1/scripts/manage-stake.js deleted file mode 100644 index 807ee06856..0000000000 --- a/solidity-v1/scripts/manage-stake.js +++ /dev/null @@ -1,176 +0,0 @@ -/* - This script provides friendly interface to manage stake for development purposes. - - To stake KEEP tokens, use 'stake' command and provide three parameters: - - operator address - - amount of KEEP to stake - - KEEP owner address (we assume it's also beneficiary/authorizer address) - - $ truffle exec scripts/manage-stake.js stake 0x524f2E0176350d950fA630D9A5a59A0a190DAf48 10000 0xFa3DA235947AaB49D439f3BcB46effD1a7237E32 - - To undelegate, use 'undelegate' command and provide operator address as a parameter - - $ truffle exec scripts/manage-stake.js undelegate 0x524f2E0176350d950fA630D9A5a59A0a190DAf48 - - To recover stake, use 'recover-stake' command and provide operator address - as a parameter. Please bear in mind you may need to wait for the expected - undelegation period time to be able to recover stake. - - $ truffle exec scripts/manage-stake.js recover-stake 0x524f2E0176350d950fA630D9A5a59A0a190DAf48 - - To print information about the stake, use 'print-stake' command and provide - operator address as a parameter. - - $ truffle exec scripts/manage-stake.js print-stake 0x524f2E0176350d950fA630D9A5a59A0a190DAf48 -*/ -const KeepToken = artifacts.require("./KeepToken.sol") -const TokenStaking = artifacts.require("TokenStaking.sol") -const KeepRandomBeaconOperator = artifacts.require( - "KeepRandomBeaconOperator.sol" -) - -module.exports = async function () { - const keepToken = await KeepToken.deployed() - const tokenStaking = await TokenStaking.deployed() - const keepRandomBeaconOperator = await KeepRandomBeaconOperator.deployed() - - const operation = process.argv[4] - const operator = process.argv[5] - - switch (operation) { - case "stake": - await stake() - break - case "undelegate": - await undelegate() - break - case "recover-stake": - await recoverStake() - break - case "print-stake": - console.log(`Getting stake info for operator ${operator}`) - await printStakeInfo() - break - default: - console.log(`Unrecognized operation ${operation}`) - } - - async function stake() { - const amountToStake = process.argv[6] - const owner = process.argv[7] - const beneficiary = owner - const authorizer = owner - - console.log( - `Staking ${amountToStake} tokens from ${owner} to operator ${operator} using beneficiary ${beneficiary} and authorizer ${authorizer}` - ) - - const delegation = - "0x" + - Buffer.concat([ - Buffer.from(beneficiary.substr(2), "hex"), - Buffer.from(operator.substr(2), "hex"), - Buffer.from(authorizer.substr(2), "hex"), - ]).toString("hex") - - try { - staked = await keepToken.approveAndCall( - tokenStaking.address, - amountToStake, - delegation - ) - - if (staked) { - console.log(`successfully staked KEEP to ${operator}`) - } else { - console.log(`failed to stake KEEP to ${operator}`) - } - } catch (err) { - console.log(`could not stake KEEP to ${operator}: ${err}`) - } - - try { - await tokenStaking.authorizeOperatorContract( - operator, - keepRandomBeaconOperator.address, - { from: authorizer } - ) - } catch (err) { - console.log( - `could not authorize operator contract for ${operator}: ${err}` - ) - } - } - - async function undelegate() { - console.log(`Undelegate stake from operator ${operator}`) - - try { - await tokenStaking.undelegate(operator) - } catch (err) { - console.log(err) - } - } - - async function recoverStake() { - console.log(`Recover stake from operator ${operator}`) - - try { - await tokenStaking.recoverStake(operator) - } catch (err) { - console.log(err) - } - } - - async function printStakeInfo() { - try { - const owner = await getOwner() - if (owner == 0) { - console.log("No KEEP tokens staked for this operator") - return - } - - console.log(`KEEP owner: ${owner.toString()}`) - console.log( - `KEEP tokens available: ${(await getOwnerBalance()).toString()}` - ) - console.log( - `KEEP eligible stake: ${(await getEligibleStake()).toString()}` - ) - console.log( - `KEEP active stake: ${(await getActiveStake()).toString()}` - ) - console.log( - `Minimum stake: ${(await getMinimumStake()).toString()}` - ) - } catch (err) { - console.log(err) - } - } - - async function getOwner() { - return tokenStaking.ownerOf(operator) - } - - async function getEligibleStake() { - return tokenStaking.eligibleStake( - operator, - keepRandomBeaconOperator.address - ) - } - - async function getActiveStake() { - return tokenStaking.activeStake(operator, keepRandomBeaconOperator.address) - } - - async function getMinimumStake() { - return keepRandomBeaconOperator.minimumStake() - } - - async function getOwnerBalance() { - const owner = await getOwner() - return keepToken.balanceOf(owner) - } - - process.exit() -} diff --git a/solidity-v1/scripts/misbehaved-groups.js b/solidity-v1/scripts/misbehaved-groups.js deleted file mode 100644 index cbac53c64d..0000000000 --- a/solidity-v1/scripts/misbehaved-groups.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Important: the KeepRandomBeaconOperatorRewardsStub - * and the TokenStakingSlashingStubs contract should be deployed to the network! - * - * This script: - * - emits fake events (UnauthorizedSigningReported, RelayEntryTimeoutReported) - * */ - -// The KeepRandomBeaconOperatorRewardsStub contract should be deployed to the network -const KeepRandomBeaconOperator = artifacts.require( - "../stubs/KeepRandomBeaconOperatorRewardsStub.sol" -) -const crypto = require("crypto") - -function getAccounts() { - return new Promise((resolve, reject) => { - web3.eth.getAccounts((error, accounts) => { - resolve(accounts) - }) - }) -} - -async function registerNewGroup(keepRandomBeaconOperator, accounts) { - const groupPublicKey = crypto.randomBytes(32) - await keepRandomBeaconOperator.registerNewGroup(groupPublicKey) - await keepRandomBeaconOperator.setGroupMembers(groupPublicKey, [ - accounts[1], - accounts[2], - accounts[1], - ]) -} - -module.exports = async function () { - try { - const accounts = await getAccounts() - const keepRandomBeaconOperator = await KeepRandomBeaconOperator.deployed() - const owner = accounts[0] - await registerNewGroup(keepRandomBeaconOperator, accounts) - - await keepRandomBeaconOperator.reportUnauthorizedSigning( - 0, - Buffer.from("abc", "hex"), - { from: owner } - ) - await keepRandomBeaconOperator.reportRelayEntryTimeout({ from: owner }) - } catch (erorr) { - console.log("Unexpected error", erorr) - process.exit(1) - } - process.exit() -} diff --git a/solidity-v1/scripts/pricing-test.js b/solidity-v1/scripts/pricing-test.js deleted file mode 100644 index 2a37269287..0000000000 --- a/solidity-v1/scripts/pricing-test.js +++ /dev/null @@ -1,336 +0,0 @@ -const KeepRandomBeaconServiceImplV1 = artifacts.require( - "KeepRandomBeaconServiceImplV1.sol" -) -const KeepRandomBeaconService = artifacts.require("KeepRandomBeaconService.sol") -const KeepRandomBeaconOperator = artifacts.require( - "KeepRandomBeaconOperator.sol" -) -const KeepRandomBeaconOperatorStatistics = artifacts.require( - "KeepRandomBeaconOperatorStatistics.sol" -) -const fs = require("fs") - -// MAKE SURE NONE OF THOSE ACCOUNTS IS A MINER ACCOUNT -const requestor = "0x146748a2b46b99ee1470b587bc9812ea59b79597" - -const operators = [ - "0x65ea55c1f10491038425725dc00dffeab2a1e28a", - "0x524f2e0176350d950fa630d9a5a59a0a190daf48", - "0x3365d0ed0e526d3b1d8b417fc0fde5b1cef2f416", - "0x7020a5556ba1ce5f92c81063a13d33512cf1305c", -] - -const delay = 60000 // 1 min in milliseconds - -module.exports = async function () { - const keepRandomBeaconService = await KeepRandomBeaconService.deployed() - const contractService = await KeepRandomBeaconServiceImplV1.at( - keepRandomBeaconService.address - ) - const contractOperator = await KeepRandomBeaconOperator.deployed() - const contractStatistics = await KeepRandomBeaconOperatorStatistics.deployed() - - const accounts = operators.slice() - accounts.push(requestor) - - let count = 0 - let requestorAccountBalance = await web3.eth.getBalance(requestor) - let requestorPrevAccountBalance = 0 - - for (;;) { - try { - console.log("---------- count: " + count + " ----------\n") - - requestorPrevAccountBalance = requestorAccountBalance - - const prevBalances = new Array(accounts.length) - const prevRewards = new Array(accounts.length) - - for (let i = 0; i < accounts.length; i++) { - prevBalances[i] = await web3.eth.getBalance(accounts[i]) - prevRewards[i] = ( - await availableRewards( - accounts[i], - contractOperator, - contractStatistics - ) - ).toString() - } - - let rewardsSum = web3.utils.toBN(0) - for (let i = 0; i < accounts.length; i++) { - rewardsSum = rewardsSum.add(web3.utils.toBN(prevRewards[i])) - } - - const serviceContractBalance = await web3.eth.getBalance( - contractService.address - ) - const dkgFeePool = await contractService.dkgFeePool() - const requestSubsidyFeePool = await contractService.requestSubsidyFeePool() - const dkgContributionMargin = await contractService.dkgContributionMargin() - - const serviceContractSummary = new ServiceContractSummary( - serviceContractBalance, - dkgFeePool.toString(), - requestSubsidyFeePool.toString(), - dkgContributionMargin.toString(), - dkgFeePool.add(requestSubsidyFeePool).toString() === - serviceContractBalance - ) - - console.log("Service Contract Summary (before request)") - console.table([serviceContractSummary]) - console.log("\n") - - const operatorContractBalance = await web3.eth.getBalance( - contractOperator.address - ) - const dkgSubmitterReimbursementFee = await contractOperator.dkgSubmitterReimbursementFee() - - const operatorContractSummary = new OperatorContractSummary( - operatorContractBalance, - rewardsSum.toString(), - dkgSubmitterReimbursementFee.toString(), - rewardsSum.add(dkgSubmitterReimbursementFee).toString() === - operatorContractBalance - ) - - console.log("Operator Contract Summary (before request)") - console.table([operatorContractSummary]) - console.log("\n") - - const gasPrice = await web3.eth.getGasPrice() - - const callbackGas = 0 - const entryFeeEstimate = await contractService.entryFeeEstimate( - callbackGas - ) - const tx = await contractService.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: requestor, - }) - - await wait(delay) - - const txGasCost = tx.receipt.gasUsed - const txCost = web3.utils.toBN(gasPrice).mul(web3.utils.toBN(txGasCost)) - - requestorAccountBalance = await web3.eth.getBalance(requestor) - - const requestorAccountBalanceChange = web3.utils - .toBN(requestorAccountBalance) - .sub(web3.utils.toBN(requestorPrevAccountBalance)) - .toString() - - const pricingSummary = new PricingSummary( - callbackGas, - entryFeeEstimate.toString(), - txCost.toString(), - requestorAccountBalance, - requestorAccountBalanceChange, - operatorContractBalance, - rewardsSum.toString() - ) - - console.log("Pricing Summary") - console.table([pricingSummary]) - console.log("\n") - let file = pricingSummary.toString() - - const clientsTable = new Array(accounts.length) - - for (let i = 0; i < accounts.length; i++) { - const address = accounts[i] - const balance = await web3.eth.getBalance(address) - const balanceChange = web3.utils - .toBN(balance) - .sub(web3.utils.toBN(prevBalances[i])) - .toString() - - const reward = ( - await availableRewards(address, contractOperator, contractStatistics) - ).toString() - const rewardChange = web3.utils - .toBN(reward) - .sub(web3.utils.toBN(prevRewards[i])) - .toString() - - const pricingClient = new PricingClient( - address, - balance, - balanceChange, - reward, - rewardChange - ) - - clientsTable[i] = pricingClient - file = file + pricingClient.toString() - } - - console.log("Clients Summary") - console.table(clientsTable) - console.log("\n") - - // Write data in 'pricing.txt' . - fs.appendFile("pricing.txt", file + "\n", (err) => { - if (err) console.log(err) - }) - - count++ - } catch (error) { - console.error("Request failed with", error) - } - } -} - -async function availableRewards(account, contractOperator, contractStatistics) { - const expiredGroupCount = ( - await contractOperator.getFirstActiveGroupIndex() - ).toNumber() - const activeGroupCount = (await contractOperator.numberOfGroups()).toNumber() - const totalGroupCount = expiredGroupCount + activeGroupCount - const groupsPublicKeys = new Array(totalGroupCount) - - for (let groupIndex = 0; groupIndex < totalGroupCount; groupIndex++) { - groupsPublicKeys[groupIndex] = await contractOperator.getGroupPublicKey( - groupIndex - ) - } - - let accountRewards = web3.utils.toBN(0) - for (let i = 0; i < groupsPublicKeys.length; i++) { - const groupMembersCount = await contractStatistics.countGroupMembership( - groupsPublicKeys[i], - account - ) - const groupMemberReward = await contractOperator.getGroupMemberRewards( - groupsPublicKeys[i] - ) - accountRewards = accountRewards.add( - groupMembersCount.mul(groupMemberReward) - ) - } - - return accountRewards -} - -function ServiceContractSummary( - balance, - dkgFeePool, - requestSubsidyFeePool, - dkgContributionMargin, - hasCorrectBalance -) { - ;(this.balance = balance), (this.dkgFeePool = dkgFeePool) - this.requestSubsidyFeePool = requestSubsidyFeePool - this.dkgContributionMargin = dkgContributionMargin - this.hasCorrectBalance = hasCorrectBalance -} - -function OperatorContractSummary( - balance, - sumOfRewards, - dkgSubmitterReimbursementFee, - hasCorrectBalance -) { - this.balance = balance - this.sumOfRewards = sumOfRewards - this.dkgSubmitterReimbursementFee = dkgSubmitterReimbursementFee - this.hasCorrectBalance = hasCorrectBalance -} - -function PricingSummary( - callbackGas, - entryFeeEstimate, - relayRequestTransactionCost, - requestorAccountBalance, - requestorAccountBalanceChange, - operatorContractBalance, - sumOfRewards -) { - this.callbackGas = callbackGas - this.entryFeeEstimate = entryFeeEstimate - this.relayRequestTransactionCost = relayRequestTransactionCost - this.requestorAccountBalance = requestorAccountBalance - this.requestorAccountBalanceChange = requestorAccountBalanceChange - this.operatorContractBalance = operatorContractBalance - this.sumOfRewards = sumOfRewards -} - -function PricingClient(address, balance, balanceChange, reward, rewardChange) { - ;(this.address = address), - (this.balance = balance), - (this.balanceChange = balanceChange), - (this.reward = reward), - (this.rewardChange = rewardChange) -} - -ServiceContractSummary.prototype.toString = function serviceContractSummaryToString() { - return ( - "" + - this.balance + - ", " + - this.dkgFeePool + - ", " + - this.requestSubsidyFeePool + - ", " + - this.dkgContributionMargin + - ", " + - this.hasCorrectBalance + - ", " - ) -} - -OperatorContractSummary.prototype.toString = function operatorContractSummaryToString() { - return ( - "" + - this.balance + - ", " + - this.sumOfRewards + - ", " + - this.dkgSubmitterReimbursementFee + - ", " + - this.hasCorrectBalance + - ", " - ) -} - -PricingSummary.prototype.toString = function pricingSummaryToString() { - return ( - "" + - this.callbackGas + - ", " + - this.entryFeeEstimate + - ", " + - this.relayRequestTransactionCost + - ", " + - this.requestorAccountBalance + - ", " + - this.requestorAccountBalanceChange + - ", " + - this.operatorContractBalance + - ", " + - this.sumOfRewards + - ", " - ) -} - -PricingClient.prototype.toString = function pricingClientToString() { - return ( - "" + - this.address + - ", " + - this.balance + - ", " + - this.balanceChange + - ", " + - this.reward + - ", " + - this.rewardChange + - ", " - ) -} - -function wait(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)) -} diff --git a/solidity-v1/scripts/request-relay-entry-with-callback.js b/solidity-v1/scripts/request-relay-entry-with-callback.js deleted file mode 100644 index d6d023f829..0000000000 --- a/solidity-v1/scripts/request-relay-entry-with-callback.js +++ /dev/null @@ -1,52 +0,0 @@ -const KeepRandomBeaconServiceImplV1 = artifacts.require( - "KeepRandomBeaconServiceImplV1.sol" -) -const KeepRandomBeaconService = artifacts.require("KeepRandomBeaconService.sol") - -// Example usage: -// truffle exec ./scripts/request-relay-entry-with-callback.js yourContractAddress callbackGas -// truffle exec ./scripts/request-relay-entry-with-callback.js 0x9F57C01059057d821c6b4B04A4598322661C934F 20000 - -module.exports = async function () { - const keepRandomBeaconService = await KeepRandomBeaconService.deployed() - const contractInstance = await KeepRandomBeaconServiceImplV1.at( - keepRandomBeaconService.address - ) - - try { - const entryFeeEstimate = await contractInstance.entryFeeEstimate( - process.argv[5] - ) - const tx = await contractInstance.methods[ - "requestRelayEntry(address,uint256)" - ](process.argv[4], process.argv[5], { value: entryFeeEstimate }) - console.log( - "Successfully requested relay entry with a callback. RequestId =", - tx.logs[0].args.requestId.toString() - ) - console.log( - "\n---Transaction Summary---" + - "\n" + - "From:" + - tx.receipt.from + - "\n" + - "To:" + - tx.receipt.to + - "\n" + - "BlockNumber:" + - tx.receipt.blockNumber + - "\n" + - "TotalGas:" + - tx.receipt.cumulativeGasUsed + - "\n" + - "TransactionHash:" + - tx.receipt.transactionHash + - "\n" + - "--------------------------" - ) - } catch (error) { - console.error("Request failed with", error) - } - - process.exit() -} diff --git a/solidity-v1/scripts/request-relay-entry.js b/solidity-v1/scripts/request-relay-entry.js deleted file mode 100644 index f94961844e..0000000000 --- a/solidity-v1/scripts/request-relay-entry.js +++ /dev/null @@ -1,94 +0,0 @@ -const KeepRandomBeaconServiceImplV1 = artifacts.require( - "KeepRandomBeaconServiceImplV1.sol" -) -const KeepRandomBeaconService = artifacts.require("KeepRandomBeaconService.sol") -const KeepRandomBeaconOperator = artifacts.require( - "KeepRandomBeaconOperator.sol" -) - -const watchRelayEntry = process.env.WATCH_RELAY_ENTRY - -module.exports = async function () { - const keepRandomBeaconService = await KeepRandomBeaconService.deployed() - const keepRandomBeaconServiceImpl = await KeepRandomBeaconServiceImplV1.at( - keepRandomBeaconService.address - ) - const keepRandomBeaconOperator = await KeepRandomBeaconOperator.deployed() - - console.log( - `Address of the KeepRandomBeaconService contract is ${keepRandomBeaconService.address}` - ) - - try { - const entryFeeEstimate = await keepRandomBeaconServiceImpl.entryFeeEstimate( - 0 - ) - const tx = await keepRandomBeaconServiceImpl.methods["requestRelayEntry()"]( - { - value: entryFeeEstimate, - } - ) - console.log( - "Successfully requested relay entry with RequestId =", - tx.logs[0].args.requestId.toString() - ) - console.log( - "\n---Transaction Summary---" + - "\n" + - "From:" + - tx.receipt.from + - "\n" + - "To:" + - tx.receipt.to + - "\n" + - "BlockNumber:" + - tx.receipt.blockNumber + - "\n" + - "TotalGas:" + - tx.receipt.cumulativeGasUsed + - "\n" + - "TransactionHash:" + - tx.receipt.transactionHash + - "\n" + - "--------------------------" - ) - } catch (error) { - console.error("Request failed with", error) - process.exit(1) - } - - if (watchRelayEntry === "true") { - try { - console.log(`Watch new relay entry generation...`) - - const iterationDelay = 30000 // 30s - let entryGenerated = false - - // Wait 10 minutes for a relay entry to be generated. - for (let i = 0; i < 20; i++) { - await wait(iterationDelay) - - const block = await keepRandomBeaconOperator.currentRequestStartBlock() - if (web3.utils.toBN(block).isZero()) { - entryGenerated = true - break - } - } - - if (!entryGenerated) { - throw new Error(`New relay has not been generated in observed time`) - } - - console.log(`New relay entry has been generated`) - } catch (error) { - console.error("New relay entry watch failed with", error) - process.exit(1) - } - } - - process.exit(0) -} - -function wait(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)) -} diff --git a/solidity-v1/scripts/rewards.js b/solidity-v1/scripts/rewards.js deleted file mode 100644 index a521d4e658..0000000000 --- a/solidity-v1/scripts/rewards.js +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Important: the KeepRandomBeaconOperatorRewardsStub contract should be deployed to the network! - * - * This script: - * - delegates stake to operators. For each operator uses the same beneficiary address, - * - adds 30 mock groups of which 19 makes stale, - * - emits fake withdrawal events. - * */ - -const KeepToken = artifacts.require("./KeepToken.sol") -const TokenStaking = artifacts.require("./TokenStaking.sol") -// The KeepRandomBeaconOperatorRewardsStub contract should be deployed to the network -const KeepRandomBeaconOperator = artifacts.require( - "../stubs/KeepRandomBeaconOperatorRewardsStub.sol" -) -const KeepRandomBeaconServiceImpl = artifacts.require( - "./KeepRandomBeaconServiceImplV1.sol" -) -const KeepRandomBeaconService = artifacts.require( - "./KeepRandomBeaconService.sol" -) -const crypto = require("crypto") - -function getAccounts() { - return new Promise((resolve, reject) => { - web3.eth.getAccounts((error, accounts) => { - resolve(accounts) - }) - }) -} - -function formatAmount(amount, decimals) { - return web3.utils - .toBN(amount) - .mul(web3.utils.toBN(10).pow(web3.utils.toBN(decimals))) -} - -module.exports = async function () { - try { - const accounts = await getAccounts() - const token = await KeepToken.deployed() - const tokenStaking = await TokenStaking.deployed() - const contractService = await KeepRandomBeaconService.deployed() - const keepRandomBeaconService = await KeepRandomBeaconServiceImpl.at( - contractService.address - ) - const keepRandomBeaconOperator = await KeepRandomBeaconOperator.deployed() - - const beneficiary = accounts[5] - const requestor = accounts[5] - const owner = accounts[0] - - for (let i = 0; i < 5; i++) { - const operator = accounts[i] - const authorizer = accounts[i] - - const delegation = - "0x" + - Buffer.concat([ - Buffer.from(beneficiary.substr(2), "hex"), - Buffer.from(operator.substr(2), "hex"), - Buffer.from(authorizer.substr(2), "hex"), - ]).toString("hex") - - const staked = await token - .approveAndCall( - tokenStaking.address, - formatAmount(20000000, 18), - delegation, - { from: owner } - ) - .catch((err) => { - console.log(`could not stake KEEP tokens for ${operator}: ${err}`) - }) - - await tokenStaking.authorizeOperatorContract( - operator, - keepRandomBeaconOperator.address, - { from: authorizer } - ) - - if (staked) { - console.log(`successfully staked KEEP tokens for account ${operator}`) - } - } - - await registerNewGroups(10) - await registerNewGroups(10) - - const entryFeeEstimate = await keepRandomBeaconService.entryFeeEstimate(0) - await keepRandomBeaconService.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: requestor, - }) - - await registerNewGroups(10) - - // terminate groups - await keepRandomBeaconOperator.reportUnauthorizedSigning(25, { - from: owner, - }) - await keepRandomBeaconOperator.reportUnauthorizedSigning(26, { - from: owner, - }) - - const numberOfGroups = await keepRandomBeaconOperator.numberOfGroups() - const firstActiveIndex = await keepRandomBeaconOperator.getFirstActiveGroupIndex() - - const allGroups = ( - await keepRandomBeaconOperator.getNumberOfCreatedGroups() - ).toNumber() - for (let i = 0; i < allGroups; i++) { - const groupPublicKey = await keepRandomBeaconOperator.getGroupPublicKey(i) - const isStale = await keepRandomBeaconOperator.isStaleGroup( - groupPublicKey - ) - - console.log("group: ", groupPublicKey, "isStale: ", isStale) - } - - console.log("number of active groups:", numberOfGroups.toString()) - console.log("first active index:", firstActiveIndex.toString()) - - async function registerNewGroups(numberOfGroups) { - const groupReward = web3.utils.toWei("145000", "Gwei") - for (let i = 0; i < numberOfGroups; i++) { - console.log("register group", i + 1) - const groupPublicKey = crypto.randomBytes(32) - await keepRandomBeaconOperator.registerNewGroup(groupPublicKey, [ - accounts[1], - accounts[2], - ]) - await keepRandomBeaconOperator.addGroupMemberReward( - groupPublicKey, - groupReward - ) - console.log( - "created group", - await keepRandomBeaconOperator.getGroupPublicKey(i) - ) - } - } - } catch (error) { - console.log("unexpected error", error) - process.exit(1) - } - - process.exit() -} diff --git a/solidity-v1/scripts/staking-port-backer-dapp-starter.js b/solidity-v1/scripts/staking-port-backer-dapp-starter.js deleted file mode 100644 index fec8f10db6..0000000000 --- a/solidity-v1/scripts/staking-port-backer-dapp-starter.js +++ /dev/null @@ -1,200 +0,0 @@ -const KeepToken = artifacts.require("./KeepToken.sol") -const TokenStaking = artifacts.require("../stubs/OldTokenStaking.sol") -const StakingPortBacker = artifacts.require("./StakingPortBacker.sol") -const GuaranteedMinimumStakingPolicy = artifacts.require( - "./GuaranteedMinimumStakingPolicy.sol" -) -const TokenGrant = artifacts.require("./TokenGrant.sol") -const ManagedGrantFactory = artifacts.require("./ManagedGrantFactory.sol") -const ManagedGrant = artifacts.require("./ManagedGrant.sol") - -function formatAmount(amount, decimals) { - return web3.utils - .toBN(amount) - .mul(web3.utils.toBN(10).pow(web3.utils.toBN(decimals))) -} - -function getAccounts() { - return new Promise((resolve, reject) => { - web3.eth.getAccounts((error, accounts) => { - resolve(accounts) - }) - }) -} - -const getDelegationExtraData = (account) => { - return ( - "0x" + - Buffer.concat([ - Buffer.from(account.substr(2), "hex"), - Buffer.from(account.substr(2), "hex"), - Buffer.from(account.substr(2), "hex"), - ]).toString("hex") - ) -} - -function GrantStakingStrategy(grantId, from) { - return { - stake: async (stakingContractAddress, amount, delegation, operator) => { - const grantContract = await TokenGrant.deployed() - - await grantContract - .stake(grantId, stakingContractAddress, amount, delegation, { from }) - .catch((err) => { - console.log( - `could not stake KEEP tokens from a grant for ${operator}: ${err}` - ) - }) - - console.log( - `successfully staked KEEP tokens from a grant (${grantId.toString()}) for ${operator}` - ) - }, - } -} - -function ManagedGrantStakingStrategy(managedGrantAddress, from) { - return { - stake: async (stakingContractAddress, amount, delegation, operator) => { - const managedGrantContract = await ManagedGrant.at(managedGrantAddress) - await managedGrantContract - .stake(stakingContractAddress, amount, delegation, { from }) - .catch((err) => { - console.log( - `could not stake KEEP tokens from a managed grant for ${operator}: ${err}` - ) - }) - - console.log( - `successfully staked KEEP tokens from a managed grant (${( - await managedGrantContract.grantId() - ).toString()}) for ${operator}` - ) - }, - } -} - -function OwnedTokensStakingStrategy(from) { - return { - stake: async (stakingContractAddress, amount, delegation, operator) => { - const token = await KeepToken.deployed() - const staked = await token - .approveAndCall(stakingContractAddress, amount, delegation, { from }) - .catch((err) => { - console.log(`could not stake KEEP tokens for ${operator}: ${err}`) - }) - - if (staked) { - console.log(`successfully staked KEEP tokens for account ${operator}`) - } - }, - } -} - -module.exports = async function () { - try { - const accounts = await getAccounts() - const token = await KeepToken.deployed() - const tokenStaking = await TokenStaking.deployed() - const stakingPortBackerContract = await StakingPortBacker.deployed() - const policy = await GuaranteedMinimumStakingPolicy.deployed() - const grantContract = await TokenGrant.deployed() - const managedGrantFactoryContract = await ManagedGrantFactory.deployed() - - const owner = accounts[0] - - const stakingManager = async ( - numberOfAccounts, - accountsOffset = 0, - stakingStrategy - ) => { - for (let i = accountsOffset; i < numberOfAccounts + accountsOffset; i++) { - const delegation = getDelegationExtraData(accounts[i]) - const operator = accounts[i] - const amount = formatAmount(200000, 18) - - await stakingStrategy.stake( - tokenStaking.address, - amount, - delegation, - operator - ) - - await stakingPortBackerContract - .allowOperator(operator, { from: owner }) - .catch((err) => - console.log(`could not allowOperator for ${operator}`, err) - ) - } - } - - await stakingManager(5, 5, new OwnedTokensStakingStrategy(owner)) - - const allTokens = await token.balanceOf(owner) - await token.transfer(stakingPortBackerContract.address, allTokens.divn(2), { - from: owner, - }) - - const grantee = owner - const duration = 1 - const start = (await web3.eth.getBlock("latest")).timestamp - const cliff = 1 - const revocable = false - const policyAddress = policy.address - - const grantExtraData = web3.eth.abi.encodeParameters( - [ - "address", - "address", - "uint256", - "uint256", - "uint256", - "bool", - "address", - ], - [owner, grantee, duration, start, cliff, revocable, policyAddress] - ) - - const managedGrantExtraData = web3.eth.abi.encodeParameters( - ["address", "uint256", "uint256", "uint256", "bool", "address"], - [grantee, duration, start, cliff, revocable, policyAddress] - ) - - // create default grant - await token.approveAndCall( - grantContract.address, - formatAmount(12300000, 18), - grantExtraData, - { from: owner } - ) - const tokenGrantCreatedEvent = (await grantContract.getPastEvents())[0] - const grantId = tokenGrantCreatedEvent.args["id"] - // Stake from a default grant - await stakingManager(5, 10, new GrantStakingStrategy(grantId, grantee)) - - // Create managed grant - await token.approveAndCall( - managedGrantFactoryContract.address, - formatAmount(12300000, 18), - managedGrantExtraData, - { from: owner } - ) - // Get the address of managed grant contract from an event. - const managedGrant1Event = ( - await managedGrantFactoryContract.getPastEvents() - )[0] - const managedGrant1Address = managedGrant1Event.args["grantAddress"] - - // delegate stake from a managed grant - await stakingManager( - 5, - 15, - new ManagedGrantStakingStrategy(managedGrant1Address, grantee) - ) - } catch (err) { - console.error("unexpected error:", err) - process.exit(1) - } - - process.exit() -} diff --git a/solidity-v1/scripts/unlock-eth-accounts.js b/solidity-v1/scripts/unlock-eth-accounts.js deleted file mode 100644 index 34ccf766b1..0000000000 --- a/solidity-v1/scripts/unlock-eth-accounts.js +++ /dev/null @@ -1,32 +0,0 @@ -/* Here we assume that the passphrase for unlocking all the accounts on -some private testnet is the same. This is intended for use with -truffle. Example: - -KEEP_ETHEREUM_PASSWORD=password \ - truffle exec ./scripts/unlock-eth-accounts.js \ - --network keep_dev -*/ - -const password = process.env.KEEP_ETHEREUM_PASSWORD || "password" - -module.exports = async function () { - const accounts = await web3.eth.getAccounts() - - console.log(`Total accounts: ${accounts.length}`) - console.log(`---------------------------------`) - - for (let i = 0; i < accounts.length; i++) { - const account = accounts[i] - - try { - console.log(`\nUnlocking account: ${account}`) - await web3.eth.personal.unlockAccount(account, password, 150000) - console.log(`Account unlocked!`) - } catch (error) { - console.log(`\nAccount: ${account} not unlocked!`) - console.error(error) - } - console.log(`\n---------------------------------`) - } - process.exit(0) -} diff --git a/solidity-v1/slither.config.json b/solidity-v1/slither.config.json deleted file mode 100644 index 3094c79ab1..0000000000 --- a/solidity-v1/slither.config.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "filter_paths": "contracts/stubs", - "detectors_to_exclude": "assembly,timestamp,solc-version" -} diff --git a/solidity-v1/tenderly.yaml b/solidity-v1/tenderly.yaml deleted file mode 100644 index 5efa38cd4d..0000000000 --- a/solidity-v1/tenderly.yaml +++ /dev/null @@ -1,7 +0,0 @@ -account_id: d9a948cf-8667-43df-acb0-ce194f6dda7a -projects: - thesis/keep: - networks: - - "1" # mainnet - thesis/keep-test: - - "3" # ropsten \ No newline at end of file diff --git a/solidity-v1/test-environment.config.js b/solidity-v1/test-environment.config.js deleted file mode 100644 index 2d0b6353e4..0000000000 --- a/solidity-v1/test-environment.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - accounts: { - amount: 200, // Number of unlocked accounts - }, -} diff --git a/solidity-v1/test/RolesLookupTest.js b/solidity-v1/test/RolesLookupTest.js deleted file mode 100644 index aa40065689..0000000000 --- a/solidity-v1/test/RolesLookupTest.js +++ /dev/null @@ -1,486 +0,0 @@ -const { accounts, contract } = require("@openzeppelin/test-environment") -const { time, expectRevert } = require("@openzeppelin/test-helpers") -const { initTokenStaking } = require("./helpers/initContracts") -const { grantTokens } = require("./helpers/grantTokens") -const { - delegateStake, - delegateStakeFromGrant, - delegateStakeFromManagedGrant, -} = require("./helpers/delegateStake") -const { createSnapshot, restoreSnapshot } = require("./helpers/snapshot") -const assert = require("chai").assert - -const KeepToken = contract.fromArtifact("KeepToken") -const TokenGrant = contract.fromArtifact("TokenGrant") -const KeepRegistry = contract.fromArtifact("KeepRegistry") -const PermissiveStakingPolicy = contract.fromArtifact("PermissiveStakingPolicy") -const ManagedGrantFactory = contract.fromArtifact("ManagedGrantFactory") -const ManagedGrant = contract.fromArtifact("ManagedGrant") -const RolesLookup = contract.fromArtifact("RolesLookup") -const RolesLookupStub = contract.fromArtifact("RolesLookupStub") - -describe("RolesLookup", () => { - const deployer = accounts[0] - const tokenOwner1 = accounts[1] - const tokenOwner2 = accounts[2] - const nonTokenOwner = accounts[3] - const operator1 = accounts[4] - const operator2 = accounts[5] - const nonOperator = accounts[6] - const beneficiary1 = accounts[7] - const beneficiary2 = accounts[8] - const authorizer = accounts[9] - const grantee1 = accounts[10] - const grantee2 = accounts[11] - const nonGrantee = accounts[12] - - const initializationPeriod = time.duration.seconds(0) - const grantUnlockingDuration = time.duration.seconds(0) - const grantStart = time.duration.seconds(0) - const grantCliff = time.duration.seconds(0) - const grantRevocable = true - - let token - let tokenGrant - let tokenStaking - let tokenGrantStakingPolicy - let managedGrantFactory - let lookup - - before(async () => { - const registry = await KeepRegistry.new({ from: deployer }) - token = await KeepToken.new({ from: deployer }) - tokenGrant = await TokenGrant.new(token.address, { from: deployer }) - const stakingContracts = await initTokenStaking( - token.address, - tokenGrant.address, - registry.address, - initializationPeriod, - contract.fromArtifact("TokenStaking") - ) - tokenStaking = stakingContracts.tokenStaking - tokenGrantStakingPolicy = await PermissiveStakingPolicy.new() - managedGrantFactory = await ManagedGrantFactory.new( - token.address, - tokenGrant.address, - { from: deployer } - ) - - await tokenGrant.authorizeStakingContract(tokenStaking.address, { - from: deployer, - }) - - const lookupLib = await RolesLookup.new({ from: deployer }) - await RolesLookupStub.detectNetwork() - await RolesLookupStub.link("RolesLookup", lookupLib.address) - lookup = await RolesLookupStub.new( - tokenStaking.address, - tokenGrant.address, - { from: deployer } - ) - }) - - describe("isTokenOwnerForOperator", async () => { - before(async () => { - await createSnapshot() - const amount = await tokenStaking.minimumStake() - - await token.transfer(tokenOwner1, amount, { from: deployer }) - await delegateStake( - token, - tokenStaking, - tokenOwner1, - operator1, - beneficiary1, - authorizer, - amount, - { from: tokenOwner1 } - ) - - await token.transfer(tokenOwner2, amount, { from: deployer }) - await delegateStake( - token, - tokenStaking, - tokenOwner2, - operator2, - beneficiary2, - authorizer, - amount, - { from: tokenOwner2 } - ) - }) - - after(async () => { - await restoreSnapshot() - }) - - it("returns true for token owner and its operator", async () => { - assert.isTrue( - await lookup.isTokenOwnerForOperator(tokenOwner1, operator1) - ) - }) - - it("returns false for mismatched token owner and operator", async () => { - assert.isFalse( - await lookup.isTokenOwnerForOperator(tokenOwner1, operator2) - ) - }) - - it("returns false for incorrect operator", async () => { - assert.isFalse( - await lookup.isTokenOwnerForOperator(tokenOwner1, nonOperator) - ) - }) - - it("returns false for non-token-owner", async () => { - assert.isFalse( - await lookup.isTokenOwnerForOperator(nonTokenOwner, operator1) - ) - }) - }) - - describe("isGranteeForOperator", async () => { - let amount - - before(async () => { - await createSnapshot() - amount = await tokenStaking.minimumStake() - - const grantId1 = await grantTokens( - tokenGrant, - token, - amount, - deployer, - grantee1, - grantUnlockingDuration, - grantStart, - grantCliff, - grantRevocable, - tokenGrantStakingPolicy.address, - { from: deployer } - ) - await delegateStakeFromGrant( - tokenGrant, - tokenStaking.address, - grantee1, - operator1, - beneficiary1, - authorizer, - amount, - grantId1 - ) - - const grantId2 = await grantTokens( - tokenGrant, - token, - amount, - deployer, - grantee2, - grantUnlockingDuration, - grantStart, - grantCliff, - grantRevocable, - tokenGrantStakingPolicy.address, - { from: deployer } - ) - await delegateStakeFromGrant( - tokenGrant, - tokenStaking.address, - grantee2, - operator2, - beneficiary2, - authorizer, - amount, - grantId2 - ) - }) - - after(async () => { - await restoreSnapshot() - }) - - it("returns true for grantee and its operator", async () => { - assert.isTrue(await lookup.isGranteeForOperator(grantee1, operator1)) - }) - - it("returns false for mismatched grantee and operator", async () => { - assert.isFalse(await lookup.isGranteeForOperator(grantee1, operator2)) - }) - - it("returns false for incorrect operator", async () => { - assert.isFalse(await lookup.isGranteeForOperator(grantee1, nonOperator)) - }) - - it("returns false for non-grantee", async () => { - assert.isFalse(await lookup.isGranteeForOperator(nonGrantee, operator1)) - }) - }) - - describe("isManagedGranteeForOperator", async () => { - let managedGrantAddress1 - let managedGrantAddress2 - - before(async () => { - await createSnapshot() - const amount = await tokenStaking.minimumStake() - - await token.approve(managedGrantFactory.address, amount, { - from: deployer, - }) - - managedGrantAddress1 = await managedGrantFactory.createManagedGrant.call( - grantee1, - amount, - grantUnlockingDuration, - grantStart, - grantCliff, - grantRevocable, - tokenGrantStakingPolicy.address, - { from: deployer } - ) - await managedGrantFactory.createManagedGrant( - grantee1, - amount, - grantUnlockingDuration, - grantStart, - grantCliff, - grantRevocable, - tokenGrantStakingPolicy.address, - { from: deployer } - ) - const managedGrant1 = await ManagedGrant.at(managedGrantAddress1) - await delegateStakeFromManagedGrant( - managedGrant1, - tokenStaking.address, - grantee1, - operator1, - beneficiary1, - authorizer, - amount - ) - - await token.approve(managedGrantFactory.address, amount, { - from: deployer, - }) - managedGrantAddress2 = await managedGrantFactory.createManagedGrant.call( - grantee2, - amount, - grantUnlockingDuration, - grantStart, - grantCliff, - grantRevocable, - tokenGrantStakingPolicy.address, - { from: deployer } - ) - await managedGrantFactory.createManagedGrant( - grantee2, - amount, - grantUnlockingDuration, - grantStart, - grantCliff, - grantRevocable, - tokenGrantStakingPolicy.address, - { from: deployer } - ) - const managedGrant2 = await ManagedGrant.at(managedGrantAddress2) - await delegateStakeFromManagedGrant( - managedGrant2, - tokenStaking.address, - grantee2, - operator2, - beneficiary2, - authorizer, - amount - ) - }) - - after(async () => { - await restoreSnapshot() - }) - - it("returns true for grantee and its operator", async () => { - assert.isTrue( - await lookup.isManagedGranteeForOperator( - grantee1, - operator1, - managedGrantAddress1 - ) - ) - }) - - it("reverts for mismatched grantee", async () => { - await expectRevert( - lookup.isManagedGranteeForOperator( - grantee2, - operator1, - managedGrantAddress1 - ), - "Not a grantee of the provided contract" - ) - }) - - it("returns false for mismatched operator", async () => { - assert.isFalse( - await lookup.isManagedGranteeForOperator( - grantee1, - operator2, - managedGrantAddress1 - ) - ) - }) - - it("returns false for mismatched managed grant", async () => { - await expectRevert( - lookup.isManagedGranteeForOperator( - grantee1, - operator1, - managedGrantAddress2 - ), - "Not a grantee of the provided contract" - ) - }) - - it("reverts for mismatched operator and managed grant", async () => { - await expectRevert( - lookup.isManagedGranteeForOperator( - grantee1, - operator2, - managedGrantAddress2 - ), - "Not a grantee of the provided contract" - ) - }) - - it("returns false for incorrect operator", async () => { - assert.isFalse( - await lookup.isManagedGranteeForOperator( - grantee1, - nonOperator, - managedGrantAddress1 - ) - ) - }) - - it("reverts for non-grantee", async () => { - await expectRevert( - lookup.isManagedGranteeForOperator( - nonGrantee, - nonOperator, - managedGrantAddress1 - ), - "Not a grantee of the provided contract" - ) - }) - }) - - describe("isManagedGranteeForGrant", async () => { - let managedGrant1Address - let managedGrant2Address - let managedGrant1Id - let managedGrant2Id - - before(async () => { - await createSnapshot() - const amount = await tokenStaking.minimumStake() - - await token.approve(managedGrantFactory.address, amount, { - from: deployer, - }) - - managedGrant1Address = await managedGrantFactory.createManagedGrant.call( - grantee1, - amount, - grantUnlockingDuration, - grantStart, - grantCliff, - grantRevocable, - tokenGrantStakingPolicy.address, - { from: deployer } - ) - await managedGrantFactory.createManagedGrant( - grantee1, - amount, - grantUnlockingDuration, - grantStart, - grantCliff, - grantRevocable, - tokenGrantStakingPolicy.address, - { from: deployer } - ) - const managedGrant1 = await ManagedGrant.at(managedGrant1Address) - managedGrant1Id = await managedGrant1.grantId() - - await token.approve(managedGrantFactory.address, amount, { - from: deployer, - }) - managedGrant2Address = await managedGrantFactory.createManagedGrant.call( - grantee2, - amount, - grantUnlockingDuration, - grantStart, - grantCliff, - grantRevocable, - tokenGrantStakingPolicy.address, - { from: deployer } - ) - await managedGrantFactory.createManagedGrant( - grantee2, - amount, - grantUnlockingDuration, - grantStart, - grantCliff, - grantRevocable, - tokenGrantStakingPolicy.address, - { from: deployer } - ) - const managedGrant2 = await ManagedGrant.at(managedGrant2Address) - managedGrant2Id = await managedGrant2.grantId() - }) - - after(async () => { - await restoreSnapshot() - }) - - it("returns true for managed grant and correct operator and grant ID", async () => { - assert.isTrue( - await lookup.isManagedGranteeForGrant.call(grantee1, managedGrant1Id) - ) - assert.isTrue( - await lookup.isManagedGranteeForGrant.call(grantee2, managedGrant2Id) - ) - }) - - it("returns false for mismatched managed grant", async () => { - assert.isFalse( - await lookup.isManagedGranteeForGrant.call(grantee1, managedGrant2Id) - ) - }) - - it("returns false for mismatched grantee", async () => { - assert.isFalse( - await lookup.isManagedGranteeForGrant.call(grantee2, managedGrant1Id) - ) - }) - - it("returns false for not a grantee", async () => { - assert.isFalse( - await lookup.isManagedGranteeForGrant.call(nonGrantee, managedGrant1Id) - ) - }) - - it("returns false for not a managed grant", async () => { - assert.isFalse( - await lookup.isManagedGranteeForGrant.call( - grantee1, - token.address // not a managed grant contract - ) - ) - assert.isFalse( - await lookup.isManagedGranteeForGrant.call( - grantee1, - deployer // not a contract - ) - ) - }) - }) -}) diff --git a/solidity-v1/test/TestAltBn128.js b/solidity-v1/test/TestAltBn128.js deleted file mode 100644 index 2a7dd94920..0000000000 --- a/solidity-v1/test/TestAltBn128.js +++ /dev/null @@ -1,136 +0,0 @@ -const { expectRevert } = require("@openzeppelin/test-helpers") -const { contract } = require("@openzeppelin/test-environment") -const TestAltBn128 = contract.fromArtifact("TestAltBn128") - -describe("AltBn128", () => { - const g1 = - "0x15c30f4b6cf6dbbcbdcc10fe22f54c8170aea44e198139b776d512d8f027319a1b9e8bfaf1383978231ce98e42bafc8129f473fc993cf60ce327f7d223460663" - const g2 = - "0x1f1954b33144db2b5c90da089e8bde287ec7089d5d6433f3b6becaefdb678b1b2a9de38d14bef2cf9afc3c698a4211fa7ada7b4f036a2dfef0dc122b423259d01659dc18b57722ecf6a4beb4d04dfe780a660c4c3bb2b165ab8486114c464c621bf37ecdba226629c20908c7f475c5b3a7628ce26d696436eab0b0148034dfcd" - const g2Compressed = - "0x1f1954b33144db2b5c90da089e8bde287ec7089d5d6433f3b6becaefdb678b1b2a9de38d14bef2cf9afc3c698a4211fa7ada7b4f036a2dfef0dc122b423259d0" - - let altBn128 - - before(async () => { - altBn128 = await TestAltBn128.new() - }) - - describe("g1Unmarshal", async () => { - it("does not accept less than 64 bytes", async () => { - await expectRevert( - altBn128.publicG1Unmarshal(g1.slice(0, -2)), - "Invalid G1 bytes length" - ) - }) - - it("does accept 64 bytes", async () => { - await altBn128.publicG1Unmarshal(g1) - // ok, no revert - }) - - it("does not accept more than 64 bytes", async () => { - await expectRevert( - altBn128.publicG1Unmarshal(g1 + "ff"), - "Invalid G1 bytes length" - ) - }) - }) - - describe("g2Unmarshal", async () => { - it("does not accept less than 128 bytes", async () => { - await expectRevert( - altBn128.publicG2Unmarshal(g2.slice(0, -2)), - "Invalid G2 bytes length" - ) - }) - - it("does accept 128 bytes", async () => { - await altBn128.publicG2Unmarshal(g2) - // ok, no revert - }) - - it("does not accept more than 128 bytes", async () => { - await expectRevert( - altBn128.publicG2Unmarshal(g2 + "ff"), - "Invalid G2 bytes length" - ) - }) - }) - - describe("g2Decompress", async () => { - it("does not accept less than 64 bytes", async () => { - await expectRevert( - altBn128.publicG2Decompress(g2Compressed.slice(0, -2)), - "Invalid G2 compressed bytes length" - ) - }) - - it("does accept 64 bytes", async () => { - await altBn128.publicG2Decompress(g2Compressed) - // ok, no revert - }) - - it("does not accept more than 64 bytes", async () => { - await expectRevert( - altBn128.publicG2Decompress(g2Compressed + "ff"), - "Invalid G2 compressed bytes length" - ) - }) - }) - - it("runHashingTest()", async () => { - await altBn128.runHashingTest() - // ok, no revert - }) - - it("runHashAndAddTest()", async () => { - await altBn128.runHashAndAddTest() - // ok, no revert - }) - - it("runHashAndScalarMultiplyTest()", async () => { - await altBn128.runHashAndScalarMultiplyTest() - // ok, no revert - }) - - it("runGfP2AddTest()", async () => { - await altBn128.runGfP2AddTest() - // ok, no revert - }) - - it("runAddTest()", async () => { - await altBn128.runAddTest() - // ok, no revert - }) - - it("runScalarMultiplyTest()", async () => { - await altBn128.runScalarMultiplyTest() - // ok, no revert - }) - - it("runBasicPairingTest()", async () => { - await altBn128.runBasicPairingTest() - // ok, no revert - }) - - it("runVerifySignatureTest()", async () => { - await altBn128.runVerifySignatureTest() - // ok, no revert - }) - - it("runCompressG1InvertibilityTest()", async () => { - await altBn128.runCompressG1InvertibilityTest() - // ok, no revert - }) - - it("runCompressG2InvertibilityTest()", async () => { - await altBn128.runCompressG2InvertibilityTest() - // ok, no revert - }) - - it("runG2PointOnCurveTest()", async () => { - await altBn128.runG2PointOnCurveTest() - // ok, no revert - }) -}) diff --git a/solidity-v1/test/TestArrayUtils.js b/solidity-v1/test/TestArrayUtils.js deleted file mode 100644 index d8472871fd..0000000000 --- a/solidity-v1/test/TestArrayUtils.js +++ /dev/null @@ -1,42 +0,0 @@ -const { contract } = require("@openzeppelin/test-environment") -const TestArrayUtils = contract.fromArtifact("TestArrayUtils") - -describe("TestArrayUtils", () => { - let arrayUtils - - before(async () => { - arrayUtils = await TestArrayUtils.new() - }) - - it("runCanHandleEmptyArrayTest()", async () => { - await arrayUtils.runCanHandleEmptyArrayTest() - }) - - it("runCanRemoveAddressFromSingleElementArrayTest()", async () => { - await arrayUtils.runCanRemoveAddressFromSingleElementArrayTest() - }) - - it("runCanRemoveIdenticalAddressesTest()", async () => { - await arrayUtils.runCanRemoveIdenticalAddressesTest() - }) - - it("runCanRemoveAddressTest()", async () => { - await arrayUtils.runCanRemoveAddressTest() - }) - - it("runCanHandleEmptyValueArrayTest()", async () => { - await arrayUtils.runCanHandleEmptyValueArrayTest() - }) - - it("runCanRemoveValueFromSingleElementArrayTest()", async () => { - await arrayUtils.runCanRemoveValueFromSingleElementArrayTest() - }) - - it("runCanRemoveIdenticalValuesTest()", async () => { - await arrayUtils.runCanRemoveIdenticalValuesTest() - }) - - it("runCanRemoveValueTest()", async () => { - await arrayUtils.runCanRemoveValueTest() - }) -}) diff --git a/solidity-v1/test/TestBLS.js b/solidity-v1/test/TestBLS.js deleted file mode 100644 index 4fa1df3df3..0000000000 --- a/solidity-v1/test/TestBLS.js +++ /dev/null @@ -1,162 +0,0 @@ -const blsData = require("./helpers/data.js") -const { contract, web3 } = require("@openzeppelin/test-environment") -const { expectRevert } = require("@openzeppelin/test-helpers") -const BLS = contract.fromArtifact("BLS") -const assert = require("chai").assert - -describe("BLS", function () { - let bls - - before(async () => { - bls = await BLS.new() - }) - - it("should be able to verify BLS signature", async function () { - // Corresponding test in Go library: bls_test.go TestSignAndVerifyG1 - const result = await bls.verify( - "0x1f1954b33144db2b5c90da089e8bde287ec7089d5d6433f3b6becaefdb678b1b2a9de38d14bef2cf9afc3c698a4211fa7ada7b4f036a2dfef0dc122b423259d01659dc18b57722ecf6a4beb4d04dfe780a660c4c3bb2b165ab8486114c464c621bf37ecdba226629c20908c7f475c5b3a7628ce26d696436eab0b0148034dfcd", - "0x15c30f4b6cf6dbbcbdcc10fe22f54c8170aea44e198139b776d512d8f027319a1b9e8bfaf1383978231ce98e42bafc8129f473fc993cf60ce327f7d223460663", - "0x112d462728e89432b0fe40251eeb6608aed4560f3dc833a9877f5010ace9b1312006dbbe2f30c6e0e3e7ec47dc078b7b6b773379d44d64e44ec4e017bfa7375c" - ) - assert.isTrue(result, "Should be able to verify valid BLS signature.") - }) - - it("should be able to verify threshold BLS recovered/reconstructed signature", async function () { - // Corresponding test in Go library: bls_test.go TestThresholdBLS - const result = await bls.verify( - "0x1644bcbb604e3608225d1826bab0b926f2df4fb506e1aa3641d5ab350ebceb5825c7df94f3a87e9dd6e11865dfdbdd3db69eab4951c8bc2250fb51da5f813009131e0c9e6d90d91741458b522b57ca99b597dd922dd31f61a2f69412ce3220d31a1ec4b09ef2ea1d6ba7cad98386f6049b5eec5fb3a40408229dc75c5759f184", - "0x15c30f4b6cf6dbbcbdcc10fe22f54c8170aea44e198139b776d512d8f027319a1b9e8bfaf1383978231ce98e42bafc8129f473fc993cf60ce327f7d223460663", - "0x23cbfa4b2fcbf43a44d8a4b2a9aa1a9123f183794fa7b53c633c2de7ada5b5ca174f81900dc4ca5672768d51c12dfcb0eac2aafba0a66ac54b76f689dc1fe321" - ) - assert.isTrue(result, "Should be able to verify valid BLS signature.") - }) - - it("should use reasonable amount of gas", async () => { - // Corresponding test in Go library: bls_test.go TestThresholdBLS - const gasEstimate = await bls.verify.estimateGas( - "0x1644bcbb604e3608225d1826bab0b926f2df4fb506e1aa3641d5ab350ebceb5825c7df94f3a87e9dd6e11865dfdbdd3db69eab4951c8bc2250fb51da5f813009131e0c9e6d90d91741458b522b57ca99b597dd922dd31f61a2f69412ce3220d31a1ec4b09ef2ea1d6ba7cad98386f6049b5eec5fb3a40408229dc75c5759f184", - "0x15c30f4b6cf6dbbcbdcc10fe22f54c8170aea44e198139b776d512d8f027319a1b9e8bfaf1383978231ce98e42bafc8129f473fc993cf60ce327f7d223460663", - "0x23cbfa4b2fcbf43a44d8a4b2a9aa1a9123f183794fa7b53c633c2de7ada5b5ca174f81900dc4ca5672768d51c12dfcb0eac2aafba0a66ac54b76f689dc1fe321" - ) - // make sure no change will make the verification more expensive than it is now - assert.isBelow(gasEstimate, 306682, "BLS verification is too expensive") - }) - - it("should be able to verify BLS aggregated signature", async function () { - // Corresponding test in Go library: bls_test.go TestAggregateBLS - const result = await bls.verify( - "0x04ab0e5862ecdffda6bab4465c4ee88a3b71a86f178c1ac6e89a4827464c618215f83a353b5ba5126f7fdfb21998fb36d1169db87ea4042ac0d60106c98c9b8122c158a3411a0ea19841c60bcc1da84cf94f5959f1783d7ee751a48d909f58f10bbcfc4acb66b369e61c91b3a5620167ab861a80c639d1fd14b2414cd386853b", - "0x15c30f4b6cf6dbbcbdcc10fe22f54c8170aea44e198139b776d512d8f027319a1b9e8bfaf1383978231ce98e42bafc8129f473fc993cf60ce327f7d223460663", - "0x0855a2afab929270bd423e0d4069250519a45e4c3bcb33f53531f5b6988bb87b14301047405783a8d52311f4dfebe6a8f5acc7f299cf576c38cf726bc9fc0a1a" - ) - assert.isTrue(result, "Should be able to verify valid BLS signature.") - }) - - it("should fail to verify invalid BLS signature", async function () { - const result = await bls.verify( - "0x1f1954b33144db2b5c90da089e8bde287ec7089d5d6433f3b6becaefdb678b1b2a9de38d14bef2cf9afc3c698a4211fa7ada7b4f036a2dfef0dc122b423259d01659dc18b57722ecf6a4beb4d04dfe780a660c4c3bb2b165ab8486114c464c621bf37ecdba226629c20908c7f475c5b3a7628ce26d696436eab0b0148034dfcd", - "0x15c30f4b6cf6dbbcbdcc10fe22f54c8170aea44e198139b776d512d8f027319a1b9e8bfaf1383978231ce98e42bafc8129f473fc993cf60ce327f7d223460663", - "0x0855a2afab929270bd423e0d4069250519a45e4c3bcb33f53531f5b6988bb87b14301047405783a8d52311f4dfebe6a8f5acc7f299cf576c38cf726bc9fc0a1a" - ) - assert.isFalse(result, "Should return false for failed verification.") - }) - - it("should fail to verify BLS signature without valid message", async function () { - const result = await bls.verify( - "0x1f1954b33144db2b5c90da089e8bde287ec7089d5d6433f3b6becaefdb678b1b2a9de38d14bef2cf9afc3c698a4211fa7ada7b4f036a2dfef0dc122b423259d01659dc18b57722ecf6a4beb4d04dfe780a660c4c3bb2b165ab8486114c464c621bf37ecdba226629c20908c7f475c5b3a7628ce26d696436eab0b0148034dfcd", - "0x1a01114fce4c287d8beb49616ca8f2c2be211820b73340c79bd4aada0c4f66af1bcbbb9c398c87dc504e9d275b6f5f97215a081a85d3161910158b4ab331f7bc", - "0x112d462728e89432b0fe40251eeb6608aed4560f3dc833a9877f5010ace9b1312006dbbe2f30c6e0e3e7ec47dc078b7b6b773379d44d64e44ec4e017bfa7375c" - ) - assert.isFalse(result, "Should return false for failed verification.") - }) - - it("should fail to verify BLS signature without valid public key", async function () { - const result = await bls.verify( - "0x1644bcbb604e3608225d1826bab0b926f2df4fb506e1aa3641d5ab350ebceb5825c7df94f3a87e9dd6e11865dfdbdd3db69eab4951c8bc2250fb51da5f813009131e0c9e6d90d91741458b522b57ca99b597dd922dd31f61a2f69412ce3220d31a1ec4b09ef2ea1d6ba7cad98386f6049b5eec5fb3a40408229dc75c5759f184", - "0x15c30f4b6cf6dbbcbdcc10fe22f54c8170aea44e198139b776d512d8f027319a1b9e8bfaf1383978231ce98e42bafc8129f473fc993cf60ce327f7d223460663", - "0x112d462728e89432b0fe40251eeb6608aed4560f3dc833a9877f5010ace9b1312006dbbe2f30c6e0e3e7ec47dc078b7b6b773379d44d64e44ec4e017bfa7375c" - ) - assert.isFalse(result, "Should return false for failed verification.") - }) - - it("should be able to sign a message and verify it", async function () { - const message = web3.utils.stringToHex("A bear walks into a bar 123...") - - const signature = await bls.sign(message, blsData.secretKey) - - const actual = await bls.verifyBytes( - blsData.groupPubKey, - message, - signature - ) - assert.isTrue(actual, "Should be able to verify valid BLS signature.") - }) - - describe("verify", async () => { - it("should fail for public key having less than 128 bytes", async () => { - await expectRevert( - bls.verify( - "0x1f1954b33144db2b5c90da089e8bde287ec7089d5d6433f3b6becaefdb678b1b2a9de38d14bef2cf9afc3c698a4211fa7ada7b4f036a2dfef0dc122b423259d01659dc18b57722ecf6a4beb4d04dfe780a660c4c3bb2b165ab8486114c464c621bf37ecdba226629c20908c7f475c5b3a7628ce26d696436eab0b0148034df", - "0x15c30f4b6cf6dbbcbdcc10fe22f54c8170aea44e198139b776d512d8f027319a1b9e8bfaf1383978231ce98e42bafc8129f473fc993cf60ce327f7d223460663", - "0x112d462728e89432b0fe40251eeb6608aed4560f3dc833a9877f5010ace9b1312006dbbe2f30c6e0e3e7ec47dc078b7b6b773379d44d64e44ec4e017bfa7375c" - ), - "Invalid G2 bytes length" - ) - }) - - it("should fail for public key having more than 128 bytes", async () => { - await expectRevert( - bls.verify( - "0x1f1954b33144db2b5c90da089e8bde287ec7089d5d6433f3b6becaefdb678b1b2a9de38d14bef2cf9afc3c698a4211fa7ada7b4f036a2dfef0dc122b423259d01659dc18b57722ecf6a4beb4d04dfe780a660c4c3bb2b165ab8486114c464c621bf37ecdba226629c20908c7f475c5b3a7628ce26d696436eab0b0148034dfcdcd", - "0x15c30f4b6cf6dbbcbdcc10fe22f54c8170aea44e198139b776d512d8f027319a1b9e8bfaf1383978231ce98e42bafc8129f473fc993cf60ce327f7d223460663", - "0x112d462728e89432b0fe40251eeb6608aed4560f3dc833a9877f5010ace9b1312006dbbe2f30c6e0e3e7ec47dc078b7b6b773379d44d64e44ec4e017bfa7375c" - ), - "Invalid G2 bytes length" - ) - }) - - it("should fail for message having less than 64 bytes", async () => { - await expectRevert( - bls.verify( - "0x1f1954b33144db2b5c90da089e8bde287ec7089d5d6433f3b6becaefdb678b1b2a9de38d14bef2cf9afc3c698a4211fa7ada7b4f036a2dfef0dc122b423259d01659dc18b57722ecf6a4beb4d04dfe780a660c4c3bb2b165ab8486114c464c621bf37ecdba226629c20908c7f475c5b3a7628ce26d696436eab0b0148034dfcd", - "0x15c30f4b6cf6dbbcbdcc10fe22f54c8170aea44e198139b776d512d8f027319a1b9e8bfaf1383978231ce98e42bafc8129f473fc993cf60ce327f7d2234606", - "0x112d462728e89432b0fe40251eeb6608aed4560f3dc833a9877f5010ace9b1312006dbbe2f30c6e0e3e7ec47dc078b7b6b773379d44d64e44ec4e017bfa7375c" - ), - "Invalid G1 bytes length" - ) - }) - - it("should fail for message having more than 64 bytes", async () => { - await expectRevert( - bls.verify( - "0x1f1954b33144db2b5c90da089e8bde287ec7089d5d6433f3b6becaefdb678b1b2a9de38d14bef2cf9afc3c698a4211fa7ada7b4f036a2dfef0dc122b423259d01659dc18b57722ecf6a4beb4d04dfe780a660c4c3bb2b165ab8486114c464c621bf37ecdba226629c20908c7f475c5b3a7628ce26d696436eab0b0148034dfcd", - "0x15c30f4b6cf6dbbcbdcc10fe22f54c8170aea44e198139b776d512d8f027319a1b9e8bfaf1383978231ce98e42bafc8129f473fc993cf60ce327f7d22346066363", - "0x112d462728e89432b0fe40251eeb6608aed4560f3dc833a9877f5010ace9b1312006dbbe2f30c6e0e3e7ec47dc078b7b6b773379d44d64e44ec4e017bfa7375c" - ), - "Invalid G1 bytes length" - ) - }) - - it("should fail for signature having less than 64 bytes", async () => { - await expectRevert( - bls.verify( - "0x1f1954b33144db2b5c90da089e8bde287ec7089d5d6433f3b6becaefdb678b1b2a9de38d14bef2cf9afc3c698a4211fa7ada7b4f036a2dfef0dc122b423259d01659dc18b57722ecf6a4beb4d04dfe780a660c4c3bb2b165ab8486114c464c621bf37ecdba226629c20908c7f475c5b3a7628ce26d696436eab0b0148034dfcd", - "0x15c30f4b6cf6dbbcbdcc10fe22f54c8170aea44e198139b776d512d8f027319a1b9e8bfaf1383978231ce98e42bafc8129f473fc993cf60ce327f7d223460663", - "0x112d462728e89432b0fe40251eeb6608aed4560f3dc833a9877f5010ace9b1312006dbbe2f30c6e0e3e7ec47dc078b7b6b773379d44d64e44ec4e017bfa737" - ), - "Invalid G1 bytes length" - ) - }) - - it("should fail for signature having more than 64 bytes", async () => { - await expectRevert( - bls.verify( - "0x1f1954b33144db2b5c90da089e8bde287ec7089d5d6433f3b6becaefdb678b1b2a9de38d14bef2cf9afc3c698a4211fa7ada7b4f036a2dfef0dc122b423259d01659dc18b57722ecf6a4beb4d04dfe780a660c4c3bb2b165ab8486114c464c621bf37ecdba226629c20908c7f475c5b3a7628ce26d696436eab0b0148034dfcd", - "0x15c30f4b6cf6dbbcbdcc10fe22f54c8170aea44e198139b776d512d8f027319a1b9e8bfaf1383978231ce98e42bafc8129f473fc993cf60ce327f7d223460663", - "0x112d462728e89432b0fe40251eeb6608aed4560f3dc833a9877f5010ace9b1312006dbbe2f30c6e0e3e7ec47dc078b7b6b773379d44d64e44ec4e017bfa7375c5c" - ), - "Invalid G1 bytes length" - ) - }) - }) -}) diff --git a/solidity-v1/test/TestEscrow.js b/solidity-v1/test/TestEscrow.js deleted file mode 100644 index 2651f739fe..0000000000 --- a/solidity-v1/test/TestEscrow.js +++ /dev/null @@ -1,181 +0,0 @@ -const { accounts, contract, web3 } = require("@openzeppelin/test-environment") -const { createSnapshot, restoreSnapshot } = require("./helpers/snapshot.js") -const { expectRevert, expectEvent } = require("@openzeppelin/test-helpers") - -const KeepToken = contract.fromArtifact("KeepToken") -const Escrow = contract.fromArtifact("Escrow") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect -const assert = require("chai").assert - -describe("Escrow", () => { - const owner = accounts[0] - const updatedOwner = accounts[1] - - const beneficiary = accounts[2] - const updatedBeneficiary = accounts[3] - const notBeneficiary = accounts[4] - - let token - let escrow - - before(async () => { - token = await KeepToken.new({ from: owner }) - escrow = await Escrow.new(token.address, { from: owner }) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("setBeneficiary", async () => { - it("can be called by owner", async () => { - await escrow.setBeneficiary(beneficiary, { from: owner }) - // ok, no revert - }) - - it("can be called by updated owner", async () => { - await escrow.transferOwnership(updatedOwner, { from: owner }) - - await expectRevert( - escrow.setBeneficiary(beneficiary, { from: owner }), - "Ownable: caller is not the owner" - ) - await escrow.setBeneficiary(beneficiary, { from: updatedOwner }) - // ok, no revert - }) - - it("can not be called by non-owner", async () => { - await expectRevert( - escrow.setBeneficiary(beneficiary, { from: beneficiary }), - "Ownable: caller is not the owner" - ) - }) - - it("sets beneficiary", async () => { - await escrow.setBeneficiary(beneficiary, { from: owner }) - - assert.equal( - await escrow.beneficiary(), - beneficiary, - "Unexpected beneficiary" - ) - }) - - it("allows to update beneficiary", async () => { - await escrow.setBeneficiary(beneficiary, { from: owner }) - await escrow.setBeneficiary(updatedBeneficiary, { from: owner }) - - assert.equal( - await escrow.beneficiary(), - updatedBeneficiary, - "Unexpected beneficiary" - ) - }) - - it("emits an event", async () => { - const receipt = await escrow.setBeneficiary(beneficiary, { from: owner }) - - await expectEvent(receipt, "BeneficiaryUpdated", { - beneficiary: beneficiary, - }) - }) - }) - - describe("withdraw", async () => { - it("can not be called if beneficiary wasn't set", async () => { - await token.transfer(escrow.address, 100, { from: owner }) - await expectRevert( - escrow.withdraw({ from: beneficiary }), - "Beneficiary not assigned" - ) - }) - - it("can not be called by non-beneficiary", async () => { - await token.transfer(escrow.address, 100, { from: owner }) - await escrow.setBeneficiary(beneficiary, { from: owner }) - await expectRevert( - escrow.withdraw({ from: notBeneficiary }), - "Caller is not the beneficiary." - ) - }) - - it("fails when escrow is empty", async () => { - await escrow.setBeneficiary(beneficiary, { from: owner }) - await expectRevert( - escrow.withdraw({ from: beneficiary }), - "No tokens to withdraw" - ) - }) - - it("can be called by beneficiary", async () => { - await escrow.setBeneficiary(beneficiary, { from: owner }) - await token.transfer(escrow.address, 100, { from: owner }) - await escrow.withdraw({ from: beneficiary }) - // ok, no reverts - }) - - it("can be called by updated beneficiary", async () => { - await token.transfer(escrow.address, 100, { from: owner }) - await escrow.setBeneficiary(updatedBeneficiary, { from: owner }) - - await expectRevert( - escrow.withdraw({ from: beneficiary }), - "Caller is not the beneficiary." - ) - await escrow.withdraw({ from: updatedBeneficiary }) - // ok, no reverts - }) - - it("withdraws all tokens to beneficiary", async () => { - await escrow.setBeneficiary(beneficiary, { from: owner }) - const amount = web3.utils.toBN(123456789) - await token.transfer(escrow.address, amount, { from: owner }) - - await escrow.withdraw({ from: beneficiary }) - const beneficiaryBalanceAfter = await token.balanceOf(beneficiary) - - expect(beneficiaryBalanceAfter).to.eq.BN( - amount, - "Unexpected amount withdrawn" - ) - }) - - it("withdraws all tokens to updated beneficiary", async () => { - await escrow.setBeneficiary(beneficiary, { from: owner }) - await escrow.setBeneficiary(updatedBeneficiary, { from: owner }) - - const amount = web3.utils.toBN(987654321) - await token.transfer(escrow.address, amount, { from: owner }) - - await escrow.setBeneficiary(updatedBeneficiary, { from: owner }) - await escrow.withdraw({ from: updatedBeneficiary }) - const beneficiaryBalanceAfter = await token.balanceOf(updatedBeneficiary) - - expect(beneficiaryBalanceAfter).to.eq.BN( - amount, - "Unexpected amount withdrawn" - ) - }) - - it("emits an event", async () => { - await escrow.setBeneficiary(beneficiary, { from: owner }) - const amount = web3.utils.toBN(100) - await token.transfer(escrow.address, amount, { from: owner }) - - const receipt = await escrow.withdraw({ from: beneficiary }) - - await expectEvent(receipt, "TokensWithdrawn", { - beneficiary: beneficiary, - amount: amount, - }) - }) - }) -}) diff --git a/solidity-v1/test/TestGasPriceOracle.js b/solidity-v1/test/TestGasPriceOracle.js deleted file mode 100644 index df3b2a81e0..0000000000 --- a/solidity-v1/test/TestGasPriceOracle.js +++ /dev/null @@ -1,194 +0,0 @@ -const { accounts, contract, web3 } = require("@openzeppelin/test-environment") -const { expectRevert, expectEvent } = require("@openzeppelin/test-helpers") -const { time } = require("@openzeppelin/test-helpers") -const { createSnapshot, restoreSnapshot } = require("./helpers/snapshot.js") - -const GasPriceOracle = contract.fromArtifact("GasPriceOracle") -const GasPriceOracleConsumerStub = contract.fromArtifact( - "GasPriceOracleConsumerStub" -) - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect -const assert = chai.assert - -describe("GasPriceOracle", () => { - const owner = accounts[1] - const thirdParty = accounts[2] - - let oracle - - before(async () => { - oracle = await GasPriceOracle.new({ from: owner }) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("when updating gas price", async () => { - it("does not let third party to begin the process", async () => { - await expectRevert( - oracle.beginGasPriceUpdate(123, { from: thirdParty }), - "caller is not the owner" - ) - }) - - it("lets the owner to begin the process", async () => { - await oracle.beginGasPriceUpdate(123, { from: owner }) - // ok, no revert - }) - - it("does not allow to finalize change without initiating it first", async () => { - await expectRevert( - oracle.finalizeGasPriceUpdate(), - "Change not initiated" - ) - }) - - it("does not allow to finalize change before governance delay", async () => { - await oracle.beginGasPriceUpdate(123, { from: owner }) - await time.increase(time.duration.minutes(59)) - await expectRevert( - oracle.finalizeGasPriceUpdate(), - "Governance delay has not elapsed" - ) - }) - - it("updates value when finalizing the change", async () => { - const newValue = 9129111 - await oracle.beginGasPriceUpdate(newValue, { from: owner }) - await time.increase(time.duration.minutes(61)) - await oracle.finalizeGasPriceUpdate() - - expect(await oracle.gasPrice()).to.eq.BN(newValue) - }) - - it("does not allow to finalize the change twice", async () => { - const newValue = 1111 - await oracle.beginGasPriceUpdate(newValue, { from: owner }) - await time.increase(time.duration.minutes(61)) - await oracle.finalizeGasPriceUpdate() - await expectRevert( - oracle.finalizeGasPriceUpdate(), - "Change not initiated" - ) - }) - - it("emits an event when finalizing the change", async () => { - const newValue = web3.utils.toBN(55555) - await oracle.beginGasPriceUpdate(newValue, { from: owner }) - await time.increase(time.duration.minutes(61)) - const receipt = await oracle.finalizeGasPriceUpdate() - await expectEvent(receipt, "GasPriceUpdated", { - newValue: newValue, - }) - }) - - it("notifies consumer contracts when finalizing the change", async () => { - const consumer = await GasPriceOracleConsumerStub.new(oracle.address) - await oracle.addConsumerContract(consumer.address, { from: owner }) - - const newValue = 545666 - await oracle.beginGasPriceUpdate(newValue, { from: owner }) - await time.increase(time.duration.minutes(61)) - await oracle.finalizeGasPriceUpdate() - - expect(await consumer.gasPrice()).to.eq.BN(newValue) - }) - - it("does not notify removed consumer contracts when finalizing the change", async () => { - const consumer1 = await GasPriceOracleConsumerStub.new(oracle.address) - const consumer2 = await GasPriceOracleConsumerStub.new(oracle.address) - const consumer3 = await GasPriceOracleConsumerStub.new(oracle.address) - - await oracle.addConsumerContract(consumer1.address, { from: owner }) - await oracle.addConsumerContract(consumer2.address, { from: owner }) - await oracle.addConsumerContract(consumer3.address, { from: owner }) - - await oracle.removeConsumerContract(1, { from: owner }) - - const newValue = 156444 - await oracle.beginGasPriceUpdate(newValue, { from: owner }) - await time.increase(time.duration.minutes(61)) - await oracle.finalizeGasPriceUpdate() - - expect(await consumer1.gasPrice()).to.eq.BN(newValue) - expect(await consumer2.gasPrice()).to.eq.BN(0) - expect(await consumer3.gasPrice()).to.eq.BN(newValue) - }) - - it("lets to overwrite the pending update", async () => { - await oracle.beginGasPriceUpdate(55555, { from: owner }) - await time.increase(time.duration.minutes(59)) - - const overwritten = 66666 - await oracle.beginGasPriceUpdate(overwritten, { from: owner }) - - expect(await oracle.newGasPrice()).to.eq.BN(overwritten) - expect(await oracle.gasPriceChangeInitiated()).to.eq.BN( - await time.latest() - ) - - await time.increase(time.duration.minutes(61)) - await oracle.finalizeGasPriceUpdate() - - expect(await oracle.gasPrice()).to.eq.BN(overwritten) - }) - }) - - describe("when managing consumer contracts", async () => { - it("does not allow third party to add new consumer contract", async () => { - const consumer = await GasPriceOracleConsumerStub.new(oracle.address) - await expectRevert( - oracle.addConsumerContract(consumer.address, { from: thirdParty }), - "Ownable: caller is not the owner." - ) - }) - - it("allows the owner to add new consumer contract", async () => { - const consumer = await GasPriceOracleConsumerStub.new(oracle.address) - await oracle.addConsumerContract(consumer.address, { from: owner }) - // ok, no revert - }) - - it("does not allow third party to remove consumer contract", async () => { - const consumer = await GasPriceOracleConsumerStub.new(oracle.address) - await oracle.addConsumerContract(consumer.address, { from: owner }) - await expectRevert( - oracle.removeConsumerContract(0, { from: thirdParty }), - "Ownable: caller is not the owner." - ) - }) - - it("allows the owner to remove consumer contract", async () => { - const consumer = await GasPriceOracleConsumerStub.new(oracle.address) - await oracle.addConsumerContract(consumer.address, { from: owner }) - await oracle.removeConsumerContract(0, { from: owner }) - // ok, no revert - }) - - it("allows to selectively remove consumer contracts", async () => { - const consumer1 = await GasPriceOracleConsumerStub.new(oracle.address) - const consumer2 = await GasPriceOracleConsumerStub.new(oracle.address) - const consumer3 = await GasPriceOracleConsumerStub.new(oracle.address) - - await oracle.addConsumerContract(consumer1.address, { from: owner }) - await oracle.addConsumerContract(consumer2.address, { from: owner }) - await oracle.addConsumerContract(consumer3.address, { from: owner }) - - await oracle.removeConsumerContract(1, { from: owner }) - - const consumers = await oracle.getConsumerContracts() - assert.equal(consumers.length, 2) - assert.equal(consumers[0], consumer1.address) - assert.equal(consumers[1], consumer3.address) - }) - }) -}) diff --git a/solidity-v1/test/TestKeepRegistry.js b/solidity-v1/test/TestKeepRegistry.js deleted file mode 100644 index bf0bb9470c..0000000000 --- a/solidity-v1/test/TestKeepRegistry.js +++ /dev/null @@ -1,574 +0,0 @@ -const { createSnapshot, restoreSnapshot } = require("./helpers/snapshot.js") -const { accounts, contract } = require("@openzeppelin/test-environment") -const { expectRevert, expectEvent } = require("@openzeppelin/test-helpers") -const assert = require("chai").assert - -const KeepRegistry = contract.fromArtifact("KeepRegistry") - -describe("KeepRegistry", () => { - const owner = accounts[0] - const governance = accounts[1] - const defaultPanicButton = accounts[2] - const registryKeeper = accounts[3] - const operatorContractUpgrader = accounts[4] - const individualContractPanicButton = accounts[5] - const serviceContractUpgrader = accounts[6] - - const someoneElse = "0x524f2E0176350d950fA630D9A5a59A0a190DAf48" - - const serviceContract1 = "0xF2D3Af2495E286C7820643B963FB9D34418c871d" - const serviceContract2 = "0x65EA55c1f10491038425725dC00dFFEAb2A1e28A" - const operatorContract1 = "0x4566716c07617c5854fe7dA9aE5a1219B19CCd27" - const operatorContract2 = "0x7020A5556Ba1ce5f92c81063a13d33512cf1305c" - - let registry - - before(async () => { - registry = await KeepRegistry.new({ from: owner }) - await registry.setGovernance(governance, { from: owner }) - await registry.setDefaultPanicButton(defaultPanicButton, { - from: governance, - }) - await registry.setRegistryKeeper(registryKeeper, { from: governance }) - await registry.setOperatorContractUpgrader( - serviceContract1, - operatorContractUpgrader, - { from: governance } - ) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("setGovernance", async () => { - it("can be called by governance", async () => { - await registry.setGovernance(someoneElse, { from: governance }) - // ok, no revert - }) - - it("can not be called by non-governance", async () => { - await expectRevert( - registry.setGovernance(someoneElse, { from: owner }), - "Not authorized" - ) - }) - - it("updates governance", async () => { - await registry.setGovernance(someoneElse, { from: governance }) - assert.equal( - await registry.governance(), - someoneElse, - "Unexpected governance" - ) - }) - - it("emits an event", async () => { - const receipt = await registry.setGovernance(someoneElse, { - from: governance, - }) - expectEvent(receipt, "GovernanceUpdated", { - governance: someoneElse, - }) - }) - }) - - describe("setRegistryKeeper", async () => { - it("can be called by governance", async () => { - await registry.setRegistryKeeper(someoneElse, { from: governance }) - // ok, no revert - }) - - it("can not be called by non-governance", async () => { - await expectRevert( - registry.setRegistryKeeper(someoneElse, { from: owner }), - "Not authorized" - ) - }) - - it("updates registry keeper", async () => { - await registry.setRegistryKeeper(someoneElse, { from: governance }) - assert.equal( - await registry.registryKeeper(), - someoneElse, - "Unexpected registry keeper" - ) - }) - - it("emits an event", async () => { - const receipt = await registry.setRegistryKeeper(someoneElse, { - from: governance, - }) - expectEvent(receipt, "RegistryKeeperUpdated", { - registryKeeper: someoneElse, - }) - }) - }) - - describe("setDefaultPanicButton", async () => { - it("can be called by governance", async () => { - await registry.setDefaultPanicButton(someoneElse, { from: governance }) - // ok, no revert - }) - - it("can not be called by non-governance", async () => { - await expectRevert( - registry.setDefaultPanicButton(someoneElse, { from: owner }), - "Not authorized" - ) - }) - - it("updates default panic button", async () => { - await registry.setDefaultPanicButton(someoneElse, { from: governance }) - assert.equal( - await registry.defaultPanicButton(), - someoneElse, - "Unexpected registry keeper" - ) - }) - - it("emits an event", async () => { - const receipt = await registry.setDefaultPanicButton(someoneElse, { - from: governance, - }) - expectEvent(receipt, "DefaultPanicButtonUpdated", { - defaultPanicButton: someoneElse, - }) - }) - }) - - describe("setOperatorContractPanicButton", async () => { - beforeEach(async () => { - await registry.approveOperatorContract(operatorContract1, { - from: registryKeeper, - }) - }) - - it("can be called by governance", async () => { - await registry.setOperatorContractPanicButton( - operatorContract1, - someoneElse, - { from: governance } - ) - // ok, no revert - }) - - it("can not be called by non-governance", async () => { - await expectRevert( - registry.setOperatorContractPanicButton( - operatorContract1, - someoneElse, - { from: owner } - ), - "Not authorized" - ) - }) - - it("can not be called with zero panic button address", async () => { - await expectRevert( - registry.setOperatorContractPanicButton( - operatorContract1, - "0x0000000000000000000000000000000000000000", - { from: governance } - ), - "Panic button must be non-zero address" - ) - }) - - it("can not be called on contracts with disabled panic button", async () => { - await registry.disableOperatorContractPanicButton(operatorContract1, { - from: governance, - }) - assert.equal( - await registry.panicButtons(operatorContract1), - "0x0000000000000000000000000000000000000000", - "Panic button not disabled correctly" - ) - await expectRevert( - registry.setOperatorContractPanicButton( - operatorContract1, - someoneElse, - { from: governance } - ), - "Disabled panic button cannot be updated" - ) - }) - - it("updates contract panic button", async () => { - await registry.setOperatorContractPanicButton( - operatorContract1, - someoneElse, - { from: governance } - ) - assert.equal( - await registry.panicButtons(operatorContract1), - someoneElse, - "Unexpected operator contract panic button" - ) - }) - - it("does not update default panic button", async () => { - await registry.setOperatorContractPanicButton( - operatorContract1, - someoneElse, - { from: governance } - ) - assert.equal( - await registry.defaultPanicButton(), - defaultPanicButton, - "Unexpected default panic button" - ) - }) - }) - - describe("setOperatorContractUpgrader", async () => { - it("can be called by governance", async () => { - await registry.setOperatorContractUpgrader( - serviceContract1, - someoneElse, - { from: governance } - ) - // ok, no revert - }) - - it("can not be called by non-governance", async () => { - await expectRevert( - registry.setOperatorContractUpgrader(serviceContract1, someoneElse, { - from: owner, - }), - "Not authorized" - ) - }) - - it("updates operator contract upgrader", async () => { - await registry.setOperatorContractUpgrader( - serviceContract1, - someoneElse, - { from: governance } - ) - - await registry.setOperatorContractUpgrader( - serviceContract2, - operatorContractUpgrader, - { from: governance } - ) - - assert.equal( - await registry.operatorContractUpgraderFor(serviceContract1), - someoneElse, - "Unexpected operator contract upgrader" - ) - - assert.equal( - await registry.operatorContractUpgraderFor(serviceContract2), - operatorContractUpgrader, - "Unexpected operator contract upgrader" - ) - }) - }) - - describe("setServiceContractUpgrader", async () => { - it("can be called by governance", async () => { - await registry.setServiceContractUpgrader( - operatorContract1, - serviceContractUpgrader, - { from: governance } - ) - // ok, no revert - }) - - it("can not be called by non-governance", async () => { - await expectRevert( - registry.setServiceContractUpgrader( - operatorContract1, - serviceContractUpgrader, - { from: owner } - ), - "Not authorized" - ) - }) - - it("updates service contract upgrader", async () => { - await registry.setServiceContractUpgrader( - operatorContract1, - serviceContractUpgrader, - { from: governance } - ) - - await registry.setServiceContractUpgrader( - operatorContract2, - someoneElse, - { from: governance } - ) - - assert.equal( - await registry.serviceContractUpgraderFor(operatorContract1), - serviceContractUpgrader, - "Unexpected service contract upgrader" - ) - - assert.equal( - await registry.serviceContractUpgraderFor(operatorContract2), - someoneElse, - "Unexpected service contract upgrader" - ) - }) - - it("emits an event", async () => { - const receipt = await registry.setServiceContractUpgrader( - operatorContract1, - serviceContractUpgrader, - { from: governance } - ) - - expectEvent(receipt, "ServiceContractUpgraderUpdated", { - operatorContract: operatorContract1, - keeper: serviceContractUpgrader, - }) - }) - }) - - describe("approveOperatorContract", async () => { - it("can be called by registry keeper", async () => { - await registry.approveOperatorContract(operatorContract1, { - from: registryKeeper, - }) - // ok, no revert - }) - - it("can not be called by non-registry-keeper", async () => { - await expectRevert( - registry.approveOperatorContract(operatorContract1, { from: owner }), - "Not authorized" - ) - }) - - it("approves operator contract", async () => { - await registry.approveOperatorContract(operatorContract1, { - from: registryKeeper, - }) - - assert.isTrue( - await registry.isApprovedOperatorContract(operatorContract1), - "operator contract should be approved" - ) - assert.isFalse( - await registry.isApprovedOperatorContract(operatorContract2), - "operator contract should not be approved" - ) - }) - - it("sets contract's panic button to the default one", async () => { - await registry.approveOperatorContract(operatorContract1, { - from: registryKeeper, - }) - - assert.equal( - await registry.panicButtons(operatorContract1), - defaultPanicButton, - "not a default panic button" - ) - }) - - it("cannot be called for already approved contract", async () => { - await registry.approveOperatorContract(operatorContract1, { - from: registryKeeper, - }) - - await expectRevert( - registry.approveOperatorContract(operatorContract1, { - from: registryKeeper, - }), - "Not a new operator contract" - ) - }) - - it("cannot be called for disabled contract", async () => { - await registry.approveOperatorContract(operatorContract1, { - from: registryKeeper, - }) - await registry.disableOperatorContract(operatorContract1, { - from: defaultPanicButton, - }) - - await expectRevert( - registry.approveOperatorContract(operatorContract1, { - from: registryKeeper, - }), - "Not a new operator contract" - ) - }) - }) - - describe("disableOperatorContract", async () => { - beforeEach(async () => { - await registry.approveOperatorContract(operatorContract1, { - from: registryKeeper, - }) - }) - - it("can be called by default panic button", async () => { - await registry.disableOperatorContract(operatorContract1, { - from: defaultPanicButton, - }) - // ok, no revert - }) - - it("cannot be called by default panic button if contract has its own", async () => { - await registry.setOperatorContractPanicButton( - operatorContract1, - individualContractPanicButton, - { from: governance } - ) - - await expectRevert( - registry.disableOperatorContract(operatorContract1, { - from: defaultPanicButton, - }), - "Not authorized" - ) - }) - - it("can not be called by non-registry-keeper", async () => { - await expectRevert( - registry.disableOperatorContract(operatorContract1, { from: owner }), - "Not authorized" - ) - }) - - it("disables operator contract", async () => { - await registry.disableOperatorContract(operatorContract1, { - from: defaultPanicButton, - }) - - assert.isFalse( - await registry.isApprovedOperatorContract(operatorContract1), - "operator contract should not be approved" - ) - }) - - it("disables operator contract with individual panic button", async () => { - await registry.setOperatorContractPanicButton( - operatorContract1, - individualContractPanicButton, - { from: governance } - ) - - await registry.disableOperatorContract(operatorContract1, { - from: individualContractPanicButton, - }) - - assert.isFalse( - await registry.isApprovedOperatorContract(operatorContract1), - "operator contract should not be approved" - ) - }) - - it("cannot be called if panic button has been disabled", async () => { - await registry.disableOperatorContractPanicButton(operatorContract1, { - from: governance, - }) - - await expectRevert( - registry.disableOperatorContract(operatorContract1, { - from: defaultPanicButton, - }), - "Panic button disabled" - ) - }) - - it("cannot be called for already disabled contract", async () => { - await registry.disableOperatorContract(operatorContract1, { - from: defaultPanicButton, - }) - - await expectRevert( - registry.disableOperatorContract(operatorContract1, { - from: defaultPanicButton, - }), - "Not an approved operator contract" - ) - }) - - it("cannot be called for new operator contract", async () => { - await expectRevert( - registry.disableOperatorContract(operatorContract2, { - from: defaultPanicButton, - }), - "Not an approved operator contract" - ) - }) - }) - - describe("isNewOperatorContract", async () => { - it("returns true for new operator contracts", async () => { - assert.isTrue( - await registry.isNewOperatorContract(operatorContract1), - "Expected true for new operator contract" - ) - }) - - it("returns false for approved operator contract", async () => { - await registry.approveOperatorContract(operatorContract1, { - from: registryKeeper, - }) - - assert.isFalse( - await registry.isNewOperatorContract(operatorContract1), - "Expected false for approved operator contract" - ) - }) - - it("returns false for disabled operator contract", async () => { - await registry.approveOperatorContract(operatorContract1, { - from: registryKeeper, - }) - await registry.disableOperatorContract(operatorContract1, { - from: defaultPanicButton, - }) - - assert.isFalse( - await registry.isNewOperatorContract(operatorContract1), - "Expected false for disabled operator contract" - ) - }) - }) - - describe("isApprovedOperatorContract", async () => { - it("returns false for new operator contracts", async () => { - assert.isFalse( - await registry.isApprovedOperatorContract(operatorContract1), - "Expected false for new operator contract" - ) - }) - - it("returns true for approved operator contract", async () => { - await registry.approveOperatorContract(operatorContract1, { - from: registryKeeper, - }) - - assert.isTrue( - await registry.isApprovedOperatorContract(operatorContract1), - "Expected true for approved operator contract" - ) - }) - - it("returns false for disabled operator contract", async () => { - await registry.approveOperatorContract(operatorContract1, { - from: registryKeeper, - }) - await registry.disableOperatorContract(operatorContract1, { - from: defaultPanicButton, - }) - - assert.isFalse( - await registry.isApprovedOperatorContract(operatorContract1), - "Expected false for disabled operator contract" - ) - }) - }) -}) diff --git a/solidity-v1/test/TestModUtils.js b/solidity-v1/test/TestModUtils.js deleted file mode 100644 index 9642bd82e3..0000000000 --- a/solidity-v1/test/TestModUtils.js +++ /dev/null @@ -1,46 +0,0 @@ -const { contract } = require("@openzeppelin/test-environment") -const TestModUtils = contract.fromArtifact("TestModUtils") - -describe("ModUtils", () => { - let modUtils - - before(async () => { - modUtils = await TestModUtils.new() - }) - - it("runModExponentTest()", async () => { - await modUtils.runModExponentTest() - }) - - it("runLegendreRangeTest()", async () => { - await modUtils.runLegendreRangeTest() - }) - - it("runLegendreListTest()", async () => { - await modUtils.runLegendreListTest() - }) - - it("runModSqrtOf0Test()", async () => { - await modUtils.runModSqrtOf0Test() - }) - - it("runModSqrtMultipleOfPTest()", async () => { - await modUtils.runModSqrtMultipleOfPTest() - }) - - it("runModSqrtAgainstListTest()", async () => { - await modUtils.runModSqrtAgainstListTest() - }) - - it("runModSqrtAgainstNonSquaresTest()", async () => { - await modUtils.runModSqrtAgainstNonSquaresTest() - }) - - it("runModSqrtALessThanPTest()", async () => { - await modUtils.runModSqrtALessThanPTest() - }) - - it("runModSqrtAGreaterThanPTest()", async () => { - await modUtils.runModSqrtAGreaterThanPTest() - }) -}) diff --git a/solidity-v1/test/TestOperatorParams.js b/solidity-v1/test/TestOperatorParams.js deleted file mode 100644 index be916e75fb..0000000000 --- a/solidity-v1/test/TestOperatorParams.js +++ /dev/null @@ -1,128 +0,0 @@ -const { contract, web3 } = require("@openzeppelin/test-environment") -const assert = require("chai").assert -const OperatorParamsStub = contract.fromArtifact("OperatorParamsStub") - -describe("OperatorParams", () => { - let opUtils - const eighteen = web3.utils.toBN(18) - const ten = web3.utils.toBN(10) - const keepDecimals = ten.pow(eighteen) - const billion = web3.utils.toBN(1000000000) - const allKeepEver = billion.mul(keepDecimals) - - const blocksPerYear = web3.utils.toBN(3153600) - const recently = blocksPerYear.muln(5) - const billionYearsFromNow = blocksPerYear.mul(billion) - - before(async () => { - opUtils = await OperatorParamsStub.new() - }) - - describe("pack", async () => { - it("should roundtrip values", async () => { - const params = await opUtils.publicPack( - allKeepEver, - recently, - billionYearsFromNow - ) - const amount = await opUtils.publicGetAmount(params) - const createdAt = await opUtils.publicGetCreationTimestamp(params) - const undelegatedAt = await opUtils.publicGetUndelegationTimestamp(params) - - assert.equal( - amount.toJSON(), - allKeepEver.toJSON(), - "The amount should be the same" - ) - assert.equal( - createdAt.toJSON(), - recently.toJSON(), - "The creation timestamp should be the same" - ) - assert.equal( - undelegatedAt.toJSON(), - billionYearsFromNow.toJSON(), - "The undelegation timestamp should be the same" - ) - }) - }) - - describe("setAmount", async () => { - it("should set the amount", async () => { - const params = await opUtils.publicPack(allKeepEver, recently, 0) - const newParams = await opUtils.publicSetAmount(params, billion) - const amount = await opUtils.publicGetAmount(newParams) - assert.equal( - amount.toJSON(), - billion.toJSON(), - "The amount should be the same" - ) - }) - }) - - describe("setCreationTimestamp", async () => { - it("should set the creation timestamp", async () => { - const params = await opUtils.publicPack(allKeepEver, recently, 0) - const newParams = await opUtils.publicSetCreationTimestamp( - params, - billionYearsFromNow - ) - const creationBlock = await opUtils.publicGetCreationTimestamp(newParams) - assert.equal( - creationBlock.toJSON(), - billionYearsFromNow.toJSON(), - "The creation timestamp should be the same" - ) - }) - }) - - describe("setUndelegationTimestamp", async () => { - it("should set the undelegation timestamp", async () => { - const params = await opUtils.publicPack(allKeepEver, recently, 0) - const newParams = await opUtils.publicSetUndelegationTimestamp( - params, - recently - ) - const undelegationTimestamp = await opUtils.publicGetUndelegationTimestamp( - newParams - ) - assert.equal( - undelegationTimestamp.toJSON(), - recently.toJSON(), - "The undelegationTimestamp should be the same" - ) - }) - }) - - describe("setAmountAndCreationTimestamp", async () => { - it("should set the creation timestamp", async () => { - const params = await opUtils.publicPack(allKeepEver, recently, 0) - const newParams = await opUtils.publicSetAmountAndCreationTimestamp( - params, - billion, - billionYearsFromNow - ) - const creationBlock = await opUtils.publicGetCreationTimestamp(newParams) - assert.equal( - creationBlock.toJSON(), - billionYearsFromNow.toJSON(), - "The creation timestamp should be the same" - ) - }) - - it("should set the amount", async () => { - const params = await opUtils.publicPack(allKeepEver, recently, 0) - const newParams = await opUtils.publicSetAmountAndCreationTimestamp( - params, - billion, - billionYearsFromNow - ) - const amount = await opUtils.publicGetAmount(newParams) - assert.equal( - amount.toJSON(), - billion.toJSON(), - "The amount should be the same" - ) - }) - }) -}) diff --git a/solidity-v1/test/TestPhasedEscrow.js b/solidity-v1/test/TestPhasedEscrow.js deleted file mode 100644 index 678c796b83..0000000000 --- a/solidity-v1/test/TestPhasedEscrow.js +++ /dev/null @@ -1,1114 +0,0 @@ -const { initContracts } = require("./helpers/initContracts") -const { accounts, contract, web3 } = require("@openzeppelin/test-environment") -const { createSnapshot, restoreSnapshot } = require("./helpers/snapshot.js") -const { expectRevert, expectEvent } = require("@openzeppelin/test-helpers") -const { ZERO_ADDRESS } = require("@openzeppelin/test-helpers/src/constants") -const time = require("@openzeppelin/test-helpers/src/time") -const crypto = require("crypto") - -const KeepToken = contract.fromArtifact("KeepToken") -const Escrow = contract.fromArtifact("Escrow") -const PhasedEscrow = contract.fromArtifact("PhasedEscrow") -const BatchedPhasedEscrow = contract.fromArtifact("BatchedPhasedEscrow") - -const TestSimpleBeneficiary = contract.fromArtifact("TestSimpleBeneficiary") -const StakingPoolRewardsEscrowBeneficiary = contract.fromArtifact( - "StakingPoolRewardsEscrowBeneficiary" -) -const StakerRewardsBeneficiary = contract.fromArtifact( - "StakerRewardsBeneficiary" -) -const BeaconBackportRewardsEscrowBeneficiary = contract.fromArtifact( - "BeaconBackportRewardsEscrowBeneficiary" -) -const BeaconRewardsEscrowBeneficiary = contract.fromArtifact( - "BeaconRewardsEscrowBeneficiary" -) -const PlainTransferEscrowBeneficiary = contract.fromArtifact( - "PlainTransferEscrowBeneficiary" -) - -const BeaconRewards = contract.fromArtifact("BeaconRewards") -const BeaconBackportRewards = contract.fromArtifact("BeaconBackportRewards") -const TestCurveRewards = contract.fromArtifact("TestCurveRewards") -const TestSimpleStakerRewards = contract.fromArtifact("TestSimpleStakerRewards") -const TestSimpleReceiver = contract.fromArtifact("TestSimpleReceiver") - -const chai = require("chai") -chai.use(require("bn-chai")(web3.utils.BN)) -const expect = chai.expect - -describe("PhasedEscrow", () => { - const owner = accounts[0] - const updatedOwner = accounts[1] - - let beneficiary - let updatedBeneficiary - let rewardsBeneficiary - - let token - let phasedEscrow - - before(async () => { - token = await KeepToken.new({ from: owner }) - phasedEscrow = await PhasedEscrow.new(token.address, { from: owner }) - beneficiary = await TestSimpleBeneficiary.new() - updatedBeneficiary = await TestSimpleBeneficiary.new() - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("receiveApproval", async () => { - it("fails for an unknown token", async () => { - // It is another KeepToken contract deployment, not the one PhasedEscrow - // has been created with. - const unknownToken = await KeepToken.new({ from: owner }) - const amountApproved = web3.utils.toBN(9991) - - await expectRevert( - unknownToken.approveAndCall( - phasedEscrow.address, - amountApproved, - "0x0", - { from: owner } - ), - "Unsupported token" - ) - }) - - it("transfers all approved tokens", async () => { - const amountApproved = web3.utils.toBN(9993) - await token.approveAndCall(phasedEscrow.address, amountApproved, "0x0", { - from: owner, - }) - - const actualBalance = await token.balanceOf(phasedEscrow.address) - expect(actualBalance).to.eq.BN(amountApproved) - }) - }) - - describe("setBeneficiary", async () => { - it("can be called by owner", async () => { - await phasedEscrow.setBeneficiary(beneficiary.address, { from: owner }) - // ok, no revert - }) - - it("can be called by updated owner", async () => { - await phasedEscrow.transferOwnership(updatedOwner, { from: owner }) - - await expectRevert( - phasedEscrow.setBeneficiary(beneficiary.address, { from: owner }), - "Ownable: caller is not the owner" - ) - await phasedEscrow.setBeneficiary(beneficiary.address, { - from: updatedOwner, - }) - // ok, no revert - }) - - it("can not be called by non-owner", async () => { - await expectRevert( - phasedEscrow.setBeneficiary(beneficiary.address, { - from: updatedOwner, - }), - "Ownable: caller is not the owner" - ) - }) - - it("sets beneficiary", async () => { - await phasedEscrow.setBeneficiary(beneficiary.address, { from: owner }) - - expect(await phasedEscrow.beneficiary()).to.equal( - beneficiary.address, - "Unexpected beneficiary" - ) - }) - - it("emits an event", async () => { - const receipt = await phasedEscrow.setBeneficiary(beneficiary.address, { - from: owner, - }) - - expectEvent(receipt, "BeneficiaryUpdated", { - beneficiary: beneficiary.address, - }) - }) - }) - - describe("withdrawFromEscrow", async () => { - const amount = web3.utils.toBN(12090) - let escrow - - beforeEach(async () => { - escrow = await Escrow.new(token.address, { from: owner }) - await token.transfer(escrow.address, amount, { from: owner }) - }) - - it("pulls all funds from a non-phased Escrow when having no tokens", async () => { - const balanceBefore = await token.balanceOf(phasedEscrow.address) - expect(balanceBefore).to.eq.BN(0) - - await escrow.setBeneficiary(phasedEscrow.address, { from: owner }) - await phasedEscrow.withdrawFromEscrow(escrow.address) - - const balanceAfter = await token.balanceOf(phasedEscrow.address) - expect(balanceAfter).to.eq.BN(amount) - }) - - it("pulls all funds from a non-phased Escrow when having some tokens", async () => { - const initialFunds = web3.utils.toBN(999) - await token.transfer(phasedEscrow.address, initialFunds, { from: owner }) - const balanceBefore = await token.balanceOf(phasedEscrow.address) - expect(balanceBefore).to.eq.BN(initialFunds) - - await escrow.setBeneficiary(phasedEscrow.address, { from: owner }) - await phasedEscrow.withdrawFromEscrow(escrow.address) - - const balanceAfter = await token.balanceOf(phasedEscrow.address) - expect(balanceAfter).to.eq.BN(initialFunds.add(amount)) - }) - }) - - describe("withdraw", async () => { - it("can not be called if beneficiary wasn't set", async () => { - await token.transfer(phasedEscrow.address, 100, { from: owner }) - await expectRevert( - phasedEscrow.withdraw(100, { from: owner }), - "Beneficiary not assigned" - ) - }) - - it("can not be called by non-owner", async () => { - await token.transfer(phasedEscrow.address, 100, { from: owner }) - await phasedEscrow.setBeneficiary(beneficiary.address, { from: owner }) - await expectRevert( - phasedEscrow.withdraw(100, { from: beneficiary.address }), - "Ownable: caller is not the owner" - ) - }) - - it("can be called by owner", async () => { - await phasedEscrow.setBeneficiary(beneficiary.address, { from: owner }) - await token.transfer(phasedEscrow.address, 100, { from: owner }) - await phasedEscrow.withdraw(100, { from: owner }) - // ok, no reverts - }) - - it("fails when escrow is empty", async () => { - await phasedEscrow.setBeneficiary(beneficiary.address, { from: owner }) - await expectRevert( - phasedEscrow.withdraw(100, { from: owner }), - "Not enough tokens for withdrawal" - ) - }) - - it("withdraws specified tokens to updated beneficiary", async () => { - await phasedEscrow.setBeneficiary(beneficiary.address, { from: owner }) - const amount = web3.utils.toBN(987654321) - await token.transfer(phasedEscrow.address, amount, { from: owner }) - - await phasedEscrow.withdraw(100, { from: owner }) - - await phasedEscrow.setBeneficiary(updatedBeneficiary.address, { - from: owner, - }) - await phasedEscrow.withdraw(100, { from: owner }) - - expect(await token.balanceOf(beneficiary.address)).to.eq.BN( - 100, - "Unexpected amount withdrawn" - ) - expect(await token.balanceOf(updatedBeneficiary.address)).to.eq.BN( - 100, - "Unexpected amount withdrawn" - ) - expect(await token.balanceOf(phasedEscrow.address)).to.eq.BN( - 987654321 - 200, - "Unexpected amount withdrawn" - ) - }) - - it("withdraws specified tokens to beneficiary", async () => { - await phasedEscrow.setBeneficiary(beneficiary.address, { from: owner }) - const amount = web3.utils.toBN(123456789) - await token.transfer(phasedEscrow.address, amount, { from: owner }) - - await phasedEscrow.withdraw(100, { from: owner }) - - expect(await token.balanceOf(beneficiary.address)).to.eq.BN( - 100, - "Unexpected amount withdrawn" - ) - expect(await token.balanceOf(phasedEscrow.address)).to.eq.BN( - 123456789 - 100, - "Unexpected amount withdrawn" - ) - }) - - it("emits an event", async () => { - await phasedEscrow.setBeneficiary(beneficiary.address, { from: owner }) - const amount = web3.utils.toBN(100) - await token.transfer(phasedEscrow.address, amount.muln(2), { - from: owner, - }) - - const receipt = await phasedEscrow.withdraw(amount, { from: owner }) - - await expectEvent(receipt, "TokensWithdrawn", { - beneficiary: beneficiary.address, - amount: amount, - }) - }) - }) - - describe("when withdrawing to a StakingPoolRewardsEscrowBeneficiary", () => { - const baseBalance = 123456789 - const transferAmount = 100 - - before(async () => { - rewardsContract = await TestCurveRewards.new(token.address) - rewardsBeneficiary = await StakingPoolRewardsEscrowBeneficiary.new( - token.address, - rewardsContract.address, - { from: owner } - ) - - await rewardsBeneficiary.transferOwnership(phasedEscrow.address, { - from: owner, - }) - const amount = web3.utils.toBN(baseBalance) - await token.transfer(phasedEscrow.address, amount, { from: owner }) - - await phasedEscrow.setBeneficiary(rewardsBeneficiary.address, { - from: owner, - }) - }) - - assertRewards(baseBalance, transferAmount) - - it("emits a RewardAdded event from the rewards beneficiary", async () => { - const receipt = resolveAllLogs( - (await phasedEscrow.withdraw(transferAmount, { from: owner })).receipt, - { rewardsContract } - ) - - expectEvent(receipt, "RewardAdded", { - reward: web3.utils.toBN(transferAmount), - }) - }) - }) - - describe("when withdrawing to a BeaconBackportRewardsEscrowBeneficiary", () => { - const baseBalance = 200000000 - const transferAmount = 200000 - let stakingContract - let operatorContract - - before(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact("KeepRandomBeaconOperatorBeaconRewardsStub") - ) - - stakingContract = contracts.stakingContract - operatorContract = contracts.operatorContract - - phasedEscrow = await PhasedEscrow.new(token.address, { from: owner }) - const amount = web3.utils.toBN(baseBalance) - await token.transfer(phasedEscrow.address, amount, { from: owner }) - - rewardsContract = await BeaconBackportRewards.new( - token.address, - operatorContract.address, - stakingContract.address - ) - - rewardsBeneficiary = await BeaconBackportRewardsEscrowBeneficiary.new( - token.address, - rewardsContract.address, - { from: owner } - ) - await rewardsBeneficiary.transferOwnership(phasedEscrow.address, { - from: owner, - }) - - await phasedEscrow.setBeneficiary(rewardsBeneficiary.address, { - from: owner, - }) - }) - - assertRewards(baseBalance, transferAmount) - }) - - describe("when withdrawing to a BeaconRewardsEscrowBeneficiary", () => { - const baseBalance = 200000000 - const transferAmount = 19800000 - let stakingContract - let operatorContract - - before(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact("KeepRandomBeaconOperatorBeaconRewardsStub") - ) - - stakingContract = contracts.stakingContract - operatorContract = contracts.operatorContract - - phasedEscrow = await PhasedEscrow.new(token.address, { from: owner }) - const amount = web3.utils.toBN(baseBalance) - await token.transfer(phasedEscrow.address, amount, { from: owner }) - - rewardsContract = await BeaconRewards.new( - token.address, - operatorContract.address, - stakingContract.address - ) - - rewardsBeneficiary = await BeaconRewardsEscrowBeneficiary.new( - token.address, - rewardsContract.address, - { from: owner } - ) - await rewardsBeneficiary.transferOwnership(phasedEscrow.address, { - from: owner, - }) - - await phasedEscrow.setBeneficiary(rewardsBeneficiary.address, { - from: owner, - }) - }) - - assertRewards(baseBalance, transferAmount) - }) - - describe("when withdrawing to a PlainTransferEscrowBeneficiary", () => { - const baseBalance = 200000000 - const transferAmount = 9100000 - - before(async () => { - phasedEscrow = await PhasedEscrow.new(token.address, { from: owner }) - const amount = web3.utils.toBN(baseBalance) - await token.transfer(phasedEscrow.address, amount, { from: owner }) - - rewardsContract = await TestSimpleReceiver.new({ from: owner }) - rewardsBeneficiary = await PlainTransferEscrowBeneficiary.new( - token.address, - rewardsContract.address, - { from: owner } - ) - await rewardsBeneficiary.transferOwnership(phasedEscrow.address, { - from: owner, - }) - - await phasedEscrow.setBeneficiary(rewardsBeneficiary.address, { - from: owner, - }) - }) - - assertRewards(baseBalance, transferAmount) - }) - - async function assertRewards(baseBalance, transferAmount) { - it("withdraws specified tokens from escrow", async () => { - await phasedEscrow.withdraw(transferAmount, { from: owner }) - - expect(await token.balanceOf(phasedEscrow.address)).to.eq.BN( - baseBalance - transferAmount, - "Unexpected amount withdrawn" - ) - }) - - it("transfers specified tokens to rewards contract", async () => { - await phasedEscrow.withdraw(transferAmount, { from: owner }) - - expect(await token.balanceOf(rewardsContract.address)).to.eq.BN( - transferAmount, - "Unexpected amount deposited" - ) - }) - - it("leaves no tokens in the rewards beneficiary", async () => { - await phasedEscrow.withdraw(transferAmount, { from: owner }) - - expect(await token.balanceOf(rewardsBeneficiary.address)).to.eq.BN( - 0, - "Unexpected amount left in rewards beneficiary" - ) - }) - - it("emits a TokensWithdrawn event to the rewards beneficiary", async () => { - const receipt = await phasedEscrow.withdraw(transferAmount, { - from: owner, - }) - - expectEvent(receipt, "TokensWithdrawn", { - beneficiary: rewardsBeneficiary.address, - amount: web3.utils.toBN(transferAmount), - }) - }) - } -}) - -describe("BatchedPhasedEscrow", () => { - const owner = accounts[1] - const drawee = accounts[2] - const updatedOwner = accounts[3] - const updatedDrawee = accounts[4] - - let token - let batchedPhasedEscrow - - let beneficiary1 - let beneficiary2 - let beneficiary3 - - before(async () => { - token = await KeepToken.new({ from: owner }) - batchedPhasedEscrow = await BatchedPhasedEscrow.new(token.address, { - from: owner, - }) - - beneficiary1 = await TestSimpleBeneficiary.new({ from: owner }) - beneficiary2 = await TestSimpleBeneficiary.new({ from: owner }) - beneficiary3 = await TestSimpleBeneficiary.new({ from: owner }) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - it("can be funded from PhasedEscrow contract", async () => { - // This test verifies if BatchedPhasedEscrow can be funded from PhasedEscrow. - // To perform such operation an intermediary beneficiary contract is needed - // that will automatically transfer funds received from PhasedEscrow to - // BatchedPhasedEscrow. - // The tokens are transferred in the following way: - // PhasedEscrow -> StakerRewardsBeneficiary -> BatchedPhasedEscrow - - // Deploy PhasedEscrow and do initial funding. - const amount = 9000 - - const phasedEscrow = await PhasedEscrow.new(token.address, { from: owner }) - await token.transfer(phasedEscrow.address, amount, { - from: owner, - }) - - // Deploy intermediary beneficiary and transfer its' ownership to PhasedEscrow. - const beneficiary = await StakerRewardsBeneficiary.new( - token.address, - batchedPhasedEscrow.address, - { from: owner } - ) - await beneficiary.transferOwnership(phasedEscrow.address, { - from: owner, - }) - - // Withdraw funds from PhasedEscrow - await phasedEscrow.setBeneficiary(beneficiary.address, { from: owner }) - await phasedEscrow.withdraw(amount, { from: owner }) - - // Verify that funds got transferred to BatchedPhasedEscrow - expect(await token.balanceOf(batchedPhasedEscrow.address)).to.eq.BN( - amount, - `Unexpected batched escrow balance` - ) - expect(await token.balanceOf(phasedEscrow.address)).to.eq.BN( - 0, - `Unexpected phased escrow balance` - ) - }) - - describe("receiveApproval", async () => { - it("fails for an unknown token", async () => { - // It is another KeepToken contract deployment, not the one PhasedEscrow - // has been created with. - const unknownToken = await KeepToken.new({ from: owner }) - const amountApproved = web3.utils.toBN(9991) - - await expectRevert( - unknownToken.approveAndCall( - batchedPhasedEscrow.address, - amountApproved, - "0x0", - { from: owner } - ), - "Unsupported token" - ) - }) - - it("transfers all approved tokens", async () => { - const amountApproved = web3.utils.toBN(9993) - await token.approveAndCall( - batchedPhasedEscrow.address, - amountApproved, - "0x0", - { from: owner } - ) - - const actualBalance = await token.balanceOf(batchedPhasedEscrow.address) - expect(actualBalance).to.eq.BN(amountApproved) - }) - }) - - describe("beneficiary approval", async () => { - it("can be done by owner", async () => { - await batchedPhasedEscrow.approveBeneficiary(beneficiary1.address, { - from: owner, - }) - // ok, no revert - }) - - it("can be done by updated owner", async () => { - await batchedPhasedEscrow.transferOwnership(updatedOwner, { from: owner }) - - await expectRevert( - batchedPhasedEscrow.approveBeneficiary(beneficiary1.address, { - from: owner, - }), - "Ownable: caller is not the owner" - ) - await batchedPhasedEscrow.approveBeneficiary(beneficiary1.address, { - from: updatedOwner, - }) - // ok, no revert - }) - - it("can not be done by non-owner", async () => { - await expectRevert( - batchedPhasedEscrow.approveBeneficiary(beneficiary1.address, { - from: drawee, - }), - "Ownable: caller is not the owner" - ) - }) - - it("can not be done on zero address", async () => { - await expectRevert( - batchedPhasedEscrow.approveBeneficiary(ZERO_ADDRESS, { from: owner }), - "Beneficiary can not be zero address" - ) - }) - - it("emits an event", async () => { - const receipt = await batchedPhasedEscrow.approveBeneficiary( - beneficiary1.address, - { - from: owner, - } - ) - - expectEvent(receipt, "BeneficiaryApproved", { - beneficiary: beneficiary1.address, - }) - }) - - it("maintains beneficiaries as non-approved by default", async () => { - expect( - await batchedPhasedEscrow.isBeneficiaryApproved(beneficiary1.address) - ).to.be.false - expect( - await batchedPhasedEscrow.isBeneficiaryApproved(beneficiary2.address) - ).to.be.false - expect( - await batchedPhasedEscrow.isBeneficiaryApproved(beneficiary3.address) - ).to.be.false - }) - - it("approves a single beneficiary", async () => { - await batchedPhasedEscrow.approveBeneficiary(beneficiary2.address, { - from: owner, - }) - - expect( - await batchedPhasedEscrow.isBeneficiaryApproved(beneficiary1.address) - ).to.be.false - expect( - await batchedPhasedEscrow.isBeneficiaryApproved(beneficiary2.address) - ).to.be.true - expect( - await batchedPhasedEscrow.isBeneficiaryApproved(beneficiary3.address) - ).to.be.false - }) - - it("approves multiple beneficiaries ", async () => { - await batchedPhasedEscrow.approveBeneficiary(beneficiary1.address, { - from: owner, - }) - await batchedPhasedEscrow.approveBeneficiary(beneficiary2.address, { - from: owner, - }) - - expect( - await batchedPhasedEscrow.isBeneficiaryApproved(beneficiary1.address) - ).to.be.true - expect( - await batchedPhasedEscrow.isBeneficiaryApproved(beneficiary2.address) - ).to.be.true - expect( - await batchedPhasedEscrow.isBeneficiaryApproved(beneficiary3.address) - ).to.be.false - }) - }) - - describe("drawee role", async () => { - it("is by default assigned to owner", async () => { - expect(await batchedPhasedEscrow.drawee()).to.equal(owner) - }) - - it("can be transferred by owner", async () => { - await batchedPhasedEscrow.setDrawee(updatedDrawee, { from: owner }) - // ok, no revert - }) - - it("can be transferred by updated owner", async () => { - await batchedPhasedEscrow.transferOwnership(updatedOwner, { from: owner }) - - await expectRevert( - batchedPhasedEscrow.setDrawee(updatedDrawee, { from: owner }), - "Ownable: caller is not the owner" - ) - await batchedPhasedEscrow.setDrawee(updatedDrawee, { - from: updatedOwner, - }) - // ok, no revert - }) - - it("can not be transferred by non-owner", async () => { - await expectRevert( - batchedPhasedEscrow.setDrawee(updatedDrawee, { from: drawee }), - "Ownable: caller is not the owner" - ) - }) - - it("can be transferred to another account", async () => { - let receipt = await batchedPhasedEscrow.setDrawee(drawee, { - from: owner, - }) - - expect(await batchedPhasedEscrow.drawee()).to.equal(drawee) - expectEvent(receipt, "DraweeRoleTransferred", { - oldDrawee: owner, - newDrawee: drawee, - }) - - receipt = await batchedPhasedEscrow.setDrawee(updatedDrawee, { - from: owner, - }) - - expect(await batchedPhasedEscrow.drawee()).to.equal(updatedDrawee) - expectEvent(receipt, "DraweeRoleTransferred", { - oldDrawee: drawee, - newDrawee: updatedDrawee, - }) - }) - }) - - describe("batchedWithdraw", async () => { - let beneficiaries - let amounts - let escrowBalance - - beforeEach(async () => { - beneficiaries = [ - beneficiary1.address, - beneficiary2.address, - beneficiary3.address, - ] - - amounts = [100, 200, 300] - escrowBalance = 600 - - await batchedPhasedEscrow.approveBeneficiary(beneficiary1.address, { - from: owner, - }) - await batchedPhasedEscrow.approveBeneficiary(beneficiary2.address, { - from: owner, - }) - await batchedPhasedEscrow.approveBeneficiary(beneficiary3.address, { - from: owner, - }) - - await batchedPhasedEscrow.setDrawee(drawee, { - from: owner, - }) - - await token.transfer(batchedPhasedEscrow.address, escrowBalance, { - from: owner, - }) - }) - - it("can be called by drawee", async () => { - await batchedPhasedEscrow.batchedWithdraw(beneficiaries, amounts, { - from: drawee, - }) - // ok, no revert - }) - - it("can not be called by owner if not drawee", async () => { - await expectRevert( - batchedPhasedEscrow.batchedWithdraw(beneficiaries, amounts, { - from: owner, - }), - "Caller is not the drawee" - ) - }) - - it("can not be called by non-drawee", async () => { - await expectRevert( - batchedPhasedEscrow.batchedWithdraw(beneficiaries, amounts, { - from: updatedDrawee, - }), - "Caller is not the drawee" - ) - }) - - it("reverts when input arrays have different lengths", async () => { - await expectRevert( - batchedPhasedEscrow.batchedWithdraw(beneficiaries, [100, 200], { - from: drawee, - }), - "Mismatched arrays length" - ) - }) - - it("reverts when beneficiary is not IBeneficiaryContract", async () => { - await expectRevert.unspecified( - batchedPhasedEscrow.batchedWithdraw( - [beneficiary1.address, beneficiary2.address, owner], - amounts, - { - from: owner, - } - ) - ) - }) - - it("reverts when beneficiary was not approved", async () => { - const anotherBeneficiary = await TestSimpleBeneficiary.new({ - from: owner, - }) - - await expectRevert( - batchedPhasedEscrow.batchedWithdraw( - [beneficiary1.address, anotherBeneficiary.address], - [100, 200], - { - from: drawee, - } - ), - "Beneficiary was not approved" - ) - }) - - it("reverts when there are not enough funds in the escrow", async () => { - await expectRevert.unspecified( - batchedPhasedEscrow.batchedWithdraw(beneficiaries, [100, 200, 301], { - from: drawee, - }) - ) - }) - - it("withdraws specified tokens to beneficiaries", async () => { - await batchedPhasedEscrow.batchedWithdraw(beneficiaries, amounts, { - from: drawee, - }) - - for (let i = 0; i < beneficiaries.length; i++) { - expect(await token.balanceOf(beneficiaries[i])).to.eq.BN( - amounts[i], - `Unexpected amount withdrawn for beneficiary ${i}` - ) - } - - expect(await token.balanceOf(batchedPhasedEscrow.address)).to.eq.BN( - 0, - `Unexpected escrow balance` - ) - }) - }) - - describe("when withdrawing to a PlainTransferEscrowBeneficiary", () => { - const baseBalance = 200000000 - const transferAmount = 9100000 - - let rewardsContract - let rewardsBeneficiary - - let withdrawTx - - before(async () => { - rewardsContract = await TestSimpleReceiver.new({ from: owner }) - rewardsBeneficiary = await PlainTransferEscrowBeneficiary.new( - token.address, - rewardsContract.address, - { from: owner } - ) - await rewardsBeneficiary.transferOwnership(batchedPhasedEscrow.address, { - from: owner, - }) - - await batchedPhasedEscrow.approveBeneficiary(rewardsBeneficiary.address, { - from: owner, - }) - - await batchedPhasedEscrow.setDrawee(drawee, { - from: owner, - }) - - const amount = web3.utils.toBN(baseBalance) - await token.transfer(batchedPhasedEscrow.address, amount, { from: owner }) - - withdrawTx = await batchedPhasedEscrow.batchedWithdraw( - [rewardsBeneficiary.address], - [transferAmount], - { from: drawee } - ) - }) - - it("withdraws specified tokens from escrow", async () => { - expect(await token.balanceOf(batchedPhasedEscrow.address)).to.eq.BN( - baseBalance - transferAmount, - "Unexpected amount withdrawn" - ) - }) - - it("transfers specified tokens to rewards contract", async () => { - expect(await token.balanceOf(rewardsContract.address)).to.eq.BN( - transferAmount, - "Unexpected amount deposited" - ) - }) - - it("leaves no tokens in the rewards beneficiary", async () => { - expect(await token.balanceOf(rewardsBeneficiary.address)).to.eq.BN( - 0, - "Unexpected amount left in rewards beneficiary" - ) - }) - - it("emits a TokensWithdrawn event to the rewards beneficiary", async () => { - expectEvent(withdrawTx, "TokensWithdrawn", { - beneficiary: rewardsBeneficiary.address, - amount: web3.utils.toBN(transferAmount), - }) - }) - }) -}) - -describe("StakingPoolRewardsEscrowBeneficiary", () => { - const owner = accounts[0] - const thirdParty = accounts[1] - - const transferAmount = 1000 - - let token - let rewardsContract - let rewardsBeneficiary - - before(async () => { - token = await KeepToken.new({ from: owner }) - rewardsContract = await TestCurveRewards.new(token.address) - rewardsBeneficiary = await StakingPoolRewardsEscrowBeneficiary.new( - token.address, - rewardsContract.address, - { from: owner } - ) - - const amount = web3.utils.toBN(transferAmount) - await token.transfer(rewardsBeneficiary.address, amount, { from: owner }) - }) - - describe("__escrowSentTokens", async () => { - it("can be called by the owner", async () => { - await rewardsBeneficiary.__escrowSentTokens(transferAmount, { - from: owner, - }) - // ok, no revert - }) - - it("can not be called by the non-owner", async () => { - await expectRevert( - rewardsBeneficiary.__escrowSentTokens(transferAmount, { - from: thirdParty, - }), - "Ownable: caller is not the owner" - ) - }) - }) -}) - -describe("StakerRewardsBeneficiary", () => { - const owner = accounts[0] - const thirdParty = accounts[1] - - const transferAmount = 1000 - - let token - let rewardsContract - let rewardsBeneficiary - - before(async () => { - token = await KeepToken.new({ from: owner }) - rewardsContract = await TestSimpleStakerRewards.new(token.address) - rewardsBeneficiary = await StakerRewardsBeneficiary.new( - token.address, - rewardsContract.address, - { from: owner } - ) - - const amount = web3.utils.toBN(transferAmount) - await token.transfer(rewardsBeneficiary.address, amount, { from: owner }) - }) - - describe("__escrowSentTokens", async () => { - it("can be called by the owner", async () => { - await rewardsBeneficiary.__escrowSentTokens(transferAmount, { - from: owner, - }) - // ok, no revert - }) - - it("can not be called by the non-owner", async () => { - await expectRevert( - rewardsBeneficiary.__escrowSentTokens(transferAmount, { - from: thirdParty, - }), - "Ownable: caller is not the owner" - ) - }) - }) -}) - -describe("BeaconRewards to PhasedEscrow transfer", async () => { - const owner = accounts[0] - const operators = [accounts[1], accounts[2]] - - const tokenDecimalMultiplier = web3.utils.toBN(10).pow(web3.utils.toBN(18)) - const totalRewards = web3.utils.toBN(19800000).mul(tokenDecimalMultiplier) - - let token - let operatorContract - let phasedEscrow - let rewardsContract - - before(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact("KeepRandomBeaconOperatorBeaconRewardsStub") - ) - - token = contracts.token - operatorContract = contracts.operatorContract - const stakingContract = contracts.stakingContract - - phasedEscrow = await PhasedEscrow.new(token.address, { from: owner }) - rewardsContract = await BeaconRewards.new( - token.address, - operatorContract.address, - stakingContract.address, - { from: owner } - ) - - await token.approveAndCall(rewardsContract.address, totalRewards, "0x0", { - from: owner, - }) - await rewardsContract.markAsFunded({ from: owner }) - }) - - it("moves all unallocated tokens to escrow", async () => { - await rewardsContract.initiateRewardsUpgrade(phasedEscrow.address, { - from: owner, - }) - - const now = await time.latest() - - await operatorContract.registerNewGroup( - crypto.randomBytes(128), - operators, - now - ) - - const currentInterval = await rewardsContract.intervalOf(now) - const currentIntervalEnd = await rewardsContract.endOf(currentInterval) - await time.increaseTo(currentIntervalEnd.addn(1)) - - await rewardsContract.finalizeRewardsUpgrade({ from: owner }) - - const escrowBalance = await token.balanceOf(phasedEscrow.address) - const allocatedRewards = await rewardsContract.totalRewards() - expect(escrowBalance).to.eq.BN(totalRewards.sub(allocatedRewards)) - }) -}) - -// FIXME Move to a shared test utils library for all Keep projects. -/** - * Uses the ABIs of all contracts in the `contractContainer` to resolve any - * events they may have emitted into the given `receipt`'s logs. Typically - * Truffle only resolves the events on the calling contract; this function - * resolves all of the ones that can be resolved. - * - * @param {TruffleReceipt} receipt The receipt of a contract function call - * submission. - * @param {ContractContainer} contractContainer An object that contains - * properties that are TruffleContracts. Not all properties in the - * container need be contracts, nor do all contracts need to have events - * in the receipt. - * - * @return {TruffleReceipt} The receipt, with its `logs` property updated to - * include all resolved logs. - */ -function resolveAllLogs(receipt, contractContainer) { - const contracts = Object.entries(contractContainer) - .map(([, value]) => value) - .filter((_) => _.contract && _.address) - - const { resolved: resolvedLogs } = contracts.reduce( - ({ raw, resolved }, contract) => { - const events = contract.contract._jsonInterface.filter( - (_) => _.type === "event" - ) - const contractLogs = raw.filter((_) => _.address == contract.address) - - const decoded = contractLogs.map((log) => { - const event = events.find((_) => log.topics.includes(_.signature)) - const decoded = web3.eth.abi.decodeLog( - event.inputs, - log.data, - log.topics.slice(1) - ) - - return Object.assign({}, log, { - event: event.name, - args: decoded, - }) - }) - - return { - raw: raw.filter((_) => _.address != contract.address), - resolved: resolved.concat(decoded), - } - }, - { raw: receipt.rawLogs, resolved: [] } - ) - - return Object.assign({}, receipt, { - logs: resolvedLogs, - }) -} diff --git a/solidity-v1/test/TestToken.js b/solidity-v1/test/TestToken.js deleted file mode 100644 index ae1fd1430a..0000000000 --- a/solidity-v1/test/TestToken.js +++ /dev/null @@ -1,47 +0,0 @@ -const { accounts, contract, web3 } = require("@openzeppelin/test-environment") -const KeepToken = contract.fromArtifact("KeepToken") -const assert = require("chai").assert - -describe("TestToken", function () { - let token - const accountOne = accounts[0] - const accountTwo = accounts[1] - - before(async () => { - token = await KeepToken.new({ from: accountOne }) - }) - - it("sets token details", async function () { - await token.name.call() - - assert.equal(await token.name.call(), "KEEP Token", "unexpected token name") - assert.equal(await token.symbol.call(), "KEEP", "unexpected token symbol") - assert.equal(await token.decimals.call(), 18, "unexpected decimals") - }) - - it("should send tokens correctly", async function () { - const amount = web3.utils.toBN(1000000000) - - // Starting balances - const accountOneStartingBalance = await token.balanceOf.call(accountOne) - const accountTwoStartingBalance = await token.balanceOf.call(accountTwo) - - // Send tokens - await token.transfer(accountTwo, amount, { from: accountOne }) - - // Ending balances - const accountOneEndingBalance = await token.balanceOf.call(accountOne) - const accountTwoEndingBalance = await token.balanceOf.call(accountTwo) - - assert.equal( - accountOneEndingBalance.eq(accountOneStartingBalance.sub(amount)), - true, - "Amount wasn't correctly taken from the sender" - ) - assert.equal( - accountTwoEndingBalance.eq(accountTwoStartingBalance.add(amount)), - true, - "Amount wasn't correctly sent to the receiver" - ) - }) -}) diff --git a/solidity-v1/test/geyser/TestKeepTokenGeyser.js b/solidity-v1/test/geyser/TestKeepTokenGeyser.js deleted file mode 100644 index 798dd7fdff..0000000000 --- a/solidity-v1/test/geyser/TestKeepTokenGeyser.js +++ /dev/null @@ -1,427 +0,0 @@ -const { accounts, contract, web3 } = require("@openzeppelin/test-environment") -const { - expectRevert, - expectEvent, - time, -} = require("@openzeppelin/test-helpers") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const { expectCloseTo } = require("../helpers/numbers.js") - -const KeepToken = contract.fromArtifact("KeepToken") -const TestToken = contract.fromArtifact("TestToken") -const KeepTokenGeyser = contract.fromArtifact("KeepTokenGeyser") -const BatchedPhasedEscrow = contract.fromArtifact("BatchedPhasedEscrow") -const KeepTokenGeyserRewardsEscrowBeneficiary = contract.fromArtifact( - "KeepTokenGeyserRewardsEscrowBeneficiary" -) -const { BN, toBN } = web3.utils -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -describe("KeepTokenGeyser", async () => { - const contractOwner = accounts[1] - const rewardDistribution = accounts[2] - const staker1 = accounts[3] - const staker2 = accounts[4] - const beneficiary = accounts[5] - const thirdParty = accounts[6] - - const maxUnlockSchedules = toBN(12) - const startBonus = toBN(30) // 30% - const bonusPeriodSec = time.duration.weeks(4) - const initialSharesPerToken = toBN(1) - const durationSec = time.duration.weeks(4) - - const tokenDecimalMultiplier = toBN(10e18) // 18-decimal precision - - const stakerInitialBalance1 = toBN(40e3).mul(tokenDecimalMultiplier) // 40k KEEP - const stakeAmount1 = toBN(16e3).mul(tokenDecimalMultiplier) // 16k KEEP - - const stakerInitialBalance2 = toBN(120e3).mul(tokenDecimalMultiplier) // 120k KEEP - const stakeAmount2 = toBN(112e3).mul(tokenDecimalMultiplier) // 112k KEEP - - const rewardsAmount = toBN(100e3).mul(tokenDecimalMultiplier) // 100k KEEP - - let stakeToken - let keepToken - let tokenGeyser - - before(async () => { - stakeToken = await TestToken.new({ from: contractOwner }) - keepToken = await KeepToken.new({ from: contractOwner }) - - tokenGeyser = await KeepTokenGeyser.new( - stakeToken.address, - keepToken.address, - maxUnlockSchedules, - startBonus, - bonusPeriodSec, - initialSharesPerToken, - durationSec, - { - from: contractOwner, - } - ) - - await tokenGeyser.setRewardDistribution(rewardDistribution, { - from: contractOwner, - }) - - // Fund accounts with tokens. - await stakeToken.mint(staker1, stakerInitialBalance1) - await stakeToken.mint(staker2, stakerInitialBalance2) - await keepToken.transfer(rewardDistribution, rewardsAmount, { - from: contractOwner, - }) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("lockTokens", async () => { - describe("called via receiveApproval", async () => { - it("should update balances", async () => { - const initialEscrowBalance = toBN(500e3).mul(tokenDecimalMultiplier) // 500k KEEP - - // Deploy Escrow. - const escrow = await BatchedPhasedEscrow.new(keepToken.address, { - from: contractOwner, - }) - - // Configure escrow beneficiary. - const escrowBeneficiary = await KeepTokenGeyserRewardsEscrowBeneficiary.new( - keepToken.address, - tokenGeyser.address, - { - from: contractOwner, - } - ) - - await escrowBeneficiary.transferOwnership(escrow.address, { - from: contractOwner, - }) - - await escrow.approveBeneficiary(escrowBeneficiary.address, { - from: contractOwner, - }) - - tokenGeyser.setRewardDistribution(escrowBeneficiary.address, { - from: contractOwner, - }) - - // Transfer tokens to Escrow. - await keepToken.approveAndCall( - escrow.address, - initialEscrowBalance, - [], - { - from: contractOwner, - } - ) - - // Initiate withdraw. - await escrow.batchedWithdraw( - [escrowBeneficiary.address], - [rewardsAmount], - { from: contractOwner } - ) - - expect( - await keepToken.balanceOf.call(escrow.address), - "invalid escrow's token balance" - ).to.eq.BN(initialEscrowBalance.sub(rewardsAmount)) - - expect( - await tokenGeyser.totalStakedFor(escrowBeneficiary.address), - "invalid reward distribution's staked balance" - ).to.eq.BN(0) - - expect( - await tokenGeyser.totalLocked(), - "invalid total locked balance" - ).to.eq.BN(rewardsAmount) - }) - - it("reverts when called by non-reward distribution", async () => { - await expectRevert( - tokenGeyser.receiveApproval( - rewardDistribution, - rewardsAmount, - keepToken.address, - [], - { from: thirdParty } - ), - "Caller is not the reward distribution" - ) - }) - - it("reverts for not supported distribution token", async () => { - await expectRevert( - tokenGeyser.receiveApproval( - rewardDistribution, - rewardsAmount, - thirdParty, - [] - ), - "Token is not supported distribution token" - ) - }) - }) - }) - - describe("setDurationSec", async () => { - const newDurationSec = toBN(1230987) - - it("updates durationSec", async () => { - await tokenGeyser.setDurationSec(newDurationSec, { from: contractOwner }) - - expect(await tokenGeyser.durationSec.call()).to.eq.BN(newDurationSec) - }) - - it("reverts when called by non-owner", async () => { - await expectRevert( - tokenGeyser.setDurationSec(newDurationSec, { from: thirdParty }), - "Ownable: caller is not the owner" - ) - }) - - it("emits event", async () => { - const oldDurationSec = await tokenGeyser.durationSec.call() - - const receipt = await tokenGeyser.setDurationSec(newDurationSec, { - from: contractOwner, - }) - - expectEvent(receipt, "DurationSecUpdated", { - oldDurationSec: oldDurationSec, - newDurationSec: newDurationSec, - }) - }) - }) - - describe("stake", async () => { - it("should update balances", async () => { - await stake(staker1, stakeAmount1) - - expect( - await stakeToken.balanceOf.call(staker1), - "invalid staker's token balance" - ).to.eq.BN(stakerInitialBalance1.sub(stakeAmount1)) - - expect( - await tokenGeyser.totalStakedFor(staker1), - "invalid staker's staked balance" - ).to.eq.BN(stakeAmount1) - }) - - it("should emit event", async () => { - const receipt = await stake(staker1, stakeAmount1) - - expectEvent(receipt, "Staked", { - user: staker1, - amount: stakeAmount1, - total: stakeAmount1, - }) - }) - - it("allows stake top-ups", async () => { - const topUpAmount = toBN(8e3).mul(tokenDecimalMultiplier) // 8k KEEP - - await stake(staker1, stakeAmount1) - - expect( - await tokenGeyser.totalStakedFor(staker1), - "invalid staker's staked balance" - ).to.eq.BN(stakeAmount1) - - const receipt = await stake(staker1, topUpAmount) - - expect( - await tokenGeyser.totalStakedFor(staker1), - "invalid staker's staked balance" - ).to.eq.BN(stakeAmount1.add(topUpAmount)) - - expectEvent(receipt, "Staked", { - user: staker1, - amount: topUpAmount, - total: stakeAmount1.add(topUpAmount), - }) - }) - }) - - describe("stakeFor", async () => { - it("should update balances", async () => { - await stakeToken.mint(contractOwner, stakeAmount1) - - await stakeToken.approve(tokenGeyser.address, stakeAmount1, { - from: contractOwner, - }) - await tokenGeyser.stakeFor(beneficiary, stakeAmount1, [], { - from: contractOwner, - }) - - expect( - await stakeToken.balanceOf.call(staker1), - "invalid staker's token balance" - ).to.eq.BN(stakerInitialBalance1) - - expect( - await stakeToken.balanceOf.call(contractOwner), - "invalid contract owner's token balance" - ).to.eq.BN(0) - - expect( - await tokenGeyser.totalStakedFor(contractOwner), - "invalid staker's staked balance" - ).to.eq.BN(0) - - expect( - await tokenGeyser.totalStakedFor(beneficiary), - "invalid staker's staked balance" - ).to.eq.BN(stakeAmount1) - }) - }) - - describe("unstake", async () => { - it("should calculate rewards for two stakers", async () => { - const expectedRewards1 = toBN(125e2).mul(tokenDecimalMultiplier) // (16k / (16k + 112k)) * 100k = 12.5k KEEP - const expectedRewards2 = toBN(875e2).mul(tokenDecimalMultiplier) // (112k / (16k + 112k)) * 100k = 87.5k KEEP - - await stake(staker1, stakeAmount1) - await stake(staker2, stakeAmount2) - - const lockTimestamp1 = await lockTokens(rewardsAmount, durationSec) - - // End first interval. - await time.increaseTo(lockTimestamp1.add(durationSec)) - - await checkRewards( - staker1, - stakeAmount1, - expectedRewards1, - "invalid calculated staker's 1 rewards" - ) - await checkRewards( - staker2, - stakeAmount2, - expectedRewards2, - "invalid calculated staker's 2 rewards" - ) - }) - - it("should calculate rewards in bonus period", async () => { - // Here we estimate rewards taking into account bonus period. - // With an assumption that bonus starts at 30% and goes to 100% over a bonus - // period, we will check rewards in the middle of the bonus period. - // In the middle of the bonus period rewards factor would be at 65%, hence - // this is calculation of the expected rewards: - // staker 1: [(16k / (16k + 112k)) * 100k] * 50% * 65% = 4062.5k KEEP - // staker 2: [(112k / (16k + 112k)) * 100k] * 50% * 65% = 28437.5k KEEP - const expectedRewards1 = toBN(40625).mul(tokenDecimalMultiplier).divn(10) - const expectedRewards2 = toBN(284375).mul(tokenDecimalMultiplier).divn(10) - - await stake(staker1, stakeAmount1) - await stake(staker2, stakeAmount2) - - const initTimestamp = await lockTokens(rewardsAmount, durationSec) - - // Pass the time to the middle of the bonus period. - const passedPeriod = bonusPeriodSec.divn(2) - await time.increaseTo(initTimestamp.add(passedPeriod)) - - await checkRewards( - staker1, - stakeAmount1, - expectedRewards1, - `invalid calculated rewards for staker 1` - ) - await checkRewards( - staker2, - stakeAmount2, - expectedRewards2, - `invalid calculated rewards for staker 2` - ) - }) - - it("should withdraw stake and rewards", async () => { - const expectedRewards1 = toBN(125e2).mul(tokenDecimalMultiplier) // (16k / (16k + 112k)) * 100k = 12.5k KEEP - const expectedRewards2 = toBN(875e2).mul(tokenDecimalMultiplier) // (112k / (16k + 112k)) * 100k = 87.5k KEEP - - await stake(staker1, stakeAmount1) - await stake(staker2, stakeAmount2) - - const lockTimestamp1 = await lockTokens(rewardsAmount, durationSec) - - // End first interval. - await time.increaseTo(lockTimestamp1.add(durationSec)) - - await tokenGeyser.unstake(stakeAmount1, [], { - from: staker1, - }) - await tokenGeyser.unstake(stakeAmount2, [], { - from: staker2, - }) - - // Validate stakers' stake token balances. - expectCloseTo( - await stakeToken.balanceOf.call(staker1), - stakerInitialBalance1, - "invalid staker's 1 token balance" - ) - expectCloseTo( - await stakeToken.balanceOf.call(staker2), - stakerInitialBalance2, - "invalid staker's 2 token balance" - ) - - // Validate stakers' distribution token balances. - expectCloseTo( - await keepToken.balanceOf.call(staker1), - expectedRewards1, - "invalid staker's 1 rewards token balance" - ) - - expectCloseTo( - await keepToken.balanceOf.call(staker2), - expectedRewards2, - "invalid staker's 2 rewards token balance" - ) - }) - - async function checkRewards(staker, stakeAmount, expectedRewards, message) { - const actualRewards = await tokenGeyser.unstakeQuery.call(stakeAmount, { - from: staker, - }) - - expectCloseTo(actualRewards, expectedRewards, message) - } - }) - - async function lockTokens(amount, durationSec) { - await keepToken.approve(tokenGeyser.address, amount, { - from: rewardDistribution, - }) - - const { receipt } = await tokenGeyser.lockTokens(amount, durationSec, { - from: rewardDistribution, - }) - - const timestamp = toBN( - (await web3.eth.getBlock(receipt.blockNumber)).timestamp - ) - - return timestamp - } - - async function stake(staker, amount) { - await stakeToken.approve(tokenGeyser.address, amount, { from: staker }) - - return await tokenGeyser.stake(amount, [], { from: staker }) - } -}) diff --git a/solidity-v1/test/geyser/TestTokenGeyser.js b/solidity-v1/test/geyser/TestTokenGeyser.js deleted file mode 100644 index c639ded991..0000000000 --- a/solidity-v1/test/geyser/TestTokenGeyser.js +++ /dev/null @@ -1,140 +0,0 @@ -const { accounts, contract, web3 } = require("@openzeppelin/test-environment") -const { expectRevert, expectEvent } = require("@openzeppelin/test-helpers") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") - -const { toBN } = require("web3-utils") - -const TestToken = contract.fromArtifact("TestToken") -const TokenGeyser = contract.fromArtifact("TokenGeyser") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -// We test only parts that we modified in the original `ampleforth/token-geyser` -// implementation. -describe("TokenGeyser", async () => { - const contractOwner = accounts[1] - const rewardDistribution = accounts[2] - const newRewardDistribution = accounts[3] - const thirdParty = accounts[6] - - const maxUnlockSchedules = toBN(12) - const startBonus = toBN(100) - const bonusPeriodSec = toBN(1) - const initialSharesPerToken = toBN(1) - const rewardsAmount = toBN(5000) - - let stakeToken - let distributionToken - let tokenGeyser - - before(async () => { - stakeToken = await TestToken.new({ from: contractOwner }) - distributionToken = await TestToken.new({ from: contractOwner }) - - tokenGeyser = await TokenGeyser.new( - stakeToken.address, - distributionToken.address, - maxUnlockSchedules, - startBonus, - bonusPeriodSec, - initialSharesPerToken, - { - from: contractOwner, - } - ) - - await tokenGeyser.setRewardDistribution(rewardDistribution, { - from: contractOwner, - }) - - // Fund accounts with tokens. - await distributionToken.mint(rewardDistribution, rewardsAmount) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("constructor", async () => { - it("sets reward distribution to owner by default", async () => { - const tokenGeyser = await TokenGeyser.new( - stakeToken.address, - distributionToken.address, - maxUnlockSchedules, - startBonus, - bonusPeriodSec, - initialSharesPerToken, - { - from: contractOwner, - } - ) - - expect(await tokenGeyser.rewardDistribution.call()).to.equal( - contractOwner - ) - }) - }) - - describe("setRewardDistribution", async () => { - it("updates rewardDistribution", async () => { - await tokenGeyser.setRewardDistribution(newRewardDistribution, { - from: contractOwner, - }) - - expect(await tokenGeyser.rewardDistribution.call()).to.eq.BN( - newRewardDistribution - ) - }) - - it("reverts when called by non-owner", async () => { - await expectRevert( - tokenGeyser.setRewardDistribution(newRewardDistribution, { - from: thirdParty, - }), - "Ownable: caller is not the owner" - ) - }) - - it("emits event", async () => { - const receipt = await tokenGeyser.setRewardDistribution( - newRewardDistribution, - { - from: contractOwner, - } - ) - - expectEvent(receipt, "RewardDistributionRoleTransferred", { - oldRewardDistribution: rewardDistribution, - newRewardDistribution: newRewardDistribution, - }) - }) - }) - - describe("lockTokens", async () => { - const durationSec = 1234567890 - - it("succeeds when called by reward distribution", async () => { - await distributionToken.approve(tokenGeyser.address, rewardsAmount, { - from: rewardDistribution, - }) - - await tokenGeyser.lockTokens(rewardsAmount, durationSec, { - from: rewardDistribution, - }) - }) - - it("reverts when called by non-reward distribution", async () => { - await expectRevert( - tokenGeyser.lockTokens(rewardsAmount, durationSec), - "Caller is not the reward distribution" - ) - }) - }) -}) diff --git a/solidity-v1/test/helpers/data.js b/solidity-v1/test/helpers/data.js deleted file mode 100644 index a875c7ed07..0000000000 --- a/solidity-v1/test/helpers/data.js +++ /dev/null @@ -1,52 +0,0 @@ -const { web3 } = require("@openzeppelin/test-environment") - -const blsData = { - // data generated using master secret key 123 - secretKey: 123, - - // altbn128 public key for secret key 123 - groupPubKey: - "0x1f1954b33144db2b5c90da089e8bde287ec7089d5d6433f3b6becaefdb678b1b2a9de38d14bef2cf9afc3c698a4211fa7ada7b4f036a2dfef0dc122b423259d01659dc18b57722ecf6a4beb4d04dfe780a660c4c3bb2b165ab8486114c464c621bf37ecdba226629c20908c7f475c5b3a7628ce26d696436eab0b0148034dfcd", - - // initial beacon entry from KeepRandomBeaconServiceImplV1.sol - previousEntry: - "0x15c30f4b6cf6dbbcbdcc10fe22f54c8170aea44e198139b776d512d8f027319a1b9e8bfaf1383978231ce98e42bafc8129f473fc993cf60ce327f7d223460663", - - // group signature over previousEntry - groupSignature: - "0x112d462728e89432b0fe40251eeb6608aed4560f3dc833a9877f5010ace9b1312006dbbe2f30c6e0e3e7ec47dc078b7b6b773379d44d64e44ec4e017bfa7375c", - - // group signature over groupSignature - nextGroupSignature: - "0x144b0508140c2c63fac298ee0cdd98571971a2d958f7c97d2bab82f3e1e727542d08314d6f087aca6ec2173b9a1d928cb80ff45258984a8929977a58d8b2fc26", - - // group signature over nextGroupSignature - nextNextGroupSignature: - "0x10bbc10ee3e5509fffa43f797a5967c46f94b19a01d40360f88d0b13a2a5dc491112a6540550709ae6673af3d4e90ef96c7d7593b71ba6e335276d0b5fc5f3ae", - - // group signature over nextNextGroupSignature - nextNextNextGroupSignature: - "0x2ed17b6237a4b9b9389f6964c4a07017d8461cb2602c367fbce7f9414585f6fc0ba88e1264f783386fb8493d31d733a100bf21f46acf0b3bf99c89834517907f", - - // uint256(keccak256(groupSignature)) - groupSignatureNumber: web3.utils.toBN( - "33136845259729814081977577432759716433762925710284529101628804651946005705295" - ), - - // uint256(keccak256(nextGroupSignature)) - nextGroupSignatureNumber: web3.utils.toBN( - "63728602218731680462391130646366490115686215934918152495059999747427209618626" - ), - - // uint256(keccak256(nextNextGroupSignatureNumber)) - nextNextGroupSignatureNumber: web3.utils.toBN( - "9775714160560684692317854436734528040997044179054191762446020971841873971471" - ), - - // uint256(keccak256(nextNextNextGroupSignatureNumber)) - nextNextNextGroupSignatureNumber: web3.utils.toBN( - "76547413554296705539222469062348207443894285352667024772941555864069963020436" - ), -} - -module.exports = blsData diff --git a/solidity-v1/test/helpers/delegateStake.js b/solidity-v1/test/helpers/delegateStake.js deleted file mode 100644 index f694f55fce..0000000000 --- a/solidity-v1/test/helpers/delegateStake.js +++ /dev/null @@ -1,71 +0,0 @@ -async function delegateStake( - tokenContract, - stakingContract, - tokenOwner, - operator, - beneficiary, - authorizer, - amount -) { - const data = Buffer.concat([ - Buffer.from(beneficiary.substr(2), "hex"), - Buffer.from(operator.substr(2), "hex"), - Buffer.from(authorizer.substr(2), "hex"), - ]) - - return tokenContract.approveAndCall( - stakingContract.address, - amount, - "0x" + data.toString("hex"), - { from: tokenOwner } - ) -} - -async function delegateStakeFromGrant( - grantContract, - stakingContractAddress, - grantee, - operator, - beneficiary, - authorizer, - amount, - grantId -) { - const delegation = Buffer.concat([ - Buffer.from(beneficiary.substr(2), "hex"), - Buffer.from(operator.substr(2), "hex"), - Buffer.from(authorizer.substr(2), "hex"), - ]) - - return grantContract.stake( - grantId, - stakingContractAddress, - amount, - delegation, - { from: grantee } - ) -} - -async function delegateStakeFromManagedGrant( - managedGrant, - stakingContractAddress, - grantee, - operator, - beneficiary, - authorizer, - amount -) { - const delegation = Buffer.concat([ - Buffer.from(beneficiary.substr(2), "hex"), - Buffer.from(operator.substr(2), "hex"), - Buffer.from(authorizer.substr(2), "hex"), - ]) - - return managedGrant.stake(stakingContractAddress, amount, delegation, { - from: grantee, - }) -} - -module.exports.delegateStake = delegateStake -module.exports.delegateStakeFromGrant = delegateStakeFromGrant -module.exports.delegateStakeFromManagedGrant = delegateStakeFromManagedGrant diff --git a/solidity-v1/test/helpers/generateTickets.js b/solidity-v1/test/helpers/generateTickets.js deleted file mode 100644 index 5cbe9ca5b1..0000000000 --- a/solidity-v1/test/helpers/generateTickets.js +++ /dev/null @@ -1,22 +0,0 @@ -const { web3 } = require("@openzeppelin/test-environment") - -function generateTickets(randomBeaconValue, stakerValue, stakerWeight) { - const tickets = [] - for (let i = 1; i <= stakerWeight; i++) { - const ticketValueHex = web3.utils.soliditySha3( - { t: "uint", v: randomBeaconValue }, - { t: "uint", v: stakerValue }, - { t: "uint", v: i } - ) - const ticketValue = web3.utils.toBN(ticketValueHex) - const ticket = { - valueHex: ticketValueHex, - value: ticketValue, - virtualStakerIndex: i, - } - tickets.push(ticket) - } - return tickets -} - -module.exports = generateTickets diff --git a/solidity-v1/test/helpers/grantTokens.js b/solidity-v1/test/helpers/grantTokens.js deleted file mode 100644 index 6237011cda..0000000000 --- a/solidity-v1/test/helpers/grantTokens.js +++ /dev/null @@ -1,65 +0,0 @@ -const { web3 } = require("@openzeppelin/test-environment") - -async function grantTokens( - grantContract, - token, - amount, - from, - grantee, - unlockingDuration, - start, - cliff, - revocable, - stakingPolicy -) { - const grantData = web3.eth.abi.encodeParameters( - ["address", "address", "uint256", "uint256", "uint256", "bool", "address"], - [ - from, - grantee, - unlockingDuration.toNumber(), - start.toNumber(), - cliff.toNumber(), - revocable, - stakingPolicy, - ] - ) - - await token.approveAndCall(grantContract.address, amount, grantData, { - from: from, - }) - return (await grantContract.getPastEvents())[0].args[0].toNumber() -} - -async function grantTokensToManagedGrant( - managedGrantFactory, - token, - amount, - from, - grantee, - unlockingDuration, - start, - cliff, - revocable, - stakingPolicy -) { - const extraData = web3.eth.abi.encodeParameters( - ["address", "uint256", "uint256", "uint256", "bool", "address"], - [ - grantee, - unlockingDuration.toNumber(), - start.toNumber(), - cliff.toNumber(), - revocable, - stakingPolicy, - ] - ) - await token.approveAndCall(managedGrantFactory.address, amount, extraData, { - from: from, - }) - const event = (await managedGrantFactory.getPastEvents())[0] - return event.args["grantAddress"] -} - -module.exports.grantTokens = grantTokens -module.exports.grantTokensToManagedGrant = grantTokensToManagedGrant diff --git a/solidity-v1/test/helpers/initContracts.js b/solidity-v1/test/helpers/initContracts.js deleted file mode 100644 index 86a19934db..0000000000 --- a/solidity-v1/test/helpers/initContracts.js +++ /dev/null @@ -1,173 +0,0 @@ -const { contract, accounts } = require("@openzeppelin/test-environment") -const { time } = require("@openzeppelin/test-helpers") - -const BLS = contract.fromArtifact("BLS") -const GroupSelection = contract.fromArtifact("GroupSelection") -const Groups = contract.fromArtifact("Groups") -const DKGResultVerification = contract.fromArtifact("DKGResultVerification") -const DelayFactor = contract.fromArtifact("DelayFactor") -const Reimbursements = contract.fromArtifact("Reimbursements") -const GasPriceOracle = contract.fromArtifact("GasPriceOracle") -const KeepRegistry = contract.fromArtifact("KeepRegistry") -const KeepToken = contract.fromArtifact("KeepToken") -const TokenGrant = contract.fromArtifact("TokenGrant") -const MinimumStakeSchedule = contract.fromArtifact("MinimumStakeSchedule") -const GrantStaking = contract.fromArtifact("GrantStaking") -const Locks = contract.fromArtifact("Locks") -const TopUps = contract.fromArtifact("TopUps") - -async function initTokenStaking( - tokenAddress, - tokenGrantAddress, - keepRegistryAddress, - stakeInitializationPeriod, - TokenStaking -) { - await TokenStaking.detectNetwork() - await TokenStaking.link( - "MinimumStakeSchedule", - (await MinimumStakeSchedule.new({ from: accounts[0] })).address - ) - await TokenStaking.link( - "GrantStaking", - (await GrantStaking.new({ from: accounts[0] })).address - ) - await TokenStaking.link( - "Locks", - (await Locks.new({ from: accounts[0] })).address - ) - await TokenStaking.link( - "TopUps", - (await TopUps.new({ from: accounts[0] })).address - ) - - const tokenStaking = await TokenStaking.new( - tokenAddress, - tokenGrantAddress, - keepRegistryAddress, - stakeInitializationPeriod, - { from: accounts[0] } - ) - - return { - tokenStaking: tokenStaking, - } -} - -async function initContracts( - TokenStaking, - KeepRandomBeaconService, - KeepRandomBeaconServiceImplV1, - KeepRandomBeaconOperator -) { - const dkgContributionMargin = 5 // 5% Represents DKG frequency of 1/20 (Every 20 entries trigger group selection) - const stakeInitializationPeriod = time.duration.hours(6) - - const token = await KeepToken.new({ from: accounts[0] }) - const tokenGrant = await TokenGrant.new(token.address, { from: accounts[0] }) - const registry = await KeepRegistry.new({ from: accounts[0] }) - - // Initialize staking contract - const stakingContracts = await initTokenStaking( - token.address, - tokenGrant.address, - registry.address, - stakeInitializationPeriod, - TokenStaking - ) - const stakingContract = stakingContracts.tokenStaking - - // Initialize Keep Random Beacon service contract - const serviceContractImplV1 = await KeepRandomBeaconServiceImplV1.new({ - from: accounts[0], - }) - - const initialize = serviceContractImplV1.contract.methods - .initialize(dkgContributionMargin, registry.address) - .encodeABI() - - const gasPriceOracle = await GasPriceOracle.new({ from: accounts[0] }) - - const serviceContractProxy = await KeepRandomBeaconService.new( - serviceContractImplV1.address, - initialize, - { from: accounts[0] } - ) - const serviceContract = await KeepRandomBeaconServiceImplV1.at( - serviceContractProxy.address - ) - // Initialize Keep Random Beacon operator contract - const bls = await BLS.new({ from: accounts[0] }) - await KeepRandomBeaconOperator.detectNetwork() - await KeepRandomBeaconOperator.link("BLS", bls.address) - const groupSelection = await GroupSelection.new({ from: accounts[0] }) - await Groups.detectNetwork() - await Groups.link("BLS", bls.address) - const groups = await Groups.new({ from: accounts[0] }) - const delayFactor = await DelayFactor.new({ from: accounts[0] }) - const dkgResultVerification = await DKGResultVerification.new({ - from: accounts[0], - }) - const reimbursements = await Reimbursements.new({ from: accounts[0] }) - - await KeepRandomBeaconOperator.link("DelayFactor", delayFactor.address) - await KeepRandomBeaconOperator.link("GroupSelection", groupSelection.address) - await KeepRandomBeaconOperator.link("Groups", groups.address) - await KeepRandomBeaconOperator.link( - "DKGResultVerification", - dkgResultVerification.address - ) - await KeepRandomBeaconOperator.link("Reimbursements", reimbursements.address) - const operatorContract = await KeepRandomBeaconOperator.new( - serviceContractProxy.address, - stakingContract.address, - registry.address, - gasPriceOracle.address, - { from: accounts[0] } - ) - await gasPriceOracle.addConsumerContract(operatorContract.address, { - from: accounts[0], - }) - - await registry.approveOperatorContract(operatorContract.address, { - from: accounts[0], - }) - - // Set service contract owner as operator contract upgrader by default - const operatorContractUpgrader = await serviceContractProxy.admin({ - from: accounts[0], - }) - await registry.setOperatorContractUpgrader( - serviceContract.address, - operatorContractUpgrader, - { from: accounts[0] } - ) - - await serviceContract.addOperatorContract(operatorContract.address, { - from: accounts[0], - }) - - const dkgGasEstimate = await operatorContract.dkgGasEstimate({ - from: accounts[0], - }) - - // Genesis should include payment to cover DKG cost to create first group - const gasPriceCeiling = await operatorContract.gasPriceCeiling({ - from: accounts[0], - }) - await operatorContract.genesis({ - value: dkgGasEstimate.mul(gasPriceCeiling), - from: accounts[0], - }) - - return { - registry: registry, - token: token, - stakingContract: stakingContract, - serviceContract: serviceContract, - operatorContract: operatorContract, - } -} - -module.exports.initTokenStaking = initTokenStaking -module.exports.initContracts = initContracts diff --git a/solidity-v1/test/helpers/numbers.js b/solidity-v1/test/helpers/numbers.js deleted file mode 100644 index cff71bc326..0000000000 --- a/solidity-v1/test/helpers/numbers.js +++ /dev/null @@ -1,35 +0,0 @@ -const { toBN } = require("web3-utils") -const BN = require("bn.js") - -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -/** - * Checks if a value is close to the expected within an allowed deviation. - * In case of a value that is outside the delta range it will fail chai expect. - * - * @param {BN|number|string} actual Actual value. - * @param {BN|number|string} expected Expected value. - * @param {string} [message] Message in case of failure (optional). - * @param {number} [deltaPercent=1] Percent deviation from the expected value that is - * acceptable. E.g. value of 5 means that the actual value cannot be different - * from the expected value more than 5%. Default value: 1. - */ -function expectCloseTo(actual, expected, message, deltaPercent = 1) { - actualBN = toBN(actual) - expectedBN = toBN(expected) - - const delta = expectedBN.muln(deltaPercent).divn(100) // approx. `deltaPercent` % - - if ( - actualBN.lt(expectedBN.sub(delta)) || - actualBN.gt(expectedBN.add(delta)) - ) { - expect.fail( - `${message}\nexpected : ${expectedBN.toString()}\nactual : ${actualBN.toString()}` - ) - } -} - -module.exports.expectCloseTo = expectCloseTo diff --git a/solidity-v1/test/helpers/packTicket.js b/solidity-v1/test/helpers/packTicket.js deleted file mode 100644 index ed920a4fa0..0000000000 --- a/solidity-v1/test/helpers/packTicket.js +++ /dev/null @@ -1,17 +0,0 @@ -const { web3 } = require("@openzeppelin/test-environment") - -function packTicket(ticketValueHex, index, operator) { - const stakerValueBytes = web3.utils.hexToBytes(operator) - - const ticketBytes = web3.utils.hexToBytes(ticketValueHex) - const ticketValue = ticketBytes.slice(0, 8) // Take the first 8 bytes of the ticket value - - const virtualStakerIndexPadded = web3.utils.padLeft(index, 8) - const virtualStakerIndexBytes = web3.utils.hexToBytes( - virtualStakerIndexPadded - ) - - return ticketValue.concat(stakerValueBytes).concat(virtualStakerIndexBytes) -} - -module.exports = packTicket diff --git a/solidity-v1/test/helpers/shuffle.js b/solidity-v1/test/helpers/shuffle.js deleted file mode 100644 index bc377cb21f..0000000000 --- a/solidity-v1/test/helpers/shuffle.js +++ /dev/null @@ -1,9 +0,0 @@ -function shuffleArray(a) { - for (let i = a.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)) - ;[a[i], a[j]] = [a[j], a[i]] - } - return a -} - -module.exports = shuffleArray diff --git a/solidity-v1/test/helpers/signature.js b/solidity-v1/test/helpers/signature.js deleted file mode 100644 index f0b4e518d7..0000000000 --- a/solidity-v1/test/helpers/signature.js +++ /dev/null @@ -1,19 +0,0 @@ -const { web3 } = require("@openzeppelin/test-environment") - -const sign = async (dataToSign, address) => { - // go-ethereum/crypto produces signature with v={0, 1} and we need to add - // 27 to v-part (signature[64]) to conform wtih the on-chain signature - // validation code that accepts v={27, 28} as specified in the - // Appendix F of the Ethereum Yellow Paper - // https://ethereum.github.io/yellowpaper/paper.pdf - return ( - "0x" + - web3.utils - .toBN(await web3.eth.sign(dataToSign, address)) - .add(web3.utils.toBN(27)) - .toBuffer("be", 65) - .toString("hex") - ) -} - -module.exports = sign diff --git a/solidity-v1/test/helpers/snapshot.js b/solidity-v1/test/helpers/snapshot.js deleted file mode 100644 index 1dcd9130d0..0000000000 --- a/solidity-v1/test/helpers/snapshot.js +++ /dev/null @@ -1,50 +0,0 @@ -// Snapshots are a feature of some EVM implementations for improved dev UX. -// They allow us to snapshot the entire state of the chain, and restore it at a later point. -// https://github.com/trufflesuite/ganache-core/blob/master/README.md#custom-methods -const { web3 } = require("@openzeppelin/test-environment") - -const snapshotIdsStack = [] - -/** - * Snapshot the state of the blockchain at the current block - */ -async function createSnapshot() { - return await new Promise((res, rej) => { - web3.currentProvider.send( - { - jsonrpc: "2.0", - method: "evm_snapshot", - params: [], - }, - function (err, result) { - if (err) rej(err) - const snapshotId = result.result - snapshotIdsStack.push(snapshotId) - res() - } - ) - }) -} - -/** - * Restores the chain to a latest snapshot - */ -async function restoreSnapshot() { - const snapshotId = snapshotIdsStack.pop() - return await new Promise((res, rej) => { - web3.currentProvider.send( - { - jsonrpc: "2.0", - method: "evm_revert", - params: [snapshotId], - }, - function (err, result) { - if (err) rej(err) - else res() - } - ) - }) -} - -module.exports.createSnapshot = createSnapshot -module.exports.restoreSnapshot = restoreSnapshot diff --git a/solidity-v1/test/helpers/stakeAndGenesis.js b/solidity-v1/test/helpers/stakeAndGenesis.js deleted file mode 100644 index 5dcf6aa5b6..0000000000 --- a/solidity-v1/test/helpers/stakeAndGenesis.js +++ /dev/null @@ -1,169 +0,0 @@ -const generateTickets = require("./generateTickets") -const packTicket = require("./packTicket") -const sign = require("./signature") -const blsData = require("./data.js") -const stakeDelegate = require("./stakeDelegate") -const { web3 } = require("@openzeppelin/test-environment") -const { time } = require("@openzeppelin/test-helpers") - -// Function stakes first three accounts provided in the array of accounts and -// executes the entire genesis cycle registering group with bls.groupPubKey -// on the chain. -// -// It expects three contracts to be passed: -// - contracts.operatorContract, -// - contracts.stakingContract, -// - contracts.token. -// -// This function should be usually used on the result of initContracts which -// initializes contracts up to the point when genesis should be performed. -async function stakeAndGenesis(accounts, contracts) { - const operator1 = accounts[1] - const operator2 = accounts[2] - const operator3 = accounts[3] - const beneficiary1 = accounts[4] - const beneficiary2 = accounts[5] - const beneficiary3 = accounts[6] - - const operatorContract = contracts.operatorContract - const stakingContract = contracts.stakingContract - const token = contracts.token - let ticket - - const operator1StakingWeight = 100 - const operator2StakingWeight = 200 - const operator3StakingWeight = 300 - - const owner = accounts[0] - const authorizer = accounts[0] - - const minimumStake = await stakingContract.minimumStake() - - await stakeDelegate( - stakingContract, - token, - owner, - operator1, - beneficiary1, - authorizer, - minimumStake.muln(operator1StakingWeight) - ) - await stakeDelegate( - stakingContract, - token, - owner, - operator2, - beneficiary2, - authorizer, - minimumStake.muln(operator2StakingWeight) - ) - await stakeDelegate( - stakingContract, - token, - owner, - operator3, - beneficiary3, - authorizer, - minimumStake.muln(operator3StakingWeight) - ) - - await stakingContract.authorizeOperatorContract( - operator1, - operatorContract.address, - { from: authorizer } - ) - await stakingContract.authorizeOperatorContract( - operator2, - operatorContract.address, - { from: authorizer } - ) - await stakingContract.authorizeOperatorContract( - operator3, - operatorContract.address, - { from: authorizer } - ) - - const groupSize = await operatorContract.groupSize() - - const groupSelectionRelayEntry = await operatorContract.getGroupSelectionRelayEntry() - const tickets1 = generateTickets( - groupSelectionRelayEntry, - operator1, - operator1StakingWeight - ) - const tickets2 = generateTickets( - groupSelectionRelayEntry, - operator2, - operator2StakingWeight - ) - const tickets3 = generateTickets( - groupSelectionRelayEntry, - operator3, - operator3StakingWeight - ) - - time.increase((await stakingContract.initializationPeriod()).addn(1)) - - for (let i = 0; i < groupSize; i++) { - ticket = packTicket( - tickets1[i].valueHex, - tickets1[i].virtualStakerIndex, - operator1 - ) - await operatorContract.submitTicket(ticket, { from: operator1 }) - } - - for (let i = 0; i < groupSize; i++) { - ticket = packTicket( - tickets2[i].valueHex, - tickets2[i].virtualStakerIndex, - operator2 - ) - await operatorContract.submitTicket(ticket, { from: operator2 }) - } - - for (let i = 0; i < groupSize; i++) { - ticket = packTicket( - tickets3[i].valueHex, - tickets3[i].virtualStakerIndex, - operator3 - ) - await operatorContract.submitTicket(ticket, { from: operator3 }) - } - - const ticketSubmissionStartBlock = await operatorContract.getTicketSubmissionStartBlock() - const submissionTimeout = await operatorContract.ticketSubmissionTimeout() - await time.advanceBlockTo(ticketSubmissionStartBlock.add(submissionTimeout)) - - const selectedParticipants = await operatorContract.selectedParticipants() - - const timeDKG = await operatorContract.timeDKG() - const resultPublicationBlock = ticketSubmissionStartBlock - .add(submissionTimeout) - .add(timeDKG) - await time.advanceBlockTo(resultPublicationBlock) - - const misbehaved = "0x" - const resultHash = web3.utils.soliditySha3(blsData.groupPubKey, misbehaved) - - const signingMemberIndices = [] - let signatures = undefined - - for (let i = 0; i < selectedParticipants.length; i++) { - const signature = await sign(resultHash, selectedParticipants[i]) - signingMemberIndices.push(i + 1) - if (signatures === undefined) signatures = signature - else signatures += signature.slice(2, signature.length) - } - - await operatorContract.submitDkgResult( - 1, - blsData.groupPubKey, - misbehaved, - signatures, - signingMemberIndices, - { from: selectedParticipants[0] } - ) -} - -module.exports = stakeAndGenesis diff --git a/solidity-v1/test/helpers/stakeDelegate.js b/solidity-v1/test/helpers/stakeDelegate.js deleted file mode 100644 index 221521756f..0000000000 --- a/solidity-v1/test/helpers/stakeDelegate.js +++ /dev/null @@ -1,19 +0,0 @@ -async function stakeDelegate( - stakingContract, - token, - owner, - operator, - beneficiary, - authorizer, - stake -) { - const delegation = Buffer.concat([ - Buffer.from(beneficiary.substr(2), "hex"), - Buffer.from(operator.substr(2), "hex"), - Buffer.from(authorizer.substr(2), "hex"), - ]) - return token.approveAndCall(stakingContract.address, stake, delegation, { - from: owner, - }) -} -module.exports = stakeDelegate diff --git a/solidity-v1/test/random_beacon_operator/TestDkgMisbehavior.js b/solidity-v1/test/random_beacon_operator/TestDkgMisbehavior.js deleted file mode 100644 index e507766128..0000000000 --- a/solidity-v1/test/random_beacon_operator/TestDkgMisbehavior.js +++ /dev/null @@ -1,237 +0,0 @@ -const blsData = require("../helpers/data") -const { contract, web3, accounts } = require("@openzeppelin/test-environment") -const { time } = require("@openzeppelin/test-helpers") -const assert = require("chai").assert -const { initContracts } = require("../helpers/initContracts") -const sign = require("../helpers/signature") -const stakeDelegate = require("../helpers/stakeDelegate") -const packTicket = require("../helpers/packTicket") -const generateTickets = require("../helpers/generateTickets") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") - -describe("KeepRandomBeaconOperator/DkgMisbehavior", function () { - let token - let stakingContract - let operatorContract - const owner = accounts[0] - const operator1 = accounts[1] - const operator2 = accounts[2] - const operator3 = accounts[3] - const operator4 = accounts[4] - const operator5 = accounts[5] - const authorizer = owner - let selectedParticipants - let signatures - let signingMemberIndices = [] - const misbehaved = "0x0305" // disqualified operator with selected member index 3 and inactive with 5 - const groupPubKey = blsData.groupPubKey - const resultHash = web3.utils.soliditySha3(groupPubKey, misbehaved) - - before(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact("KeepRandomBeaconOperatorMisbehaviorStub") - ) - - token = contracts.token - stakingContract = contracts.stakingContract - operatorContract = contracts.operatorContract - - const minimumStake = await stakingContract.minimumStake() - await stakeDelegate( - stakingContract, - token, - owner, - operator1, - owner, - authorizer, - minimumStake, - { from: owner } - ) - await stakeDelegate( - stakingContract, - token, - owner, - operator2, - owner, - authorizer, - minimumStake, - { from: owner } - ) - await stakeDelegate( - stakingContract, - token, - owner, - operator3, - owner, - authorizer, - minimumStake, - { from: owner } - ) - await stakeDelegate( - stakingContract, - token, - owner, - operator4, - owner, - authorizer, - minimumStake, - { from: owner } - ) - await stakeDelegate( - stakingContract, - token, - owner, - operator5, - owner, - authorizer, - minimumStake, - { from: owner } - ) - - await stakingContract.authorizeOperatorContract( - operator1, - operatorContract.address, - { from: authorizer } - ) - await stakingContract.authorizeOperatorContract( - operator2, - operatorContract.address, - { from: authorizer } - ) - await stakingContract.authorizeOperatorContract( - operator3, - operatorContract.address, - { from: authorizer } - ) - await stakingContract.authorizeOperatorContract( - operator4, - operatorContract.address, - { from: authorizer } - ) - await stakingContract.authorizeOperatorContract( - operator5, - operatorContract.address, - { from: authorizer } - ) - - time.increase((await stakingContract.initializationPeriod()).addn(1)) - - const groupSelectionRelayEntry = await operatorContract.getGroupSelectionRelayEntry() - const tickets1 = generateTickets(groupSelectionRelayEntry, operator1, 1) - const tickets2 = generateTickets(groupSelectionRelayEntry, operator2, 1) - const tickets3 = generateTickets(groupSelectionRelayEntry, operator3, 1) - const tickets4 = generateTickets(groupSelectionRelayEntry, operator4, 1) - const tickets5 = generateTickets(groupSelectionRelayEntry, operator5, 1) - - await operatorContract.submitTicket( - packTicket( - tickets1[0].valueHex, - tickets1[0].virtualStakerIndex, - operator1 - ), - { from: operator1 } - ) - - await operatorContract.submitTicket( - packTicket( - tickets2[0].valueHex, - tickets2[0].virtualStakerIndex, - operator2 - ), - { from: operator2 } - ) - - await operatorContract.submitTicket( - packTicket( - tickets3[0].valueHex, - tickets3[0].virtualStakerIndex, - operator3 - ), - { from: operator3 } - ) - - await operatorContract.submitTicket( - packTicket( - tickets4[0].valueHex, - tickets4[0].virtualStakerIndex, - operator4 - ), - { from: operator4 } - ) - - await operatorContract.submitTicket( - packTicket( - tickets5[0].valueHex, - tickets5[0].virtualStakerIndex, - operator5 - ), - { from: operator5 } - ) - - const ticketSubmissionStartBlock = await operatorContract.getTicketSubmissionStartBlock() - const timeoutChallenge = await operatorContract.ticketSubmissionTimeout() - const timeDKG = await operatorContract.timeDKG() - const resultPublicationTime = ticketSubmissionStartBlock - .add(timeoutChallenge) - .add(timeDKG) - - await time.advanceBlockTo(resultPublicationTime) - - selectedParticipants = await operatorContract.selectedParticipants() - - signingMemberIndices = [] - signatures = undefined - - for (let i = 0; i < selectedParticipants.length; i++) { - const signature = await sign(resultHash, selectedParticipants[i]) - signingMemberIndices.push(i + 1) - if (signatures == undefined) signatures = signature - else signatures += signature.slice(2, signature.length) - } - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - it("should be able to save group members based on misbehaved data", async () => { - await operatorContract.submitDkgResult( - 1, - groupPubKey, - misbehaved, - signatures, - signingMemberIndices, - { from: selectedParticipants[0] } - ) - const registeredMembers = await operatorContract.getGroupMembers( - groupPubKey - ) - assert.isTrue( - registeredMembers.indexOf(selectedParticipants[0]) != -1, - "Member should be registered" - ) - assert.isTrue( - registeredMembers.indexOf(selectedParticipants[1]) != -1, - "Member should be registered" - ) - assert.isTrue( - registeredMembers.indexOf(selectedParticipants[2]) == -1, - "Member should not be registered" - ) - assert.isTrue( - registeredMembers.indexOf(selectedParticipants[3]) != -1, - "Member should be registered" - ) - assert.isTrue( - registeredMembers.indexOf(selectedParticipants[4]) == -1, - "Member should not be registered" - ) - }) -}) diff --git a/solidity-v1/test/random_beacon_operator/TestGroupExpiration.js b/solidity-v1/test/random_beacon_operator/TestGroupExpiration.js deleted file mode 100644 index 13606a6742..0000000000 --- a/solidity-v1/test/random_beacon_operator/TestGroupExpiration.js +++ /dev/null @@ -1,331 +0,0 @@ -const { contract, web3, accounts } = require("@openzeppelin/test-environment") -const assert = require("chai").assert -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const { expectRevert, time } = require("@openzeppelin/test-helpers") -const GroupsExpirationStub = contract.fromArtifact("GroupsExpirationStub") -const Groups = contract.fromArtifact("Groups") -const BLS = contract.fromArtifact("BLS") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -describe("KeepRandomBeaconOperator/GroupExpiration", function () { - let groups - - const groupActiveTime = new BN(20) - const relayEntryTimeout = new BN(10) - - before(async () => { - const bls = await BLS.new({ from: accounts[0] }) - await Groups.detectNetwork() - await Groups.link("BLS", bls.address) - const groupsLibrary = await Groups.new() - await GroupsExpirationStub.detectNetwork() - await GroupsExpirationStub.link("Groups", groupsLibrary.address) - groups = await GroupsExpirationStub.new() - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - async function addGroups(numberOfGroups) { - for (let i = 1; i <= numberOfGroups; i++) await groups.addGroup([i]) - } - - async function expireGroup(groupIndex) { - const groupRegistrationBlock = await groups.getGroupRegistrationBlockHeight( - groupIndex - ) - const currentBlock = new BN(await web3.eth.getBlockNumber()) - - // If current block is larger than group registration block by group active time then - // it is not necessary to mine any blocks cause the group is already expired - if (currentBlock.sub(groupRegistrationBlock).lte(groupActiveTime)) { - await time.advanceBlockTo( - currentBlock - .add(groupActiveTime.sub(currentBlock.sub(groupRegistrationBlock))) - .addn(1) - ) - } - } - - async function runExpirationTest(groupSize, expiredCount, beaconValue) { - await addGroups(groupSize) - if (expiredCount > 0) { - // expire group accepts group index, we need to subtract one from the - // count since we index from 0. - await expireGroup(expiredCount - 1) - } - return groups.selectGroup.call(beaconValue) - } - - it("should be able to count the number of active groups", async function () { - const expectedGroupCount = 23 - await addGroups(expectedGroupCount) - const numberOfGroups = await groups.numberOfGroups() - assert.equal( - Number(numberOfGroups), - expectedGroupCount, - "Unexpected number of groups" - ) - }) - - describe("should expire old groups and select active one", async () => { - it("A beacon_value = 0", async function () { - const selectedIndex = await runExpirationTest(1, 0, 0) - expect(selectedIndex).to.eq.BN(0) - }) - it("A beacon_value = 1", async function () { - const selectedIndex = await runExpirationTest(1, 0, 1) - expect(selectedIndex).to.eq.BN(0) - }) - it("AAA beacon_value = 0", async function () { - const selectedIndex = await runExpirationTest(3, 0, 0) - expect(selectedIndex).to.eq.BN(0) - }) - it("AAA beacon_value = 1", async function () { - const selectedIndex = await runExpirationTest(3, 0, 1) - expect(selectedIndex).to.eq.BN(1) - }) - it("AAA beacon_value = 2", async function () { - const selectedIndex = await runExpirationTest(3, 0, 2) - expect(selectedIndex).to.eq.BN(2) - }) - it("AAA beacon_value = 3", async function () { - const selectedIndex = await runExpirationTest(3, 0, 3) - expect(selectedIndex).to.eq.BN(0) - }) - it("EAA beacon_value = 0", async function () { - const selectedIndex = await runExpirationTest(3, 1, 0) - expect(selectedIndex).to.eq.BN(1) - }) - it("EEEEAAAAAA beacon_value = 0", async function () { - const selectedIndex = await runExpirationTest(10, 4, 0) - expect(selectedIndex).to.eq.BN(4) - }) - it("EEEEAAAAAA beacon_value = 1", async function () { - const selectedIndex = await runExpirationTest(10, 4, 1) - expect(selectedIndex).to.eq.BN(5) - }) - it("EEEEAAAAAA beacon_value = 2", async function () { - const selectedIndex = await runExpirationTest(10, 4, 2) - expect(selectedIndex).to.eq.BN(6) - }) - it("EEEEAAAAAA beacon_value = 3", async function () { - const selectedIndex = await runExpirationTest(10, 4, 3) - expect(selectedIndex).to.eq.BN(7) - }) - it("EEEEAAAAAA beacon_value = 4", async function () { - const selectedIndex = await runExpirationTest(10, 4, 4) - expect(selectedIndex).to.eq.BN(8) - }) - it("EEEEAAAAAA beacon_value = 5", async function () { - const selectedIndex = await runExpirationTest(10, 4, 5) - expect(selectedIndex).to.eq.BN(9) - }) - it("EEEEAAAAAA beacon_value = 6", async function () { - const selectedIndex = await runExpirationTest(10, 4, 6) - expect(selectedIndex).to.eq.BN(4) - }) - it("EEEEAAAAAA beacon_value = 7", async function () { - const selectedIndex = await runExpirationTest(10, 4, 7) - expect(selectedIndex).to.eq.BN(5) - }) - it("EEEEAAAAAA beacon_value = 8", async function () { - const selectedIndex = await runExpirationTest(10, 4, 8) - expect(selectedIndex).to.eq.BN(6) - }) - it("EEEEAAAAAA beacon_value = 9", async function () { - const selectedIndex = await runExpirationTest(10, 4, 9) - expect(selectedIndex).to.eq.BN(7) - }) - it("EEEEAAAAAA beacon_value = 10", async function () { - const selectedIndex = await runExpirationTest(10, 4, 10) - expect(selectedIndex).to.eq.BN(8) - }) - it("EEEEAAAAAA beacon_value = 11", async function () { - const selectedIndex = await runExpirationTest(10, 4, 11) - expect(selectedIndex).to.eq.BN(9) - }) - it("EEEEEEEEEA beacon_value = 0", async function () { - const selectedIndex = await runExpirationTest(10, 9, 0) - expect(selectedIndex).to.eq.BN(9) - }) - it("EEEEEEEEEA beacon_value = 1", async function () { - const selectedIndex = await runExpirationTest(10, 9, 1) - expect(selectedIndex).to.eq.BN(9) - }) - it("EEEEEEEEEA beacon_value = 10", async function () { - const selectedIndex = await runExpirationTest(10, 9, 10) - expect(selectedIndex).to.eq.BN(9) - }) - it("EEEEEEEEEA beacon_value = 11", async function () { - const selectedIndex = await runExpirationTest(10, 9, 11) - expect(selectedIndex).to.eq.BN(9) - }) - }) - - it("should revert group selection when all groups expired", async () => { - await addGroups(5) - - const currentBlock = new BN(await web3.eth.getBlockNumber()) - await time.advanceBlockTo(currentBlock.add(groupActiveTime)) - - await expectRevert(groups.selectGroup(0), "No active groups") - }) - - // - we start with [AAAAAA] - // - we check whether the first group is stale and assert it is not since - // an active group cannot be stale - it("should not mark group as stale if it is active", async function () { - await addGroups(6) - - const pubKey = await groups.getGroupPublicKey(0) - - const isStale = await groups.isStaleGroup(pubKey) - - assert.equal(isStale, false, "Group should not be marked as stale") - }) - - // - we start with [AAAAAAAAAAAAAAA] - // - we expire the first 10 groups so that we have [EEEEEEEEEEAAAAA] - // - we check whether any of active groups is stale and assert it's not - it("should not mark group as stale if it is active and there are other expired groups", async function () { - const groupsCount = 15 - await addGroups(groupsCount) - await expireGroup(8) // move height to expire first 9 groups (we index from 0) - - // this will move height by one and expire 9 + 1 groups - await groups.selectGroup(0) - - for (let i = 10; i < groupsCount; i++) { - const pubKey = await groups.getGroupPublicKey(i) - const isStale = await groups.isStaleGroup(pubKey) - - assert.equal(isStale, false, "Group should not be marked as stale") - } - }) - - // - we start with [AAAAAAAAAAAAAAA] - // - we expire the first 10 groups so that we have [EEEEEEEEEEAAAAA] - // - we mine as many blocks as needed to mark expired groups as stale - // - we check whether any of active groups is stale and assert it's not - it("should not mark group as stale if it is active and there are other stale groups", async function () { - const groupsCount = 15 - await addGroups(groupsCount) - await expireGroup(8) // move height to expire first 9 groups (we index from 0) - - // this will move height by one and expire 9 + 1 groups - await groups.selectGroup(0) - - await time.advanceBlockTo( - relayEntryTimeout.addn(await web3.eth.getBlockNumber()) - ) - - for (let i = 10; i < groupsCount; i++) { - const pubKey = await groups.getGroupPublicKey(i) - const isStale = await groups.isStaleGroup(pubKey) - - assert.equal( - isStale, - false, - `Group at index ${i} should not be marked as stale` - ) - } - }) - - // - we start with [AAAAAA] - // - we mine as many blocks as needed to have all the groups qualify as stale - // - we check whether the group at position 0 is stale - // - group should not be marked as stale since it is not marked as expired - // (no group selection was triggered); group can be stale only if it has - // been marked as expired - it("should not mark group as stale if its expiration time passed but it is not marked as such", async function () { - await addGroups(6) - - const pubKey = await groups.getGroupPublicKey(0) - - // mine blocks but do not select group so it's not marked as expired - await time.advanceBlockTo( - groupActiveTime - .add(relayEntryTimeout) - .addn(await web3.eth.getBlockNumber()) - ) - - const isStale = await groups.isStaleGroup(pubKey) - - assert.equal(isStale, false, "Group should not be marked as stale") - }) - - // - we start with [AAAAAA] - // - we mine as many blocks as needed to qualify the first group as expired - // and we run group selection to mark it as such; we have [EAAAAA] - // - we check whether this group is a stale group and assert it is not since - // relay request timeout did not pass since the group expiration block - it("should not mark group as stale if it is expired but can be still signing relay entry", async function () { - await addGroups(6) - - const pubKey = await groups.getGroupPublicKey(0) - - await expireGroup(0) - await groups.selectGroup(0) - - const isStale = await groups.isStaleGroup(pubKey) - - assert.equal(isStale, false, "Group should not be marked as stale") - }) - - // - we start with [AAAAAA] - // - we mine as many blocks as needed to qualify the first group as expired - // and we run group selection to mark it as such; we have [EAAAAA] - // - we mine as many blocks as defined by relay request timeout - // - we check whether this group is a stale group and assert it is stale since - // relay request timeout did pass since the group expiration block - it("should mark group as stale if it is expired and can be no longer signing relay entry", async function () { - await addGroups(6) - - const pubKey = await groups.getGroupPublicKey(0) - - await expireGroup(0) - await groups.selectGroup(0) - - await time.advanceBlockTo( - relayEntryTimeout.addn(await web3.eth.getBlockNumber()) - ) - - const isStale = await groups.isStaleGroup(pubKey) - - assert.equal(isStale, true, "Group should be marked as stale") - }) - - // - we start with [AAAAAA] - // - we check whether group with a non-existing public key is stale and - // we assert the check should fail - it("should fail stale check if group could not be found", async function () { - await addGroups(6) - - const pubKey = "0x1337" // group with such pub key does not exist - await expectRevert(groups.isStaleGroup(pubKey), "Group does not exist") - }) - - it("should allow to add and select new group even if all other groups expired", async () => { - await addGroups(5) - const currentBlock = new BN(await web3.eth.getBlockNumber()) - await time.advanceBlockTo(currentBlock.add(groupActiveTime)) - await addGroups(1) - - const selected = await groups.selectGroup.call(0) - await groups.selectGroup(0) - const numberOfGroups = await groups.numberOfGroups() - - assert.equal(Number(numberOfGroups), 1, "Expected one active group") - assert.equal(Number(selected), 5, "Unexpected group selected") - }) -}) diff --git a/solidity-v1/test/random_beacon_operator/TestGroupSelection.js b/solidity-v1/test/random_beacon_operator/TestGroupSelection.js deleted file mode 100644 index ff4218f9a2..0000000000 --- a/solidity-v1/test/random_beacon_operator/TestGroupSelection.js +++ /dev/null @@ -1,362 +0,0 @@ -const { contract, accounts, web3 } = require("@openzeppelin/test-environment") -const { expectRevert, time } = require("@openzeppelin/test-helpers") -const assert = require("chai").assert -const { initContracts } = require("../helpers/initContracts") -const stakeDelegate = require("../helpers/stakeDelegate") -const packTicket = require("../helpers/packTicket") -const generateTickets = require("../helpers/generateTickets") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") - -describe("KeepRandomBeaconOperator/GroupSelection", function () { - let operatorContract - let submissionTimeout - const owner = accounts[0] - const beneficiary = accounts[1] - const operator1 = accounts[2] - let tickets1 - const operator2 = accounts[3] - let tickets2 - const operator3 = accounts[4] - let tickets3 - const authorizer = owner - - const operator1StakingWeight = 100 - const operator2StakingWeight = 200 - const operator3StakingWeight = 300 - - before(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact("KeepRandomBeaconOperatorGroupSelectionStub") - ) - - const token = contracts.token - const stakingContract = contracts.stakingContract - - operatorContract = contracts.operatorContract - - const minimumStake = await stakingContract.minimumStake() - - await stakeDelegate( - stakingContract, - token, - owner, - operator1, - beneficiary, - authorizer, - minimumStake.muln(operator1StakingWeight) - ) - await stakeDelegate( - stakingContract, - token, - owner, - operator2, - beneficiary, - authorizer, - minimumStake.muln(operator2StakingWeight) - ) - await stakeDelegate( - stakingContract, - token, - owner, - operator3, - beneficiary, - authorizer, - minimumStake.muln(operator3StakingWeight) - ) - - await stakingContract.authorizeOperatorContract( - operator1, - operatorContract.address, - { from: authorizer } - ) - await stakingContract.authorizeOperatorContract( - operator2, - operatorContract.address, - { from: authorizer } - ) - await stakingContract.authorizeOperatorContract( - operator3, - operatorContract.address, - { from: authorizer } - ) - - time.increase((await stakingContract.initializationPeriod()).addn(1)) - - const groupSelectionRelayEntry = await operatorContract.getGroupSelectionRelayEntry() - tickets1 = generateTickets( - groupSelectionRelayEntry, - operator1, - operator1StakingWeight - ) - tickets2 = generateTickets( - groupSelectionRelayEntry, - operator2, - operator2StakingWeight - ) - tickets3 = generateTickets( - groupSelectionRelayEntry, - operator3, - operator3StakingWeight - ) - - submissionTimeout = await operatorContract.ticketSubmissionTimeout() - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - it("should fail to get selected participants before submission period is over", async () => { - await expectRevert( - operatorContract.selectedParticipants(), - "Ticket submission in progress" - ) - }) - - it("should accept valid ticket with minimum virtual staker index", async () => { - const ticket = packTicket(tickets1[0].valueHex, 1, operator1) - await operatorContract.submitTicket(ticket, { from: operator1 }) - - const submittedCount = (await operatorContract.submittedTickets()).length - assert.equal(1, submittedCount, "Ticket should be accepted") - }) - - it("should accept valid ticket with maximum virtual staker index", async () => { - const ticket = packTicket( - tickets1[tickets1.length - 1].valueHex, - tickets1.length, - operator1 - ) - await operatorContract.submitTicket(ticket, { from: operator1 }) - - const submittedCount = (await operatorContract.submittedTickets()).length - assert.equal(1, submittedCount, "Ticket should be accepted") - }) - - it("should reject ticket with too high virtual staker index", async () => { - const ticket = packTicket( - tickets1[tickets1.length - 1].valueHex, - tickets1.length + 1, - operator1 - ) - await expectRevert( - operatorContract.submitTicket(ticket, { from: operator1 }), - "Invalid ticket" - ) - }) - - it("should reject ticket with invalid value", async () => { - const ticket = packTicket("0x1337", 1, operator1) - await expectRevert( - operatorContract.submitTicket(ticket, { from: operator1 }), - "Invalid ticket" - ) - }) - - it("should reject ticket with not matching operator", async () => { - const ticket = packTicket(tickets1[0].valueHex, 1, operator1) - await expectRevert( - operatorContract.submitTicket(ticket, { from: operator2 }), - "Invalid ticket" - ) - }) - - it("should reject ticket with not matching virtual staker index", async () => { - const ticket = packTicket(tickets1[0].valueHex, 2, operator1) - await expectRevert( - operatorContract.submitTicket(ticket, { from: operator1 }), - "Invalid ticket" - ) - }) - - it("should reject duplicate ticket", async () => { - const ticket = packTicket(tickets1[0].valueHex, 1, operator1) - await operatorContract.submitTicket(ticket, { from: operator1 }) - - await expectRevert( - operatorContract.submitTicket(ticket, { from: operator1 }), - "Duplicate ticket" - ) - }) - - it("should trim selected participants to the group size", async () => { - const groupSize = await operatorContract.groupSize() - let ticket - - for (let i = 0; i < groupSize * 2; i++) { - ticket = packTicket( - tickets1[i].valueHex, - tickets1[i].virtualStakerIndex, - operator1 - ) - await operatorContract.submitTicket(ticket, { from: operator1 }) - } - - await time.advanceBlockTo( - submissionTimeout.addn(await web3.eth.getBlockNumber()) - ) - - const selectedParticipants = await operatorContract.selectedParticipants() - assert.equal( - selectedParticipants.length, - groupSize, - "Selected participants list should be trimmed to groupSize length" - ) - }) - - it("should select participants by tickets in ascending order", async function () { - let tickets = [ - { value: tickets1[0].value, operator: operator1 }, - { value: tickets2[0].value, operator: operator2 }, - { value: tickets3[0].value, operator: operator3 }, - ] - - // Sort tickets in ascending order - tickets = tickets.sort(function (a, b) { - return a.value - b.value - }) - - const ticket1 = packTicket( - tickets1[0].valueHex, - tickets1[0].virtualStakerIndex, - operator1 - ) - await operatorContract.submitTicket(ticket1, { from: operator1 }) - - const ticket2 = packTicket( - tickets2[0].valueHex, - tickets2[0].virtualStakerIndex, - operator2 - ) - await operatorContract.submitTicket(ticket2, { from: operator2 }) - - const ticket3 = packTicket( - tickets3[0].valueHex, - tickets3[0].virtualStakerIndex, - operator3 - ) - await operatorContract.submitTicket(ticket3, { from: operator3 }) - - await time.advanceBlockTo( - submissionTimeout.addn(await web3.eth.getBlockNumber()) - ) - - const selectedParticipants = await operatorContract.selectedParticipants() - assert.equal( - selectedParticipants[0], - tickets[0].operator, - "Unexpected operator selected at position 0" - ) - assert.equal( - selectedParticipants[1], - tickets[1].operator, - "Unexpected operator selected at position 1" - ) - assert.equal( - selectedParticipants[2], - tickets[2].operator, - "Unexpected operator selected at position 2" - ) - }) - - it("should properly override previous group selection data", async function () { - // Simulate previous data existence: operator 2 has submitted two tickets and operator 3 has submitted one ticket - await operatorContract.submitTicket( - packTicket( - tickets2[10].valueHex, - tickets2[10].virtualStakerIndex, - operator2 - ), - { from: operator2 } - ) - await operatorContract.submitTicket( - packTicket( - tickets3[10].valueHex, - tickets3[10].virtualStakerIndex, - operator3 - ), - { from: operator3 } - ) - await operatorContract.submitTicket( - packTicket( - tickets2[11].valueHex, - tickets2[11].virtualStakerIndex, - operator2 - ), - { from: operator2 } - ) - - await time.advanceBlockTo( - submissionTimeout.addn(await web3.eth.getBlockNumber()) - ) - - // Start new group selection - const seed = await operatorContract.getGroupSelectionRelayEntry() - await operatorContract.startGroupSelection(seed) - - let tickets = [ - { value: tickets1[0].value, operator: operator1 }, - { value: tickets2[0].value, operator: operator2 }, - { value: tickets3[0].value, operator: operator3 }, - ] - - // Sort tickets in ascending order - tickets = tickets.sort(function (a, b) { - return a.value - b.value - }) - - const ticket1 = packTicket( - tickets1[0].valueHex, - tickets1[0].virtualStakerIndex, - operator1 - ) - await operatorContract.submitTicket(ticket1, { from: operator1 }) - - const ticket2 = packTicket( - tickets2[0].valueHex, - tickets2[0].virtualStakerIndex, - operator2 - ) - await operatorContract.submitTicket(ticket2, { from: operator2 }) - - const ticket3 = packTicket( - tickets3[0].valueHex, - tickets3[0].virtualStakerIndex, - operator3 - ) - await operatorContract.submitTicket(ticket3, { from: operator3 }) - - await time.advanceBlockTo( - submissionTimeout.addn(await web3.eth.getBlockNumber()) - ) - - const selectedParticipants = await operatorContract.selectedParticipants() - assert.equal( - selectedParticipants.length, - 3, - "Unexpected number of selected participants" - ) - assert.equal( - selectedParticipants[0], - tickets[0].operator, - "Unexpected operator selected at position 0" - ) - assert.equal( - selectedParticipants[1], - tickets[1].operator, - "Unexpected operator selected at position 1" - ) - assert.equal( - selectedParticipants[2], - tickets[2].operator, - "Unexpected operator selected at position 2" - ) - }) -}) diff --git a/solidity-v1/test/random_beacon_operator/TestGroupTermination.js b/solidity-v1/test/random_beacon_operator/TestGroupTermination.js deleted file mode 100644 index 039bf5b5dc..0000000000 --- a/solidity-v1/test/random_beacon_operator/TestGroupTermination.js +++ /dev/null @@ -1,250 +0,0 @@ -const { expectRevert, time } = require("@openzeppelin/test-helpers") -const assert = require("chai").assert -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const { contract, accounts, web3 } = require("@openzeppelin/test-environment") -const GroupsTerminationStub = contract.fromArtifact("GroupsTerminationStub") -const Groups = contract.fromArtifact("Groups") -const BLS = contract.fromArtifact("BLS") - -describe("KeepRandomBeaconOperator/GroupTermination", function () { - let groups - - const groupActiveTime = web3.utils.toBN(5) - - before(async () => { - const bls = await BLS.new({ from: accounts[0] }) - await Groups.detectNetwork() - await Groups.link("BLS", bls.address) - const groupsLibrary = await Groups.new() - await GroupsTerminationStub.detectNetwork() - await GroupsTerminationStub.link("Groups", groupsLibrary.address) - groups = await GroupsTerminationStub.new() - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - async function runTerminationTest( - groupsCount, - expiredCount, - terminatedGroups, - beaconValue - ) { - await groups.registerNewGroups(expiredCount) - await time.advanceBlockTo( - groupActiveTime.addn(await web3.eth.getBlockNumber()) - ) - await groups.registerNewGroups(groupsCount - expiredCount) - - for (const groupIndex of terminatedGroups) { - await groups.terminateGroup(groupIndex) - } - - return groups.selectGroup.call(beaconValue) - } - - describe("performs selection with terminated groups not in ascending order", async () => { - it("AATAT beacon_value = 0", async () => { - const selectedIndex = await runTerminationTest(5, 0, [4, 2], 0) - assert.equal(0, selectedIndex) - }) - it("AATAT beacon_value = 1", async () => { - const selectedIndex = await runTerminationTest(5, 0, [4, 2], 1) - assert.equal(1, selectedIndex) - }) - it("AATAT beacon_value = 2", async () => { - const selectedIndex = await runTerminationTest(5, 0, [4, 2], 2) - assert.equal(3, selectedIndex) - }) - it("TATATTA beacon_value = 0", async () => { - const selectedIndex = await runTerminationTest(7, 0, [5, 2, 4, 0], 0) - assert.equal(1, selectedIndex) - }) - it("TATATTA beacon_value = 1", async () => { - const selectedIndex = await runTerminationTest(7, 0, [5, 2, 4, 0], 1) - assert.equal(3, selectedIndex) - }) - it("TATATTA beacon_value = 2", async () => { - const selectedIndex = await runTerminationTest(7, 0, [5, 2, 4, 0], 2) - assert.equal(6, selectedIndex) - }) - it("AATATTA beacon_value = 0", async () => { - const selectedIndex = await runTerminationTest(7, 0, [5, 2, 4], 0) - assert.equal(0, selectedIndex) - }) - it("TATATAAT beacon_value = 0", async () => { - const selectedIndex = await runTerminationTest(8, 0, [7, 0, 4, 2], 0) - assert.equal(1, selectedIndex) - }) - it("TATATAAT beacon_value = 1", async () => { - const selectedIndex = await runTerminationTest(8, 0, [7, 0, 4, 2], 1) - assert.equal(3, selectedIndex) - }) - it("TATATAAT beacon_value = 2", async () => { - const selectedIndex = await runTerminationTest(8, 0, [7, 0, 4, 2], 2) - assert.equal(5, selectedIndex) - }) - it("TATATAAT beacon_value = 3", async () => { - const selectedIndex = await runTerminationTest(8, 0, [7, 0, 4, 2], 3) - assert.equal(6, selectedIndex) - }) - }) - - describe("should not select terminated groups", async () => { - it("TA beacon_value = 0", async function () { - const selectedIndex = await runTerminationTest(2, 0, [0], 0) - assert.equal(1, selectedIndex) - }) - it("TA beacon_value = 1", async function () { - const selectedIndex = await runTerminationTest(2, 0, [0], 1) - assert.equal(1, selectedIndex) - }) - it("TA beacon_value = 2", async function () { - const selectedIndex = await runTerminationTest(2, 0, [0], 2) - assert.equal(1, selectedIndex) - }) - it("AT beacon_value = 0", async function () { - const selectedIndex = await runTerminationTest(2, 0, [1], 0) - assert.equal(0, selectedIndex) - }) - it("AT beacon_value = 1", async function () { - const selectedIndex = await runTerminationTest(2, 0, [1], 1) - assert.equal(0, selectedIndex) - }) - it("AT beacon_value = 2", async function () { - const selectedIndex = await runTerminationTest(2, 0, [1], 2) - assert.equal(0, selectedIndex) - }) - it("TAA beacon_value = 0", async function () { - const selectedIndex = await runTerminationTest(3, 0, [0], 0) - assert.equal(1, selectedIndex) - }) - it("TAA beacon_value = 1", async function () { - const selectedIndex = await runTerminationTest(3, 0, [0], 1) - assert.equal(2, selectedIndex) - }) - it("TAA beacon_value = 2", async function () { - const selectedIndex = await runTerminationTest(3, 0, [0], 2) - assert.equal(1, selectedIndex) - }) - it("AAT beacon_value = 0", async function () { - const selectedIndex = await runTerminationTest(3, 0, [2], 0) - assert.equal(0, selectedIndex) - }) - it("AAT beacon_value = 1", async function () { - const selectedIndex = await runTerminationTest(3, 0, [2], 1) - assert.equal(1, selectedIndex) - }) - it("AAT beacon_value = 2", async function () { - const selectedIndex = await runTerminationTest(3, 0, [2], 2) - assert.equal(0, selectedIndex) - }) - it("ATA beacon_value = 0", async function () { - const selectedIndex = await runTerminationTest(3, 0, [1], 0) - assert.equal(0, selectedIndex) - }) - it("ATA beacon_value = 1", async function () { - const selectedIndex = await runTerminationTest(3, 0, [1], 1) - assert.equal(2, selectedIndex) - }) - it("ATA beacon_value = 2", async function () { - const selectedIndex = await runTerminationTest(3, 0, [1], 2) - assert.equal(0, selectedIndex) - }) - it("TTA beacon_value = 0", async function () { - const selectedIndex = await runTerminationTest(3, 0, [0, 1], 0) - assert.equal(2, selectedIndex) - }) - it("TTA beacon_value = 1", async function () { - const selectedIndex = await runTerminationTest(3, 0, [0, 1], 1) - assert.equal(2, selectedIndex) - }) - it("ATT beacon_value = 0", async function () { - const selectedIndex = await runTerminationTest(3, 0, [1, 2], 0) - assert.equal(0, selectedIndex) - }) - it("ATT beacon_value = 1", async function () { - const selectedIndex = await runTerminationTest(3, 0, [1, 2], 1) - assert.equal(0, selectedIndex) - }) - }) - - describe("should not select expired or terminated groups", async () => { - it("ETA beacon_value = 0", async function () { - const selectedIndex = await runTerminationTest(3, 1, [1], 0) - assert.equal(2, selectedIndex) - }) - it("ETA beacon_value = 1", async function () { - const selectedIndex = await runTerminationTest(3, 1, [1], 1) - assert.equal(2, selectedIndex) - }) - it("ETA beacon_value = 2", async function () { - const selectedIndex = await runTerminationTest(3, 1, [1], 2) - assert.equal(2, selectedIndex) - }) - it("ETA beacon_value = 3", async function () { - const selectedIndex = await runTerminationTest(3, 1, [1], 3) - assert.equal(2, selectedIndex) - }) - it("EAT beacon_value = 0", async function () { - const selectedIndex = await runTerminationTest(3, 1, [2], 0) - assert.equal(1, selectedIndex) - }) - it("EAT beacon_value = 1", async function () { - const selectedIndex = await runTerminationTest(3, 1, [2], 1) - assert.equal(1, selectedIndex) - }) - it("EAT beacon_value = 2", async function () { - const selectedIndex = await runTerminationTest(3, 1, [2], 2) - assert.equal(1, selectedIndex) - }) - it("EAT beacon_value = 3", async function () { - const selectedIndex = await runTerminationTest(3, 1, [2], 3) - assert.equal(1, selectedIndex) - }) - it("EEETTATAAT beacon_value = 0", async function () { - const selectedIndex = await runTerminationTest(10, 3, [3, 4, 6, 9], 0) - assert.equal(5, selectedIndex) - }) - it("EEETTATAAT beacon_value = 1", async function () { - const selectedIndex = await runTerminationTest(10, 3, [3, 4, 6, 9], 1) - assert.equal(7, selectedIndex) - }) - it("EEETTATAAT beacon_value = 2", async function () { - const selectedIndex = await runTerminationTest(10, 3, [3, 4, 6, 9], 2) - assert.equal(8, selectedIndex) - }) - it("EEETTATAAT beacon_value = 3", async function () { - const selectedIndex = await runTerminationTest(10, 3, [3, 4, 6, 9], 3) - assert.equal(5, selectedIndex) - }) - it("EEETTATAAT beacon_value = 4", async function () { - const selectedIndex = await runTerminationTest(10, 3, [3, 4, 6, 9], 4) - assert.equal(7, selectedIndex) - }) - it("EEETTATAAT beacon_value = 5", async function () { - const selectedIndex = await runTerminationTest(10, 3, [3, 4, 6, 9], 5) - assert.equal(8, selectedIndex) - }) - }) - - describe("should fail when there are no active groups", async () => { - it("T", async function () { - await expectRevert(runTerminationTest(1, 0, [0], 0), "No active groups") - }) - it("TT", async function () { - await expectRevert( - runTerminationTest(2, 0, [0, 1], 0), - "No active groups" - ) - }) - it("ET", async function () { - await expectRevert(runTerminationTest(2, 1, [1], 0), "No active groups") - }) - }) -}) diff --git a/solidity-v1/test/random_beacon_operator/TestInitialization.js b/solidity-v1/test/random_beacon_operator/TestInitialization.js deleted file mode 100644 index 85ebc6c0fc..0000000000 --- a/solidity-v1/test/random_beacon_operator/TestInitialization.js +++ /dev/null @@ -1,45 +0,0 @@ -const { initContracts } = require("../helpers/initContracts") -const assert = require("chai").assert -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const { contract } = require("@openzeppelin/test-environment") - -describe("KeepRandomBeaconOperator/Initialization", function () { - let operatorContract - - before(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact("KeepRandomBeaconOperatorInitializationStub") - ) - - operatorContract = contracts.operatorContract - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - it("should set groups relay entry timeout", async () => { - const relayEntryTimeout = await operatorContract.getGroupsRelayEntryTimeout() - assert.equal( - relayEntryTimeout.toNumber(), - 384, - "groups relay entry should have been set to (groupSize * resultPublicationBlockStep)" - ) - }) - - it("should set groups active time", async () => { - const groupActiveTimeout = await operatorContract.getGroupsActiveTime() - assert.equal( - groupActiveTimeout.toNumber(), - 80640, - "group active time should have been set" - ) - }) -}) diff --git a/solidity-v1/test/random_beacon_operator/TestManageServiceContracts.js b/solidity-v1/test/random_beacon_operator/TestManageServiceContracts.js deleted file mode 100644 index 6a2c508815..0000000000 --- a/solidity-v1/test/random_beacon_operator/TestManageServiceContracts.js +++ /dev/null @@ -1,80 +0,0 @@ -const { contract, accounts } = require("@openzeppelin/test-environment") -const { expectRevert } = require("@openzeppelin/test-helpers") -const { initContracts } = require("../helpers/initContracts") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const blsData = require("../helpers/data.js") - -describe("KeepRandomBeaconOperator/ManageServiceContracts", () => { - let operatorContract - let registry - const serviceContract2 = accounts[1] - const serviceContractUpgrader = accounts[2] - const someoneElse = accounts[3] - - let groupProfitAndEntryVerificationFee - - before(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact("KeepRandomBeaconOperatorStub") - ) - - operatorContract = contracts.operatorContract - registry = contracts.registry - - await registry.setServiceContractUpgrader( - operatorContract.address, - serviceContractUpgrader, - { from: accounts[0] } - ) - - groupProfitFee = await operatorContract.groupProfitFee() - entryVerificationFee = await operatorContract.entryVerificationFee() - - groupProfitAndEntryVerificationFee = groupProfitFee.add( - entryVerificationFee - ) - - await operatorContract.registerNewGroup(blsData.groupPubKey) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("addServiceContract", async () => { - it("can be called by service contract upgrader", async () => { - await operatorContract.addServiceContract(serviceContract2, { - from: serviceContractUpgrader, - }) - // ok, no revert - }) - - it("cannot be called by non-upgrader", async () => { - await expectRevert( - operatorContract.addServiceContract(serviceContract2, { - from: someoneElse, - }), - "Not authorized" - ) - }) - - it("adds service contract to the list", async () => { - await operatorContract.addServiceContract(serviceContract2, { - from: serviceContractUpgrader, - }) - - await operatorContract.sign(1, blsData.previousEntry, { - value: groupProfitAndEntryVerificationFee, - from: serviceContract2, - }) - // ok, no revert - }) - }) -}) diff --git a/solidity-v1/test/random_beacon_operator/TestPricingRewards.js b/solidity-v1/test/random_beacon_operator/TestPricingRewards.js deleted file mode 100644 index 05f1a4c63d..0000000000 --- a/solidity-v1/test/random_beacon_operator/TestPricingRewards.js +++ /dev/null @@ -1,284 +0,0 @@ -const blsData = require("../helpers/data.js") -const { initContracts } = require("../helpers/initContracts") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const { contract, accounts, web3 } = require("@openzeppelin/test-environment") -const { time } = require("@openzeppelin/test-helpers") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -describe("KeepRandomBeaconOperator/PricingRewards", function () { - let serviceContract - let operatorContract - - before(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact("KeepRandomBeaconOperatorPricingStub") - ) - - serviceContract = contracts.serviceContract - operatorContract = contracts.operatorContract - - await operatorContract.registerNewGroup(blsData.groupPubKey) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - it("should correctly evaluate delay factor right after the request", async () => { - const entryFeeEstimate = await serviceContract.entryFeeEstimate(0) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: accounts[0], - }) - - const delayFactor = await operatorContract.delayFactor.call() - expect(delayFactor).to.eq.BN("10000000000000000") - }) - - it("should correctly evaluate delay factor at the first submission block", async () => { - const entryFeeEstimate = await serviceContract.entryFeeEstimate(0) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: accounts[0], - }) - - await time.advanceBlockTo( - web3.utils.toBN(await web3.eth.getBlockNumber()).addn(1) - ) - - const delayFactor = await operatorContract.delayFactor.call() - expect(delayFactor).to.eq.BN("10000000000000000") - }) - - it("should correctly evaluate delay factor at the second submission block", async () => { - const entryFeeEstimate = await serviceContract.entryFeeEstimate(0) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: accounts[0], - }) - - await time.advanceBlockTo( - web3.utils.toBN(await web3.eth.getBlockNumber()).addn(2) - ) - - const delayFactor = await operatorContract.delayFactor.call() - // currentRequestStartBlock = 0 - // T_received = 2 - // T_deadline = 0 + 384 + 1 = 385 - // T_begin = 0 + 1 = 1 - // [(T_deadline - T_received) / (T_deadline - T_begin)]^2 = [(385 - 2) / (385 - 1)]^2 - expect(delayFactor).to.eq.BN("9947984483506943") - }) - - it("should correctly evaluate delay factor in the last block before timeout", async () => { - const entryFeeEstimate = await serviceContract.entryFeeEstimate(0) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: accounts[0], - }) - - const relayEntryTimeout = await operatorContract.relayEntryTimeout() - await time.advanceBlockTo( - relayEntryTimeout.addn(await web3.eth.getBlockNumber()) - ) - - const delayFactor = await operatorContract.delayFactor.call() - // currentRequestStartBlock = 0 - // T_received = 384 - // T_deadline = 0 + 384 + 1 = 385 - // T_begin = 0 + 1 = 1 - // [(T_deadline - T_received) / (T_deadline - T_begin)]^2 = [(385 - 384) / (385 - 1)]^2 - expect(delayFactor).to.eq.BN("67816840277") - }) - - it( - "should correctly evaluate rewards for entry submitted " + - "right after the request", - async () => { - await operatorContract.setGroupMemberBaseReward(1410) - await operatorContract.setEntryVerificationGasEstimate(10020) - await operatorContract.setGasPriceCeiling(140000, { from: accounts[0] }) - - const entryFeeEstimate = await serviceContract.entryFeeEstimate(0) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: accounts[0], - }) - - // No delay so entire group member base reward is paid and nothing - // goes to the subsidy pool. - const expectedGroupMemberReward = web3.utils.toBN("1410") - const expectedSubsidy = web3.utils.toBN("0") - // The entire entry verification fee is paid to the submitter - // regardless of their gas expenditure. The submitter is free to spend - // less or more, keeping the surplus or paying the difference: - // 10020 * 140000 - const expectedSubmitterReward = web3.utils.toBN("1402800000") - - const rewards = await operatorContract.getNewEntryRewardsBreakdown.call() - - expect(rewards.groupMemberReward).to.eq.BN(expectedGroupMemberReward) - expect(rewards.submitterReward).to.eq.BN(expectedSubmitterReward) - expect(rewards.subsidy).to.eq.BN(expectedSubsidy) - } - ) - - it( - "should correctly evaluate rewards for entry submitted " + - "at the first submission block", - async () => { - await operatorContract.setGroupMemberBaseReward(966) - await operatorContract.setEntryVerificationGasEstimate(10050) - await operatorContract.setGasPriceCeiling(150000, { from: accounts[0] }) - - const entryFeeEstimate = await serviceContract.entryFeeEstimate(0) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: accounts[0], - }) - - await time.advanceBlockTo( - web3.utils.toBN(await web3.eth.getBlockNumber()).addn(1) - ) - - // No delay so entire group member base reward is paid and nothing - // goes to the subsidy pool. - const expectedGroupMemberReward = web3.utils.toBN("966") - const expectedSubsidy = web3.utils.toBN("0") - // The entire entry verification fee is paid to the submitter - // regardless of their gas expenditure. The submitter is free to spend - // less or more, keeping the surplus or paying the difference: - // 10050 * 150000 - const expectedSubmitterReward = web3.utils.toBN("1507500000") - - const rewards = await operatorContract.getNewEntryRewardsBreakdown.call() - - expect(rewards.groupMemberReward).to.eq.BN(expectedGroupMemberReward) - expect(rewards.submitterReward).to.eq.BN(expectedSubmitterReward) - expect(rewards.subsidy).to.eq.BN(expectedSubsidy) - } - ) - - it( - "should correctly evaluate rewards for the entry submitted " + - "at the second submission block", - async () => { - await operatorContract.setGroupMemberBaseReward(1987000) - await operatorContract.setEntryVerificationGasEstimate(50050) - await operatorContract.setGasPriceCeiling(1400000, { from: accounts[0] }) - - const entryFeeEstimate = await serviceContract.entryFeeEstimate(0) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: accounts[0], - }) - - await time.advanceBlockTo( - web3.utils.toBN(await web3.eth.getBlockNumber()).addn(2) - ) - - // There is one block of delay so the delay factor is 0.9947984483506943. - // Group member reward should be scaled by the delay factor: - // 1987000 * 0.9947984483506943 = ~1966355 - const expectedGroupMemberReward = web3.utils.toBN("1976664") - - // The entire entry verification fee is paid to the submitter - // regardless of their gas expenditure. The submitter is free to spend - // less or more, keeping the surplus or paying the difference: - // 50050 * 1400000 = 70070000000 - // - // To incentivize a race for the submitter position, the submitter - // receives delay penalty * group size * 0.05 as an extra reward: - // 1987000 * (1 - 0.9947984483506943) * 64 * 5% = ~33073 - // - // 70070000000 + 33073 = 70070033073 - const expectedSubmitterReward = web3.utils.toBN("70070033073") - - // If the amount paid out to the signing group in group rewards and the - // submitter’s extra reward is less than the profit margin, the - // difference is added to the beacon’s request subsidy pool to - // incentivize customers to request entries. - // - // profit margin: 1987000 * 64 = 127168000 - // paid member rewards: 1976664 * 64 = 126506496 - // submitter extra reward: 33073 - // - // 127168000 - 126506496 - 33073 = 628431 - const expectedSubsidy = web3.utils.toBN("628431") - - const rewards = await operatorContract.getNewEntryRewardsBreakdown.call() - - expect(rewards.groupMemberReward).to.eq.BN(expectedGroupMemberReward) - expect(rewards.submitterReward).to.eq.BN(expectedSubmitterReward) - expect(rewards.subsidy).to.eq.BN(expectedSubsidy) - } - ) - - it( - "should correctly evaluate rewards for the entry submitted " + - "in the last block before timeout", - async () => { - await operatorContract.setGroupMemberBaseReward(1382000000) - await operatorContract.setEntryVerificationGasEstimate(50020) - await operatorContract.setGasPriceCeiling(2000000, { from: accounts[0] }) - - const entryFeeEstimate = await serviceContract.entryFeeEstimate(0) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: accounts[0], - }) - - const relayEntryTimeout = await operatorContract.relayEntryTimeout() - await time.advanceBlockTo( - relayEntryTimeout.addn(await web3.eth.getBlockNumber()) - ) - - // There is one block left before the timeout so the delay factor is - // 0.000067816840277. - // Group member reward should be scaled by the delay factor: - // 1382000000 * 0.0000067816840277 = ~9372 - const expectedGroupMemberReward = web3.utils.toBN("9372") - - // The entire entry verification fee is paid to the submitter - // regardless of their gas expenditure. The submitter is free to spend - // less or more, keeping the surplus or paying the difference: - // 50020 * 2000000 = 100040000000 - // - // To incentivize a race for the submitter position, the submitter - // receives delay penalty * group size * 0.05 as an extra reward: - // 1382000000 * (1 - 0.0000067816840277) * 64 * 5% = ~4422370008 - // - // 100040000000 + 4422370008 = 104462370008 - const expectedSubmitterReward = web3.utils.toBN("104462370008") - - // If the amount paid out to the signing group in group rewards and the - // submitter’s extra reward is less than the profit margin, the - // difference is added to the beacon’s request subsidy pool to - // incentivize customers to request entries. - // - // profit margin: 1382000000 * 64 = 88448000000 - // paid member rewards: 9372 * 64 = 599808 - // submitter extra reward: 4422280034 - // - // 88448000000 - 599808 - 4422370008 = 84025030184 - const expectedSubsidy = web3.utils.toBN("84025030184") - - const rewards = await operatorContract.getNewEntryRewardsBreakdown.call() - - expect(rewards.groupMemberReward).to.eq.BN(expectedGroupMemberReward) - expect(rewards.submitterReward).to.eq.BN(expectedSubmitterReward) - expect(rewards.subsidy).to.eq.BN(expectedSubsidy) - } - ) -}) diff --git a/solidity-v1/test/random_beacon_operator/TestPricingRewardsWithdraw.js b/solidity-v1/test/random_beacon_operator/TestPricingRewardsWithdraw.js deleted file mode 100644 index a52c400a18..0000000000 --- a/solidity-v1/test/random_beacon_operator/TestPricingRewardsWithdraw.js +++ /dev/null @@ -1,381 +0,0 @@ -const { initContracts } = require("../helpers/initContracts") -const { expectRevert, time } = require("@openzeppelin/test-helpers") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const { contract, accounts, web3 } = require("@openzeppelin/test-environment") -const crypto = require("crypto") -const stakeDelegate = require("../helpers/stakeDelegate") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -describe("KeepRandomBeaconOperator/PricingRewardsWithdraw", function () { - let token - let stakingContract - let operatorContract - let serviceContract - let groupSize - let memberBaseReward - let entryFeeEstimate - let group1 - let group2 - let group3 - const owner = accounts[0] - const requestor = accounts[1] - const operator1 = accounts[2] - const operator2 = accounts[3] - const operator3 = accounts[4] - const beneficiary1 = accounts[5] - const beneficiary2 = accounts[6] - const beneficiary3 = accounts[7] - - before(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact( - "KeepRandomBeaconOperatorPricingRewardsWithdrawStub" - ) - ) - - token = contracts.token - stakingContract = contracts.stakingContract - operatorContract = contracts.operatorContract - serviceContract = contracts.serviceContract - - groupSize = await operatorContract.groupSize() - const minimumStake = await stakingContract.minimumStake() - - await stakeDelegate( - stakingContract, - token, - owner, - operator1, - beneficiary1, - operator1, - minimumStake - ) - await stakeDelegate( - stakingContract, - token, - owner, - operator2, - beneficiary2, - operator2, - minimumStake - ) - await stakeDelegate( - stakingContract, - token, - owner, - operator3, - beneficiary3, - operator3, - minimumStake - ) - - group1 = crypto.randomBytes(128) - group2 = crypto.randomBytes(128) - group3 = crypto.randomBytes(128) - - await operatorContract.registerNewGroup(group1, [ - operator1, - operator2, - operator2, - ]) - - entryFeeEstimate = await serviceContract.entryFeeEstimate(0) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: requestor, - }) - - // Stub relay entry for the current signing request and accumulate rewards - await operatorContract.relayEntry() - - // Register second group with all members as operator1 - await operatorContract.registerNewGroup(group2, [ - operator1, - operator1, - operator1, - ]) - - // New request will expire the first group - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: requestor, - }) - await operatorContract.relayEntry() - - const entryFee = await serviceContract.entryFeeBreakdown() - memberBaseReward = entryFee.groupProfitFee.div(groupSize) - - // make sure groups become stale in tests - await time.advanceBlockTo( - web3.utils.toBN(4).addn(await web3.eth.getBlockNumber()) - ) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - it("should allow fetching public key of active group", async () => { - const groupPublicKey = await operatorContract.getGroupPublicKey(1) - expect(groupPublicKey).to.equal("0x" + group2.toString("hex")) - }) - - it("should allow fetching public key of stale group", async () => { - await time.advanceBlockTo( - web3.utils.toBN(10).addn(await web3.eth.getBlockNumber()) - ) - expect( - await operatorContract.isStaleGroup("0x" + group1.toString("hex")), - "Group should be stale" - ).to.be.true - - const groupPublicKey = await operatorContract.getGroupPublicKey(0) - expect(groupPublicKey).to.equal("0x" + group1.toString("hex")) - }) - - it("should be able to withdraw group rewards from multiple staled groups", async () => { - // Register new group and request new entry so we can expire the previous two groups - await operatorContract.registerNewGroup(group3, [ - operator1, - operator2, - operator2, - ]) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: requestor, - }) - const beneficiary1balance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary1) - ) - - await time.advanceBlockTo( - web3.utils.toBN(10).addn(await web3.eth.getBlockNumber()) - ) - expect( - await operatorContract.isStaleGroup("0x" + group1.toString("hex")), - "Group should be stale" - ).to.be.true - expect( - await operatorContract.isStaleGroup("0x" + group2.toString("hex")), - "Group should be stale" - ).to.be.true - - // operator1 has 1 member in group1 and 3 members in group2 - const expectedReward = memberBaseReward.muln(4) - await operatorContract.withdrawGroupMemberRewards(operator1, 0) - await operatorContract.withdrawGroupMemberRewards(operator1, 1) - - expect( - web3.utils - .toBN(await web3.eth.getBalance(beneficiary1)) - .eq(beneficiary1balance.add(expectedReward)), - "Unexpected beneficiary balance" - ).to.be.true - }) - - it("should be able to withdraw group rewards from a staled group", async () => { - // Register new group and request new entry so we can expire the previous two groups - await operatorContract.registerNewGroup(group3, [ - operator1, - operator2, - operator2, - ]) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: requestor, - }) - const beneficiary2balance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary2) - ) - - await time.advanceBlockTo( - web3.utils.toBN(10).addn(await web3.eth.getBlockNumber()) - ) - expect( - await operatorContract.isStaleGroup("0x" + group1.toString("hex")), - "Group should be stale" - ).to.be.true - - // operator2 has 2 members in group1 only - const expectedReward = memberBaseReward.muln(2) - await operatorContract.withdrawGroupMemberRewards(operator2, 0) - expect( - web3.utils - .toBN(await web3.eth.getBalance(beneficiary2)) - .eq(beneficiary2balance.add(expectedReward)), - "Unexpected beneficiary balance" - ).to.be.true - }) - - it("should record whether the operator has withdrawn", async () => { - // Register new group and request new entry so we can expire the previous two groups - await operatorContract.registerNewGroup(group3, [ - operator1, - operator2, - operator2, - ]) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: requestor, - }) - - await time.advanceBlockTo( - web3.utils.toBN(10).addn(await web3.eth.getBlockNumber()) - ) - expect( - await operatorContract.isStaleGroup("0x" + group1.toString("hex")), - "Group should be stale" - ).to.be.true - - const preWithdrawn = await operatorContract.hasWithdrawnRewards( - operator2, - 0 - ) - expect(preWithdrawn, "Incorrect status before withdrawal").to.be.false - await operatorContract.withdrawGroupMemberRewards(operator2, 0) - const postWithdrawn = await operatorContract.hasWithdrawnRewards( - operator2, - 0 - ) - expect(postWithdrawn, "Incorrect status after withdrawal").to.be.true - }) - - it("should not be able to withdraw group rewards without correct data", async () => { - // Register new group and request new entry so we can expire the previous two groups - await operatorContract.registerNewGroup(group3, [ - operator1, - operator2, - operator2, - ]) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: requestor, - }) - - await time.advanceBlockTo( - web3.utils.toBN(10).addn(await web3.eth.getBlockNumber()) - ) - expect( - await operatorContract.isStaleGroup("0x" + group1.toString("hex")), - "Group should be stale" - ).to.be.true - - const beneficiary3balance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary3) - ) - - // operator3 doesn't have any group members, nothing can be withdrawn - await operatorContract.withdrawGroupMemberRewards(operator3, 0) - expect( - web3.utils - .toBN(await web3.eth.getBalance(beneficiary3)) - .eq(beneficiary3balance), - "Unexpected beneficiary balance" - ).to.be.true - }) - - it("should not be able to withdraw group rewards if group is active", async () => { - // operator1 has 3 members in group2 - const firstActiveGroupIndex = await operatorContract.getFirstActiveGroupIndex() - expect(firstActiveGroupIndex).to.eq.BN(1) - - const beneficiary1balance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary1) - ) - - // Nothing can be withdrawn - await expectRevert( - operatorContract.withdrawGroupMemberRewards( - operator1, - firstActiveGroupIndex - ), - "Group must be expired and stale" - ) - expect( - web3.utils - .toBN(await web3.eth.getBalance(beneficiary1)) - .eq(beneficiary1balance), - "Unexpected beneficiary balance" - ).to.be.true - }) - - it("should not be able to withdraw group rewards if group is expired but not stale", async () => { - // operator2 has 2 members in group1 - const firstActiveGroupIndex = await operatorContract.getFirstActiveGroupIndex() - expect(firstActiveGroupIndex).to.eq.BN(1) - - expect( - await operatorContract.isStaleGroup("0x" + group1.toString("hex")), - "Group should not be stale" - ).to.be.false - const beneficiary2balance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary2) - ) - const mostRecentExpiredGroup = firstActiveGroupIndex.toNumber() - 1 - - // Nothing can be withdrawn - await expectRevert( - operatorContract.withdrawGroupMemberRewards( - operator2, - mostRecentExpiredGroup - ), - "Group must be expired and stale" - ) - expect( - web3.utils - .toBN(await web3.eth.getBalance(beneficiary2)) - .eq(beneficiary2balance), - "Unexpected beneficiary balance" - ).to.be.true - }) - - it("should not be able to withdraw group rewards multiple times", async () => { - // Register new group and request new entry so we can expire the previous two groups - await operatorContract.registerNewGroup(group3, [ - operator1, - operator2, - operator2, - ]) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: requestor, - }) - const beneficiary2balance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary2) - ) - - await time.advanceBlockTo( - web3.utils.toBN(10).addn(await web3.eth.getBlockNumber()) - ) - expect( - await operatorContract.isStaleGroup("0x" + group1.toString("hex")), - "Group should be stale" - ).to.be.true - - // operator2 has 2 members in group1 only - const expectedReward = memberBaseReward.muln(2) - await operatorContract.withdrawGroupMemberRewards(operator2, 0) - expect( - web3.utils - .toBN(await web3.eth.getBalance(beneficiary2)) - .eq(beneficiary2balance.add(expectedReward)), - "Unexpected beneficiary balance" - ).to.be.true - - await expectRevert( - operatorContract.withdrawGroupMemberRewards(operator2, 0), - "Rewards already withdrawn" - ) - }) -}) diff --git a/solidity-v1/test/random_beacon_operator/TestPublishDkgResult.js b/solidity-v1/test/random_beacon_operator/TestPublishDkgResult.js deleted file mode 100644 index c8dcd44db1..0000000000 --- a/solidity-v1/test/random_beacon_operator/TestPublishDkgResult.js +++ /dev/null @@ -1,653 +0,0 @@ -const blsData = require("../helpers/data") -const sign = require("../helpers/signature") -const packTicket = require("../helpers/packTicket") -const generateTickets = require("../helpers/generateTickets") -const shuffleArray = require("../helpers/shuffle") -const { initContracts } = require("../helpers/initContracts") -const assert = require("chai").assert -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const { contract, accounts, web3 } = require("@openzeppelin/test-environment") -const { expectRevert, time } = require("@openzeppelin/test-helpers") -const stakeDelegate = require("../helpers/stakeDelegate") - -describe("KeepRandomBeaconOperator/PublishDkgResult", function () { - const groupSize = 20 - const groupThreshold = 11 - const dkgResultSignatureThreshold = 15 - const resultPublicationBlockStep = 6 - - let resultPublicationTime - let token - let stakingContract - let operatorContract - const owner = accounts[0] - const beneficiary = accounts[4] - let ticket - const operator1 = accounts[0] - const operator2 = accounts[1] - const operator3 = accounts[2] - const operator4 = accounts[3] - let selectedParticipants - let signatures - let signingMemberIndices = [] - const noMisbehaved = "0x" - const maxMisbehaved = "0x0102030405" // 20 - 15 = 5 max could misbehave - const groupPubKey = blsData.groupPubKey - const resultHash = web3.utils.soliditySha3(groupPubKey, noMisbehaved) - - before(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact("KeepRandomBeaconOperatorDKGResultStub") - ) - - token = contracts.token - stakingContract = contracts.stakingContract - operatorContract = contracts.operatorContract - - await operatorContract.setGroupSize(groupSize) - await operatorContract.setGroupThreshold(groupThreshold) - await operatorContract.setDKGResultSignatureThreshold( - dkgResultSignatureThreshold - ) - - const operator1StakingWeight = 100 - const operator2StakingWeight = 200 - const operator3StakingWeight = 300 - const minimumStake = await stakingContract.minimumStake() - - await stakeDelegate( - stakingContract, - token, - owner, - operator1, - beneficiary, - owner, - minimumStake.muln(operator1StakingWeight) - ) - await stakeDelegate( - stakingContract, - token, - owner, - operator2, - beneficiary, - owner, - minimumStake.muln(operator2StakingWeight) - ) - await stakeDelegate( - stakingContract, - token, - owner, - operator3, - beneficiary, - owner, - minimumStake.muln(operator3StakingWeight) - ) - - await stakingContract.authorizeOperatorContract( - operator1, - operatorContract.address, - { from: owner } - ) - await stakingContract.authorizeOperatorContract( - operator2, - operatorContract.address, - { from: owner } - ) - await stakingContract.authorizeOperatorContract( - operator3, - operatorContract.address, - { from: owner } - ) - - time.increase((await stakingContract.initializationPeriod()).addn(1)) - - const groupSelectionRelayEntry = await operatorContract.getGroupSelectionRelayEntry() - const tickets1 = generateTickets( - groupSelectionRelayEntry, - operator1, - operator1StakingWeight - ) - const tickets2 = generateTickets( - groupSelectionRelayEntry, - operator2, - operator2StakingWeight - ) - const tickets3 = generateTickets( - groupSelectionRelayEntry, - operator3, - operator3StakingWeight - ) - - for (let i = 0; i < groupSize; i++) { - ticket = packTicket( - tickets1[i].valueHex, - tickets1[i].virtualStakerIndex, - operator1 - ) - await operatorContract.submitTicket(ticket, { from: operator1 }) - } - - for (let i = 0; i < groupSize; i++) { - ticket = packTicket( - tickets2[i].valueHex, - tickets2[i].virtualStakerIndex, - operator2 - ) - await operatorContract.submitTicket(ticket, { from: operator2 }) - } - - for (let i = 0; i < groupSize; i++) { - ticket = packTicket( - tickets3[i].valueHex, - tickets3[i].virtualStakerIndex, - operator3 - ) - await operatorContract.submitTicket(ticket, { from: operator3 }) - } - - const ticketSubmissionStartBlock = await operatorContract.getTicketSubmissionStartBlock() - const submissionTimeout = await operatorContract.ticketSubmissionTimeout() - const timeDKG = await operatorContract.timeDKG() - resultPublicationTime = ticketSubmissionStartBlock - .add(submissionTimeout) - .add(timeDKG) - - await time.advanceBlockTo(ticketSubmissionStartBlock.add(submissionTimeout)) - - selectedParticipants = await operatorContract.selectedParticipants() - - signingMemberIndices = [] - signatures = undefined - - for (let i = 0; i < selectedParticipants.length; i++) { - const signature = await sign(resultHash, selectedParticipants[i]) - signingMemberIndices.push(i + 1) - if (signatures == undefined) signatures = signature - else signatures += signature.slice(2, signature.length) - } - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - it("allows to submit correct result as the first member after DKG finished", async () => { - // Jump in time to when submitter becomes eligible to submit - await time.advanceBlockTo(resultPublicationTime) - - await operatorContract.submitDkgResult( - 1, - groupPubKey, - noMisbehaved, - signatures, - signingMemberIndices, - { from: selectedParticipants[0] } - ) - assert.isTrue( - await operatorContract.isGroupRegistered(groupPubKey), - "group should be registered" - ) - assert.equal( - await operatorContract.numberOfGroups(), - 1, - "expected 1 group to be registered" - ) - }) - - it("sends reward to the DKG submitter", async () => { - // Jump in time to when submitter becomes eligible to submit - await time.advanceBlockTo(resultPublicationTime) - - const beneficiaryBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - const dkgGasEstimate = await operatorContract.dkgGasEstimate() - const submitterCustomGasPrice = web3.utils.toWei( - web3.utils.toBN(65), - "gwei" - ) - const expectedSubmitterReward = dkgGasEstimate.mul( - await operatorContract.gasPriceCeiling() - ) - - await operatorContract.submitDkgResult( - 1, - groupPubKey, - noMisbehaved, - signatures, - signingMemberIndices, - { from: selectedParticipants[0], gasPrice: submitterCustomGasPrice } - ) - - const updatedBeneficiaryBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - assert.isTrue( - updatedBeneficiaryBalance.eq( - beneficiaryBalance.add(expectedSubmitterReward) - ), - "Submitter should receive expected reward." - ) - }) - - it("sends max dkgSubmitterReimbursementFee to the submitter in case of a much higher price than gas price ceiling", async () => { - // Jump in time to when submitter becomes eligible to submit - await time.advanceBlockTo(resultPublicationTime) - - const dkgSubmitterReimbursementFee = web3.utils.toBN( - await web3.eth.getBalance(operatorContract.address) - ) - const beneficiaryBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - - await operatorContract.setGasPriceCeiling( - web3.utils.toWei(web3.utils.toBN(100), "gwei") - ) - - await operatorContract.submitDkgResult( - 1, - groupPubKey, - noMisbehaved, - signatures, - signingMemberIndices, - { - from: selectedParticipants[0], - gasPrice: web3.utils.toWei(web3.utils.toBN(100), "gwei"), - } - ) - const updatedBeneficiaryBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - assert.isTrue( - updatedBeneficiaryBalance.eq( - beneficiaryBalance.add(dkgSubmitterReimbursementFee) - ), - "Submitter should receive dkgSubmitterReimbursementFee" - ) - }) - - it("allows to submit correct result with unordered signatures and indexes", async () => { - let unorderedSigningMembersIndexes = [] - for (let i = 0; i < selectedParticipants.length; i++) { - unorderedSigningMembersIndexes[i] = i + 1 - } - - unorderedSigningMembersIndexes = shuffleArray( - unorderedSigningMembersIndexes - ) - let unorderedSignatures - - for (let i = 0; i < selectedParticipants.length; i++) { - const signature = await sign( - resultHash, - selectedParticipants[unorderedSigningMembersIndexes[i] - 1] - ) - if (unorderedSignatures == undefined) unorderedSignatures = signature - else unorderedSignatures += signature.slice(2, signature.length) - } - - // Jump in time to when submitter becomes eligible to submit - await time.advanceBlockTo(resultPublicationTime) - - await operatorContract.submitDkgResult( - 1, - groupPubKey, - noMisbehaved, - unorderedSignatures, - unorderedSigningMembersIndexes, - { from: selectedParticipants[0] } - ) - assert.isTrue( - await operatorContract.isGroupRegistered(groupPubKey), - "group should be registered" - ) - assert.equal( - await operatorContract.numberOfGroups(), - 1, - "expected 1 group to be registered" - ) - }) - - it("allows to submit result at eligible block time based on member index", async () => { - const submitter1MemberIndex = 4 - const submitter2MemberIndex = 5 - const submitter2 = selectedParticipants[submitter2MemberIndex - 1] - const eligibleBlockForSubmitter1 = resultPublicationTime.addn( - (submitter1MemberIndex - 1) * resultPublicationBlockStep - ) - const eligibleBlockForSubmitter2 = resultPublicationTime.addn( - (submitter2MemberIndex - 1) * resultPublicationBlockStep - ) - - // Jump in time to when submitter 1 becomes eligible to submit - await time.advanceBlockTo(eligibleBlockForSubmitter1) - - // Should throw if non eligible submitter 2 tries to submit - await expectRevert( - operatorContract.submitDkgResult( - submitter2MemberIndex, - groupPubKey, - noMisbehaved, - signatures, - signingMemberIndices, - { from: submitter2 } - ), - "Submitter not eligible" - ) - - // Jump in time to when submitter 2 becomes eligible to submit - await time.advanceBlockTo(eligibleBlockForSubmitter2) - - await operatorContract.submitDkgResult( - submitter2MemberIndex, - groupPubKey, - noMisbehaved, - signatures, - signingMemberIndices, - { from: submitter2 } - ) - assert.isTrue( - await operatorContract.isGroupRegistered(groupPubKey), - "group should be registered" - ) - assert.equal( - await operatorContract.numberOfGroups(), - 1, - "expected 1 group to be registered" - ) - }) - - it("reverts if submitter was not selected to the group.", async () => { - await expectRevert( - operatorContract.submitDkgResult( - 1, - groupPubKey, - noMisbehaved, - signatures, - signingMemberIndices, - { from: operator4 } - ), - "Unexpected submitter index" - ) - - assert.isFalse( - await operatorContract.isGroupRegistered(groupPubKey), - "group should not be registered" - ) - }) - - it("reverts for invalid signatures", async () => { - signingMemberIndices = [] - signatures = undefined - const lastParticipantIdx = dkgResultSignatureThreshold - 1 - - for (let i = 0; i < lastParticipantIdx; i++) { - const signature = await sign(resultHash, selectedParticipants[i]) - signingMemberIndices.push(i + 1) - if (signatures == undefined) signatures = signature - else signatures += signature.slice(2, signature.length) - } - - // Add invalid signature as the last one - const nonsenseHash = web3.utils.soliditySha3("ducky duck") - const invalidSignature = await sign( - nonsenseHash, - selectedParticipants[lastParticipantIdx] - ) - signatures += invalidSignature.slice(2, invalidSignature.length) - signingMemberIndices.push(lastParticipantIdx + 1) - - // Jump in time to when first member is eligible to submit - await time.advanceBlockTo(resultPublicationTime) - - await expectRevert( - operatorContract.submitDkgResult( - 1, - groupPubKey, - noMisbehaved, - signatures, - signingMemberIndices, - { from: selectedParticipants[0] } - ), - "Invalid signature" - ) - - assert.isFalse( - await operatorContract.isGroupRegistered(groupPubKey), - "group should not be registered" - ) - }) - - it("reverts for duplicate member indices", async () => { - signingMemberIndices = [] - signatures = undefined - const lastParticipantIdx = dkgResultSignatureThreshold - 1 - - for (let i = 0; i < lastParticipantIdx; i++) { - const signature = await sign(resultHash, selectedParticipants[i]) - signingMemberIndices.push(i + 1) - if (signatures == undefined) signatures = signature - else signatures += signature.slice(2, signature.length) - } - - // Duplicate member and signature - const signature = await sign(resultHash, selectedParticipants[0]) - signatures += signature.slice(2, signature.length) - signingMemberIndices.push(1) - - // Jump in time to when first member is eligible to submit - await time.advanceBlockTo(resultPublicationTime) - - await expectRevert( - operatorContract.submitDkgResult( - 1, - groupPubKey, - noMisbehaved, - signatures, - signingMemberIndices, - { from: selectedParticipants[0] } - ), - "Duplicate member index" - ) - - assert.isFalse( - await operatorContract.isGroupRegistered(groupPubKey), - "group should not be registered" - ) - }) - - it("allows to submit the result with minimum number of valid signatures", async () => { - signingMemberIndices = [] - signatures = undefined - - // Create minimum amount of valid signatures - for (let i = 0; i < dkgResultSignatureThreshold; i++) { - const signature = await sign(resultHash, selectedParticipants[i]) - signingMemberIndices.push(i + 1) - if (signatures == undefined) signatures = signature - else signatures += signature.slice(2, signature.length) - } - - // Jump in time to when first member is eligible to submit - await time.advanceBlockTo(resultPublicationTime) - - await operatorContract.submitDkgResult( - 1, - groupPubKey, - noMisbehaved, - signatures, - signingMemberIndices, - { from: selectedParticipants[0] } - ) - - assert.isTrue( - await operatorContract.isGroupRegistered(groupPubKey), - "group should be registered" - ) - assert.equal( - await operatorContract.numberOfGroups(), - 1, - "expected 1 group to be registered" - ) - }) - - it("reverts without minimum number of signatures", async () => { - signingMemberIndices = [] - signatures = undefined - - // Create less than minimum amount of valid signatures - for (let i = 0; i < dkgResultSignatureThreshold - 1; i++) { - const signature = await sign(resultHash, selectedParticipants[i]) - signingMemberIndices.push(i + 1) - if (signatures == undefined) signatures = signature - else signatures += signature.slice(2, signature.length) - } - - // Jump in time to when first member is eligible to submit - await time.advanceBlockTo(resultPublicationTime) - - await expectRevert( - operatorContract.submitDkgResult( - 1, - groupPubKey, - noMisbehaved, - signatures, - signingMemberIndices, - { from: selectedParticipants[0] } - ), - "Too few signatures" - ) - - assert.isFalse( - await operatorContract.isGroupRegistered(groupPubKey), - "group should not be registered" - ) - }) - - it("reverts for a public key having less than 128 bytes", async () => { - // Jump in time to when submitter becomes eligible to submit - await time.advanceBlockTo(resultPublicationTime) - - const invalidGroupPubKey = groupPubKey.slice(0, -2) - - const s = await signResult(invalidGroupPubKey, noMisbehaved) - await expectRevert( - operatorContract.submitDkgResult( - 1, - invalidGroupPubKey, - noMisbehaved, - s.signatures, - s.signingMemberIndices, - { from: selectedParticipants[0] } - ), - "Malformed group public key" - ) - }) - - it("reverts for a public key having more than 128 bytes", async () => { - // Jump in time to when submitter becomes eligible to submit - await time.advanceBlockTo(resultPublicationTime) - - const invalidGroupPubKey = groupPubKey + "ff" - - const s = await signResult(invalidGroupPubKey, noMisbehaved) - await expectRevert( - operatorContract.submitDkgResult( - 1, - invalidGroupPubKey, - noMisbehaved, - s.signatures, - s.signingMemberIndices, - { from: selectedParticipants[0] } - ), - "Malformed group public key" - ) - }) - - it("reverts for too many misbehaved", async () => { - // Jump in time to when submitter becomes eligible to submit - await time.advanceBlockTo(resultPublicationTime) - - const invalidMisbehaved = maxMisbehaved + "ff" - - const s = await signResult(groupPubKey, invalidMisbehaved) - await expectRevert( - operatorContract.submitDkgResult( - 1, - groupPubKey, - invalidMisbehaved, - s.signatures, - s.signingMemberIndices, - { from: selectedParticipants[0] } - ), - "Malformed misbehaved" - ) - }) - - it("allows to submit with maximum possible misbehaved", async () => { - // Jump in time to when submitter becomes eligible to submit - await time.advanceBlockTo(resultPublicationTime) - - const s = await signResult(groupPubKey, maxMisbehaved) - - await operatorContract.submitDkgResult( - 1, - groupPubKey, - maxMisbehaved, - s.signatures, - s.signingMemberIndices, - { from: selectedParticipants[0] } - ) - // ok, no exceptions - }) - - it("allows to submit with more signatures than the group size", async () => { - // Jump in time to when submitter becomes eligible to submit - await time.advanceBlockTo(resultPublicationTime) - - const s = await signResult(groupPubKey, noMisbehaved) - - const anotherSignature = await sign(resultHash, selectedParticipants[0]) - s.signatures += anotherSignature.slice(2, anotherSignature.length) - s.signingMemberIndices.push(s.signingMemberIndices.length + 1) - - await expectRevert( - operatorContract.submitDkgResult( - 1, - groupPubKey, - noMisbehaved, - s.signatures, - s.signingMemberIndices, - { from: selectedParticipants[0] } - ), - "Too many signatures" - ) - }) - - async function signResult(groupPublicKey, misbehaved) { - const resultHash = web3.utils.soliditySha3(groupPublicKey, misbehaved) - - signingMemberIndices = [] - signatures = undefined - - for (let i = 0; i < selectedParticipants.length; i++) { - const signature = await sign(resultHash, selectedParticipants[i]) - signingMemberIndices.push(i + 1) - if (signatures == undefined) signatures = signature - else signatures += signature.slice(2, signature.length) - } - - return { - signingMemberIndices: signingMemberIndices, - signatures: signatures, - } - } -}) diff --git a/solidity-v1/test/random_beacon_operator/TestRelayEntry.js b/solidity-v1/test/random_beacon_operator/TestRelayEntry.js deleted file mode 100644 index b065107da8..0000000000 --- a/solidity-v1/test/random_beacon_operator/TestRelayEntry.js +++ /dev/null @@ -1,99 +0,0 @@ -const blsData = require("../helpers/data.js") -const { initContracts } = require("../helpers/initContracts") -const assert = require("chai").assert -const { expectRevert } = require("@openzeppelin/test-helpers") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const { contract, accounts } = require("@openzeppelin/test-environment") - -describe("KeepRandomBeaconOperator/RelayEntry", () => { - let serviceContract - let operatorContract - - before(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact("KeepRandomBeaconOperatorStub") - ) - - operatorContract = contracts.operatorContract - serviceContract = contracts.serviceContract - - // Using stub method to add first group to help testing. - await operatorContract.registerNewGroup(blsData.groupPubKey) - const group = await operatorContract.getGroupPublicKey(0) - await operatorContract.setGroupMembers(group, [ - accounts[0], - accounts[1], - accounts[2], - ]) - - const entryFeeEstimate = await serviceContract.entryFeeEstimate(0) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: accounts[0], - }) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - it("should keep relay entry submission at reasonable price", async () => { - const gasEstimate = await operatorContract.relayEntry.estimateGas( - blsData.groupSignature - ) - - // Make sure no change will make the verification more expensive than it is - // now or that even if it happens, it will be a conscious decision. - assert.isBelow( - gasEstimate, - 378902, - "Relay entry submission is too expensive" - ) - }) - - it("should not allow to submit corrupted relay entry", async () => { - // This is not a valid G1 point - const groupSignature = - "0x11134abfa2a9844a58776650e399bca3e08ab134e42595e03e3efc5a0472bcd8" - - await expectRevert( - operatorContract.relayEntry(groupSignature), - "Invalid G1 bytes length" - ) - }) - - it("should not allow to submit invalid relay entry", async () => { - // Signature is a valid G1 point but it is not a signature over the - // expected input. - await expectRevert( - operatorContract.relayEntry(blsData.nextGroupSignature), - "Invalid signature" - ) - }) - - it("should allow to submit valid relay entry", async () => { - await operatorContract.relayEntry(blsData.groupSignature) - - assert.equal( - (await serviceContract.getPastEvents())[0].args["entry"].toString(), - blsData.groupSignatureNumber.toString(), - "Should emit event with generated entry" - ) - }) - - it("should allow to submit only one entry", async () => { - await operatorContract.relayEntry(blsData.groupSignature) - - await expectRevert( - operatorContract.relayEntry(blsData.groupSignature), - "Entry was submitted" - ) - }) -}) diff --git a/solidity-v1/test/random_beacon_operator/TestRelayEntryTimeout.js b/solidity-v1/test/random_beacon_operator/TestRelayEntryTimeout.js deleted file mode 100644 index 149e706118..0000000000 --- a/solidity-v1/test/random_beacon_operator/TestRelayEntryTimeout.js +++ /dev/null @@ -1,251 +0,0 @@ -const { - expectRevert, - expectEvent, - time, -} = require("@openzeppelin/test-helpers") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const { contract, accounts, web3 } = require("@openzeppelin/test-environment") -const blsData = require("../helpers/data.js") -const stakeDelegate = require("../helpers/stakeDelegate") -const { initContracts } = require("../helpers/initContracts") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -describe("KeepRandomBeaconOperator/RelayEntryTimeout", function () { - const deployer = accounts[0] - const serviceContractUpgrader = accounts[1] - ;(serviceContract = accounts[2]), - (operator1 = accounts[3]), - (operator2 = accounts[4]), - (operator3 = accounts[5]), - (thirdParty = accounts[6]) - - let operatorContract - let entryFee - - before(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact("KeepRandomBeaconOperatorStub") - ) - - operatorContract = contracts.operatorContract - - // - // register 'serviceContract' account as a new service contract so that - // we can hit the operator contract from this account for tests' simplicity. - // - await contracts.registry.setServiceContractUpgrader( - operatorContract.address, - serviceContractUpgrader, - { from: deployer } - ) - await operatorContract.addServiceContract(serviceContract, { - from: serviceContractUpgrader, - }) - - // - // stake 3 operators, authorize operator contract for all of them, - // and wait for the stake initialization period to complete - // - const token = contracts.token - const tokenStaking = contracts.stakingContract - const stake = web3.utils.toBN("500000000000000000000000") // 500 000 KEEP - await stakeDelegate( - tokenStaking, - token, - deployer, - operator1, - operator1, - operator1, - stake - ) - await stakeDelegate( - tokenStaking, - token, - deployer, - operator2, - operator2, - operator2, - stake - ) - await stakeDelegate( - tokenStaking, - token, - deployer, - operator3, - operator3, - operator3, - stake - ) - await tokenStaking.authorizeOperatorContract( - operator1, - operatorContract.address, - { from: operator1 } - ) - await tokenStaking.authorizeOperatorContract( - operator2, - operatorContract.address, - { from: operator2 } - ) - await tokenStaking.authorizeOperatorContract( - operator3, - operatorContract.address, - { from: operator3 } - ) - await time.increase((await tokenStaking.initializationPeriod()).addn(1)) - - // - // register two groups with operators staked in the previous step - // - await operatorContract.registerNewGroup("0x111") - await operatorContract.setGroupMembers("0x111", [ - operator1, - operator2, - operator3, - ]) - await operatorContract.registerNewGroup(blsData.groupPubKey) - await operatorContract.setGroupMembers(blsData.groupPubKey, [ - operator3, - operator2, - operator1, - ]) - - entryFee = await contracts.serviceContract.entryFeeEstimate(0) - }) - - async function requestRelayEntry() { - return operatorContract.sign(0, blsData.previousEntry, { - value: entryFee, - from: serviceContract, - }) - } - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("request for a new relay entry", async () => { - it("should be accepted when no other request is in progress", async () => { - const receipt = await requestRelayEntry() - await expectEvent(receipt, "RelayEntryRequested") - }) - - it("should be rejected when another request is in progress", async () => { - await requestRelayEntry() - await expectRevert(requestRelayEntry(), "Beacon is busy") - }) - - it("should be rejected when another request is in progress even if it timed out", async () => { - const timeout = await operatorContract.relayEntryTimeout() - await requestRelayEntry() - await time.advanceBlockTo((await time.latestBlock()).add(timeout)) - await expectRevert(requestRelayEntry(), "Beacon is busy") - }) - - it("should be retried when another request timed out and it's been reported", async () => { - const timeout = await operatorContract.relayEntryTimeout() - await requestRelayEntry() - await time.advanceBlockTo((await time.latestBlock()).add(timeout)) - const receipt = await operatorContract.reportRelayEntryTimeout({ - from: thirdParty, - }) - - expect(await operatorContract.isEntryInProgress()).to.be.true - await expectEvent(receipt, "RelayEntryRequested") - await expectRevert(requestRelayEntry(), "Beacon is busy") - }) - - it("should not be retried when there are no more active groups", async () => { - const timeout = await operatorContract.relayEntryTimeout() - - await requestRelayEntry() - await time.advanceBlockTo((await time.latestBlock()).add(timeout)) - await operatorContract.reportRelayEntryTimeout({ from: thirdParty }) - - await time.advanceBlockTo((await time.latestBlock()).add(timeout)) - await operatorContract.reportRelayEntryTimeout({ from: thirdParty }) - - expect(await operatorContract.isEntryInProgress()).to.be.false - const events = await operatorContract.getPastEvents("RelayEntryRequested") - expect(events).to.be.empty - }) - }) - - describe("beacon genesis", async () => { - // There is only one active group in the system and that group did not - // produce relay entry on time. Relay entry timeout is reported but since - // there is no other group in the system, we do not retry with another - // group. Entry is not marked as timed out to not block the beacon. - // With no groups, anyone can genesis again. - it("should be possible when entry timeout has been reported for the last active group", async () => { - // we need to register a real service contract as the most recent one - // so that genesis does not revert; genesis interacts with the most - // recent service contract, so we can't have there just an account - // address - const KeepRandomBeaconService = contract.fromArtifact( - "KeepRandomBeaconServiceImplV1" - ) - const realServiceContract = await KeepRandomBeaconService.new({ - from: deployer, - }) - await operatorContract.addServiceContract(realServiceContract.address, { - from: serviceContractUpgrader, - }) - - const timeout = await operatorContract.relayEntryTimeout() - - await requestRelayEntry() - await time.advanceBlockTo((await time.latestBlock()).add(timeout)) - await operatorContract.reportRelayEntryTimeout({ from: thirdParty }) - - await time.advanceBlockTo((await time.latestBlock()).add(timeout)) - await operatorContract.reportRelayEntryTimeout({ from: thirdParty }) - // there should be no more groups at this point - - const groupCount = await operatorContract.numberOfGroups() - expect(groupCount).to.eq.BN(0) - - const dkgGasEstimate = await operatorContract.dkgGasEstimate() - const gasPriceCeiling = await operatorContract.gasPriceCeiling() - await operatorContract.genesis({ - value: dkgGasEstimate.mul(gasPriceCeiling), - from: thirdParty, - }) - // ok, no revert - }) - }) - - describe("relay entry submission", async () => { - it("should be rejected after timeout", async () => { - const timeout = await operatorContract.relayEntryTimeout() - await requestRelayEntry() - await time.advanceBlockTo((await time.latestBlock()).add(timeout)) - await expectRevert( - operatorContract.relayEntry(blsData.groupSignature), - "Entry timed out" - ) - }) - - it("should be accepted when the previous request timed out and it's been reported", async () => { - const timeout = await operatorContract.relayEntryTimeout() - await requestRelayEntry() - await time.advanceBlockTo((await time.latestBlock()).add(timeout)) - await operatorContract.reportRelayEntryTimeout({ from: thirdParty }) - // 0x111 group gets terminated and bls.groupPubKey group is now asked - // to provide the signature - - await operatorContract.relayEntry(blsData.groupSignature) - // ok, no revert - }) - }) -}) diff --git a/solidity-v1/test/random_beacon_operator/TestSlashing.js b/solidity-v1/test/random_beacon_operator/TestSlashing.js deleted file mode 100644 index a4c5fcbb6b..0000000000 --- a/solidity-v1/test/random_beacon_operator/TestSlashing.js +++ /dev/null @@ -1,389 +0,0 @@ -const blsData = require("../helpers/data.js") -const { initContracts } = require("../helpers/initContracts") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const { contract, accounts, web3 } = require("@openzeppelin/test-environment") -const { expectRevert, time } = require("@openzeppelin/test-helpers") -const stakeDelegate = require("../helpers/stakeDelegate") -const BLS = contract.fromArtifact("BLS") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -describe("KeepRandomBeaconOperator/Slashing", function () { - let token - let stakingContract - let serviceContract - let operatorContract - let entryFeeEstimate - let groupIndex - let registry - let bls - const owner = accounts[0] - const operator1 = accounts[1] - const operator2 = accounts[2] - const operator3 = accounts[3] - const tattletale = accounts[4] - const authorizer = accounts[5] - const anotherOperatorContract = accounts[6] - const registryKeeper = accounts[7] - - let scheduleStart - let relayRequestStartBlock - - const largeStake = web3.utils.toBN("50000000000000000000000000") // 50 000 000 KEEP - const mediumStake = web3.utils.toBN("500000000000000000000000") // 500 000 KEEP - const smallStake = web3.utils.toBN("100000000000000000000000") // 100 000 KEEP - - before(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStakingStub"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact("KeepRandomBeaconOperatorSlashingStub") - ) - - token = contracts.token - stakingContract = contracts.stakingContract - serviceContract = contracts.serviceContract - operatorContract = contracts.operatorContract - registry = contracts.registry - bls = await BLS.new() - - await registry.setRegistryKeeper(registryKeeper, { from: accounts[0] }) - await registry.approveOperatorContract(anotherOperatorContract, { - from: registryKeeper, - }) - - await stakeDelegate( - stakingContract, - token, - owner, - operator1, - owner, - authorizer, - largeStake - ) - await stakeDelegate( - stakingContract, - token, - owner, - operator2, - owner, - authorizer, - mediumStake - ) - await stakeDelegate( - stakingContract, - token, - owner, - operator3, - owner, - authorizer, - smallStake - ) - await stakingContract.authorizeOperatorContract( - operator1, - operatorContract.address, - { from: authorizer } - ) - await stakingContract.authorizeOperatorContract( - operator2, - operatorContract.address, - { from: authorizer } - ) - await stakingContract.authorizeOperatorContract( - operator3, - operatorContract.address, - { from: authorizer } - ) - - scheduleStart = await stakingContract.deployedAt() - - time.increase((await stakingContract.initializationPeriod()).addn(1)) - - groupIndex = 0 - await operatorContract.registerNewGroup(blsData.groupPubKey, [ - operator1, - operator2, - operator3, - ]) - entryFeeEstimate = await serviceContract.entryFeeEstimate(0) - const tx = await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: accounts[0], - }) - relayRequestStartBlock = web3.utils.toBN(tx.receipt.blockNumber) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("reportUnauthorizedSigning", async () => { - it("seizes 100% of minimum stake", async () => { - const tattletaleSignature = await bls.sign(tattletale, blsData.secretKey) - - await operatorContract.reportUnauthorizedSigning( - groupIndex, - tattletaleSignature, - { from: tattletale } - ) - - expect(await stakingContract.balanceOf(operator1)).to.eq.BN( - "49900000000000000000000000" // 50000000000000000000000000 - 100000000000000000000000 - ) - expect(await stakingContract.balanceOf(operator2)).to.eq.BN( - "400000000000000000000000" // 500000000000000000000000 - 100000000000000000000000 - ) - expect(await stakingContract.balanceOf(operator3)).to.eq.BN( - "0" // 100000000000000000000000 - 100000000000000000000000 - ) - - // Expecting 5% of all the seized tokens - // - // minimum stake = 100000000000000000000000 - // 3 * 100000000000000000000000 * 5% = 15000000000000000000000 - expect(await token.balanceOf(tattletale)).to.eq.BN( - "15000000000000000000000" - ) - - // Group should be terminated, expecting total number of groups to become 0 - await expectRevert( - serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: accounts[0], - }), - "Total number of groups must be greater than zero." - ) - }) - - it("reverts for invalid signature", async () => { - await expectRevert( - operatorContract.reportUnauthorizedSigning( - groupIndex, - blsData.nextGroupSignature, // Wrong signature - { from: tattletale } - ), - "Invalid signature" - ) - }) - - it("reverts when already reported for the group", async () => { - const tattletaleSignature = await bls.sign(tattletale, blsData.secretKey) - - await operatorContract.reportUnauthorizedSigning( - groupIndex, - tattletaleSignature, - { from: tattletale } - ) - - await expectRevert( - operatorContract.reportUnauthorizedSigning( - groupIndex, - tattletaleSignature, - { from: tattletale } - ), - "Group has been already terminated" - ) - }) - }) - - describe("reportRelayEntryTimeout", async () => { - it("reverts if entry did not time out", async () => { - await expectRevert( - operatorContract.reportRelayEntryTimeout({ from: tattletale }), - "Entry did not time out." - ) - - await time.advanceBlockTo(relayRequestStartBlock.addn(9)) - - await expectRevert( - operatorContract.reportRelayEntryTimeout({ from: tattletale }), - "Entry did not time out." - ) - }) - - // There is only one active group in the system and that group did not - // produce relay entry on time. Relay entry timeout is reported but since - // there is no other group in the system, we do not retry with another - // group. reportRelayEntryTimeout reverts so that the last group may not - // be slashed more than one time. - it("reverts when already reported for the last active group", async () => { - await time.advanceBlockTo(relayRequestStartBlock.addn(10)) - await operatorContract.reportRelayEntryTimeout({ from: tattletale }) - await expectRevert( - operatorContract.reportRelayEntryTimeout({ from: tattletale }), - "Entry did not time out" - ) - }) - - it("does not revert in the first block relay entry timed out", async () => { - await time.advanceBlockTo(relayRequestStartBlock.addn(10)) - await operatorContract.reportRelayEntryTimeout({ from: tattletale }) - // ok, no reverts - }) - - it("seizes 1% of minimum stake from operators at the beginning", async () => { - await time.advanceBlockTo(relayRequestStartBlock.addn(10)) - await operatorContract.reportRelayEntryTimeout({ from: tattletale }) - - // minimum stake = 100000000000000000000000 - expect(await stakingContract.balanceOf(operator1)).to.eq.BN( - "49999000000000000000000000" // 50000000000000000000000000 - 1% * 100000000000000000000000 - ) - expect(await stakingContract.balanceOf(operator2)).to.eq.BN( - "499000000000000000000000" // 500000000000000000000000 - 1% * 100000000000000000000000 - ) - expect(await stakingContract.balanceOf(operator3)).to.eq.BN( - "99000000000000000000000" // 100000000000000000000000 - 1% * 100000000000000000000000 - ) - }) - - it("rewards tattletale with 1% stake adjustment at the beginning", async () => { - await time.advanceBlockTo(relayRequestStartBlock.addn(10)) - await operatorContract.reportRelayEntryTimeout({ from: tattletale }) - - // Expecting 5% of all the seized tokens with reward adjustment of (20 / 64) = 31%. - // And "all of the seized tokens" are 3 * minimum stake with 1% adjustment - // for the first three months: - // - // minimum stake = 100000000000000000000000 - // 3 * 100000000000000000000000 * 1% * 5% * 31% = 46500000000000000000 - expect(await token.balanceOf(tattletale)).to.eq.BN("46500000000000000000") - }) - - it("seizes 1% of minimum stake from operators before the first 3 months end", async () => { - await time.advanceBlockTo(relayRequestStartBlock.addn(10)) - await time.increaseTo(scheduleStart.addn(86400 * 89)) - await operatorContract.reportRelayEntryTimeout({ from: tattletale }) - - expect(await stakingContract.balanceOf(operator1)).to.eq.BN( - "49999000000000000000000000" // 50000000000000000000000000 - 1% * 100000000000000000000000 - ) - expect(await stakingContract.balanceOf(operator2)).to.eq.BN( - "499000000000000000000000" // 500000000000000000000000 - 1% * 100000000000000000000000 - ) - expect(await stakingContract.balanceOf(operator3)).to.eq.BN( - "99000000000000000000000" // 100000000000000000000000 - 1% * 100000000000000000000000 - ) - }) - - it("rewards tattletale with 1% stake adjustment before the first 3 months end", async () => { - await time.advanceBlockTo(relayRequestStartBlock.addn(10)) - await time.increaseTo(scheduleStart.addn(86400 * 89)) - await operatorContract.reportRelayEntryTimeout({ from: tattletale }) - - // Expecting 5% of all the seized tokens with reward adjustment of (20 / 64) = 31%. - // And "all of the seized tokens" are 3 * minimum stake with 1% adjustment - // for the first three months: - // - // minimum stake = 100000000000000000000000 - // 3 * 100000000000000000000000 * 1% * 5% * 31% = 46500000000000000000 - expect(await token.balanceOf(tattletale)).to.eq.BN("46500000000000000000") - }) - - it("seizes 50% of minimum stake from operators after the first 3 months", async () => { - await time.advanceBlockTo(relayRequestStartBlock.addn(10)) - await time.increaseTo(scheduleStart.addn(86400 * 90)) - await operatorContract.reportRelayEntryTimeout({ from: tattletale }) - - expect(await stakingContract.balanceOf(operator1)).to.eq.BN( - "49950000000000000000000000" // 50000000000000000000000000 - 50% * 100000000000000000000000 - ) - expect(await stakingContract.balanceOf(operator2)).to.eq.BN( - "450000000000000000000000" // 500000000000000000000000 - 50% * 100000000000000000000000 - ) - expect(await stakingContract.balanceOf(operator3)).to.eq.BN( - "50000000000000000000000" // 100000000000000000000000 - 50% * 100000000000000000000000 - ) - }) - - it("rewards tattletale with 50% stake adjustment after the first 3 months", async () => { - await time.advanceBlockTo(relayRequestStartBlock.addn(10)) - await time.increaseTo(scheduleStart.addn(86400 * 90)) - await operatorContract.reportRelayEntryTimeout({ from: tattletale }) - - // Expecting 5% of all the seized tokens with reward adjustment of (20 / 64) = 31%. - // And "all of the seized tokens" are 3 * minimum stake with 50% adjustment - // after the first 3 months end - // - // minimum stake = 100000000000000000000000 - // 3 * 100000000000000000000000 * 50% * 5% * 31% = 2325000000000000000000 - expect(await token.balanceOf(tattletale)).to.eq.BN( - "2325000000000000000000" - ) - }) - - it("seizes 50% of minimum stake from operators before the first 6 months end", async () => { - await time.advanceBlockTo(relayRequestStartBlock.addn(10)) - await time.increaseTo(scheduleStart.addn(86400 * 179)) - await operatorContract.reportRelayEntryTimeout({ from: tattletale }) - - // minimum stake = 100000000000000000000000 - expect(await stakingContract.balanceOf(operator1)).to.eq.BN( - "49950000000000000000000000" // 50000000000000000000000000 - 50% * 100000000000000000000000 - ) - expect(await stakingContract.balanceOf(operator2)).to.eq.BN( - "450000000000000000000000" // 500000000000000000000000 - 50% * 100000000000000000000000 - ) - expect(await stakingContract.balanceOf(operator3)).to.eq.BN( - "50000000000000000000000" // 100000000000000000000000 - 50% * 100000000000000000000000 - ) - }) - - it("rewards tattletale with 50% stake adjustment before the first 6 months end", async () => { - await time.advanceBlockTo(relayRequestStartBlock.addn(10)) - await time.increaseTo(scheduleStart.addn(86400 * 179)) - await operatorContract.reportRelayEntryTimeout({ from: tattletale }) - - // Expecting 5% of all the seized tokens with reward adjustment of (20 / 64) = 31%. - // And "all of the seized tokens" are 3 * minimum stake with 1% adjustment - // for the first three months: - // - // minimum stake = 100000000000000000000000 - // 3 * 100000000000000000000000 * 50% * 5% * 31% = 2325000000000000000000 - expect(await token.balanceOf(tattletale)).to.eq.BN( - "2325000000000000000000" - ) - }) - - it("seizes 100% of minimum stake from operators after the first 6 months end", async () => { - await time.advanceBlockTo(relayRequestStartBlock.addn(10)) - await time.increaseTo(scheduleStart.addn(86400 * 180)) - await operatorContract.reportRelayEntryTimeout({ from: tattletale }) - - // minimum stake = 100000000000000000000000 - expect(await stakingContract.balanceOf(operator1)).to.eq.BN( - "49900000000000000000000000" // 50000000000000000000000000 - 100% * 100000000000000000000000 - ) - expect(await stakingContract.balanceOf(operator2)).to.eq.BN( - "400000000000000000000000" // 500000000000000000000000 - 100% * 100000000000000000000000 - ) - expect(await stakingContract.balanceOf(operator3)).to.eq.BN( - "0" // 100000000000000000000000 - 100% * 100000000000000000000000 - ) - }) - - it("rewards tattletale with 100% stake adjustment after the first 6 months end", async () => { - await time.advanceBlockTo(relayRequestStartBlock.addn(10)) - await time.increaseTo(scheduleStart.addn(86400 * 180)) - await operatorContract.reportRelayEntryTimeout({ from: tattletale }) - - // Expecting 5% of all the seized tokens with reward adjustment of (20 / 64) = 31%. - // And "all of the seized tokens" are 3 * minimum stake with 1% adjustment - // for the first three months: - // - // minimum stake = 100000000000000000000000 - // 3 * 100000000000000000000000 * 100% * 5% * 31% = 4650000000000000000000 - expect(await token.balanceOf(tattletale)).to.eq.BN( - "4650000000000000000000" - ) - }) - }) -}) diff --git a/solidity-v1/test/random_beacon_operator/TestTicketsOrdering.js b/solidity-v1/test/random_beacon_operator/TestTicketsOrdering.js deleted file mode 100644 index 05243489ef..0000000000 --- a/solidity-v1/test/random_beacon_operator/TestTicketsOrdering.js +++ /dev/null @@ -1,257 +0,0 @@ -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const assert = require("chai").assert -const { contract } = require("@openzeppelin/test-environment") -const GroupSelectionStub = contract.fromArtifact("GroupSelectionStub") - -describe("KeepRandomBeaconOperator/TicketsOrdering", function () { - const groupSize = 10 - - let groupSelectionStub - - before(async () => { - groupSelectionStub = await GroupSelectionStub.new(groupSize) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("ticket insertion", () => { - describe("tickets array size is at its max capacity", () => { - it("should reject a new ticket when it is higher than the current highest one", async () => { - const ticketsToAdd = [1, 3, 5, 7, 4, 9, 6, 11, 8, 12, 100, 200, 300] - - await addTickets(ticketsToAdd) - - const expectedTickets = [1, 3, 5, 7, 4, 9, 6, 11, 8, 12] // 100, 200, 300 -> out - // indices = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] - // sorted tickets = [1, 3, 4, 5, 6, 7, 8, 9, 11, 12] - // sorted indices = [0, 1, 4, 2, 6, 3, 8, 5, 7, 9] - // 0->0 1->0 2->4 3->6 4->1 - // 5->8 6->2 7->5 8->3 9->7 - const expectedOrderedIndices = [0, 0, 4, 6, 1, 8, 2, 5, 3, 7] - const expectedTail = 9 - - await assertTickets( - expectedTail, - expectedOrderedIndices, - expectedTickets - ) - }) - - it("should replace the highest ticket with a new ticket which is somewhere in the middle value range", async () => { - const ticketsToAdd = [ - 5986, - 6782, - 5161, - 7009, - 8086, - 1035, - 5294, - 9826, - 6475, - 9520, - 4293, - ] - - await addTickets(ticketsToAdd) - - const expectedTickets = [ - 5986, - 6782, - 5161, - 7009, - 8086, - 1035, - 5294, - 4293, - 6475, - 9520, - ] // 9826 -> out - // indices = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] - // sorted tickets = [1035, 4293, 5161, 5294, 5986, 6475, 6782, 7009, 8086, 9520] - // sorted indices = [ 5 , 7 , 2 , 6 , 0 , 8 , 1 , 3 , 4 , 9 ] - // 0->6 1->8 2->7 3->1 4->3 - // 5->5 6->2 7->5 8->0 9->4 - const expectedOrderedIndices = [6, 8, 7, 1, 3, 5, 2, 5, 0, 4] - const expectedTail = 9 - - await assertTickets( - expectedTail, - expectedOrderedIndices, - expectedTickets - ) - }) - - it("should replace highest ticket (tail) and become a new highest (also tail)", async () => { - const ticketsToAdd = [151, 42, 175, 7, 128, 190, 74, 143, 88, 130, 185] - - await addTickets(ticketsToAdd) - - const expectedTickets = [151, 42, 175, 7, 128, 185, 74, 143, 88, 130] // 190 -> out - // indices = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] - // sorted tickets = [ 7, 42, 74, 88, 128, 130, 143, 151, 175, 185] - // sorted indices = [ 3, 1, 6, 8, 4, 9, 7, 0, 2, 5 ] - // 0->7 1->3 2->0 3->3 4->8 - // 5->2 6->1 7->9 8->6 9->4 - const expectedOrderedIndices = [7, 3, 0, 3, 8, 2, 1, 9, 6, 4] - const expectedTail = 5 - - await assertTickets( - expectedTail, - expectedOrderedIndices, - expectedTickets - ) - }) - - it("should add a new smallest ticket and remove the highest", async () => { - const ticketsToAdd = [ - 5986, - 6782, - 5161, - 7009, - 8086, - 1035, - 5294, - 9826, - 6475, - 9520, - 4293, - 998, - ] - - await addTickets(ticketsToAdd) - - const expectedTickets = [ - 5986, - 6782, - 5161, - 7009, - 8086, - 1035, - 5294, - 4293, - 6475, - 998, - ] // 9826 & 9520 -> out - // indices = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] - // sorted tickets = [998, 1035, 4293, 5161, 5294, 5986, 6475, 6782, 7009, 8086] - // sorted indices = [ 9 , 5 , 7 , 2 , 6 , 0 , 8 , 1 , 3 , 4 ] - // 0->6 1->8 2->7 3->1 4->3 - // 5->9 6->2 7->5 8->0 9->9 - const expectedOrderedIndices = [6, 8, 7, 1, 3, 9, 2, 5, 0, 9] - const expectedTail = 4 - - await assertTickets( - expectedTail, - expectedOrderedIndices, - expectedTickets - ) - }) - }) - - describe("tickets array size is less than a group size", () => { - it("should add all the tickets and keep track the order when the latest ticket is the highest one", async () => { - const ticketsToAdd = [1, 3, 5, 7, 4, 9, 6, 11] - - await addTickets(ticketsToAdd) - - // expected tickets = [1, 3, 5, 7, 4, 9, 6, 11] - // indices = [0, 1, 2, 3, 4, 5, 6, 7] - // sorted tickets = [1, 3, 4, 5, 6, 7, 9, 11] - // sorted indices = [0, 1, 4, 2, 6, 3, 5, 7] - // 0->0 1->0 2->4 3->6 - // 4->1 5->3 6->2 7->5 - const expectedOrderedIndices = [0, 0, 4, 6, 1, 3, 2, 5] - const expectedTail = 7 - - await assertTickets(expectedTail, expectedOrderedIndices, ticketsToAdd) - }) - - it("should add all the tickets and track the order when the latest ticket is somewhere in the middle value range", async () => { - const ticketsToAdd = [1, 3, 5, 7, 4, 9, 11, 6] - - await addTickets(ticketsToAdd) - - // expected tickets = [1, 3, 5, 7, 4, 9, 11, 6] - // indices = [0, 1, 2, 3, 4, 5, 6, 7] - // sorted tickets = [1, 3, 4, 5, 6, 7, 9, 11] - // sorted indices = [0, 1, 4, 2, 7, 3, 5, 6] - // 0->0 1->0 2->4 3->7 - // 4->1 5->3 6->5 7->2 - const expectedOrderedIndices = [0, 0, 4, 7, 1, 3, 5, 2] - const expectedTail = 6 - - await assertTickets(expectedTail, expectedOrderedIndices, ticketsToAdd) - }) - - it("should add all the tickets and track the order when the last added ticket is the smallest", async () => { - const ticketsToAdd = [151, 42, 175, 7, 128, 190, 74, 4] - - await addTickets(ticketsToAdd) - - // expected tickets = [151, 42, 175, 7, 128, 190, 74, 4 ] - // indices = [ 0, 1, 2, 3, 4, 5, 6, 7 ] - // sorted tickets = [ 4, 7, 42, 74, 128, 151, 175, 190] - // sorted indices = [ 7, 3, 1, 6, 4, 0, 2, 5 ] - // 0->4 1->3 2->0 3->7 - // 4->6 5->2 6->1 7->7 - const expectedOrderedIndices = [4, 3, 0, 7, 6, 2, 1, 7] - const expectedTail = 5 - - await assertTickets(expectedTail, expectedOrderedIndices, ticketsToAdd) - }) - }) - - async function addTickets(ticketsToAdd) { - for (let i = 0; i < ticketsToAdd.length; i++) { - await groupSelectionStub.addTicket(ticketsToAdd[i]) - } - } - - async function assertTickets( - expectedTail, - expectedLinkedTicketIndices, - expectedTickets - ) { - // Assert tickets size - const tickets = await groupSelectionStub.getTickets() - assert.isAtMost( - tickets.length, - groupSize, - "array of tickets cannot have more elements than the group size" - ) - - // Assert ticket values - const actualTickets = [] - for (let i = 0; i < tickets.length; i++) { - actualTickets.push(tickets[i]) - } - assert.sameOrderedMembers( - actualTickets.map((bn) => bn.toNumber()), - expectedTickets, - "unexpected ticket values" - ) - - // Assert tail - const tail = await groupSelectionStub.getTail() - assert.equal(tail.toString(), expectedTail, "unexpected tail index") - - // Assert the order of the tickets[] indices - const actualLinkedTicketIndices = [] - for (let i = 0; i < tickets.length; i++) { - const actualIndex = await groupSelectionStub.getPreviousTicketIndex(i) - actualLinkedTicketIndices.push(actualIndex) - } - assert.sameOrderedMembers( - actualLinkedTicketIndices.map((bn) => bn.toNumber()), - expectedLinkedTicketIndices, - "unexpected order of tickets" - ) - } - }) -}) diff --git a/solidity-v1/test/random_beacon_service/TestPricing.js b/solidity-v1/test/random_beacon_service/TestPricing.js deleted file mode 100644 index 15c2a0356a..0000000000 --- a/solidity-v1/test/random_beacon_service/TestPricing.js +++ /dev/null @@ -1,256 +0,0 @@ -const stakeDelegate = require("../helpers/stakeDelegate") -const blsData = require("../helpers/data.js") -const { initContracts } = require("../helpers/initContracts") -const assert = require("chai").assert -const { contract, accounts, web3 } = require("@openzeppelin/test-environment") -const { time } = require("@openzeppelin/test-helpers") -const CallbackContract = contract.fromArtifact("CallbackContract") - -describe("TestKeepRandomBeaconService/Pricing", function () { - let token - let stakingContract - let operatorContract - let serviceContract - let callbackContract - let entryFee - let groupSize - let group - const owner = accounts[0] - const requestor = accounts[1] - const operator1 = accounts[2] - const operator2 = accounts[3] - const operator3 = accounts[4] - const beneficiary1 = accounts[5] - const beneficiary2 = accounts[6] - const beneficiary3 = accounts[7] - - beforeEach(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact("KeepRandomBeaconOperatorServicePricingStub") - ) - - token = contracts.token - stakingContract = contracts.stakingContract - operatorContract = contracts.operatorContract - serviceContract = contracts.serviceContract - callbackContract = await CallbackContract.new() - - // Using stub method to add first group to help testing. - await operatorContract.registerNewGroup(blsData.groupPubKey) - - groupSize = web3.utils.toBN(3) - group = await operatorContract.getGroupPublicKey(0) - await operatorContract.setGroupMembers(group, [ - operator1, - operator2, - operator3, - ]) - const minimumStake = await stakingContract.minimumStake() - - await stakeDelegate( - stakingContract, - token, - owner, - operator1, - beneficiary1, - operator1, - minimumStake - ) - await stakeDelegate( - stakingContract, - token, - owner, - operator2, - beneficiary2, - operator2, - minimumStake - ) - await stakeDelegate( - stakingContract, - token, - owner, - operator3, - beneficiary3, - operator3, - minimumStake - ) - - entryFee = await serviceContract.entryFeeBreakdown() - }) - - it("should successfully refund callback surplus for a lower submission gas price", async () => { - const gasPriceCeiling = web3.utils.toBN(web3.utils.toWei("20", "gwei")) - await operatorContract.setGasPriceCeiling(gasPriceCeiling) - - const callbackGas = web3.utils.toBN( - await callbackContract.__beaconCallback.estimateGas( - blsData.groupSignature - ) - ) - const entryFeeEstimate = await serviceContract.entryFeeEstimate(callbackGas) - - await serviceContract.methods["requestRelayEntry(address,uint256)"]( - callbackContract.address, - callbackGas, - { - value: entryFeeEstimate, - from: requestor, - } - ) - - const submissionGasPrice = web3.utils.toBN(web3.utils.toWei("5", "gwei")) - const gasPriceDiff = gasPriceCeiling.sub(submissionGasPrice) - - const requestorBalance = await web3.eth.getBalance(requestor) - await operatorContract.relayEntry(blsData.groupSignature, { - gasPrice: submissionGasPrice, - }) - const updatedRequestorBalance = await web3.eth.getBalance(requestor) - - const refund = web3.utils - .toBN(updatedRequestorBalance) - .sub(web3.utils.toBN(requestorBalance)) - - const baseCallbackGas = await serviceContract.baseCallbackGas() - const expectedSurplus = callbackGas.add(baseCallbackGas).mul(gasPriceDiff) - - assert.isTrue( - expectedSurplus.eq(refund), - "Callback gas surplus should be refunded to the requestor." - ) - }) - - it("should send group reward to each operator.", async function () { - const entryFeeEstimate = await serviceContract.entryFeeEstimate(0) - const tx = await serviceContract.methods[ - "requestRelayEntry(address,uint256)" - ](callbackContract.address, 0, { value: entryFeeEstimate, from: requestor }) - - const currentRequestStartBlock = web3.utils.toBN(tx.receipt.blockNumber) - const relayEntryTimeout = await operatorContract.relayEntryTimeout() - const deadlineBlock = currentRequestStartBlock.add(relayEntryTimeout) - const entryReceivedBlock = currentRequestStartBlock.addn(1) - const remainingBlocks = deadlineBlock.sub(entryReceivedBlock) - const submissionWindow = deadlineBlock.sub(entryReceivedBlock) - const decimalPoints = web3.utils.toBN(1e16) - const delayFactor = remainingBlocks - .mul(decimalPoints) - .div(submissionWindow) - .pow(web3.utils.toBN(2)) - const memberBaseReward = entryFee.groupProfitFee.div(groupSize) - const expectedGroupMemberReward = memberBaseReward - .mul(delayFactor) - .div(decimalPoints.pow(web3.utils.toBN(2))) - - await operatorContract.relayEntry(blsData.groupSignature) - - assert.isTrue( - delayFactor.eq(web3.utils.toBN(1e16).pow(web3.utils.toBN(2))), - "Delay factor expected to be 1 * 1e16 ^ 2." - ) - - const groupMemberRewards = await operatorContract.getGroupMemberRewards( - group - ) - assert.isTrue( - web3.utils - .toBN(groupMemberRewards) - .eq(web3.utils.toBN(expectedGroupMemberReward)), - "Unexpected group member reward." - ) - }) - - it("should send part of the group reward to request subsidy pool based on the submission block.", async function () { - // Example rewards breakdown: - // entryVerificationGasEstimate: 1240000 - // groupCreationGasEstimate: 2260000 - // dkgContributionMargin: 10% - // groupMemberBaseReward: 1050000000000000 - // groupSize: 5 - // entry fee estimate: 49230000000000000 wei - // signing fee: 37200000000000000 wei - // DKG fee: 6780000000000000 wei - // relayEntryTimeout: 10 blocks - // currentRequestStartBlock: 38 - // relay entry submission block: 44 - // decimals: 1e16 - // groupProfitFee: 42450000000000000 - 37200000000000000 = 5250000000000000 wei - // memberBaseReward: 5250000000000000 / 5 = 1050000000000000 wei - // entryTimeout: 38 + 10 = 48 - // delayFactor: ((48 - 44) * 1e16 / (10 - 1)) ^ 2 = 19753086419753082469135802469136 - // groupMemberDelayPenalty: 1050000000000000 * 80246913580246917530864197530864 / (1e16 ^ 2) = 842592592592592 - // groupMemberReward: 1050000000000000 * 19753086419753082469135802469136) / (1e16 ^ 2) = 207407407407407 wei - // submitterExtraReward: 842592592592592 * 5 * 5 / 100 = 210648148148148 wei - // submitterReward: 37200000000000000 + 210648148148148 = 37410648148148148 wei - // subsidy = 5250000000000000 - 207407407407407 * 5 - 210648148148148 = 4002314814814817 wei - - const entryFeeEstimate = await serviceContract.entryFeeEstimate(0) - const tx = await serviceContract.methods[ - "requestRelayEntry(address,uint256)" - ](callbackContract.address, 0, { value: entryFeeEstimate, from: requestor }) - - const currentRequestStartBlock = web3.utils.toBN(tx.receipt.blockNumber) - const relayEntryTimeout = await operatorContract.relayEntryTimeout() - const deadlineBlock = currentRequestStartBlock - .add(relayEntryTimeout) - .addn(1) - const submissionStartBlock = currentRequestStartBlock.addn(1) - const decimalPoints = web3.utils.toBN(1e16) - - await time.advanceBlockTo( - web3.utils.toBN(await web3.eth.getBlockNumber()).addn(1) - ) - - const entryReceivedBlock = web3.utils - .toBN(await web3.eth.getBlockNumber()) - .add(web3.utils.toBN(1)) // web3.eth.getBlockNumber is 1 block behind solidity 'block.number'. - const remainingBlocks = deadlineBlock.sub(entryReceivedBlock) - const submissionWindow = deadlineBlock.sub(submissionStartBlock) - const delayFactor = remainingBlocks - .mul(decimalPoints) - .div(submissionWindow) - .pow(web3.utils.toBN(2)) - - const memberBaseReward = entryFee.groupProfitFee.div(groupSize) - const expectedGroupMemberReward = memberBaseReward - .mul(delayFactor) - .div(decimalPoints.pow(web3.utils.toBN(2))) - const expectedDelayPenalty = memberBaseReward.sub( - memberBaseReward - .mul(delayFactor) - .div(decimalPoints.pow(web3.utils.toBN(2))) - ) - const expectedSubmitterExtraReward = expectedDelayPenalty - .mul(groupSize) - .muln(5) - .div(web3.utils.toBN(100)) - const requestSubsidy = entryFee.groupProfitFee - .sub(expectedGroupMemberReward.mul(groupSize)) - .sub(expectedSubmitterExtraReward) - - const serviceContractBalance = web3.utils.toBN( - await web3.eth.getBalance(serviceContract.address) - ) - - await operatorContract.relayEntry(blsData.groupSignature) - - const groupMemberRewards = await operatorContract.getGroupMemberRewards( - group - ) - assert.isTrue( - groupMemberRewards.eq(expectedGroupMemberReward), - "Unexpected group member reward." - ) - assert.isTrue( - serviceContractBalance - .add(requestSubsidy) - .eq( - web3.utils.toBN(await web3.eth.getBalance(serviceContract.address)) - ), - "Service contract should receive request subsidy." - ) - }) -}) diff --git a/solidity-v1/test/random_beacon_service/TestPricingDkg.js b/solidity-v1/test/random_beacon_service/TestPricingDkg.js deleted file mode 100644 index 7fbace0a96..0000000000 --- a/solidity-v1/test/random_beacon_service/TestPricingDkg.js +++ /dev/null @@ -1,131 +0,0 @@ -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const stakeAndGenesis = require("../helpers/stakeAndGenesis") -const blsData = require("../helpers/data.js") -const { initContracts } = require("../helpers/initContracts") -const assert = require("chai").assert -const { contract, accounts, web3 } = require("@openzeppelin/test-environment") - -describe("KeepRandomBeaconService/PricingDkg", () => { - let serviceContract - let operatorContract - let groupCreationFee - - before(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact("KeepRandomBeaconOperatorPricingDKGStub") - ) - - serviceContract = contracts.serviceContract - operatorContract = contracts.operatorContract - - await stakeAndGenesis(accounts, contracts) - - groupCreationFee = await operatorContract.groupCreationFee() - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - it( - "should not trigger new group selection when there are not sufficient " + - "funds in the DKG fee pool", - async () => { - const entryFeeEstimate = await serviceContract.entryFeeEstimate(0) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: accounts[0], - }) - - const contractBalance = await web3.eth.getBalance(serviceContract.address) - - const insufficientPoolFunds = web3.utils - .toBN(groupCreationFee) - .sub(web3.utils.toBN(contractBalance)) - .sub(web3.utils.toBN(1)) - - await serviceContract.fundDkgFeePool({ value: insufficientPoolFunds }) - - await operatorContract.relayEntry(blsData.groupSignature) - - assert.isFalse( - await operatorContract.isGroupSelectionInProgress(), - "new group selection should not start" - ) - } - ) - - it( - "should trigger new group selection when there are sufficient funds in the " + - "DKG fee pool", - async () => { - const entryFeeEstimate = await serviceContract.entryFeeEstimate(0) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: accounts[0], - }) - - const sufficientPoolFunds = web3.utils.toBN(groupCreationFee) - - await serviceContract.fundDkgFeePool({ value: sufficientPoolFunds }) - - await operatorContract.relayEntry(blsData.groupSignature) - - assert.isTrue( - await operatorContract.isGroupSelectionInProgress(), - "new group selection should be started" - ) - } - ) - - it("should not trigger group selection while one is in progress", async () => { - await serviceContract.fundDkgFeePool({ value: 3 * groupCreationFee }) - - const entryFeeEstimate = await serviceContract.entryFeeEstimate(0) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: accounts[0], - }) - await operatorContract.relayEntry(blsData.groupSignature) - - assert.isTrue( - await operatorContract.isGroupSelectionInProgress(), - "new group selection should be started" - ) - - const startBlock = await operatorContract.getTicketSubmissionStartBlock() - - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: accounts[0], - }) - const contractBalance = web3.utils.toBN( - await web3.eth.getBalance(serviceContract.address) - ) - await operatorContract.relayEntry(blsData.nextGroupSignature) - - assert.isTrue( - web3.utils - .toBN(await web3.eth.getBalance(serviceContract.address)) - .eq(contractBalance), - "service contract balance should not change" - ) - - assert.isTrue( - await operatorContract.isGroupSelectionInProgress(), - "previous group selection should continue" - ) - - assert.isTrue( - startBlock.eq(await operatorContract.getTicketSubmissionStartBlock()), - "new group selection should not be started" - ) - }) -}) diff --git a/solidity-v1/test/random_beacon_service/TestPricingFees.js b/solidity-v1/test/random_beacon_service/TestPricingFees.js deleted file mode 100644 index 873ce5f98e..0000000000 --- a/solidity-v1/test/random_beacon_service/TestPricingFees.js +++ /dev/null @@ -1,72 +0,0 @@ -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const blsData = require("../helpers/data.js") -const { initContracts } = require("../helpers/initContracts") -const assert = require("chai").assert -const { contract, accounts } = require("@openzeppelin/test-environment") - -describe("KeepRandomBeaconService/PricingFees", function () { - let serviceContract - let operatorContract - - before(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact("KeepRandomBeaconOperatorPricingStub") - ) - - serviceContract = contracts.serviceContract - operatorContract = contracts.operatorContract - - await operatorContract.registerNewGroup(blsData.groupPubKey) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - it("should correctly evaluate entry verification fee", async () => { - await operatorContract.setGasPriceCeiling(200, { from: accounts[0] }) - await operatorContract.setEntryVerificationGasEstimate(12) - - const fees = await serviceContract.entryFeeBreakdown() - const entryVerificationFee = fees.entryVerificationFee - - const expectedEntryVerificationFee = 2400 // 200 * 12 - assert.equal(expectedEntryVerificationFee, entryVerificationFee) - }) - - it("should correctly evaluate DKG contribution fee", async () => { - await operatorContract.setGasPriceCeiling(1234, { from: accounts[0] }) - - const fees = await serviceContract.entryFeeBreakdown() - const dkgContributionFee = fees.dkgContributionFee - - const expectedDkgContributionFee = 119698000 // 1234 * (1740000 + 200000) * 5% = 119698000 - assert.equal(expectedDkgContributionFee, dkgContributionFee) - }) - - it("should correctly evaluate entry fee estimate", async () => { - await operatorContract.setGasPriceCeiling(200, { from: accounts[0] }) - await operatorContract.setEntryVerificationGasEstimate(12) - await operatorContract.setGroupSize(13) - await operatorContract.setGroupMemberBaseReward(3) - - const callbackGas = 7 - - const entryFeeEstimate = await serviceContract.entryFeeEstimate(callbackGas) - - // entry verification fee = 12 * 200 = 2400 - // dkg contribution fee = (1740000 + 200000) * 200 * 5% = 19400000 - // group profit fee = 13 * 3 = 39 - // callback fee = (10226 + 7) * 200 = 2046600 - // entry fee = 2400 + 19400000 + 39 + 2046600 = 21449039 - const expectedEntryFeeEstimate = 21449039 - assert.equal(expectedEntryFeeEstimate, entryFeeEstimate) - }) -}) diff --git a/solidity-v1/test/random_beacon_service/TestRelayRequestCallback.js b/solidity-v1/test/random_beacon_service/TestRelayRequestCallback.js deleted file mode 100644 index a66a4c0252..0000000000 --- a/solidity-v1/test/random_beacon_service/TestRelayRequestCallback.js +++ /dev/null @@ -1,891 +0,0 @@ -const stakeAndGenesis = require("../helpers/stakeAndGenesis") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const blsData = require("../helpers/data.js") -const { initContracts } = require("../helpers/initContracts") -const { contract, web3, accounts } = require("@openzeppelin/test-environment") -const { expectRevert } = require("@openzeppelin/test-helpers") - -const CallbackContract = contract.fromArtifact("CallbackContract") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect -const assert = chai.assert - -// A set of integration tests for the beacon pricing mechanism related to -// callback reimbursement. -describe("KeepRandomBeacon/RelayRequestCallback", function () { - let operatorContract - let serviceContract - let callbackContract - - const customer = accounts[0] - const operator = accounts[1] // make sure these match the ones in stakeAndGenesis.js - const beneficiary = accounts[4] - - let entryVerificationFee - let dkgContributionFee - let groupProfitFee - let baseCallbackGas - - before(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact("KeepRandomBeaconOperatorCallbackStub") - ) - - operatorContract = contracts.operatorContract - serviceContract = contracts.serviceContract - callbackContract = await CallbackContract.new() - - await stakeAndGenesis(accounts, contracts) - - const feeBreakdown = await serviceContract.entryFeeBreakdown() - entryVerificationFee = web3.utils.toBN(feeBreakdown.entryVerificationFee) - dkgContributionFee = web3.utils.toBN(feeBreakdown.dkgContributionFee) - groupProfitFee = web3.utils.toBN(feeBreakdown.groupProfitFee) - - baseCallbackGas = web3.utils.toBN(await serviceContract.baseCallbackGas()) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - it("should revert when callback gas exceeds gas limit", async () => { - const callbackGas = 2000001 - await expectRevert( - serviceContract.entryFeeEstimate(callbackGas), - "Callback gas exceeds 2000000 gas limit" - ) - - const entryFeeEstimate = await serviceContract.entryFeeEstimate(2000000) - await expectRevert( - serviceContract.methods["requestRelayEntry(address,uint256)"]( - callbackContract.address, - callbackGas, - { - value: entryFeeEstimate, - from: customer, - } - ), - "Callback gas exceeds 2000000 gas limit" - ) - }) - - it("should produce entry when no callback was not provided", async () => { - const entryFeeEstimate = await serviceContract.entryFeeEstimate(0) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: customer, - }) - await operatorContract.relayEntry(blsData.groupSignature, { - from: operator, - }) - - assert.equal( - (await serviceContract.getPastEvents())[0].args["entry"].toString(), - blsData.groupSignatureNumber.toString(), - "Should emit event with the generated entry" - ) - }) - - it("should reimburse submitter when no callback was provided", async () => { - const entryFeeEstimate = await serviceContract.entryFeeEstimate(0) - await serviceContract.methods["requestRelayEntry()"]({ - value: entryFeeEstimate, - from: customer, - }) - - const beneficiaryStartBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - await operatorContract.relayEntry(blsData.groupSignature, { - from: operator, - }) - const beneficiaryEndBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - - const submitterReimbursement = beneficiaryEndBalance.sub( - beneficiaryStartBalance - ) - - assert.isTrue( - submitterReimbursement.eq(entryVerificationFee), - "Unexpected submitter reimbursement" - ) - }) - - it("should produce entry and execute callback if provided", async () => { - const callbackGas = await callbackContract.__beaconCallback.estimateGas( - blsData.groupSignature - ) - const entryFeeEstimate = await serviceContract.entryFeeEstimate(callbackGas) - await serviceContract.methods["requestRelayEntry(address,uint256)"]( - callbackContract.address, - callbackGas, - { - value: entryFeeEstimate, - from: customer, - } - ) - await operatorContract.relayEntry(blsData.groupSignature, { - from: operator, - }) - - assert.equal( - (await serviceContract.getPastEvents())[0].args["entry"].toString(), - blsData.groupSignatureNumber.toString(), - "Should emit event with the generated entry" - ) - - const result = web3.utils.toBN(await callbackContract.lastEntry()) - assert.isTrue( - result.eq(blsData.groupSignatureNumber), - "Unexpected entry value passed to the callback" - ) - }) - - it("should reimburse submitter and customer for executing callback consuming less gas", async () => { - let callbackGas = await callbackContract.__beaconCallback.estimateGas( - blsData.groupSignature - ) - callbackGas = callbackGas + 100000 // use 100k more gas than needed - const entryFeeEstimate = await serviceContract.entryFeeEstimate(callbackGas) - await serviceContract.methods["requestRelayEntry(address,uint256)"]( - callbackContract.address, - callbackGas, - { - value: entryFeeEstimate, - from: customer, - } - ) - - const customerStartBalance = web3.utils.toBN( - await web3.eth.getBalance(customer) - ) - const beneficiaryStartBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - - // use the same gas price as the gas price ceiling - const relayEntryTxGasPrice = web3.utils.toBN(web3.utils.toWei("60", "Gwei")) - await operatorContract.relayEntry(blsData.groupSignature, { - from: operator, - gasPrice: relayEntryTxGasPrice, - }) - - const customerEndBalance = web3.utils.toBN( - await web3.eth.getBalance(customer) - ) - const beneficiaryEndBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - - const customerSurplus = customerEndBalance.sub(customerStartBalance) - const submitterReimbursement = beneficiaryEndBalance.sub( - beneficiaryStartBalance - ) - - const gasSurplus = customerSurplus.div(relayEntryTxGasPrice) - await assertTotalSpending( - entryFeeEstimate, - submitterReimbursement, - customerSurplus - ) - - // The additional 100k gas margin was never used so it should be returned - // to the customer as surplus. Since gasleft() in Soldity inserts additional - // opcodes, it's not possible to evaluate an exact gas spent value for - // callback execution. Hence, we assume a healthy margin instead of an exact - // value. - expect(gasSurplus).to.gt.BN("98500") - expect(gasSurplus).to.lte.BN("100000") - }) - - // gas price ceiling > tx.gasprice - it("should reimburse submitter and customer for executing callback with lower tx.gasprice", async () => { - const callbackGas = await callbackContract.__beaconCallback.estimateGas( - blsData.groupSignature - ) - const entryFeeEstimate = await serviceContract.entryFeeEstimate(callbackGas) - await serviceContract.methods["requestRelayEntry(address,uint256)"]( - callbackContract.address, - callbackGas, - { - value: entryFeeEstimate, - from: customer, - } - ) - - // use lower gas price when submitting entry - const relayEntryTxGasPrice = web3.utils.toBN(web3.utils.toWei("2", "Gwei")) - - const customerStartBalance = web3.utils.toBN( - await web3.eth.getBalance(customer) - ) - const beneficiaryStartBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - await operatorContract.relayEntry(blsData.groupSignature, { - from: operator, - gasPrice: relayEntryTxGasPrice, - }) - const customerEndBalance = web3.utils.toBN( - await web3.eth.getBalance(customer) - ) - const beneficiaryEndBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - - const customerSurplus = customerEndBalance.sub(customerStartBalance) - const submitterReimbursement = beneficiaryEndBalance.sub( - beneficiaryStartBalance - ) - - await assertCallbackReimbursement( - callbackGas, - entryFeeEstimate, - submitterReimbursement, - customerSurplus, - relayEntryTxGasPrice - ) - }) - - // gas price ceiling == tx.gasprice - it("should reimburse submitter and customer for executing callback with expected tx.gasprice", async () => { - const callbackGas = await callbackContract.__beaconCallback.estimateGas( - blsData.groupSignature - ) - const entryFeeEstimate = await serviceContract.entryFeeEstimate(callbackGas) - await serviceContract.methods["requestRelayEntry(address,uint256)"]( - callbackContract.address, - callbackGas, - { - value: entryFeeEstimate, - from: customer, - } - ) - - // use the same gas price as the gas price ceiling - const relayEntryTxGasPrice = web3.utils.toBN(web3.utils.toWei("60", "Gwei")) - - const customerStartBalance = web3.utils.toBN( - await web3.eth.getBalance(customer) - ) - const beneficiaryStartBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - await operatorContract.relayEntry(blsData.groupSignature, { - from: operator, - gasPrice: relayEntryTxGasPrice, - }) - const customerEndBalance = web3.utils.toBN( - await web3.eth.getBalance(customer) - ) - const beneficiaryEndBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - - const customerSurplus = customerEndBalance.sub(customerStartBalance) - const submitterReimbursement = beneficiaryEndBalance.sub( - beneficiaryStartBalance - ) - - await assertCallbackReimbursement( - callbackGas, - entryFeeEstimate, - submitterReimbursement, - customerSurplus, - relayEntryTxGasPrice - ) - }) - - // gas price ceiling < tx.gasprice - it("should reimburse submitter and customer for executing callback with higher tx.gasprice", async () => { - const callbackGas = await callbackContract.__beaconCallback.estimateGas( - blsData.groupSignature - ) - const entryFeeEstimate = await serviceContract.entryFeeEstimate(callbackGas) - await serviceContract.methods["requestRelayEntry(address,uint256)"]( - callbackContract.address, - callbackGas, - { - value: entryFeeEstimate, - from: customer, - } - ) - - // use higher price than the gas price ceiling - const relayEntryTxGasPrice = web3.utils.toBN(web3.utils.toWei("70", "Gwei")) - // higher tx.gasprice should not be used for reimbursement - maximum gas - // price is the one from the gas price ceiling - const gasPriceForReimbursement = web3.utils.toBN( - web3.utils.toWei("60", "Gwei") - ) - - const customerStartBalance = web3.utils.toBN( - await web3.eth.getBalance(customer) - ) - const beneficiaryStartBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - await operatorContract.relayEntry(blsData.groupSignature, { - from: operator, - gasPrice: relayEntryTxGasPrice, - }) - const customerEndBalance = web3.utils.toBN( - await web3.eth.getBalance(customer) - ) - const beneficiaryEndBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - - const customerSurplus = customerEndBalance.sub(customerStartBalance) - const submitterReimbursement = beneficiaryEndBalance.sub( - beneficiaryStartBalance - ) - - await assertCallbackReimbursement( - callbackGas, - entryFeeEstimate, - submitterReimbursement, - customerSurplus, - gasPriceForReimbursement - ) - }) - - it("should trigger new group creation and execute callback if provided", async () => { - await fundDkgPool() - - // Request relay entry with a callback - const callbackGas = await callbackContract.__beaconCallback.estimateGas( - blsData.groupSignature - ) - const entryFeeEstimate = await serviceContract.entryFeeEstimate(callbackGas) - await serviceContract.methods["requestRelayEntry(address,uint256)"]( - callbackContract.address, - callbackGas, - { - value: entryFeeEstimate, - from: customer, - } - ) - - await operatorContract.relayEntry(blsData.groupSignature, { - from: operator, - }) - - assert.equal( - (await operatorContract.getPastEvents())[1].event, - "GroupSelectionStarted", - "Should start group selection" - ) - - assert.equal( - (await operatorContract.getPastEvents())[1].args["newEntry"].toString(), - blsData.groupSignatureNumber.toString(), - "Should start group selection with new entry" - ) - - assert.equal( - (await serviceContract.getPastEvents())[0].args["entry"].toString(), - blsData.groupSignatureNumber.toString(), - "Should emit event with the generated entry" - ) - - const result = web3.utils.toBN(await callbackContract.lastEntry()) - assert.isTrue( - result.eq(blsData.groupSignatureNumber), - "Unexpected entry value passed to the callback" - ) - }) - - // gas price ceiling == tx.gasprice - it( - "should trigger new group creation, execute callback, reimburse submitter " + - "and customer with expected tx.gasprice", - async () => { - await fundDkgPool() - - // Request relay entry with a callback - const callbackGas = await callbackContract.__beaconCallback.estimateGas( - blsData.groupSignature - ) - const entryFeeEstimate = await serviceContract.entryFeeEstimate( - callbackGas - ) - await serviceContract.methods["requestRelayEntry(address,uint256)"]( - callbackContract.address, - callbackGas, - { - value: entryFeeEstimate, - from: customer, - } - ) - - // use the same gas price as the gas price ceiling - const relayEntryTxGasPrice = web3.utils.toBN( - web3.utils.toWei("60", "Gwei") - ) - - const customerStartBalance = web3.utils.toBN( - await web3.eth.getBalance(customer) - ) - const beneficiaryStartBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - await operatorContract.relayEntry(blsData.groupSignature, { - from: operator, - gasPrice: relayEntryTxGasPrice, - }) - const customerEndBalance = web3.utils.toBN( - await web3.eth.getBalance(customer) - ) - const beneficiaryEndBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - - const customerSurplus = customerEndBalance.sub(customerStartBalance) - const submitterReimbursement = beneficiaryEndBalance.sub( - beneficiaryStartBalance - ) - - await assertCallbackAndDKGReimbursement( - callbackGas, - entryFeeEstimate, - submitterReimbursement, - customerSurplus, - relayEntryTxGasPrice - ) - } - ) - - // gas price ceiling > tx.gasprice - it( - "should trigger new group selection, execute callback, reimburse submitter " + - "and customer with lower tx.gasprice", - async () => { - await fundDkgPool() - - // Request relay entry with a callback - const callbackGas = await callbackContract.__beaconCallback.estimateGas( - blsData.groupSignature - ) - const entryFeeEstimate = await serviceContract.entryFeeEstimate( - callbackGas - ) - await serviceContract.methods["requestRelayEntry(address,uint256)"]( - callbackContract.address, - callbackGas, - { - value: entryFeeEstimate, - from: customer, - } - ) - - // use lower gas price when submitting entry - const relayEntryTxGasPrice = web3.utils.toBN( - web3.utils.toWei("2", "Gwei") - ) - - const customerStartBalance = web3.utils.toBN( - await web3.eth.getBalance(customer) - ) - const beneficiaryStartBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - await operatorContract.relayEntry(blsData.groupSignature, { - from: operator, - gasPrice: relayEntryTxGasPrice, - }) - const customerEndBalance = web3.utils.toBN( - await web3.eth.getBalance(customer) - ) - const beneficiaryEndBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - - const customerSurplus = customerEndBalance.sub(customerStartBalance) - const submitterReimbursement = beneficiaryEndBalance.sub( - beneficiaryStartBalance - ) - - await assertCallbackAndDKGReimbursement( - callbackGas, - entryFeeEstimate, - submitterReimbursement, - customerSurplus, - relayEntryTxGasPrice - ) - } - ) - - // gas price ceiling < tx.gasprice - it( - "should trigger new group selection, execute callback, reimburse submitter " + - "and customer with higher tx.gasprice", - async () => { - await fundDkgPool() - - // Request relay entry with a callback - const callbackGas = await callbackContract.__beaconCallback.estimateGas( - blsData.groupSignature - ) - const entryFeeEstimate = await serviceContract.entryFeeEstimate( - callbackGas - ) - await serviceContract.methods["requestRelayEntry(address,uint256)"]( - callbackContract.address, - callbackGas, - { - value: entryFeeEstimate, - from: customer, - } - ) - - // use higher price than the gas price ceiling - const relayEntryTxGasPrice = web3.utils.toBN( - web3.utils.toWei("70", "Gwei") - ) - // higher tx.gasprice should not be used for reimbursement - maximum gas - // price is the one from the gas price ceiling - const gasPriceForReimbursement = web3.utils.toBN( - web3.utils.toWei("60", "Gwei") - ) - - const customerStartBalance = web3.utils.toBN( - await web3.eth.getBalance(customer) - ) - const beneficiaryStartBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - await operatorContract.relayEntry(blsData.groupSignature, { - from: operator, - gasPrice: relayEntryTxGasPrice, - }) - const customerEndBalance = web3.utils.toBN( - await web3.eth.getBalance(customer) - ) - const beneficiaryEndBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - - const customerSurplus = customerEndBalance.sub(customerStartBalance) - const submitterReimbursement = beneficiaryEndBalance.sub( - beneficiaryStartBalance - ) - - await assertCallbackAndDKGReimbursement( - callbackGas, - entryFeeEstimate, - submitterReimbursement, - customerSurplus, - gasPriceForReimbursement - ) - } - ) - - it("should trigger new group creation when callback failed", async () => { - await fundDkgPool() - - const callbackGas = 1 // Requestor provides wrong gas - const entryFeeEstimate = await serviceContract.entryFeeEstimate(callbackGas) - await serviceContract.methods["requestRelayEntry(address,uint256)"]( - callbackContract.address, - callbackGas, - { - value: entryFeeEstimate, - from: customer, - } - ) - - await operatorContract.relayEntry(blsData.groupSignature, { - from: operator, - }) - - assert.equal( - (await operatorContract.getPastEvents())[1].event, - "GroupSelectionStarted", - "Should start group selection" - ) - - assert.equal( - (await operatorContract.getPastEvents())[1].args["newEntry"].toString(), - blsData.groupSignatureNumber.toString(), - "Should start group selection with new entry" - ) - - assert.equal( - (await serviceContract.getPastEvents())[0].args["entry"].toString(), - blsData.groupSignatureNumber.toString(), - "Should emit event with the generated entry" - ) - }) - - it("should reimburse submitter when callback failed", async () => { - const estimate = await callbackContract.__beaconCallback.estimateGas( - blsData.groupSignature - ) - - const callbackGas = estimate - 10 // Requestor provides wrong gas - const entryFeeEstimate = await serviceContract.entryFeeEstimate(callbackGas) - await serviceContract.methods["requestRelayEntry(address,uint256)"]( - callbackContract.address, - callbackGas, - { - value: entryFeeEstimate, - from: customer, - } - ) - - // use the same gas price as the gas price ceiling - const relayEntryTxGasPrice = web3.utils.toBN(web3.utils.toWei("60", "Gwei")) - - const customerStartBalance = web3.utils.toBN( - await web3.eth.getBalance(customer) - ) - const beneficiaryStartBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - await operatorContract.relayEntry(blsData.groupSignature, { - from: operator, - gasPrice: relayEntryTxGasPrice, - }) - const customerEndBalance = web3.utils.toBN( - await web3.eth.getBalance(customer) - ) - const beneficiaryEndBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - - const customerSurplus = customerEndBalance.sub(customerStartBalance) - const submitterReimbursement = beneficiaryEndBalance.sub( - beneficiaryStartBalance - ) - - await assertCallbackReimbursement( - callbackGas, - entryFeeEstimate, - submitterReimbursement, - customerSurplus, - relayEntryTxGasPrice - ) - }) - - it("should return surplus to requestor when callback fails", async () => { - const lastEntry = await callbackContract.lastEntry() - const estimate = await callbackContract.__beaconCallback.estimateGas( - blsData.groupSignature - ) - const callbackGas = estimate - 25000 // Requestor provides wrong gas - const entryFeeEstimate = await serviceContract.entryFeeEstimate(callbackGas) - await serviceContract.methods["requestRelayEntry(address,uint256)"]( - callbackContract.address, - callbackGas, - { - value: entryFeeEstimate, - from: customer, - } - ) - - const customerStartBalance = web3.utils.toBN( - await web3.eth.getBalance(customer) - ) - const beneficiaryStartBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - await operatorContract.relayEntry(blsData.groupSignature, { - from: operator, - }) - const customerEndBalance = web3.utils.toBN( - await web3.eth.getBalance(customer) - ) - const beneficiaryEndBalance = web3.utils.toBN( - await web3.eth.getBalance(beneficiary) - ) - - const customerSurplus = customerEndBalance.sub(customerStartBalance) - const submitterReimbursement = beneficiaryEndBalance.sub( - beneficiaryStartBalance - ) - - await assertCallbackReimbursement( - callbackGas, - entryFeeEstimate, - submitterReimbursement, - customerSurplus, - web3.utils.toBN(await web3.eth.getGasPrice()) - ) - - const dkgSubmitterReimbursementFee = await operatorContract.dkgSubmitterReimbursementFee() - const operatorContractBalance = await web3.eth.getBalance( - operatorContract.address - ) - - assert.isTrue( - web3.utils - .toBN(operatorContractBalance) - .eq(dkgSubmitterReimbursementFee.add(groupProfitFee)), - "Unexpected operator contract balance" - ) - - assert.isTrue( - lastEntry.eq(await callbackContract.lastEntry()), - "Unexpected callback" - ) - }) - - // This function assets expected submitter reimbursement and customer surplus - // in a situation when callback is executed and no new group creation is - // triggered. - // - // Function performs two checks: - // - // 1. It makes sure beneficiary account balance change (submitter - // reward + callback reimbursement) and customer account balance - // change (surplus) add up to entry verification fee and callback fee as - // calculated by the service contract. In other words, beacon does not spend - // more than received and all required contributions (DKG fee + group profit - // fee) stay in the contract. - // - // 2. It calculates the expected gas cost of executing the callback and assert - // it is the same as beneficiary account balance change without - // entry verification fee. - async function assertCallbackReimbursement( - callbackGas, - entryFeeEstimate, - submitterReimbursement, - customerSurplus, - txGasPrice - ) { - assertTotalSpending( - entryFeeEstimate, - submitterReimbursement, - customerSurplus - ) - - // expected and actual gas reimbursement should be _almost_ the same; - // see the function doc for explanation about additional EVM opcodes - // around 'call' - const expectedCallbackReimbursementGas = baseCallbackGas.addn(callbackGas) - const actualCallbackReimbursementGas = submitterReimbursement - .sub(entryVerificationFee) - .div(txGasPrice) - - assert.equal( - actualCallbackReimbursementGas.toNumber(), - expectedCallbackReimbursementGas.toNumber(), - "Unexpected callback reimbursement" - ) - } - - // This function makes sure the total spending do not exceed the - // fee provided by the customer. - // It makes sure beneficiary account balance change (submitter - // reward + callback reimbursement) and customer account balance - // change (surplus) add up to entry verification fee and callback fee as - // calculated by the service contract. In other words, beacon does not spend - // more than received and all required contributions (DKG fee + group profit - // fee) stay in the contract. - async function assertTotalSpending( - entryFeeEstimate, - submitterReimbursement, - customerSurplus - ) { - const totalSpentByBeacon = submitterReimbursement.add(customerSurplus) - - // calculate part the fee used for entry verification and callback - const entryVerificationAndCallbackFee = web3.utils - .toBN(entryFeeEstimate) - .sub(dkgContributionFee) - .sub(groupProfitFee) - - // the sum of ether paid to beneficiary and customer should equal - // entry verification and callback fee passed to the beacon - assert.isTrue( - entryVerificationAndCallbackFee.eq(totalSpentByBeacon), - "Beacon spent more than allowed" - ) - } - - // This function asserts expected submitter reimbursement and customer surplus - // in a situation when callback is executed and a new group creation is - // triggered. - // - // Function performs two checks: - // - // 1. It makes sure beneficiary account balance change (submitter - // reward + callback reimbursement + start group creation reimbursement) and - // customer account balance change (surplus) add up to entry verification fee, - // start group creation fee and callback fee as calculated by the service - // contract. In other words, beacon does not spend more than received and - // all required contributions (DKG fee + group profit fee) stay in the - // contract. - // - // 2. It calculates the expected gas cost of executing the callback and assert - // it is the same as beneficiary account balance change without - // entry verification fee and without group creation cost. - async function assertCallbackAndDKGReimbursement( - callbackGas, - entryFeeEstimate, - submitterReimbursement, - customerSurplus, - txGasPrice - ) { - const totalSpentByBeacon = submitterReimbursement.add(customerSurplus) - - // calculate part the fee used for entry verification, group creation, - // and callback - const entryVerificationAndCallbackFee = web3.utils - .toBN(entryFeeEstimate) - .sub(dkgContributionFee) - .sub(groupProfitFee) - - const groupSelectionGasEstimate = web3.utils.toBN( - await operatorContract.groupSelectionGasEstimate() - ) - const gasPriceCeiling = await operatorContract.gasPriceCeiling() - const groupCreationFee = gasPriceCeiling.mul(groupSelectionGasEstimate) - - // the sum of ether paid to beneficiary and customer should equal - // entry verification, group creation, and callback fee passed to the beacon - const expectedTotalSpent = entryVerificationAndCallbackFee.add( - groupCreationFee - ) - assert.isTrue( - expectedTotalSpent.eq(totalSpentByBeacon), - "Beacon spent more than allowed" - ) - - // expected and actual gas reimbursement should be _almost_ the same; - // see the function doc for explanation about additional EVM opcodes - // around 'call' - const expectedCallbackReimbursementGas = baseCallbackGas.addn(callbackGas) - const actualCallbackReimbursementGas = submitterReimbursement - .sub(entryVerificationFee) - .sub(groupCreationFee) - .div(txGasPrice) - - assert.equal( - actualCallbackReimbursementGas.toNumber(), - expectedCallbackReimbursementGas.toNumber(), - "Unexpected callback reimbursement" - ) - } - - // Sends to DKG fee pool on the service contract enough ether to start - // a new group creation. - async function fundDkgPool() { - const groupCreationFee = await operatorContract.groupCreationFee() - await serviceContract.fundDkgFeePool({ value: groupCreationFee }) - } -}) diff --git a/solidity-v1/test/random_beacon_service/TestSelectOperator.js b/solidity-v1/test/random_beacon_service/TestSelectOperator.js deleted file mode 100644 index 6ba823b91e..0000000000 --- a/solidity-v1/test/random_beacon_service/TestSelectOperator.js +++ /dev/null @@ -1,157 +0,0 @@ -const { expectRevert } = require("@openzeppelin/test-helpers") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const { initContracts } = require("../helpers/initContracts") -const assert = require("chai").assert -const { contract, accounts } = require("@openzeppelin/test-environment") -const OperatorContract = contract.fromArtifact("KeepRandomBeaconOperatorStub") -const GasPriceOracle = contract.fromArtifact("GasPriceOracle") - -describe("TestKeepRandomBeaconService/SelectOperator", function () { - let registry - let stakingContract - let serviceContract - let operatorContract - let operatorContract2 - let operatorContract3 - - before(async () => { - const gasPriceOracle = await GasPriceOracle.new({ from: accounts[0] }) - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - OperatorContract - ) - - registry = contracts.registry - stakingContract = contracts.stakingContract - serviceContract = contracts.serviceContract - operatorContract = contracts.operatorContract - - // Create and initialize additional operator contracts - operatorContract2 = await OperatorContract.new( - serviceContract.address, - stakingContract.address, - registry.address, - gasPriceOracle.address, - { from: accounts[0] } - ) - operatorContract3 = await OperatorContract.new( - serviceContract.address, - stakingContract.address, - registry.address, - gasPriceOracle.address, - { from: accounts[0] } - ) - - await operatorContract.registerNewGroup("0x0", { from: accounts[0] }) - await operatorContract2.registerNewGroup("0x0", { from: accounts[0] }) - await operatorContract2.registerNewGroup("0x0", { from: accounts[0] }) - await operatorContract3.registerNewGroup("0x0", { from: accounts[0] }) - await operatorContract3.registerNewGroup("0x0", { from: accounts[0] }) - await operatorContract3.registerNewGroup("0x0", { from: accounts[0] }) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - it("service contract owner should be able to remove and add operator contracts.", async function () { - let result = await serviceContract.selectOperatorContract(0, { - from: accounts[0], - }) - assert.equal( - result, - operatorContract.address, - "Operator contract added during initialization should present in the service contract." - ) - - await serviceContract.removeOperatorContract(operatorContract.address, { - from: accounts[0], - }) - await expectRevert( - serviceContract.selectOperatorContract(0, { from: accounts[0] }), - "Total number of groups must be greater than zero" - ) // Should revert since no operator contract present. - - await registry.approveOperatorContract(operatorContract2.address, { - from: accounts[0], - }) - await serviceContract.addOperatorContract(operatorContract2.address, { - from: accounts[0], - }) - result = await serviceContract.selectOperatorContract(0, { - from: accounts[0], - }) - assert.equal( - result, - operatorContract2.address, - "Operator contract should be added" - ) - }) - - it("should select contract from operators list according to the amount of groups.", async function () { - await registry.approveOperatorContract(operatorContract2.address, { - from: accounts[0], - }) - await registry.approveOperatorContract(operatorContract3.address, { - from: accounts[0], - }) - serviceContract.addOperatorContract(operatorContract2.address, { - from: accounts[0], - }) - serviceContract.addOperatorContract(operatorContract3.address, { - from: accounts[0], - }) - - const selectionCounter = {} - selectionCounter[operatorContract.address] = 0 - selectionCounter[operatorContract2.address] = 0 - selectionCounter[operatorContract3.address] = 0 - - // Total max weight = 6 (Operator1 - 1 group, Operator2 - 2 groups, Operator3 - 3 groups) - for (let i = 0; i < 6; i++) { - const address = await serviceContract.selectOperatorContract(i, { - from: accounts[0], - }) - selectionCounter[address] = selectionCounter[address] + 1 - } - - assert.equal( - selectionCounter[operatorContract.address], - (await operatorContract.numberOfGroups()).toNumber(), - "Contract selection counter should be equal to the number of groups." - ) - - assert.equal( - selectionCounter[operatorContract2.address], - (await operatorContract2.numberOfGroups()).toNumber(), - "Contract selection counter should be equal to the number of groups." - ) - - assert.equal( - selectionCounter[operatorContract3.address], - (await operatorContract3.numberOfGroups()).toNumber(), - "Contract selection counter should be equal to the number of groups." - ) - - await registry.disableOperatorContract(operatorContract.address, { - from: accounts[0], - }) - await registry.disableOperatorContract(operatorContract2.address, { - from: accounts[0], - }) - await registry.disableOperatorContract(operatorContract3.address, { - from: accounts[0], - }) - - await expectRevert( - serviceContract.selectOperatorContract(0, { from: accounts[0] }), - "Total number of groups must be greater than zero." - ) - }) -}) diff --git a/solidity-v1/test/random_beacon_service/TestUpgrade.js b/solidity-v1/test/random_beacon_service/TestUpgrade.js deleted file mode 100644 index 7b11c2dd0f..0000000000 --- a/solidity-v1/test/random_beacon_service/TestUpgrade.js +++ /dev/null @@ -1,344 +0,0 @@ -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const { - BN, - constants, - expectEvent, - expectRevert, - time, -} = require("@openzeppelin/test-helpers") -const { contract, accounts } = require("@openzeppelin/test-environment") -const assert = require("chai").assert - -const ServiceContractProxy = contract.fromArtifact("KeepRandomBeaconService") -const ServiceContractImplV1 = contract.fromArtifact( - "KeepRandomBeaconServiceImplV1" -) -const ServiceContractImplV2 = contract.fromArtifact( - "KeepRandomBeaconServiceUpgradeExample" -) - -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -describe("KeepRandomBeaconService/Upgrade", function () { - let proxy - let implementationV1 - let implementationV2 - - let initializeCallData - - const admin = accounts[1] - const nonAdmin = accounts[2] - const newAdmin = accounts[3] - - before(async () => { - implementationV1 = await ServiceContractImplV1.new({ from: admin }) - implementationV2 = await ServiceContractImplV2.new({ from: admin }) - - initializeCallData = implementationV1.contract.methods - .initialize(100, "0x0000000000000000000000000000000000000001") - .encodeABI() - - proxy = await ServiceContractProxy.new( - implementationV1.address, - initializeCallData, - { from: admin } - ) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("constructor", async () => { - it("sets admin", async () => { - assert.equal(await proxy.admin(), admin, "Unexpected admin") - }) - - it("sets upgrade time delay to one day", async () => { - assert.equal( - (await proxy.upgradeTimeDelay()).toNumber(), - 86400, // 1 day - "Upgrade time delay should be one day" - ) - }) - - it("initializes implementation", async () => { - assert.isTrue( - await implementationV1.initialized(), - "Implementation contract should be initialized" - ) - }) - - it("sets implementation", async () => { - assert.equal( - await proxy.implementation(), - implementationV1.address, - "Unexpected implementation contract address" - ) - }) - }) - - describe("upgradeTo", async () => { - it("sets timestamp", async () => { - await proxy.upgradeTo(implementationV2.address, initializeCallData, { - from: admin, - }) - - const expectedTimestamp = await time.latest() - - expect(await proxy.upgradeInitiatedTimestamp()).to.eq.BN( - expectedTimestamp - ) - }) - - it("sets new implementation", async () => { - await proxy.upgradeTo(implementationV2.address, initializeCallData, { - from: admin, - }) - - assert.equal( - await proxy.newImplementation(), - implementationV2.address, - "Unexpected new implementation contract address" - ) - assert.equal( - await proxy.implementation(), - implementationV1.address, - "Unexpected implementation contract address" - ) - }) - - it("sets initialization call data", async () => { - await proxy.upgradeTo(implementationV2.address, initializeCallData, { - from: admin, - }) - - assert.equal( - await proxy.initializationData(implementationV2.address), - initializeCallData, - "Unexpected initialization call data" - ) - }) - - it("supports empty initialization call data", async () => { - await proxy.upgradeTo(implementationV2.address, [], { from: admin }) - assert.notExists( - await proxy.initializationData.call(implementationV2.address) - ) - }) - - it("emits an event", async () => { - const receipt = await proxy.upgradeTo( - implementationV2.address, - initializeCallData, - { from: admin } - ) - - const expectedTimestamp = await time.latest() - expectEvent(receipt, "UpgradeStarted", { - implementation: implementationV2.address, - timestamp: expectedTimestamp, - }) - }) - - it("allows implementation overwrite", async () => { - const address3 = "0x4566716c07617c5854fe7dA9aE5a1219B19CCd27" - await proxy.upgradeTo(implementationV2.address, initializeCallData, { - from: admin, - }) - await proxy.upgradeTo(address3, initializeCallData, { from: admin }) - - assert.equal( - await proxy.newImplementation(), - address3, - "Unexpected new implementation contract address" - ) - }) - - it("allows implementation data overwrite", async () => { - const initializeCallData2 = "0x123456" - await proxy.upgradeTo(implementationV2.address, initializeCallData, { - from: admin, - }) - await proxy.upgradeTo(implementationV2.address, initializeCallData2, { - from: admin, - }) - - assert.equal( - await proxy.initializationData.call(implementationV2.address), - initializeCallData2, - "unexpected initialization call data" - ) - }) - - it("reverts on zero address", async () => { - await expectRevert( - proxy.upgradeTo(constants.ZERO_ADDRESS, initializeCallData, { - from: admin, - }), - "Implementation address can't be zero." - ) - }) - - it("reverts on the same address", async () => { - await expectRevert( - proxy.upgradeTo(implementationV1.address, initializeCallData, { - from: admin, - }), - "Implementation address must be different from the current one." - ) - }) - - it("reverts when called by non-admin", async () => { - await expectRevert( - proxy.upgradeTo(implementationV2.address, initializeCallData, { - from: nonAdmin, - }), - "Caller is not the admin." - ) - }) - }) - - describe("completeUpgrade", async () => { - it("reverts for non-initiated upgrade", async () => { - await expectRevert( - proxy.completeUpgrade({ from: admin }), - "Upgrade not initiated" - ) - }) - - it("reverts for non-elapsed timer", async () => { - await proxy.upgradeTo(implementationV2.address, initializeCallData, { - from: admin, - }) - - await time.increase((await proxy.upgradeTimeDelay()).subn(2)) - - await expectRevert( - proxy.completeUpgrade({ from: admin }), - "Timer not elapsed" - ) - }) - - it("clears timestamp", async () => { - await proxy.upgradeTo(implementationV2.address, initializeCallData, { - from: admin, - }) - - await time.increase(await proxy.upgradeTimeDelay()) - - await proxy.completeUpgrade({ from: admin }) - - expect(await proxy.upgradeInitiatedTimestamp()).to.eq.BN(0) - }) - - it("sets implementation", async () => { - await proxy.upgradeTo(implementationV2.address, initializeCallData, { - from: admin, - }) - - await time.increase(await proxy.upgradeTimeDelay()) - - await proxy.completeUpgrade({ from: admin }) - - assert.equal( - await proxy.implementation(), - implementationV2.address, - "Unexpected new implementation address" - ) - }) - - it("emits an event", async () => { - await proxy.upgradeTo(implementationV2.address, initializeCallData, { - from: admin, - }) - - await time.increase(await proxy.upgradeTimeDelay()) - - const receipt = await proxy.completeUpgrade({ from: admin }) - - await expectEvent(receipt, "UpgradeCompleted", { - implementation: implementationV2.address, - }) - }) - - it("supports empty initialization call data", async () => { - const address3 = "0x4566716c07617c5854fe7dA9aE5a1219B19CCd27" - await proxy.upgradeTo(address3, [], { from: admin }) - await time.increase(await proxy.upgradeTimeDelay()) - - await proxy.completeUpgrade({ from: admin }) - }) - - it("reverts when called by non-admin", async () => { - await expectRevert( - proxy.completeUpgrade({ from: nonAdmin }), - "Caller is not the admin." - ) - }) - - it("reverts when initialization fails", async () => { - const failingData = implementationV1.contract.methods - .initialize(100, constants.ZERO_ADDRESS) - .encodeABI() - - await proxy.upgradeTo(implementationV2.address, failingData, { - from: admin, - }) - - await time.increase(await proxy.upgradeTimeDelay()) - - await expectRevert( - proxy.completeUpgrade({ from: admin }), - "Incorrect registry address" - ) - }) - - it("finalizes upgrade procedure", async () => { - await proxy.upgradeTo(implementationV2.address, initializeCallData, { - from: admin, - }) - - await time.increase(await proxy.upgradeTimeDelay()) - - await proxy.completeUpgrade({ from: admin }) - - const v2 = await ServiceContractImplV2.at(proxy.address) - assert.equal( - await v2.getNewVar(), - 1234, - "Should be able to get new data from upgraded contract" - ) - }) - }) - - describe("updateAdmin", async () => { - it("sets new admin when called by admin", async () => { - await proxy.updateAdmin(newAdmin, { from: admin }) - - assert.equal(await proxy.admin(), newAdmin, "Unexpected admin") - }) - - it("reverts when called by non-admin", async () => { - await expectRevert( - proxy.updateAdmin(newAdmin, { from: nonAdmin }), - "Caller is not the admin" - ) - }) - - it("reverts when called by admin after role transfer", async () => { - await proxy.updateAdmin(newAdmin, { from: admin }) - - await expectRevert( - proxy.updateAdmin(nonAdmin, { from: admin }), - "Caller is not the admin" - ) - }) - }) -}) diff --git a/solidity-v1/test/random_beacon_service/TestViaProxy.js b/solidity-v1/test/random_beacon_service/TestViaProxy.js deleted file mode 100644 index e75e110457..0000000000 --- a/solidity-v1/test/random_beacon_service/TestViaProxy.js +++ /dev/null @@ -1,235 +0,0 @@ -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const blsData = require("../helpers/data.js") -const { initContracts } = require("../helpers/initContracts") -const assert = require("chai").assert -const { contract, web3, accounts } = require("@openzeppelin/test-environment") -const { expectRevert } = require("@openzeppelin/test-helpers") - -const ServiceContractProxy = contract.fromArtifact("KeepRandomBeaconService") - -describe("TestKeepRandomBeaconService/ViaProxy", function () { - let serviceContract - let serviceContractProxy - let operatorContract - const accountOne = accounts[0] - const accountTwo = accounts[1] - let entryFeeEstimate - let entryFeeBreakdown - - before(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - ServiceContractProxy, - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact("KeepRandomBeaconOperatorStub") - ) - - operatorContract = contracts.operatorContract - serviceContract = contracts.serviceContract - serviceContractProxy = await ServiceContractProxy.at( - serviceContract.address - ) - - // Using stub method to add first group to help testing. - await operatorContract.registerNewGroup(blsData.groupPubKey) - const group = await operatorContract.getGroupPublicKey(0) - await operatorContract.setGroupMembers(group, [accounts[0]]) - - entryFeeEstimate = await serviceContract.entryFeeEstimate(0) - entryFeeBreakdown = await serviceContract.entryFeeBreakdown() - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - it("should be able to check if the service contract was initialized", async function () { - assert.isTrue( - await serviceContract.initialized(), - "Service contract should be initialized." - ) - }) - - it("should fail to request relay entry with not enough ether", async function () { - await expectRevert( - serviceContract.methods["requestRelayEntry()"]({ - from: accountTwo, - value: 0, - }), - "Payment is less than required minimum." - ) - }) - - it("should be able to request relay with enough ether", async function () { - const initialRequesterBalance = await web3.eth.getBalance(accountTwo) - await serviceContract.fundRequestSubsidyFeePool({ - from: accountOne, - value: 100, - }) - const requestorSubsidy = web3.utils.toBN(1) // 1% is returned to the requestor. - - const initialServiceContractBalance = web3.utils.toBN( - await web3.eth.getBalance(serviceContract.address) - ) - const dkgSubmitterReimbursementFee = await operatorContract.dkgSubmitterReimbursementFee() - - const tx = await serviceContract.methods["requestRelayEntry()"]({ - from: accountTwo, - value: entryFeeEstimate, - }) - const transactionCost = web3.utils - .toBN(tx.receipt.gasUsed) - .mul(web3.utils.toWei(web3.utils.toBN(20), "gwei")) // 20 default gasPrice - - assert.equal( - (await operatorContract.getPastEvents())[0].event, - "RelayEntryRequested", - "RelayEntryRequested event should occur on operator contract." - ) - - assert.isTrue( - web3.utils - .toBN(initialRequesterBalance) - .sub(entryFeeEstimate) - .sub(transactionCost) - .add(requestorSubsidy) - .eq(web3.utils.toBN(await web3.eth.getBalance(accountTwo))), - "Requestor should receive 1% subsidy." - ) - - const serviceContractBalance = await web3.eth.getBalance( - serviceContract.address - ) - assert.isTrue( - web3.utils - .toBN(serviceContractBalance) - .eq( - initialServiceContractBalance - .add(entryFeeBreakdown.dkgContributionFee) - .sub(requestorSubsidy) - ), - "Keep Random Beacon service contract should receive DKG fee fraction." - ) - - const serviceContractBalanceViaProxy = await web3.eth.getBalance( - serviceContractProxy.address - ) - assert.isTrue( - web3.utils - .toBN(serviceContractBalanceViaProxy) - .eq( - initialServiceContractBalance - .add(entryFeeBreakdown.dkgContributionFee) - .sub(requestorSubsidy) - ), - "Keep Random Beacon service contract new balance should be visible via serviceContractProxy." - ) - - const operatorContractBalance = await web3.eth.getBalance( - operatorContract.address - ) - assert.isTrue( - web3.utils - .toBN(operatorContractBalance) - .eq( - entryFeeBreakdown.entryVerificationFee - .add(entryFeeBreakdown.groupProfitFee) - .add(dkgSubmitterReimbursementFee) - ), - "Keep Random Beacon operator contract should receive entry fee, " + - "group profit fee and dkg submitter reimbursement." - ) - }) - - it("should be able to request relay entry via serviceContractProxy contract with enough ether", async function () { - const initialRequesterBalance = await web3.eth.getBalance(accountTwo) - await serviceContract.fundRequestSubsidyFeePool({ - from: accountOne, - value: 100, - }) - const requestorSubsidy = web3.utils.toBN(1) // 1% is returned to the requestor. - - const initialServiceContractBalance = web3.utils.toBN( - await web3.eth.getBalance(serviceContract.address) - ) - const dkgSubmitterReimbursementFee = await operatorContract.dkgSubmitterReimbursementFee() - - const gasPrice = web3.utils.toWei(web3.utils.toBN(20), "gwei") - let transactionCost - - await web3.eth - .sendTransaction({ - // if you see a plain 'revert' error, it's probably because of not enough gas - from: accountTwo, - value: entryFeeEstimate, - gas: 500000, - gasPrice: gasPrice, - to: serviceContractProxy.address, - data: web3.eth.abi.encodeFunctionSignature("requestRelayEntry()"), - }) - .then(function (receipt) { - transactionCost = web3.utils.toBN(receipt.gasUsed).mul(gasPrice) - }) - - assert.equal( - (await operatorContract.getPastEvents())[0].event, - "RelayEntryRequested", - "RelayEntryRequested event should occur on the operator contract." - ) - - assert.isTrue( - web3.utils - .toBN(initialRequesterBalance) - .sub(entryFeeEstimate) - .sub(transactionCost) - .add(requestorSubsidy) - .eq(web3.utils.toBN(await web3.eth.getBalance(accountTwo))), - "Requestor should receive 1% subsidy." - ) - - const contractBalance = await web3.eth.getBalance(serviceContract.address) - assert.isTrue( - web3.utils - .toBN(contractBalance) - .eq( - initialServiceContractBalance - .add(entryFeeBreakdown.dkgContributionFee) - .sub(requestorSubsidy) - ), - "Keep Random Beacon service contract should receive DKG fee fraction." - ) - - const contractBalanceServiceContract = await web3.eth.getBalance( - serviceContractProxy.address - ) - assert.isTrue( - web3.utils - .toBN(contractBalanceServiceContract) - .eq( - initialServiceContractBalance - .add(entryFeeBreakdown.dkgContributionFee) - .sub(requestorSubsidy) - ), - "Keep Random Beacon service contract new balance should be visible via serviceContractProxy." - ) - - const operatorContractBalance = await web3.eth.getBalance( - operatorContract.address - ) - assert.isTrue( - web3.utils - .toBN(operatorContractBalance) - .eq( - entryFeeBreakdown.entryVerificationFee - .add(entryFeeBreakdown.groupProfitFee) - .add(dkgSubmitterReimbursementFee) - ), - "Keep Random Beacon operator contract should receive entry fee, " + - "group profit fee and dkg submitter reimbursement." - ) - }) -}) diff --git a/solidity-v1/test/rewards/TestBeaconBackportRewards.js b/solidity-v1/test/rewards/TestBeaconBackportRewards.js deleted file mode 100644 index 890b020cda..0000000000 --- a/solidity-v1/test/rewards/TestBeaconBackportRewards.js +++ /dev/null @@ -1,169 +0,0 @@ -const { initContracts } = require("../helpers/initContracts") -const { accounts, contract, web3 } = require("@openzeppelin/test-environment") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const { expectRevert, time } = require("@openzeppelin/test-helpers") -const crypto = require("crypto") -const stakeDelegate = require("../helpers/stakeDelegate") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -describe("BeaconBackportRewards", () => { - // accounts - const owner = accounts[0] - let operators - let beneficiaries - - // contracts - let rewardsContract - let token - let stakingContract - let operatorContract - - // system parameters - const tokenDecimalMultiplier = web3.utils.toBN(10).pow(web3.utils.toBN(18)) - // 1,000,000,000 - total KEEP supply - // 200,000,000 - 20% of the total supply goes to staker rewards - // 20,000,000 - 10% of staker rewards goes to the random beacon stakers - // 200,000 - 1% of staker rewards for the beacon goes to May genesis groups - const totalBeaconRewards = web3.utils.toBN(200000).mul(tokenDecimalMultiplier) - - before(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact("KeepRandomBeaconOperatorBeaconRewardsStub") - ) - - token = contracts.token - stakingContract = contracts.stakingContract - operatorContract = contracts.operatorContract - - rewardsContract = await contract - .fromArtifact("BeaconBackportRewards") - .new(token.address, operatorContract.address, stakingContract.address, { - from: owner, - }) - - await token.approveAndCall( - rewardsContract.address, - totalBeaconRewards, - "0x0", - { from: owner } - ) - await rewardsContract.markAsFunded({ from: owner }) - - // create 64 operators and beneficiaries, delegate stake for them - const minimumStake = await stakingContract.minimumStake() - operators = [] - beneficiaries = [] - for (i = 0; i < 64; i++) { - const operator = accounts[i] - const beneficiary = accounts[64 + i] - const authorizer = operator - - operators.push(operator) - beneficiaries.push(beneficiary) - await stakeDelegate( - stakingContract, - token, - owner, - operator, - beneficiary, - authorizer, - minimumStake - ) - } - - // 3 groups created in an interval - const startOf = await rewardsContract.startOf(0) - await registerNewGroup(startOf.addn(1)) - await registerNewGroup(startOf.addn(2)) - await registerNewGroup(startOf.addn(3)) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("interval allocation", async () => { - it("should equal the full allocation", async () => { - const expectedAllocation = 200000 - - await timeJumpToEndOfInterval(0) - await rewardsContract.allocateRewards(0) - - const allocated = await rewardsContract.getAllocatedRewards(0) - const allocatedKeep = allocated.div(tokenDecimalMultiplier) - - expect(allocatedKeep).to.eq.BN(expectedAllocation) - }) - }) - - describe("rewards withdrawal", async () => { - it("should correctly distribute rewards to beneficiaries", async () => { - await timeJumpToEndOfInterval(0) - - await rewardsContract.receiveReward(0) - // each beneficiary receives 200000 / 3 / 64 = 1041 KEEP - await assertKeepBalanceOfBeneficiaries(web3.utils.toBN(1041)) - - await rewardsContract.receiveReward(1) - // each beneficiary receives 200000 / 3 / 64 = 1041 KEEP - // they should have 1041 + 1041 = 2082 KEEP now - await assertKeepBalanceOfBeneficiaries(web3.utils.toBN(2082)) - - await rewardsContract.receiveReward(2) - // each beneficiary receives 200000 / 3 / 64 = 1041 KEEP - // they should have 1041 + 1041 + 1041 = 3123 KEEP now - await assertKeepBalanceOfBeneficiaries(web3.utils.toBN(3123)) - }) - - it("should fail for non-existing group", async () => { - await expectRevert( - rewardsContract.receiveReward(3), - "Keep not recognized by factory" - ) - }) - }) - - async function timeJumpToEndOfInterval(intervalNumber) { - const endOf = await rewardsContract.endOf(intervalNumber) - const now = await time.latest() - - if (now.lt(endOf)) { - await time.increaseTo(endOf.addn(1)) - } - } - - async function registerNewGroup(creationTimestamp) { - const groupPublicKey = crypto.randomBytes(128) - await operatorContract.registerNewGroup( - groupPublicKey, - operators, - creationTimestamp - ) - } - - async function assertKeepBalanceOfBeneficiaries(expectedBalance) { - // solidity is not very good when it comes to floating point precision, - // we are allowing for ~2 KEEP difference margin between expected and - // actual value - const precision = 2 - - for (let i = 0; i < beneficiaries.length; i++) { - const balance = await token.balanceOf(beneficiaries[i]) - const balanceInKeep = balance.div(tokenDecimalMultiplier) - - expect(balanceInKeep).to.gte.BN(expectedBalance.subn(precision)) - expect(balanceInKeep).to.lte.BN(expectedBalance.addn(precision)) - } - } -}) diff --git a/solidity-v1/test/rewards/TestBeaconRewards.js b/solidity-v1/test/rewards/TestBeaconRewards.js deleted file mode 100644 index 9d9c25b74c..0000000000 --- a/solidity-v1/test/rewards/TestBeaconRewards.js +++ /dev/null @@ -1,408 +0,0 @@ -const { initContracts } = require("../helpers/initContracts") -const { accounts, contract, web3 } = require("@openzeppelin/test-environment") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const { expectRevert, time } = require("@openzeppelin/test-helpers") -const crypto = require("crypto") -const stakeDelegate = require("../helpers/stakeDelegate") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -describe("BeaconRewards", () => { - // accounts - const owner = accounts[0] - let operators - let beneficiaries - - // contracts - let rewardsContract - let token - let stakingContract - let operatorContract - const groupActiveTime = 5 // from KeepRandomBeaconOperatorBeaconRewardsStub - const relayEntryTimeout = 10 // from KeepRandomBeaconOperatorBeaconRewardsStub - - // system parameters - const tokenDecimalMultiplier = web3.utils.toBN(10).pow(web3.utils.toBN(18)) - // 1,000,000,000 - total KEEP supply - // 200,000,000 - 20% of the total supply goes to staker rewards - // 20,000,000 - 10% of staker rewards goes to the random beacon stakers - // 19,800,000 - 99% of staker rewards goes to the random beacon stakers - // operating after 2020-09-24 - const totalBeaconRewards = web3.utils - .toBN(19800000) - .mul(tokenDecimalMultiplier) - - const groupSize = 64 - - const expectedKeepAllocations = [ - 792000, - 1520640, - 1748736, - 1888635, - 2077498, - 1765874, - 1500993, - 1275844, - 1084467, - 921797, - 783528, - 665998, - 566099, - 481184, - 409006, - 347655, - 295507, - 251181, - 213504, - 181478, - 154257, - 131118, - 111450, - 94733, - ] - - before(async () => { - const contracts = await initContracts( - contract.fromArtifact("TokenStaking"), - contract.fromArtifact("KeepRandomBeaconService"), - contract.fromArtifact("KeepRandomBeaconServiceImplV1"), - contract.fromArtifact("KeepRandomBeaconOperatorBeaconRewardsStub") - ) - - token = contracts.token - stakingContract = contracts.stakingContract - operatorContract = contracts.operatorContract - - rewardsContract = await contract - .fromArtifact("BeaconRewards") - .new(token.address, operatorContract.address, stakingContract.address, { - from: owner, - }) - - await token.approveAndCall( - rewardsContract.address, - totalBeaconRewards, - "0x0", - { from: owner } - ) - await rewardsContract.markAsFunded({ from: owner }) - - // create 64 operators and beneficiaries, delegate stake for them - const minimumStake = await stakingContract.minimumStake() - operators = [] - beneficiaries = [] - for (i = 0; i < groupSize; i++) { - const operator = accounts[i] - const beneficiary = accounts[groupSize + i] - const authorizer = operator - - operators.push(operator) - beneficiaries.push(beneficiary) - await stakeDelegate( - stakingContract, - token, - owner, - operator, - beneficiary, - authorizer, - minimumStake - ) - } - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("interval allocations", async () => { - it("should equal expected ones having two groups created per interval", async () => { - for (let i = 0; i < 24; i++) { - const startOf = await rewardsContract.startOf(i) - - // 2 groups created in an interval - await registerNewGroup(startOf.addn(1)) - await registerNewGroup(startOf.addn(2)) - - await timeJumpToEndOfInterval(i) - await rewardsContract.allocateRewards(i) - - const allocated = await rewardsContract.getAllocatedRewards(i) - const allocatedKeep = allocated.div(tokenDecimalMultiplier) - - assertKeepIntervalAllocations(allocatedKeep, expectedKeepAllocations[i]) - } - }) - - it("should equal expected ones having more than two groups created per interval", async () => { - for (let i = 0; i < 24; i++) { - const startOf = await rewardsContract.startOf(i) - - // 5 groups created in an interval - for (let j = 0; j < 5; j++) { - await registerNewGroup(startOf.addn(j + 1)) - } - - await timeJumpToEndOfInterval(i) - await rewardsContract.allocateRewards(i) - - const allocated = await rewardsContract.getAllocatedRewards(i) - const allocatedKeep = allocated.div(tokenDecimalMultiplier) - - assertKeepIntervalAllocations(allocatedKeep, expectedKeepAllocations[i]) - } - }) - - it("should equal expected ones having just one group created per interval", async () => { - // 1st interval expected allocation: 19,800,000 * 4% = 792,000 - // 1st interval adjusted: 792,000 / 2 = 396,000 - // Remaining pool: 19,800,000 - 396,000 = 19,404,000 - // 2nd interval expected allocation: 19,404,000 * 8% = 1,552,320 - // 2nd interval adjusted: 776160 - // etc. - const adjustedKeepAllocations = [ - 396000, - 776160, - 931392, - 1061787, - 1247600, - 1154030, - 1067477, - 987417, - 913360, - 844858, - 781494, - 722882, - 668666, - 618516, - 572127, - 529218, - 489526, - 452812, - 418851, - 387437, - 358379, - 331501, - 306638, - 283640, - ] - - for (let i = 0; i < 24; i++) { - const startOf = await rewardsContract.startOf(i) - // one group created in an interval - await registerNewGroup(startOf.addn(1)) - - await timeJumpToEndOfInterval(i) - await rewardsContract.allocateRewards(i) - - const allocated = await rewardsContract.getAllocatedRewards(i) - const allocatedKeep = allocated.div(tokenDecimalMultiplier) - - assertKeepIntervalAllocations(allocatedKeep, adjustedKeepAllocations[i]) - } - }) - }) - - describe("rewards withdrawal", async () => { - it("should be possible for stale groups", async () => { - const startOf = await rewardsContract.startOf(0) - await registerNewGroup(startOf.addn(1)) - await expireAllGroups() - - const isEligible = await rewardsContract.eligibleForReward(0) - expect(isEligible).to.be.true - - await timeJumpToEndOfInterval(0) - await rewardsContract.receiveReward(0) - // ok, no revert - }) - - it("should not be possible for non-stale groups", async () => { - const startOf = await rewardsContract.startOf(0) - await registerNewGroup(startOf.addn(1)) - - const isEligible = await rewardsContract.eligibleForReward(0) - expect(isEligible).to.be.false - - await timeJumpToEndOfInterval(0) - await expectRevert(rewardsContract.receiveReward(0), "Keep is not closed") - }) - - it("should not be possible for terminated groups", async () => { - const startOf = await rewardsContract.startOf(0) - await registerNewGroup(startOf.addn(1)) - await operatorContract.terminateGroup(0) - - const isEligible = await rewardsContract.eligibleForReward(0) - expect(isEligible).to.be.false - - await timeJumpToEndOfInterval(0) - await expectRevert(rewardsContract.receiveReward(0), "Keep is not closed") - }) - - it("should not count terminated groups when distributing rewards", async () => { - const startOf = await rewardsContract.startOf(0) - await registerNewGroup(startOf.addn(1)) - await registerNewGroup(startOf.addn(2)) - await operatorContract.terminateGroup(1) - - await timeJumpToEndOfInterval(0) - await rewardsContract.allocateRewards(0) - - await expireAllGroups() - await rewardsContract.receiveReward(0) - // two groups but one of them is terminated and does not count here - // each beneficiary receives 792,000 / 2 / 64 = 6,187.5 KEEP => ~6,188 - await assertKeepBalanceOfBeneficiaries(web3.utils.toBN(6188)) - - // the remaining 396,000 stays in unallocated rewards but the fact - // it terminated needs to be reported to recalculate the unallocated - // amount - let unallocated = await rewardsContract.unallocatedRewards() - let unallocatedInKeep = unallocated.div(tokenDecimalMultiplier) - expect(unallocatedInKeep).to.eq.BN(19008000) - - await rewardsContract.reportTermination(1) - unallocated = await rewardsContract.unallocatedRewards() - unallocatedInKeep = unallocated.div(tokenDecimalMultiplier) - expect(unallocatedInKeep).to.eq.BN(19404000) - }) - - it("should not count a batch of terminated groups when distributing rewards", async () => { - const startOf = await rewardsContract.startOf(0) - await registerNewGroup(startOf.addn(1)) - await registerNewGroup(startOf.addn(2)) - await registerNewGroup(startOf.addn(3)) - - const terminatedGroups = [1, 2] - await operatorContract.terminateGroup(terminatedGroups[0]) - await operatorContract.terminateGroup(terminatedGroups[1]) - - await timeJumpToEndOfInterval(0) - await rewardsContract.allocateRewards(0) - - await expireAllGroups() - await rewardsContract.receiveReward(0) - // three groups but two of them were terminated and do not count here - // each beneficiary receives 792,000 / 3 / 64 = 4,125 KEEP - await assertKeepBalanceOfBeneficiaries(web3.utils.toBN(4125)) - - // the remaining unallocated rewards pool has 19,008,000 KEEP - // the remaining 528,000 stays in unallocated rewards but the fact - // two keeps were terminated needs to be reported to recalculate the - // unallocated amount - // unallocated amount: 19,008,000 + 528,000 = 19,536,000 - await rewardsContract.methods["reportTerminations(uint256[])"]( - terminatedGroups - ) - unallocated = await rewardsContract.unallocatedRewards() - unallocatedInKeep = unallocated.div(tokenDecimalMultiplier) - expect(unallocatedInKeep).to.eq.BN(19536000) - }) - - it("should correctly distribute rewards to beneficiaries", async () => { - let startOf = await rewardsContract.startOf(0) - // 2 groups in the first interval, 792,000 KEEP to distribute - // between 64 beneficiaries. - await registerNewGroup(startOf.addn(1)) - await registerNewGroup(startOf.addn(2)) - await timeJumpToEndOfInterval(0) - await rewardsContract.allocateRewards(0) - - await expireAllGroups() - await rewardsContract.receiveReward(0) - // each beneficiary receives 792,000 / 2 / 64 = 6,187.5 KEEP => ~6,188 - await assertKeepBalanceOfBeneficiaries(web3.utils.toBN(6188)) - await rewardsContract.receiveReward(1) - // each beneficiary receives 792,000 / 2 / 64 = 6187.5 KEEP - // they should have 6,187.5 + 6,187.5 = 12,375 KEEP now - await assertKeepBalanceOfBeneficiaries(web3.utils.toBN(12375)) - - // 1 group in the second interval, 760,320 KEEP to distribute - // between 64 beneficiaries - startOf = await rewardsContract.startOf(1) - await registerNewGroup(startOf.addn(1)) - await timeJumpToEndOfInterval(1) - await rewardsContract.allocateRewards(1) - - await expireAllGroups() - await rewardsContract.receiveReward(2) - // each beneficiary receives 760,320 / 64 = 11,880 KEEP - // they should have 12,375 + 11,880 = 23,760 KEEP now - await assertKeepBalanceOfBeneficiaries(web3.utils.toBN(24255)) - }) - - it("should correctly distribute rewards in batch", async () => { - const startOf = await rewardsContract.startOf(0) - // 2 groups in the first interval, 792,000 KEEP to distribute - // between 64 beneficiaries. - await registerNewGroup(startOf.addn(1)) - await registerNewGroup(startOf.addn(2)) - - await timeJumpToEndOfInterval(0) - await rewardsContract.allocateRewards(0) - - await expireAllGroups() - const groupsReceivingRewards = [0, 1] - await rewardsContract.receiveRewards(groupsReceivingRewards) - // each beneficiary receives 792,000 / 2 / 64 = 6187.5 KEEP - // each beneficiary was in 2 groups - // each should receive 6,187.5 * 2 = 12,375 KEEP - await assertKeepBalanceOfBeneficiaries(web3.utils.toBN(12375)) - }) - }) - - async function timeJumpToEndOfInterval(intervalNumber) { - const endOf = await rewardsContract.endOf(intervalNumber) - const now = await time.latest() - - if (now.lt(endOf)) { - await time.increaseTo(endOf.addn(1)) - } - } - - async function registerNewGroup(creationTimestamp) { - const groupPublicKey = crypto.randomBytes(128) - await operatorContract.registerNewGroup( - groupPublicKey, - operators, - creationTimestamp - ) - } - - async function expireAllGroups() { - const currentBlock = await time.latestBlock() - - const groupStalingTime = groupActiveTime + relayEntryTimeout + 1 - await time.advanceBlockTo(currentBlock.addn(groupStalingTime)) - await operatorContract.expireOldGroups() - } - - async function assertKeepBalanceOfBeneficiaries(expectedBalance) { - // Solidity is not very good when it comes to floating point precision, - // we are allowing for ~1 KEEP difference margin between expected and - // actual value. - const precision = 1 - - for (let i = 0; i < beneficiaries.length; i++) { - const balance = await token.balanceOf(beneficiaries[i]) - const balanceInKeep = balance.div(tokenDecimalMultiplier) - - expect(balanceInKeep).to.gte.BN(expectedBalance.subn(precision)) - expect(balanceInKeep).to.lte.BN(expectedBalance.addn(precision)) - } - } - - async function assertKeepIntervalAllocations(actual, expected) { - const precision = 1 - - expect(actual).to.gte.BN(expected - precision) - expect(actual).to.lte.BN(expected + precision) - } -}) diff --git a/solidity-v1/test/rewards/TestRewardUpgrades.js b/solidity-v1/test/rewards/TestRewardUpgrades.js deleted file mode 100644 index 23e7777145..0000000000 --- a/solidity-v1/test/rewards/TestRewardUpgrades.js +++ /dev/null @@ -1,294 +0,0 @@ -const { accounts, contract, web3 } = require("@openzeppelin/test-environment") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const { expectRevert, time } = require("@openzeppelin/test-helpers") - -const KeepToken = contract.fromArtifact("KeepToken") -const RewardsStub = contract.fromArtifact("RewardsStub") -const NewRewardsStub = contract.fromArtifact("NewRewardsStub") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -describe("Rewards/Upgrades", () => { - const owner = accounts[0] - const thirdParty = accounts[1] - const beneficiary = accounts[3] - - const intervalWeights = [5, 10, 15, 20] - const totalRewards = 1000000 - const minimumKeepsPerInterval = 1 - const termLength = 1000 - let timestamps - let firstIntervalStart - - let token - let rewards - let newRewards - - before(async () => { - token = await KeepToken.new({ from: owner }) - newRewards = await NewRewardsStub.new() - - firstIntervalStart = await time.latest() - timestamps = [ - 101, - 150, // 2 keep in interval 0 - 1100, // 1 keep in interval 1 - 2200, - 2201, // 2 keeps in interval 2 - ].map((t) => firstIntervalStart.addn(t).toNumber()) - - rewards = await RewardsStub.new( - token.address, - minimumKeepsPerInterval, - firstIntervalStart, - intervalWeights, - timestamps, - termLength, - { from: owner } - ) - await token.approveAndCall(rewards.address, totalRewards, "0x0", { - from: owner, - }) - await rewards.markAsFunded({ from: owner }) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("upgrades", async () => { - it("can be initiated only by contract owner", async () => { - await expectRevert( - rewards.initiateRewardsUpgrade(newRewards.address, { - from: thirdParty, - }), - "Ownable: caller is not the owner" - ) - }) - - it("can be finalized only by contract owner", async () => { - await rewards.initiateRewardsUpgrade(newRewards.address, { from: owner }) - await expectRevert( - rewards.finalizeRewardsUpgrade({ from: thirdParty }), - "Ownable: caller is not the owner." - ) - }) - - it("cannot be finalized without initiating first", async () => { - await expectRevert( - rewards.finalizeRewardsUpgrade({ from: owner }), - "Upgrade not initiated" - ) - }) - - it("cannot be finalized before the initiation, zero interval ends", async () => { - await rewards.initiateRewardsUpgrade(newRewards.address, { from: owner }) - await expectRevert( - rewards.finalizeRewardsUpgrade({ from: owner }), - "Interval at which the upgrade was initiated hasn't ended yet" - ) - }) - - it("cannot be finalized before the initiation, non-zero interval ends", async () => { - await time.increase(termLength + 1) // interval 0 ends - - await rewards.initiateRewardsUpgrade(newRewards.address, { from: owner }) - await expectRevert( - rewards.finalizeRewardsUpgrade({ from: owner }), - "Interval at which the upgrade was initiated hasn't ended yet" - ) - }) - - it("cannot be finalized another time without initiating again", async () => { - await rewards.initiateRewardsUpgrade(newRewards.address, { from: owner }) - - await time.increase(termLength + 1) // interval 0 ends - await rewards.finalizeRewardsUpgrade({ from: owner }) - await expectRevert( - rewards.finalizeRewardsUpgrade({ from: owner }), - "Upgrade not initiated" - ) - }) - - it("should not change the current interval allocation", async () => { - await rewards.initiateRewardsUpgrade(newRewards.address, { from: owner }) - - await time.increase(termLength + 1) // interval 0 ends - await rewards.setCloseTime(timestamps[1]) - - await rewards.finalizeRewardsUpgrade({ from: owner }) - - const allocation = await rewards.getAllocatedRewards(0) - expect(allocation).to.eq.BN(50000) // 5% of 1 000 000 - }) - - it("allocates all possible intervals", async () => { - await time.increase(termLength + 1) // interval 0 ends - - await rewards.initiateRewardsUpgrade(newRewards.address, { from: owner }) - - await time.increase(termLength + 1) // interval 1 ends - await rewards.setCloseTime(timestamps[2]) - - await rewards.finalizeRewardsUpgrade({ from: owner }) - - const allocation0 = await rewards.getAllocatedRewards(0) - const allocation1 = await rewards.getAllocatedRewards(1) - - expect(allocation0).to.eq.BN(50000) // 5% of 1000000 - expect(allocation1).to.eq.BN(95000) // 10% of (1000000 - 50000) - await expectRevert( - rewards.getAllocatedRewards(2), - "Interval not allocated yet" - ) - }) - - it("can be finalized with all previous intervals already allocated", async () => { - await time.increase(termLength + 1) // interval 0 ends - - await rewards.initiateRewardsUpgrade(newRewards.address, { from: owner }) - - await time.increase(termLength + 1) // interval 1 ends - await rewards.setCloseTime(timestamps[2]) - - await rewards.allocateRewards(1) - await rewards.finalizeRewardsUpgrade({ from: owner }) - - const allocation0 = await rewards.getAllocatedRewards(0) - const allocation1 = await rewards.getAllocatedRewards(1) - - expect(allocation0).to.eq.BN(50000) // 5% of 1000000 - expect(allocation1).to.eq.BN(95000) // 10% of (1000000 - 50000) - }) - - it("should correctly update timestamps", async () => { - await time.increase(termLength + 1) // interval 0 ends - - await rewards.initiateRewardsUpgrade(newRewards.address, { from: owner }) - - await time.increase(termLength + 1) // interval 1 ends - await rewards.setCloseTime(timestamps[2]) - - await rewards.allocateRewards(1) - await rewards.finalizeRewardsUpgrade({ from: owner }) - - const upgradeInitiatedTimestamp = await rewards.upgradeInitiatedTimestamp() - const upgradeFinalizedTimestamp = await rewards.upgradeFinalizedTimestamp() - - expect(upgradeInitiatedTimestamp).to.eq.BN(0) - expect(upgradeFinalizedTimestamp).not.to.eq.BN(0) - }) - - it("transfers any topped-up amount to a new contract after finalizing the upgrade", async () => { - await time.increase(termLength + 1) // interval 0 ends - - await rewards.initiateRewardsUpgrade(newRewards.address, { from: owner }) - - await time.increase(termLength + 1) // interval 1 ends - await rewards.setCloseTime(timestamps[2]) - - await rewards.finalizeRewardsUpgrade({ from: owner }) - - const rewardsTopUp = 420000 - await token.approveAndCall(rewards.address, rewardsTopUp, "0x0", { - from: owner, - }) - - // interval 0 allocates 50,000 - // interval 1 allocates 95,000 - // old contract receives 420,000 - // 1,000,000 - (50,000 + 95,000) + 420,000 = 1,275,000 should be - // transferred to the new contract - const newContractBalance = await token.balanceOf(newRewards.address) - expect(newContractBalance).to.eq.BN(1275000) - - const oldContractBalance = await token.balanceOf(rewards.address) - expect(oldContractBalance).to.eq.BN(145000) - }) - - it("moves all unallocated rewards to new contract", async () => { - await rewards.initiateRewardsUpgrade(newRewards.address, { from: owner }) - - await time.increase(2 * termLength + 1) - - await rewards.setCloseTime(timestamps[2]) - await rewards.finalizeRewardsUpgrade({ from: owner }) - - const newContractBalance = await token.balanceOf(newRewards.address) - // interval 0 allocates 50000 - // interval 1 allocates 95000 - // 1000000 - 50000 - 95000 = 855000 should be transferred to the - // new contract - expect(newContractBalance).to.eq.BN(855000) - }) - - it("correctly updates reward balances", async () => { - await rewards.initiateRewardsUpgrade(newRewards.address, { from: owner }) - - await time.increase(2 * termLength + 1) - - await rewards.setCloseTime(timestamps[2]) - await rewards.finalizeRewardsUpgrade({ from: owner }) - - const totalRewards = await rewards.totalRewards() - const unallocatedRewards = await rewards.unallocatedRewards() - const dispensedRewards = await rewards.dispensedRewards() - - // interval 0 allocates 50000 - // interval 1 allocates 95000 - // 50000 + 95000 = 145000 - expect(totalRewards).to.eq.BN(145000) - expect(unallocatedRewards).to.eq.BN(0) - expect(dispensedRewards).to.eq.BN(0) // nothing yet withdrawn - }) - - it("lets to withdraw outstanding rewards after finalizing upgrade", async () => { - await rewards.initiateRewardsUpgrade(newRewards.address, { from: owner }) - - await time.increase(2 * termLength + 1) - - await rewards.setCloseTime(timestamps[2]) - await rewards.finalizeRewardsUpgrade({ from: owner }) - - await rewards.receiveReward(0, { from: beneficiary }) - await rewards.receiveReward(1, { from: beneficiary }) - await rewards.receiveReward(2, { from: beneficiary }) - const beneficiaryBalance = await token.balanceOf(beneficiary) - // interval 0 allocates 50000 - // interval 1 allocates 95000 - // 50000 + 95000 = 145000 - expect(beneficiaryBalance).to.eq.BN(145000) - }) - - it("correctly updates reward balances when withdrawing after finalizing upgrade", async () => { - await rewards.initiateRewardsUpgrade(newRewards.address, { from: owner }) - - await time.increase(2 * termLength + 1) - - await rewards.setCloseTime(timestamps[2]) - await rewards.finalizeRewardsUpgrade({ from: owner }) - - await rewards.receiveReward(0, { from: beneficiary }) - await rewards.receiveReward(1, { from: beneficiary }) - await rewards.receiveReward(2, { from: beneficiary }) - - const totalRewards = await rewards.totalRewards() - const dispensedRewards = await rewards.dispensedRewards() - const unallocatedRewards = await rewards.unallocatedRewards() - - // interval 0 allocates 50000 - // interval 1 allocates 95000 - // 50000 + 95000 = 145000 - expect(totalRewards).to.eq.BN(145000) - expect(dispensedRewards).to.eq.BN(145000) - expect(unallocatedRewards).to.eq.BN(0) - }) - }) -}) diff --git a/solidity-v1/test/rewards/TestRewards.js b/solidity-v1/test/rewards/TestRewards.js deleted file mode 100644 index ae6b7a4915..0000000000 --- a/solidity-v1/test/rewards/TestRewards.js +++ /dev/null @@ -1,586 +0,0 @@ -const { accounts, contract, web3 } = require("@openzeppelin/test-environment") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const { expectRevert, time } = require("@openzeppelin/test-helpers") -const { testValues } = require("./rewardsData.js") - -const KeepToken = contract.fromArtifact("KeepToken") - -const RewardsStub = contract.fromArtifact("RewardsStub") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect -const assert = chai.assert - -describe("Rewards", () => { - const owner = accounts[0] - const aliceBeneficiary = accounts[1] - const funder = accounts[9] - - const termLength = 100 - - let rewards - let token - - async function createKeeps(timestamps) { - rewards = await RewardsStub.new( - token.address, - testValues.minimumIntervalKeeps, - testValues.initiationTime, - testValues.intervalWeights, - timestamps, - termLength, - { from: owner } - ) - await fund(testValues.totalRewards) - await rewards.markAsFunded({ from: owner }) - } - - async function fund(amount) { - await token.approveAndCall(rewards.address, amount, "0x0", { from: funder }) - } - - before(async () => { - token = await KeepToken.new({ from: funder }) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("receiveApproval", async () => { - it("funds the rewards correctly", async () => { - await createKeeps([]) - const preRewards = await rewards.totalRewards() - expect(preRewards.toNumber()).to.equal(testValues.totalRewards) - - await fund(testValues.totalRewards) - const postRewards = await rewards.totalRewards() - expect(postRewards.toNumber()).to.equal(testValues.totalRewards * 2) - }) - - it("collects tokens sent outside `approveAndCall`", async () => { - await createKeeps([]) - await token.transfer(rewards.address, testValues.totalRewards, { - from: funder, - }) - - const preRewards = await rewards.totalRewards() - expect(preRewards.toNumber()).to.equal(testValues.totalRewards) - - await fund(0) - const postRewards = await rewards.totalRewards() - expect(postRewards.toNumber()).to.equal(testValues.totalRewards * 2) - }) - }) - - describe("markAsFunded", async () => { - let newRewards - - beforeEach(async () => { - newRewards = await RewardsStub.new( - token.address, - testValues.minimumIntervalKeeps, - testValues.initiationTime, - testValues.intervalWeights, - [], - termLength, - { from: owner } - ) - }) - - it("can not be called by non-owner", async () => { - await expectRevert( - newRewards.markAsFunded({ from: funder }), - "Ownable: caller is not the owner" - ) - }) - - it("prevents from allocating rewards if not previously called", async () => { - await expectRevert( - newRewards.allocateRewards(0), - "Contract has not been funded yet" - ) - }) - }) - - describe("eligibleForReward", async () => { - it("returns true for happily closed keeps", async () => { - await createKeeps([1000]) - await rewards.setCloseTime(1000) - const eligible = await rewards.eligibleForReward(0) - expect(eligible).to.equal(true) - }) - - it("returns false for terminated keeps", async () => { - await createKeeps([1000]) - await rewards.terminate(0) - const eligible = await rewards.eligibleForReward(0) - expect(eligible).to.equal(false) - }) - - it("returns false for active keeps", async () => { - await createKeeps([1000]) - await rewards.setCloseTime(999) - const eligible = await rewards.eligibleForReward(0) - expect(eligible).to.equal(false) - }) - - it("returns false for unrecognized keeps", async () => { - await createKeeps([1000]) - const eligible = await rewards.eligibleForReward(1) - expect(eligible).to.equal(false) - }) - }) - - describe("eligibleButTerminated", async () => { - it("returns false for happily closed keeps", async () => { - await createKeeps([1000]) - await rewards.setCloseTime(1000) - const eligible = await rewards.eligibleButTerminatedWithUint(0) - expect(eligible).to.equal(false) - }) - - it("returns true for terminated keeps", async () => { - await createKeeps([1000]) - await rewards.terminate(0) - const eligible = await rewards.eligibleButTerminatedWithUint(0) - expect(eligible).to.equal(true) - }) - - it("returns false for active keeps", async () => { - await createKeeps([1000]) - await rewards.setCloseTime(999) - const eligible = await rewards.eligibleButTerminatedWithUint(0) - expect(eligible).to.equal(false) - }) - - it("returns false for unrecognized keeps", async () => { - await createKeeps([1000]) - const eligible = await rewards.eligibleButTerminatedWithUint(1) - expect(eligible).to.equal(false) - }) - }) - - describe("intervalOf", async () => { - it("returns the correct interval", async () => { - await createKeeps([]) - const interval999 = await rewards.intervalOf(999) - expect(interval999.toNumber()).to.equal(0) - const interval1000 = await rewards.intervalOf(1000) - expect(interval1000.toNumber()).to.equal(0) - const interval1001 = await rewards.intervalOf(1001) - expect(interval1001.toNumber()).to.equal(0) - const interval1099 = await rewards.intervalOf(1099) - expect(interval1099.toNumber()).to.equal(0) - const interval1100 = await rewards.intervalOf(1100) - expect(interval1100.toNumber()).to.equal(1) - const interval1101 = await rewards.intervalOf(1101) - expect(interval1101.toNumber()).to.equal(1) - const interval1000000 = await rewards.intervalOf(1000000) - expect(interval1000000.toNumber()).to.equal(9990) - }) - }) - - describe("startOf", async () => { - it("returns the start of the interval", async () => { - await createKeeps([]) - const start0 = await rewards.startOf(0) - expect(start0.toNumber()).to.equal(1000) - const start1 = await rewards.startOf(1) - expect(start1.toNumber()).to.equal(1100) - const start9990 = await rewards.startOf(9990) - expect(start9990.toNumber()).to.equal(1000000) - }) - }) - - describe("endOf", async () => { - it("returns the end of the interval", async () => { - await createKeeps([]) - const end0 = await rewards.endOf(0) - expect(end0.toNumber()).to.equal(1100) - const end1 = await rewards.endOf(1) - expect(end1.toNumber()).to.equal(1200) - const end9990 = await rewards.endOf(9990) - expect(end9990.toNumber()).to.equal(1000100) - }) - }) - - describe("findEndpoint", async () => { - const increment = 1000 - - it("returns 0 when no keeps have been created", async () => { - await createKeeps([]) - const targetTimestamp = await time.latest() - time.increase(increment) - - const index = await rewards.findEndpoint(targetTimestamp) - expect(index.toNumber()).to.equal(0) - }) - - it("returns 0 when all current keeps were created after the interval", async () => { - const timestamps = testValues.defaultTimestamps - await createKeeps(timestamps) - const targetTimestamp = 500 - const expectedIndex = 0 - const index = await rewards.findEndpoint(targetTimestamp) - - expect(index.toNumber()).to.equal(expectedIndex) - }) - - it("returns the first index outside the interval", async () => { - const timestamps = testValues.defaultTimestamps - await createKeeps(timestamps) - for (let i = 0; i < timestamps.length; i++) { - const expectedIndex = i - const targetTimestamp = timestamps[i] - const index = await rewards.findEndpoint(targetTimestamp) - - expect(index.toNumber()).to.equal(expectedIndex) - } - }) - - it("returns the number of keeps when all current keeps were created in the interval", async () => { - const timestamps = testValues.defaultTimestamps - await createKeeps(timestamps) - const targetTimestamp = 2000 - const expectedIndex = 16 - const index = await rewards.findEndpoint(targetTimestamp) - - expect(index.toNumber()).to.equal(expectedIndex) - }) - - it("returns the correct index when duplicates are present", async () => { - const timestamps = [1001, 1001, 1002, 1002] - await createKeeps(timestamps) - const targetTimestamp = 1002 - const expectedIndex = 2 - const index = await rewards.findEndpoint(targetTimestamp) - - expect(index.toNumber()).to.equal(expectedIndex) - }) - - it("reverts if the endpoint is in the future", async () => { - await createKeeps([]) - const recentTimestamp = await time.latest() - const targetTimestamp = recentTimestamp + increment - await expectRevert( - rewards.findEndpoint(targetTimestamp), - "interval hasn't ended yet" - ) - }) - }) - - describe("getEndpoint", async () => { - it("returns the correct number of keeps for the interval", async () => { - const timestamps = testValues.defaultTimestamps - await createKeeps(timestamps) - const keepCount = await rewards.getEndpoint.call(0) - expect(keepCount.toNumber()).to.equal(timestamps.length) - }) - - it("returns 0 for intervals with no keeps", async () => { - const timestamps = [1200, 1201] - await createKeeps(timestamps) - const keepCount = await rewards.getEndpoint.call(1) - expect(keepCount.toNumber()).to.equal(0) - }) - - it("reverts if the interval hasn't ended", async () => { - await createKeeps([]) - const recentTimestamp = await time.latest() - const targetTimestamp = recentTimestamp + testValues.termLength - const targetInterval = await rewards.intervalOf(targetTimestamp) - await expectRevert( - rewards.getEndpoint(targetInterval), - "Interval hasn't ended yet" - ) - }) - }) - - describe("keepsInInterval", async () => { - it("returns the correct number of keeps for the interval", async () => { - const timestamps = testValues.rewardTimestamps - const expectedCounts = testValues.keepsInRewardIntervals - await createKeeps(timestamps) - for (let i = 0; i < expectedCounts.length; i++) { - const keepCount = await rewards.keepsInInterval.call(i) - expect(keepCount.toNumber()).to.equal(expectedCounts[i]) - } - }) - }) - - describe("getIntervalWeight", async () => { - it("returns the weight of a defined interval", async () => { - await createKeeps([]) - const weight0 = await rewards.getIntervalWeight(0) - expect(weight0.toNumber()).to.equal(20) - const weight3 = await rewards.getIntervalWeight(3) - expect(weight3.toNumber()).to.equal(50) - }) - - it("returns the last defined interval weight after the defined intervals", async () => { - await createKeeps([]) - const weight4 = await rewards.getIntervalWeight(4) - expect(weight4.toNumber()).to.equal(50) - }) - }) - - describe("getIntervalCount", async () => { - it("returns the number of defined intervals", async () => { - await createKeeps([]) - const intervalCount = await rewards.getIntervalCount() - expect(intervalCount.toNumber()).to.equal(4) - }) - }) - - describe("baseAllocation", async () => { - it("returns the maximum reward of a defined interval", async () => { - await createKeeps([]) - const expectedAllocations = testValues.inVacuumBaseRewards - for (let i = 0; i < expectedAllocations.length; i++) { - const allocation = await rewards.baseAllocation(i) - expect(allocation.toNumber()).to.equal(expectedAllocations[i]) - } - }) - }) - - describe("adjustedAllocation", async () => { - it("returns the adjusted reward allocation of the interval", async () => { - const timestamps = testValues.rewardTimestamps - const expectedAllocations = testValues.inVacuumAdjustedRewards - await createKeeps(timestamps) - for (let i = 0; i < expectedAllocations.length; i++) { - const allocation = await rewards.adjustedAllocation.call(i) - expect(allocation.toNumber()).to.equal(expectedAllocations[i]) - } - }) - }) - - describe("rewardPerKeep", async () => { - it("returns the per keep allocation of the interval", async () => { - const timestamps = testValues.rewardTimestamps - const expectedAllocations = testValues.inVacuumPerKeepRewards - await createKeeps(timestamps) - for (let i = 0; i < expectedAllocations.length; i++) { - const allocation = await rewards.rewardPerKeep.call(i) - expect(allocation.toNumber()).to.equal(expectedAllocations[i]) - } - }) - }) - - describe("allocateRewards", async () => { - it("allocates the reward for each interval", async () => { - const timestamps = testValues.rewardTimestamps - const expectedAllocations = testValues.actualAllocations - await createKeeps(timestamps) - for (let i = 0; i < expectedAllocations.length; i++) { - await rewards.allocateRewards(i) - const allocation = await rewards.getAllocatedRewards(i) - expect(allocation.toNumber()).to.equal(expectedAllocations[i]) - } - }) - - it("allocates the rewards recursively", async () => { - const timestamps = testValues.rewardTimestamps - const expectedAllocations = testValues.actualAllocations - await createKeeps(timestamps) - await rewards.allocateRewards(expectedAllocations.length - 1) - for (let i = 0; i < expectedAllocations.length; i++) { - const allocation = await rewards.getAllocatedRewards(i) - expect(allocation.toNumber()).to.equal(expectedAllocations[i]) - } - }) - }) - - describe("isAllocated", async () => { - it("returns false before allocation and true after allocation", async () => { - const timestamps = testValues.rewardTimestamps - const expectedAllocations = testValues.actualAllocations - await createKeeps(timestamps) - for (let i = 0; i < expectedAllocations.length; i++) { - const preAllocated = await rewards.isAllocated(i) - expect(preAllocated).to.equal(false) - await rewards.allocateRewards(i) - const postAllocated = await rewards.isAllocated(i) - expect(postAllocated).to.equal(true) - } - }) - }) - - describe("receiveReward", async () => { - it("lets closed keeps claim the reward correctly", async () => { - const timestamps = testValues.rewardTimestamps - await createKeeps(timestamps) - await rewards.setCloseTime(timestamps[0]) - await rewards.receiveReward(0, { from: aliceBeneficiary }) - const aliceBalance = await token.balanceOf(aliceBeneficiary) - expect(aliceBalance.toNumber()).to.equal(66666) - }) - - it("doesn't let keeps claim rewards again", async () => { - const timestamps = testValues.rewardTimestamps - await createKeeps(timestamps) - await rewards.setCloseTime(timestamps[0]) - await rewards.receiveReward(0, { from: aliceBeneficiary }) - await expectRevert( - rewards.receiveReward(0, { from: aliceBeneficiary }), - "Rewards already claimed" - ) - }) - - it("doesn't let active keeps claim the reward", async () => { - await createKeeps(testValues.rewardTimestamps) - await expectRevert( - rewards.receiveReward(0, { from: aliceBeneficiary }), - "Keep is not closed" - ) - }) - - it("doesn't let terminated keeps claim the reward", async () => { - await createKeeps(testValues.rewardTimestamps) - await rewards.terminate(0) - await expectRevert( - rewards.receiveReward(0, { from: aliceBeneficiary }), - "Keep is not closed" - ) - }) - - it("doesn't let unrecognized keeps claim the reward", async () => { - await createKeeps(testValues.rewardTimestamps) - await expectRevert( - rewards.receiveReward(testValues.rewardTimestamps.length), - "Keep not recognized by factory" - ) - }) - - it("requires that the interval is over", async () => { - const recentTimestamp = await time.latest() - const targetTimestamp = recentTimestamp + 1000 - await createKeeps([targetTimestamp]) - await rewards.setCloseTime(targetTimestamp) - await expectRevert(rewards.receiveReward(0), "Interval hasn't ended yet") - }) - - it("emits an event", async () => { - const timestamps = testValues.rewardTimestamps - await createKeeps(timestamps) - await rewards.setCloseTime(timestamps[0]) - await rewards.receiveReward(0, { from: aliceBeneficiary }) - assert.equal( - (await rewards.getPastEvents())[0].event, - "RewardReceived", - "Should emit event" - ) - }) - }) - - describe("receiveRewards", async () => { - it("lets closed keeps claim the rewards from multiple keeps correctly", async () => { - const timestamps = testValues.rewardTimestamps - await createKeeps(timestamps) - await rewards.setCloseTime(timestamps[2]) - const rewardsReceivingKeeps = [0, 1] - - await rewards.methods["receiveRewards(uint256[])"]( - rewardsReceivingKeeps, - { from: aliceBeneficiary } - ) - const aliceBalance = await token.balanceOf(aliceBeneficiary) - // Beneficiary will receive 200,000 / 3 = 66,666 per keep - // 66,666 * 2 = 133,332 KEEP rewards total for being in 2 closed keeps - expect(aliceBalance.toNumber()).to.equal(133332) - }) - }) - - describe("reportTermination", async () => { - it("unallocates rewards allocated to terminated keep", async () => { - const timestamps = testValues.rewardTimestamps - await createKeeps(timestamps) - - await rewards.setCloseTime(testValues.rewardTimestamps[0]) - await rewards.receiveReward(0, { from: aliceBeneficiary }) // allocate rewards - - await rewards.terminate(1) - const preUnallocated = await rewards.unallocatedRewards() - await rewards.reportTermination(1) - const postUnallocated = await rewards.unallocatedRewards() - expect(postUnallocated.toNumber()).to.equal( - preUnallocated.toNumber() + 66666 - ) - }) - - it("doesn't unallocate rewards twice for the same keep", async () => { - const timestamps = testValues.rewardTimestamps - await createKeeps(timestamps) - await rewards.terminate(0) - await rewards.reportTermination(0) - await expectRevert( - rewards.reportTermination(0), - "Rewards already claimed" - ) - }) - - it("doesn't unallocate active keeps' rewards", async () => { - await createKeeps(testValues.rewardTimestamps) - await expectRevert(rewards.reportTermination(0), "Keep is not terminated") - }) - - it("doesn't unallocate closed keeps' rewards", async () => { - await createKeeps(testValues.rewardTimestamps) - await rewards.setCloseTime(testValues.rewardTimestamps[0]) - await expectRevert(rewards.reportTermination(0), "Keep is not terminated") - }) - - it("doesn't unallocate unrecognized keeps' rewards", async () => { - await createKeeps(testValues.rewardTimestamps) - await expectRevert( - rewards.reportTermination(testValues.rewardTimestamps.length), - "Keep not recognized by factory" - ) - }) - - it("requires that the interval is over", async () => { - const recentTimestamp = await time.latest() - const targetTimestamp = recentTimestamp + 1000 - await createKeeps([targetTimestamp]) - await rewards.terminate(0) - await expectRevert( - rewards.reportTermination(0), - "Interval hasn't ended yet" - ) - }) - }) - - describe("reportTerminations", async () => { - it("unallocates rewards allocated to terminated keeps in batch", async () => { - const timestamps = testValues.rewardTimestamps - await createKeeps(timestamps) - - await rewards.setCloseTime(testValues.rewardTimestamps[0]) - await rewards.allocateRewards(0) - - await rewards.terminate(1) - await rewards.terminate(2) - - const preUnallocated = await rewards.unallocatedRewards() - - const terminatedIdentifiers = [1, 2] - await rewards.methods["reportTerminations(uint256[])"]( - terminatedIdentifiers - ) - const actual = await rewards.unallocatedRewards() - // 200,000 KEEP were allocated for the first interval - // 800,000 KEEP remaining in unallocated pool - // 2 out of 3 keeps were terminated - // 200,000 / 3 = 66,666 rewards per keep - // 66,666 * 2 = 133,332 returned back to unallocated pool - expect(actual.toNumber()).to.equal(preUnallocated.toNumber() + 133332) - }) - }) -}) diff --git a/solidity-v1/test/rewards/rewardsData.js b/solidity-v1/test/rewards/rewardsData.js deleted file mode 100644 index 7d6b64edcf..0000000000 --- a/solidity-v1/test/rewards/rewardsData.js +++ /dev/null @@ -1,61 +0,0 @@ -const testValues = { - defaultTimestamps: [ - 1000, - 1001, - 1002, - 1003, - 1004, - 1005, - 1006, - 1007, - 1008, - 1009, - 1010, - 1011, - 1012, - 1013, - 1014, - 1015, - ], - initiationTime: 1000, - termLength: 100, - totalRewards: 1000000, - minimumIntervalKeeps: 2, - rewardTimestamps: [ - 1000, - 1001, - 1099, // interval 0; 0..2 - 1100, - 1101, - 1102, - 1103, // interval 1; 3..6 - 1234, // interval 2; 7 - 1300, - 1301, // interval 3; 8..9 - 1500, // interval 5; 10 - 1600, - 1601, // interval 6; 11..12 - ], - keepsInRewardIntervals: [3, 4, 1, 2, 0, 1, 2, 0], - // rewardIntervalAdjustments = [...] - intervalWeights: [ - // percentage of unallocated rewards, allocated : remaining - 20, // 20:80 - 50, // 40:40 - 25, // 10:30 - 50, // 15:15 - ], - inVacuumBaseRewards: [200000, 500000, 250000, 500000, 500000, 500000, 500000], - inVacuumAdjustedRewards: [200000, 500000, 125000, 500000, 0, 250000, 500000], - inVacuumPerKeepRewards: [66666, 125000, 125000, 250000, 0, 250000, 250000], - actualAllocations: [ - 200000, // 800000 remaining - 400000, // 400000 remaining - 50000, // 350000 remaining - 175000, // 175000 remaining - 0, // 175000 remaining - 43750, // 131250 remaining - 65625, // 65625 remaining - ], -} -module.exports = { testValues } diff --git a/solidity-v1/test/token-distribution/TokenDistributorTest.js b/solidity-v1/test/token-distribution/TokenDistributorTest.js deleted file mode 100644 index f2f08e3a00..0000000000 --- a/solidity-v1/test/token-distribution/TokenDistributorTest.js +++ /dev/null @@ -1,691 +0,0 @@ -const { - expectRevert, - expectEvent, - constants, - time, - send, - ether, -} = require("@openzeppelin/test-helpers") -const { - accounts, - contract, - web3, - defaultSender, -} = require("@openzeppelin/test-environment") - -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") - -const TokenDistributor = contract.fromArtifact("TokenDistributor") -const TestToken = contract.fromArtifact("TestToken") - -const { ZERO_ADDRESS } = constants - -const { BN, toBN } = web3.utils -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const { expect } = chai - -const testData = require("./testData.json") - -describe("TokenDistributor", () => { - const [owner, recoveryDestination] = accounts - - const unclaimedUnlockDuration = time.duration.weeks(12) - - let testToken - let tokenDistributor - let recipient - let claimDestination - let thirdParty - let signature - - const freshDeployment = async () => { - testToken = await TestToken.new({ from: owner }) - tokenDistributor = await TokenDistributor.new(testToken.address, { - from: owner, - }) - - await testToken.mint(owner, testData.merkle.tokenTotal) - await testToken.approve( - tokenDistributor.address, - testData.merkle.tokenTotal, - { - from: owner, - } - ) - } - - before(async () => { - recipient = await importAccountFromPrivateKey(testData.recipient.privateKey) - claimDestination = await importAccountFromPrivateKey( - testData.destination.privateKey - ) - thirdParty = await importAccountFromPrivateKey( - testData.thirdParty.privateKey - ) - - await freshDeployment() - - signature = signDestinationAddress( - testData.recipient.privateKey, - tokenDistributor.address, - claimDestination - ) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("allocate", async () => { - it("transfers tokens", async function () { - await tokenDistributor.allocate( - testData.merkle.merkleRoot, - testData.merkle.tokenTotal, - unclaimedUnlockDuration, - { from: owner } - ) - - expect( - await testToken.balanceOf(tokenDistributor.address), - "invalid token distributor balance" - ).to.eq.BN(toBN(testData.merkle.tokenTotal)) - }) - - it("sets merkle root", async function () { - await tokenDistributor.allocate( - testData.merkle.merkleRoot, - testData.merkle.tokenTotal, - unclaimedUnlockDuration, - { from: owner } - ) - - expect(await tokenDistributor.merkleRoot()).to.equal( - testData.merkle.merkleRoot - ) - }) - - it("emits event", async function () { - expectEvent( - await tokenDistributor.allocate( - testData.merkle.merkleRoot, - testData.merkle.tokenTotal, - unclaimedUnlockDuration, - { from: owner } - ), - "TokensAllocated", - { - merkleRoot: testData.merkle.merkleRoot, - amount: toBN(testData.merkle.tokenTotal), - unclaimedUnlockTimestamp: await tokenDistributor.unclaimedUnlockTimestamp(), - } - ) - }) - - it("sets unclaimed tokens unlock timestamp", async function () { - const { receipt } = await tokenDistributor.allocate( - testData.merkle.merkleRoot, - testData.merkle.tokenTotal, - unclaimedUnlockDuration, - { from: owner } - ) - - const timestamp = toBN( - (await web3.eth.getBlock(receipt.blockNumber)).timestamp - ) - - const expectedUnclaimedUnlockDuration = toBN( - timestamp.add(unclaimedUnlockDuration) - ) - - expect( - await tokenDistributor.unclaimedUnlockTimestamp(), - "invalid unclaimed unlock timestamp" - ).to.eq.BN(expectedUnclaimedUnlockDuration) - - expectEvent(receipt, "TokensAllocated", { - unclaimedUnlockTimestamp: expectedUnclaimedUnlockDuration, - }) - }) - - it("doesn't set unclaimed tokens unlock timestamp when unclaimed duration is not provided", async function () { - const receipt = await tokenDistributor.allocate( - testData.merkle.merkleRoot, - testData.merkle.tokenTotal, - 0, - { from: owner } - ) - - expect( - await tokenDistributor.unclaimedUnlockTimestamp(), - "invalid unclaimed unlock timestamp" - ).to.eq.BN(0) - - expectEvent(receipt, "TokensAllocated", { - unclaimedUnlockTimestamp: toBN(0), - }) - }) - - it("reverts on merkle root overwrite", async function () { - await tokenDistributor.allocate( - testData.merkle.merkleRoot, - testData.merkle.tokenTotal, - unclaimedUnlockDuration, - { from: owner } - ) - - await expectRevert( - tokenDistributor.allocate( - "0x1234567890", - testData.merkle.tokenTotal, - unclaimedUnlockDuration, - { - from: owner, - } - ), - "tokens were already allocated" - ) - }) - - it("reverts on empty merkle root", async function () { - await expectRevert( - tokenDistributor.allocate( - [], - testData.merkle.tokenTotal, - unclaimedUnlockDuration, - { - from: owner, - } - ), - "merkle root cannot be empty" - ) - }) - - it("reverts on zero amount", async function () { - await expectRevert( - tokenDistributor.allocate( - testData.merkle.merkleRoot, - 0, - unclaimedUnlockDuration, - { - from: owner, - } - ), - "amount has to be greater than zero" - ) - }) - - it("reverts on token transfer failure", async function () { - await expectRevert( - tokenDistributor.allocate( - testData.merkle.merkleRoot, - testData.merkle.tokenTotal + 1, - unclaimedUnlockDuration, - { - from: owner, - } - ), - "SafeERC20: low-level call failed" - ) - }) - - it("reverts when called by non-owner", async function () { - await expectRevert( - tokenDistributor.allocate( - testData.merkle.merkleRoot, - testData.merkle.tokenTotal, - unclaimedUnlockDuration, - { - from: thirdParty, - } - ), - "Ownable: caller is not the owner" - ) - }) - }) - - describe("claim", async () => { - beforeEach(async () => { - await tokenDistributor.allocate( - testData.merkle.merkleRoot, - testData.merkle.tokenTotal, - unclaimedUnlockDuration, - { from: owner } - ) - }) - - it("transfers tokens", async function () { - const recipientInitialBalance = toBN(await testToken.balanceOf(recipient)) - const destinationInitialBalance = toBN( - await testToken.balanceOf(claimDestination) - ) - - await tokenDistributor.claim( - recipient, - claimDestination, - signature.v, - signature.r, - signature.s, - testData.merkle.claims[recipient].index, - testData.merkle.claims[recipient].amount, - testData.merkle.claims[recipient].proof - ) - - expect( - await testToken.balanceOf(recipient), - "invalid recipient address balance" - ).to.eq.BN(toBN(recipientInitialBalance)) - - expect( - await testToken.balanceOf(claimDestination), - "invalid destination address balance" - ).to.eq.BN( - destinationInitialBalance.add( - toBN(testData.merkle.claims[recipient].amount) - ) - ) - }) - - it("emits event", async function () { - const signature = signDestinationAddress( - testData.recipient.privateKey, - tokenDistributor.address, - claimDestination - ) - - expectEvent( - await tokenDistributor.claim( - recipient, - claimDestination, - signature.v, - signature.r, - signature.s, - testData.merkle.claims[recipient].index, - testData.merkle.claims[recipient].amount, - testData.merkle.claims[recipient].proof - ), - "TokensClaimed", - { - index: testData.merkle.claims[recipient].index.toString(), - recipient: recipient, - destination: claimDestination, - amount: toBN(testData.merkle.claims[recipient].amount), - } - ) - }) - - describe("when verifying destination signature", async function () { - async function signatureVerificationTest( - signerPrivateKey, - submitter, - shouldRevert - ) { - const signature = signDestinationAddress( - signerPrivateKey, - tokenDistributor.address, - claimDestination - ) - - claimFuncCall = tokenDistributor.claim( - recipient, - claimDestination, - signature.v, - signature.r, - signature.s, - testData.merkle.claims[recipient].index, - testData.merkle.claims[recipient].amount, - testData.merkle.claims[recipient].proof, - { from: submitter } - ) - - shouldRevert - ? await expectRevert(claimFuncCall, "invalid signature") - : expectEvent(await claimFuncCall, "TokensClaimed", { - recipient: recipient, - destination: claimDestination, - }) - } - - it("completes when signed by recipient, submitted by third-party", async function () { - await signatureVerificationTest( - testData.recipient.privateKey, - thirdParty - ) - }) - - it("completes when signed by recipient, submitted by recipient", async function () { - await signatureVerificationTest( - testData.recipient.privateKey, - recipient - ) - }) - - it("reverts when signed by third-party, submitted by recipient", async function () { - await signatureVerificationTest( - testData.thirdParty.privateKey, - recipient, - true - ) - }) - - it("completes when signed by recipient, submitted by destination", async function () { - await signatureVerificationTest( - testData.recipient.privateKey, - claimDestination - ) - }) - - it("reverts when signed by destination, submitted by recipient", async function () { - await signatureVerificationTest( - testData.destination.privateKey, - recipient, - true - ) - }) - - it("reverts when signed by destination, submitted by destination", async function () { - await signatureVerificationTest( - testData.destination.privateKey, - claimDestination, - true - ) - }) - }) - - it("reverts on malleable signatures", async function () { - const secp256k1N = toBN( - "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141" - ) - - const malleableS = "0x" + secp256k1N.sub(toBN(signature.s)).toJSON() - - await expectRevert( - tokenDistributor.claim( - recipient, - claimDestination, - signature.v, - signature.r, - malleableS, - testData.merkle.claims[recipient].index, - testData.merkle.claims[recipient].amount, - testData.merkle.claims[recipient].proof - ), - "Invalid signature 's' value" - ) - - await expectRevert( - tokenDistributor.claim( - recipient, - claimDestination, - signature.v - 27, - signature.r, - signature.s, - testData.merkle.claims[recipient].index, - testData.merkle.claims[recipient].amount, - testData.merkle.claims[recipient].proof - ), - "Invalid signature 'v' value" - ) - }) - - it("reverts on empty addresses", async function () { - await expectRevert( - tokenDistributor.claim( - ZERO_ADDRESS, - claimDestination, - signature.v, - signature.r, - signature.s, - testData.merkle.claims[recipient].index, - testData.merkle.claims[recipient].amount, - testData.merkle.claims[recipient].proof - ), - "recipient address cannot be zero" - ) - - await expectRevert( - tokenDistributor.claim( - recipient, - ZERO_ADDRESS, - signature.v, - signature.r, - signature.s, - testData.merkle.claims[recipient].index, - testData.merkle.claims[recipient].amount, - testData.merkle.claims[recipient].proof - ), - "destination address cannot be zero" - ) - }) - - it("reverts if tokens were not allocated", async function () { - const tokenDistributor = await TokenDistributor.new(testToken.address, { - from: owner, - }) - - await expectRevert( - tokenDistributor.claim( - recipient, - claimDestination, - signature.v, - signature.r, - signature.s, - testData.merkle.claims[recipient].index, - testData.merkle.claims[recipient].amount, - testData.merkle.claims[recipient].proof - ), - "tokens were not allocated yet" - ) - }) - - it("reverts if tokens were already claimed", async function () { - await tokenDistributor.claim( - recipient, - claimDestination, - signature.v, - signature.r, - signature.s, - testData.merkle.claims[recipient].index, - testData.merkle.claims[recipient].amount, - testData.merkle.claims[recipient].proof - ) - - await expectRevert( - tokenDistributor.claim( - recipient, - claimDestination, - signature.v, - signature.r, - signature.s, - testData.merkle.claims[recipient].index, - testData.merkle.claims[recipient].amount, - testData.merkle.claims[recipient].proof - ), - "tokens already claimed" - ) - }) - - it("reverts on invalid amount", async function () { - await expectRevert( - tokenDistributor.claim( - recipient, - claimDestination, - signature.v, - signature.r, - signature.s, - testData.merkle.claims[recipient].index, - toBN(testData.merkle.claims[recipient].amount).addn(1), - testData.merkle.claims[recipient].proof - ), - "invalid proof" - ) - }) - - it("reverts on wrong merkle data", async function () { - await expectRevert( - tokenDistributor.claim( - recipient, - claimDestination, - signature.v, - signature.r, - signature.s, - testData.merkle.claims[thirdParty].index, - testData.merkle.claims[thirdParty].amount, - testData.merkle.claims[thirdParty].proof - ), - "invalid proof" - ) - }) - }) - - describe("recoverUnclaimed", async function () { - const allocate = async (unlockDuration) => { - const { receipt } = await tokenDistributor.allocate( - testData.merkle.merkleRoot, - testData.merkle.tokenTotal, - unlockDuration, - { from: owner } - ) - - return toBN((await web3.eth.getBlock(receipt.blockNumber)).timestamp) - } - - it("transfers tokens to destination address", async function () { - const timestamp = await allocate(unclaimedUnlockDuration) - await time.increaseTo(timestamp.add(unclaimedUnlockDuration)) - - const destinationInitialBalance = toBN( - await testToken.balanceOf(recoveryDestination) - ) - - await tokenDistributor.recoverUnclaimed(recoveryDestination, { - from: owner, - }) - - expect( - await testToken.balanceOf(recoveryDestination), - "invalid recipient address balance" - ).to.eq.BN( - toBN(destinationInitialBalance.add(toBN(testData.merkle.tokenTotal))) - ) - }) - - it("emits event", async function () { - const timestamp = await allocate(unclaimedUnlockDuration) - await time.increaseTo(timestamp.add(unclaimedUnlockDuration)) - - expectEvent( - await tokenDistributor.recoverUnclaimed(recoveryDestination, { - from: owner, - }), - "TokensRecovered", - { - destination: recoveryDestination, - amount: toBN(testData.merkle.tokenTotal), - } - ) - }) - - it("transfers only unclaimed tokens", async function () { - const timestamp = await allocate(unclaimedUnlockDuration) - - const destinationInitialBalance = toBN( - await testToken.balanceOf(recoveryDestination) - ) - - await tokenDistributor.claim( - recipient, - claimDestination, - signature.v, - signature.r, - signature.s, - testData.merkle.claims[recipient].index, - testData.merkle.claims[recipient].amount, - testData.merkle.claims[recipient].proof - ) - - await time.increaseTo(timestamp.add(unclaimedUnlockDuration)) - - await tokenDistributor.recoverUnclaimed(recoveryDestination, { - from: owner, - }) - - expect( - await testToken.balanceOf(recoveryDestination), - "invalid recipient address balance" - ).to.eq.BN( - toBN( - destinationInitialBalance - .add(toBN(testData.merkle.tokenTotal)) - .sub(toBN(testData.merkle.claims[recipient].amount)) - ) - ) - }) - - it("reverts on empty destination addresse", async function () { - await expectRevert( - tokenDistributor.recoverUnclaimed(ZERO_ADDRESS, { from: owner }), - "destination address cannot be zero" - ) - }) - - it("reverts if tokens recovery is not allowed", async function () { - await allocate(0) - - await expectRevert( - tokenDistributor.recoverUnclaimed(recoveryDestination, { from: owner }), - "token recovery is not allowed" - ) - }) - - it("reverts if unlock period has not passed yet", async function () { - const timestamp = await allocate(unclaimedUnlockDuration) - - await time.increaseTo(timestamp.add(unclaimedUnlockDuration).subn(10)) - - await expectRevert( - tokenDistributor.recoverUnclaimed(recoveryDestination, { from: owner }), - "token recovery is not possible yet" - ) - }) - - it("reverts when called by non-owner", async function () { - await expectRevert( - tokenDistributor.recoverUnclaimed(recoveryDestination, { - from: thirdParty, - }), - "Ownable: caller is not the owner" - ) - }) - }) - - function signDestinationAddress( - signerPrivateKey, - tokenDistributorAddress, - destinationAddress - ) { - const digest = web3.utils.soliditySha3( - tokenDistributorAddress, - destinationAddress - ) - - return web3.eth.accounts.sign(digest, signerPrivateKey) - } - - async function importAccountFromPrivateKey(privateKey) { - const password = "password" - - const address = web3.utils.toChecksumAddress( - await web3.eth.personal.importRawKey(privateKey, password) - ) - - await web3.eth.personal.unlockAccount(address, password, 600) - - await send.ether(defaultSender, address, ether("1")) - return address - } -}) diff --git a/solidity-v1/test/token-distribution/testData.json b/solidity-v1/test/token-distribution/testData.json deleted file mode 100644 index 3b00c35b6f..0000000000 --- a/solidity-v1/test/token-distribution/testData.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "recipient": { - "address": "0xB1302cEeCe2b36584Be5a498588cd974A6304544", - "privateKey": "0xa9c98fe538f065bfe391e1baa24e0c455a67441ebbc3f413b0204236d981106c" - }, - "destination": { - "address": "0xEf044fa1AEEb203b6aA72c30A6295e09cf803508", - "privateKey": "0x9369006157c95e92e53c80610678e5376b82764bf5d9dbaa18e9c1d009584948" - }, - "thirdParty": { - "address": "0x8f733469c5d1fCee27a7E4c5433517ccAD992e6C", - "privateKey": "0xd889eda11a6cfb36248b65e9e525c99d13e34d835cf81d063212483a65ec43bb" - }, - "merkle": { - "merkleRoot": "0xb83c6e12d9018f63a9741859cd7a8852e7808af9f9adb37d14d6eb7fd91153fe", - "tokenTotal": "0x20b34706499fd319400000", - "claims": { - "0x02ea4fBE3bb3E28c9cFDE69b5a2ef120848E0ee1": { - "index": 0, - "amount": "0x0751e17dbc2f4fbc0000", - "proof": [ - "0xa16f3605f66a5639dd2ab43012dadf957ab1f8f982c92aaa3d3429ac58f1f26d", - "0x0be2d1f507ca8b5d9a0bbe87480cbfef69bee7d0342bcfbd2c9bcd4650618e8d", - "0xed0449c87cc82e900b315e07986fa8e04444e811f4d638c7cea3ce4b3a32b832" - ] - }, - "0x8f733469c5d1fCee27a7E4c5433517ccAD992e6C": { - "index": 1, - "amount": "0x01a784379d99db42000000", - "proof": [ - "0xd2fd5c02bc90b2c77bfd89ba5a80b905efc4e85061e33946273f3d9ae884f4db", - "0xf9744cfec55155c66e701a923fedf571d2227662b489603debbea9fecbc7977a", - "0x40b25251d690f1e2140c58266ce8f377dc2926834d09817c92eebb146d773cac" - ] - }, - "0xB1302cEeCe2b36584Be5a498588cd974A6304544": { - "index": 2, - "amount": "0x0629994f2b1050bc400000", - "proof": [ - "0xf28ea4ef1209d9dae85c816084161f5b6764f5157503538c076eac1c0a96ea33", - "0x40b25251d690f1e2140c58266ce8f377dc2926834d09817c92eebb146d773cac" - ] - }, - "0xCc4d22160E6C2541ecd06ED6e4d80a5f8F00373d": { - "index": 3, - "amount": "0x6c6b935b8bbd400000", - "proof": [ - "0xb794638b414bb5821125a536fff64bd4b12db326526eaab0606a97396dc47f70", - "0x0be2d1f507ca8b5d9a0bbe87480cbfef69bee7d0342bcfbd2c9bcd4650618e8d", - "0xed0449c87cc82e900b315e07986fa8e04444e811f4d638c7cea3ce4b3a32b832" - ] - }, - "0xE292F62271941CcCF406b07B4E2439DBF9E3Fc60": { - "index": 4, - "amount": "0x18d0bf423c03d8de000000", - "proof": [ - "0xce67d8c565f5f3eb9ab8d788adde0dc2854fba50fe12ea9c7a9811b7cb6f55b7", - "0xf9744cfec55155c66e701a923fedf571d2227662b489603debbea9fecbc7977a", - "0x40b25251d690f1e2140c58266ce8f377dc2926834d09817c92eebb146d773cac" - ] - }, - "0xa5d96E4E4E1c848b7f95eF4f0D9c41cD8dF6253D": { - "index": 5, - "amount": "0x09abe253235f88a00000", - "proof": [ - "0x4e3cadfde18a2d1843d6e8059ec93ae5018436d8b1a77176fe470fc66479e699", - "0x14262b1cdb5728be081d825042abde2378f48b4462ad4b2c028e74df23a2cdab", - "0xed0449c87cc82e900b315e07986fa8e04444e811f4d638c7cea3ce4b3a32b832" - ] - }, - "0xbC5eE0FBD357a40d88a3a61183ffD779c9E006Bb": { - "index": 6, - "amount": "0x0de0b6b3a7640000", - "proof": [ - "0x9f29b27696acad70d1ea1f38276d8c1a3ff7ce4770e4740a9613e3e04c0362f2", - "0x14262b1cdb5728be081d825042abde2378f48b4462ad4b2c028e74df23a2cdab", - "0xed0449c87cc82e900b315e07986fa8e04444e811f4d638c7cea3ce4b3a32b832" - ] - } - } - } -} diff --git a/solidity-v1/test/token_grant/TestManagedGrantFactory.js b/solidity-v1/test/token_grant/TestManagedGrantFactory.js deleted file mode 100644 index ea9f686ab9..0000000000 --- a/solidity-v1/test/token_grant/TestManagedGrantFactory.js +++ /dev/null @@ -1,218 +0,0 @@ -const { contract, accounts, web3 } = require("@openzeppelin/test-environment") -const { expectRevert, time } = require("@openzeppelin/test-helpers") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot") -const { initTokenStaking } = require("../helpers/initContracts") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -const KeepToken = contract.fromArtifact("KeepToken") -const TokenGrant = contract.fromArtifact("TokenGrant") -const KeepRegistry = contract.fromArtifact("KeepRegistry") -const PermissiveStakingPolicy = contract.fromArtifact("PermissiveStakingPolicy") -const GuaranteedMinimumStakingPolicy = contract.fromArtifact( - "GuaranteedMinimumStakingPolicy" -) - -const ManagedGrant = contract.fromArtifact("ManagedGrant") -const ManagedGrantFactory = contract.fromArtifact("ManagedGrantFactory") - -describe("TokenGrant/ManagedGrantFactory", () => { - let token - let registry - let tokenGrant - let staking - let permissivePolicy - let minimumStake - let grantAmount - - const grantCreator = accounts[0] - const grantee = accounts[2] - const unrelatedAddress = accounts[3] - - let grantStart - - const grantUnlockingDuration = time.duration.days(60) - const grantCliff = time.duration.days(10) - - const initializationPeriod = time.duration.minutes(10) - - let factory - - before(async () => { - token = await KeepToken.new({ from: grantCreator }) - tokenGrant = await TokenGrant.new(token.address, { from: grantCreator }) - registry = await KeepRegistry.new({ from: grantCreator }) - const contracts = await initTokenStaking( - token.address, - tokenGrant.address, - registry.address, - initializationPeriod, - contract.fromArtifact("TokenStaking") - ) - staking = contracts.tokenStaking - - await tokenGrant.authorizeStakingContract(staking.address, { - from: grantCreator, - }) - - minimumStake = await staking.minimumStake() - - permissivePolicy = await PermissiveStakingPolicy.new() - minimumPolicy = await GuaranteedMinimumStakingPolicy.new(staking.address) - grantAmount = minimumStake.muln(10) - - factory = await ManagedGrantFactory.new(token.address, tokenGrant.address, { - from: grantCreator, - }) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("creating managed grants", async () => { - it("works with a two-step call", async () => { - await token.approve(factory.address, grantAmount, { from: grantCreator }) - grantStart = await time.latest() - const managedGrantAddress = await factory.createManagedGrant.call( - grantee, - grantAmount, - grantUnlockingDuration, - grantStart, - grantCliff, - false, - permissivePolicy.address, - { from: grantCreator } - ) - await factory.createManagedGrant( - grantee, - grantAmount, - grantUnlockingDuration, - grantStart, - grantCliff, - false, - permissivePolicy.address, - { from: grantCreator } - ) - const event = (await factory.getPastEvents())[0] - const managedGrant = await ManagedGrant.at(managedGrantAddress) - const grantId = await managedGrant.grantId() - expect(await tokenGrant.availableToStake(grantId)).to.eq.BN(grantAmount) - expect(await managedGrant.grantee()).to.equal(grantee) - expect(await managedGrant.grantManager()).to.equal(grantCreator) - expect(event.args["grantAddress"]).to.equal(managedGrantAddress) - expect(event.args["grantee"]).to.equal(grantee) - - const schedule = await tokenGrant.getGrantUnlockingSchedule(grantId) - const returnedGrantManager = schedule[0] - expect(returnedGrantManager).to.equal(grantCreator) - - const returnedDuration = schedule[1] - expect(returnedDuration).to.eq.BN(grantUnlockingDuration) - - const returnedStart = schedule[2] - expect(returnedStart).to.eq.BN(grantStart) - - const returnedCliff = schedule[3] - expect(returnedCliff).to.eq.BN(grantStart.add(grantCliff)) - - const returnedPolicy = schedule[4] - expect(returnedPolicy).to.equal(permissivePolicy.address) - }) - - it("works with receiveApproval", async () => { - grantStart = await time.latest() - const extraData = web3.eth.abi.encodeParameters( - ["address", "uint256", "uint256", "uint256", "bool", "address"], - [ - grantee, - grantUnlockingDuration.toNumber(), - grantStart.toNumber(), - grantCliff.toNumber(), - false, - permissivePolicy.address, - ] - ) - await token.approveAndCall(factory.address, grantAmount, extraData, { - from: grantCreator, - }) - const event = (await factory.getPastEvents())[0] - expect(event.args["grantee"]).to.equal(grantee) - const managedGrantAddress = event.args["grantAddress"] - const managedGrant = await ManagedGrant.at(managedGrantAddress) - const grantId = await managedGrant.grantId() - expect(await tokenGrant.availableToStake(grantId)).to.eq.BN(grantAmount) - expect(await managedGrant.grantee()).to.equal(grantee) - expect(await managedGrant.grantManager()).to.equal(grantCreator) - - const schedule = await tokenGrant.getGrantUnlockingSchedule(grantId) - const returnedGrantManager = schedule[0] - expect(returnedGrantManager).to.equal(grantCreator) - - const returnedDuration = schedule[1] - expect(returnedDuration).to.eq.BN(grantUnlockingDuration) - - const returnedStart = schedule[2] - expect(returnedStart).to.eq.BN(grantStart) - - const returnedCliff = schedule[3] - expect(returnedCliff).to.eq.BN(grantStart.add(grantCliff)) - - const returnedPolicy = schedule[4] - expect(returnedPolicy).to.equal(permissivePolicy.address) - }) - - it("doesn't let one grant more than they've approved on the token", async () => { - await token.transfer(unrelatedAddress, grantAmount, { - from: grantCreator, - }) - await token.approve(factory.address, grantAmount.subn(1), { - from: unrelatedAddress, - }) - grantStart = await time.latest() - await expectRevert( - factory.createManagedGrant( - grantee, - grantAmount, - grantUnlockingDuration, - grantStart, - grantCliff, - false, - permissivePolicy.address, - { from: unrelatedAddress } - ), - "SafeERC20: low-level call failed -- Reason given: SafeERC20: low-level call failed." - ) - }) - - it("doesn't let one grant more than they have on the token", async () => { - await token.transfer(unrelatedAddress, grantAmount, { - from: grantCreator, - }) - await token.approve(factory.address, grantAmount.addn(1), { - from: unrelatedAddress, - }) - grantStart = await time.latest() - await expectRevert( - factory.createManagedGrant( - grantee, - grantAmount.addn(1), - grantUnlockingDuration, - grantStart, - grantCliff, - false, - permissivePolicy.address, - { from: unrelatedAddress } - ), - "SafeERC20: low-level call failed -- Reason given: SafeERC20: low-level call failed." - ) - }) - }) -}) diff --git a/solidity-v1/test/token_grant/TestStakingPolicy.js b/solidity-v1/test/token_grant/TestStakingPolicy.js deleted file mode 100644 index cb43e269a0..0000000000 --- a/solidity-v1/test/token_grant/TestStakingPolicy.js +++ /dev/null @@ -1,452 +0,0 @@ -const { contract, accounts, web3 } = require("@openzeppelin/test-environment") - -const { initTokenStaking } = require("../helpers/initContracts") - -const PermissiveStakingPolicy = contract.fromArtifact("PermissiveStakingPolicy") -const GuaranteedMinimumStakingPolicy = contract.fromArtifact( - "GuaranteedMinimumStakingPolicy" -) -const AdaptiveStakingPolicy = contract.fromArtifact("AdaptiveStakingPolicy") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -describe("PermissiveStakingPolicy", async () => { - let policy - const amount = 10000 - const start = 1000 - const duration = 2000 - const cliff = 1500 - const withdrawn = 4000 - - before(async () => { - policy = await PermissiveStakingPolicy.new() - }) - - async function calculate(atTimestamp, withdrawnAmount) { - return await policy.getStakeableAmount( - atTimestamp, - amount, - duration, - start, - cliff, - withdrawnAmount - ) - } - - it("should permit staking all tokens before cliff", async () => { - expect(await calculate(1400, 0)).to.eq.BN(amount) - }) - - it("should permit staking all tokens after cliff", async () => { - expect(await calculate(1600, 0)).to.eq.BN(amount) - }) - - it("should permit staking all tokens after unlocking", async () => { - expect(await calculate(3100, 0)).to.eq.BN(amount) - }) - - it("should permit staking remaining tokens before cliff", async () => { - expect(await calculate(1400, withdrawn)).to.eq.BN(amount - withdrawn) - }) - - it("should permit staking remaining tokens after cliff", async () => { - expect(await calculate(1600, withdrawn)).to.eq.BN(amount - withdrawn) - }) - - it("should permit staking remaining tokens after unlocking", async () => { - expect(await calculate(3100, withdrawn)).to.eq.BN(amount - withdrawn) - }) -}) - -describe("GuaranteedMinimumStakingPolicy", async () => { - let policy - let stakingContract - let minimumStake - let largeGrant - let mediumGrant - let smallGrant - const start = 1000 - const duration = 2000 - const cliff = 1500 - - // Minimum stake is 100,000 KEEP tokens at the beginning. - // `tokens(n)` returns a BN whose value equals `n` KEEP. - function tokens(n) { - return minimumStake.divn(100000).muln(n) - } - - before(async () => { - const contracts = await initTokenStaking( - accounts[9], - accounts[9], - accounts[9], - 0, - contract.fromArtifact("TokenStaking") - ) - stakingContract = contracts.tokenStaking - policy = await GuaranteedMinimumStakingPolicy.new(stakingContract.address) - minimumStake = await stakingContract.minimumStake() - largeGrant = tokens(500000) // 5x minimum stake - mediumGrant = tokens(250000) // 2.5x minimum stake - smallGrant = tokens(50000) // half of minimum stake - }) - - async function calculate(atTimestamp, givenAmount, withdrawnAmount) { - return await policy.getStakeableAmount( - atTimestamp, - givenAmount, - duration, - start, - cliff, - withdrawnAmount - ) - } - - describe("with nothing withdrawn", async () => { - it("should calculate stakeable amount correctly before cliff", async () => { - expect(await calculate(1499, largeGrant, 0)).to.eq.BN( - minimumStake, - "Should permit minimum stake with large grant before cliff" - ) - expect(await calculate(1499, mediumGrant, 0)).to.eq.BN( - minimumStake, - "Should permit minimum stake with medium grant before cliff" - ) - expect(await calculate(1499, smallGrant, 0)).to.eq.BN( - smallGrant, - "Should permit entire grant with small grant before cliff" - ) - }) - - it("should calculate stakeable amount correctly just after cliff", async () => { - expect(await calculate(1500, largeGrant, 0)).to.eq.BN( - tokens(125000), - "Should permit unlocked amount with large grant just after cliff" - ) - expect(await calculate(1500, mediumGrant, 0)).to.eq.BN( - minimumStake, - "Should permit minimum stake with medium grant just after cliff" - ) - expect(await calculate(1500, smallGrant, 0)).to.eq.BN( - smallGrant, - "Should permit entire grant with small grant just after cliff" - ) - }) - - it("should calculate stakeable amount correctly halfway through", async () => { - expect(await calculate(2000, largeGrant, 0)).to.eq.BN( - tokens(250000), - "Should permit unlocked amount with large grant halfway through" - ) - expect(await calculate(2000, mediumGrant, 0)).to.eq.BN( - tokens(125000), - "Should permit unlocked amount with medium grant halfway through" - ) - expect(await calculate(2000, smallGrant, 0)).to.eq.BN( - smallGrant, - "Should permit entire grant with small grant halfway through" - ) - }) - - it("should calculate stakeable amount correctly after unlocking period", async () => { - expect(await calculate(3000, largeGrant, 0)).to.eq.BN( - largeGrant, - "Should permit unlocked amount with large grant after unlocking period" - ) - expect(await calculate(3000, mediumGrant, 0)).to.eq.BN( - mediumGrant, - "Should permit unlocked amount with medium grant after unlocking period" - ) - expect(await calculate(3000, smallGrant, 0)).to.eq.BN( - smallGrant, - "Should permit entire grant with small grant after unlocking period" - ) - }) - }) - - describe("with all unlocked tokens withdrawn", async () => { - it("should calculate stakeable amount correctly just after cliff", async () => { - expect(await calculate(1500, largeGrant, tokens(125000))).to.eq.BN( - minimumStake, - "Should permit minimum stake with large grant just after cliff" - ) - expect(await calculate(1500, mediumGrant, tokens(62500))).to.eq.BN( - minimumStake, - "Should permit minimum stake with medium grant just after cliff" - ) - expect(await calculate(1500, smallGrant, tokens(12500))).to.eq.BN( - tokens(37500), - "Should permit remaining amount with small grant just after cliff" - ) - }) - - it("should calculate stakeable amount correctly halfway through", async () => { - expect(await calculate(2000, largeGrant, tokens(250000))).to.eq.BN( - minimumStake, - "Should permit minimum stake with large grant halfway through" - ) - expect(await calculate(2000, mediumGrant, tokens(125000))).to.eq.BN( - minimumStake, - "Should permit minimum stake with medium grant halfway through" - ) - expect(await calculate(2000, smallGrant, tokens(25000))).to.eq.BN( - tokens(25000), - "Should permit remaining amount with small grant halfway through" - ) - }) - - it("should calculate stakeable amount correctly at three quarters", async () => { - expect(await calculate(2500, largeGrant, tokens(375000))).to.eq.BN( - minimumStake, - "Should permit minimum stake with large grant at three quarters" - ) - expect(await calculate(2500, mediumGrant, tokens(187500))).to.eq.BN( - tokens(62500), - "Should permit remaining amount with medium grant at three quarters" - ) - expect(await calculate(2500, smallGrant, tokens(37500))).to.eq.BN( - tokens(12500), - "Should permit remaining amount with small grant at three quarters" - ) - }) - }) - - describe("with half of unlocked tokens withdrawn", async () => { - it("should calculate stakeable amount correctly just after cliff", async () => { - expect(await calculate(1500, largeGrant, tokens(62500))).to.eq.BN( - minimumStake, - "Should permit minimum stake with large grant just after cliff" - ) - expect(await calculate(1500, mediumGrant, tokens(31250))).to.eq.BN( - minimumStake, - "Should permit minimum stake with medium grant just after cliff" - ) - expect(await calculate(1500, smallGrant, tokens(6250))).to.eq.BN( - tokens(43750), - "Should permit remaining amount with small grant just after cliff" - ) - }) - - it("should calculate stakeable amount correctly halfway through", async () => { - expect(await calculate(2000, largeGrant, tokens(125000))).to.eq.BN( - tokens(125000), - "Should permit remaining unlocked amount with large grant halfway through" - ) - expect(await calculate(2000, mediumGrant, tokens(62500))).to.eq.BN( - minimumStake, - "Should permit minimum stake with medium grant halfway through" - ) - expect(await calculate(2000, smallGrant, tokens(12500))).to.eq.BN( - tokens(37500), - "Should permit remaining amount with small grant halfway through" - ) - }) - }) -}) - -describe("AdaptiveStakingPolicy", async () => { - let cliffPolicy - let noCliffPolicy - let stakingContract - let minimumStake - let largeGrant - let mediumGrant - let smallGrant - const start = 1000 - const duration = 2000 - const cliff = 2000 - const minimumMultiplier = 4 - const stakeahead = 500 - - // Minimum stake is 100,000 KEEP tokens at the beginning. - // `tokens(n)` returns a BN whose value equals `n` KEEP. - function tokens(n) { - return minimumStake.divn(100000).muln(n) - } - - before(async () => { - const contracts = await initTokenStaking( - accounts[9], - accounts[9], - accounts[9], - 0, - contract.fromArtifact("TokenStaking") - ) - stakingContract = contracts.tokenStaking - cliffPolicy = await AdaptiveStakingPolicy.new( - stakingContract.address, - minimumMultiplier, - stakeahead, - true - ) - noCliffPolicy = await AdaptiveStakingPolicy.new( - stakingContract.address, - minimumMultiplier, - stakeahead, - false - ) - minimumStake = await stakingContract.minimumStake() - largeGrant = tokens(5000000) // 50x minimum stake - mediumGrant = tokens(500000) // 5x minimum stake - smallGrant = tokens(50000) // half of minimum stake - }) - - async function withCliff(atTimestamp, givenAmount, withdrawnAmount) { - return await cliffPolicy.getStakeableAmount( - atTimestamp, - givenAmount, - duration, - start, - cliff, - withdrawnAmount - ) - } - async function withoutCliff(atTimestamp, givenAmount, withdrawnAmount) { - return await noCliffPolicy.getStakeableAmount( - atTimestamp, - givenAmount, - duration, - start, - cliff, - withdrawnAmount - ) - } - - describe("with nothing withdrawn", async () => { - it("should calculate stakeable amount correctly before cliff", async () => { - expect(await withCliff(1499, largeGrant, 0)).to.eq.BN( - minimumStake.muln(minimumMultiplier), - "Should permit multiple of minimum stake with large grant before cliff" - ) - expect(await withCliff(1499, mediumGrant, 0)).to.eq.BN( - minimumStake.muln(minimumMultiplier), - "Should permit multiple of minimum stake with medium grant before cliff" - ) - expect(await withCliff(1499, smallGrant, 0)).to.eq.BN( - smallGrant, - "Should permit entire grant with small grant before cliff" - ) - }) - - it("should ignore cliff if specified", async () => { - expect(await withoutCliff(1250, largeGrant, 0)).to.eq.BN( - tokens(1875000), - "Should permit stakeahead with large grant before cliff" - ) - }) - - // cliff at 1000, stakeahead of 500 - it("should calculate stakeable amount correctly just after cliff", async () => { - expect(await withCliff(1500, largeGrant, 0)).to.eq.BN( - tokens(2500000), - "Should permit half with large grant just after cliff" - ) - expect(await withCliff(1500, mediumGrant, 0)).to.eq.BN( - minimumStake.muln(minimumMultiplier), - "Should permit multiple of minimum with medium grant just after cliff" - ) - expect(await withCliff(1500, smallGrant, 0)).to.eq.BN( - smallGrant, - "Should permit entire grant with small grant just after cliff" - ) - }) - - // stakeahead of 500, so 75% is unlocked - it("should calculate stakeable amount correctly halfway through", async () => { - expect(await withCliff(2000, largeGrant, 0)).to.eq.BN( - tokens(3750000), - "Should permit three quarters with large grant halfway through" - ) - expect(await withCliff(2000, mediumGrant, 0)).to.eq.BN( - minimumStake.muln(minimumMultiplier), - "Should permit multiple of minimum with medium grant halfway through" - ) - expect(await withCliff(2000, smallGrant, 0)).to.eq.BN( - smallGrant, - "Should permit entire grant with small grant halfway through" - ) - }) - - it("should calculate stakeable amount correctly after unlocking period", async () => { - expect(await withCliff(3000, largeGrant, 0)).to.eq.BN( - largeGrant, - "Should permit unlocked amount with large grant after unlocking period" - ) - expect(await withCliff(3000, mediumGrant, 0)).to.eq.BN( - mediumGrant, - "Should permit unlocked amount with medium grant after unlocking period" - ) - expect(await withCliff(3000, smallGrant, 0)).to.eq.BN( - smallGrant, - "Should permit entire grant with small grant after unlocking period" - ) - }) - }) - - describe("with all unlocked tokens withdrawn", async () => { - it("should calculate stakeable amount correctly just after cliff", async () => { - expect(await withCliff(2000, largeGrant, tokens(2500000))).to.eq.BN( - tokens(1250000), - "Should permit a quarter with large grant just after cliff" - ) - expect(await withCliff(2000, mediumGrant, tokens(250000))).to.eq.BN( - tokens(250000), - "Should permit remaining amount with medium grant just after cliff" - ) - expect(await withCliff(2000, smallGrant, tokens(25000))).to.eq.BN( - tokens(25000), - "Should permit remaining amount with small grant just after cliff" - ) - }) - - it("should calculate stakeable amount correctly at three quarters", async () => { - expect(await withCliff(2500, largeGrant, tokens(3750000))).to.eq.BN( - tokens(1250000), - "Should permit remaining amount with large grant at three quarters" - ) - expect(await withCliff(2500, mediumGrant, tokens(375000))).to.eq.BN( - tokens(125000), - "Should permit remaining amount with medium grant at three quarters" - ) - expect(await withCliff(2500, smallGrant, tokens(37500))).to.eq.BN( - tokens(12500), - "Should permit remaining amount with small grant at three quarters" - ) - }) - }) - - describe("with half of unlocked tokens withdrawn", async () => { - it("should calculate stakeable amount correctly just after cliff", async () => { - expect(await withCliff(2000, largeGrant, tokens(1250000))).to.eq.BN( - tokens(2500000), - "Should permit half with large grant just after cliff" - ) - expect(await withCliff(2000, mediumGrant, tokens(125000))).to.eq.BN( - tokens(375000), - "Should permit remaining amount with medium grant just after cliff" - ) - expect(await withCliff(2000, smallGrant, tokens(12500))).to.eq.BN( - tokens(37500), - "Should permit remaining amount with small grant just after cliff" - ) - }) - - it("should calculate stakeable amount correctly at three quarters", async () => { - expect(await withCliff(2500, largeGrant, tokens(1875000))).to.eq.BN( - tokens(3125000), - "Should permit remaining amount with large grant at three quarters" - ) - expect(await withCliff(2500, mediumGrant, tokens(187500))).to.eq.BN( - tokens(312500), - "Should permit remaining amount with medium grant at three quarters" - ) - expect(await withCliff(2500, smallGrant, tokens(18750))).to.eq.BN( - tokens(31250), - "Should permit remaining amount with small grant at three quarters" - ) - }) - }) -}) diff --git a/solidity-v1/test/token_grant/TestTokenGrant.js b/solidity-v1/test/token_grant/TestTokenGrant.js deleted file mode 100644 index 36b4ea6083..0000000000 --- a/solidity-v1/test/token_grant/TestTokenGrant.js +++ /dev/null @@ -1,241 +0,0 @@ -const { contract, accounts, web3 } = require("@openzeppelin/test-environment") -const { expectRevert, time } = require("@openzeppelin/test-helpers") -const { initTokenStaking } = require("../helpers/initContracts") -const { grantTokens } = require("../helpers/grantTokens") - -const KeepToken = contract.fromArtifact("KeepToken") -const TokenGrant = contract.fromArtifact("TokenGrant") -const KeepRegistry = contract.fromArtifact("KeepRegistry") -const PermissiveStakingPolicy = contract.fromArtifact("PermissiveStakingPolicy") - -const assert = require("chai").assert - -describe("TokenGrant", function () { - let token - let registry - let grantContract - let stakingContract - let permissivePolicy - let amount - let unlockingDuration - let start - let cliff - const grantManager = accounts[0] - const accountTwo = accounts[1] - const grantee = accounts[2] - - before(async () => { - token = await KeepToken.new({ from: accounts[0] }) - registry = await KeepRegistry.new({ from: accounts[0] }) - grantContract = await TokenGrant.new(token.address, { from: accounts[0] }) - const contracts = await initTokenStaking( - token.address, - grantContract.address, - registry.address, - time.duration.days(1), - contract.fromArtifact("TokenStaking") - ) - stakingContract = contracts.tokenStaking - - await grantContract.authorizeStakingContract(stakingContract.address, { - from: accounts[0], - }) - permissivePolicy = await PermissiveStakingPolicy.new() - amount = web3.utils.toBN(100) - unlockingDuration = time.duration.days(30) - start = await time.latest() - cliff = time.duration.days(0) - }) - - it("should grant tokens correctly", async function () { - const amount = web3.utils.toBN(1000000000) - const unlockingDuration = time.duration.days(30) - const start = await time.latest() - const cliff = time.duration.days(10) - const revocable = true - - // Starting balances - const grantManagerStartingBalance = await token.balanceOf.call(grantManager) - const accountTwoStartingBalance = await token.balanceOf.call(accountTwo) - - // Grant tokens - const id = await grantTokens( - grantContract, - token, - amount, - grantManager, - accountTwo, - unlockingDuration, - start, - cliff, - revocable, - permissivePolicy.address, - { from: accounts[0] } - ) - - // Ending balances - const grantManagerEndingBalance = await token.balanceOf.call(grantManager) - let accountTwoEndingBalance = await token.balanceOf.call(accountTwo) - let accountTwoGrantBalance = await grantContract.balanceOf.call(accountTwo) - - assert.equal( - grantManagerEndingBalance.eq(grantManagerStartingBalance.sub(amount)), - true, - "Amount should be transfered from sender balance" - ) - assert.equal( - accountTwoGrantBalance.eq(amount), - true, - "Amount should be added to the grantee grant balance" - ) - assert.equal( - accountTwoEndingBalance.eq(accountTwoStartingBalance), - true, - "Grantee main balance should stay unchanged" - ) - - // Should not be able to withdraw token grant (0 withdrawable amount) - await expectRevert( - grantContract.withdraw(id), - "Grant available to withdraw amount should be greater than zero" - ) - - // jump in time, third unlocking duration - await time.increase(unlockingDuration.divn(3)) - - // Should be able to withdraw token grant withdrawable amount - await grantContract.withdraw(id) - - // should withdraw some of grant to the main balance - accountTwoEndingBalance = await token.balanceOf.call(accountTwo) - assert.equal( - accountTwoEndingBalance.lte( - accountTwoStartingBalance.add(amount.div(web3.utils.toBN(2))) - ), - true, - "Should withdraw some of the grant to the main balance" - ) - - // jump in time, full unlocking duration - await time.increase(unlockingDuration) - await grantContract.withdraw(id) - - // should withdraw full grant amount to the main balance - accountTwoEndingBalance = await token.balanceOf.call(accountTwo) - assert.equal( - accountTwoEndingBalance.eq(accountTwoStartingBalance.add(amount)), - true, - "Should withdraw full grant amount to the main balance" - ) - - accountTwoGrantBalance = await grantContract.balanceOf.call(accountTwo) - assert.equal(accountTwoGrantBalance, 0, "Grant amount should become 0") - }) - - it("token holder should be able to grant it's tokens to a grantee.", async function () { - const grantManagerStartingBalance = await token.balanceOf.call(grantManager) - - const id = await grantTokens( - grantContract, - token, - amount, - grantManager, - grantee, - unlockingDuration, - start, - cliff, - true, - permissivePolicy.address, - { from: accounts[0] } - ) - - const grantManagerEndingBalance = await token.balanceOf.call(grantManager) - - assert.equal( - grantManagerEndingBalance.eq(grantManagerStartingBalance.sub(amount)), - true, - "Amount should be taken out from grant manager main balance." - ) - assert.equal( - (await grantContract.balanceOf.call(grantee)).eq(amount), - true, - "Amount should be added to grantee's granted balance." - ) - - const grant = await grantContract.getGrant(id) - assert.equal( - grant[0].eq(amount), - true, - "Grant should maintain a record of the granted amount." - ) - assert.equal( - grant[1].isZero(), - true, - "Grant should have 0 amount withdrawn initially." - ) - assert.equal(grant[2], false, "Grant should initially be undelegated.") - assert.equal( - grant[3], - false, - "Grant should not be marked as revoked initially." - ) - - const schedule = await grantContract.getGrantUnlockingSchedule(id) - assert.equal( - schedule[0], - grantManager, - "Grant should maintain a record of the grant manager." - ) - assert.equal( - schedule[1].eq(web3.utils.toBN(unlockingDuration)), - true, - "Grant should have unlocking schedule time.duration." - ) - assert.equal( - schedule[2].eq(web3.utils.toBN(start)), - true, - "Grant should have start time." - ) - assert.equal( - schedule[3].eq(web3.utils.toBN(start).add(web3.utils.toBN(cliff))), - true, - "Grant should have unlocking schedule cliff time.duration." - ) - }) - - it("can assign a different address than the sender as grant manager", async () => { - // Assign `account_two` as grant manager - const grantData = web3.eth.abi.encodeParameters( - [ - "address", - "address", - "uint256", - "uint256", - "uint256", - "bool", - "address", - ], - [ - accountTwo, - grantee, - unlockingDuration.toNumber(), - start.toNumber(), - cliff.toNumber(), - false, - permissivePolicy.address, - ] - ) - - await token.approveAndCall(grantContract.address, amount, grantData, { - from: grantManager, - }) - const grantId = (await grantContract.getPastEvents())[0].args[0].toNumber() - - const schedule = await grantContract.getGrantUnlockingSchedule(grantId) - assert.equal( - schedule[0], - accountTwo, - "The grant manager should be assignable to a non-sender" - ) - }) -}) diff --git a/solidity-v1/test/token_grant/TestTokenGrantWithdraw.js b/solidity-v1/test/token_grant/TestTokenGrantWithdraw.js deleted file mode 100644 index fbf7e72f84..0000000000 --- a/solidity-v1/test/token_grant/TestTokenGrantWithdraw.js +++ /dev/null @@ -1,169 +0,0 @@ -const { delegateStakeFromGrant } = require("../helpers/delegateStake") -const { contract, accounts, web3 } = require("@openzeppelin/test-environment") -const { expectRevert, time } = require("@openzeppelin/test-helpers") -const { initTokenStaking } = require("../helpers/initContracts") -const { grantTokens } = require("../helpers/grantTokens") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -const KeepToken = contract.fromArtifact("KeepToken") -const TokenGrant = contract.fromArtifact("TokenGrant") -const KeepRegistry = contract.fromArtifact("KeepRegistry") -const PermissiveStakingPolicy = contract.fromArtifact("PermissiveStakingPolicy") - -describe("TokenGrant/Withdraw", function () { - let tokenContract - let registryContract - let grantContract - let stakingContract - let permissivePolicy - - const tokenOwner = accounts[0] - const grantee = accounts[1] - const operatorOne = accounts[2] - const beneficiary = accounts[4] - const authorizer = accounts[5] - - let grantId - let grantStart - let grantAmount - - const grantRevocable = false - const grantDuration = time.duration.seconds(60) - const grantCliff = time.duration.seconds(1) - - const initializationPeriod = time.duration.seconds(10) - - before(async () => { - tokenContract = await KeepToken.new({ from: accounts[0] }) - grantContract = await TokenGrant.new(tokenContract.address, { - from: accounts[0], - }) - registryContract = await KeepRegistry.new({ from: accounts[0] }) - const stakingContracts = await initTokenStaking( - tokenContract.address, - grantContract.address, - registryContract.address, - initializationPeriod, - contract.fromArtifact("TokenStaking") - ) - stakingContract = stakingContracts.tokenStaking - await grantContract.authorizeStakingContract(stakingContract.address, { - from: accounts[0], - }) - - grantAmount = (await stakingContract.minimumStake()).muln(10) - - permissivePolicy = await PermissiveStakingPolicy.new() - - grantStart = await time.latest() - - grantId = await grantTokens( - grantContract, - tokenContract, - grantAmount, - tokenOwner, - grantee, - grantDuration, - grantStart, - grantCliff, - grantRevocable, - permissivePolicy.address, - { from: accounts[0] } - ) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - it("should allow to wihtdraw some tokens", async () => { - await time.increaseTo(grantStart.add(grantDuration) - 30) - - const withdrawable = await grantContract.withdrawable(grantId) - const granteeTokenGrantBalancePre = await grantContract.balanceOf(grantee) - await grantContract.withdraw(grantId) - const granteeTokenGrantBalancePost = await grantContract.balanceOf(grantee) - - const granteeTokenBalance = await tokenContract.balanceOf(grantee) - const grantDetails = await grantContract.getGrant(grantId) - - expect(withdrawable).to.be.gt.BN(0, "Should allow to withdraw more than 0") - expect(granteeTokenBalance).to.eq.BN( - grantDetails.withdrawn, - "Grantee KEEP token balance should be equal to the grant withdrawn amount" - ) - expect( - granteeTokenGrantBalancePre.sub(granteeTokenGrantBalancePost) - ).to.eq.BN( - grantDetails.withdrawn, - "Grantee token grant balance should be updated" - ) - }) - - it("should allow to wihtdraw the whole grant amount ", async () => { - await time.increaseTo(grantStart.add(grantDuration)) - - const withdrawablePre = await grantContract.withdrawable(grantId) - const granteeTokenGrantBalancePre = await grantContract.balanceOf(grantee) - await grantContract.withdraw(grantId) - const withdrawablePost = await grantContract.withdrawable(grantId) - const granteeTokenGrantBalancePost = await grantContract.balanceOf(grantee) - - const granteeTokenBalance = await tokenContract.balanceOf(grantee) - const grantDetails = await grantContract.getGrant(grantId) - - expect(withdrawablePre).to.eq.BN( - grantAmount, - "The withdrawable amount should be equal to the whole grant amount" - ) - expect(granteeTokenBalance).to.eq.BN( - grantAmount, - "Grantee KEEP token balance should be equal to the grant amount" - ) - expect(withdrawablePost).to.eq.BN( - 0, - "The withdrawable amount should be equal to 0, when the whole grant amount has been withdrawn" - ) - expect(granteeTokenGrantBalancePre.sub(grantAmount)).to.eq.BN( - granteeTokenGrantBalancePost, - "Grantee token grant balance should be updated" - ) - expect(grantDetails.withdrawn).to.eq.BN( - grantAmount, - "The grant withdrawan amount should be updated" - ) - }) - - it("should not allow to withdraw delegated tokens", async () => { - await time.increaseTo(grantStart.add(grantDuration)) - await delegateStakeFromGrant( - grantContract, - stakingContract.address, - grantee, - operatorOne, - beneficiary, - authorizer, - grantAmount, - grantId - ) - const withdrawableAfterStake = await grantContract.withdrawable(grantId) - - await expectRevert( - grantContract.withdraw(grantId), - "Grant available to withdraw amount should be greater than zero." - ) - expect(withdrawableAfterStake).to.eq.BN( - 0, - "The withdrawable amount should be equal to 0" - ) - }) -}) diff --git a/solidity-v1/test/token_stake/TestDelegatedAuthority.js b/solidity-v1/test/token_stake/TestDelegatedAuthority.js deleted file mode 100644 index b745169f9b..0000000000 --- a/solidity-v1/test/token_stake/TestDelegatedAuthority.js +++ /dev/null @@ -1,371 +0,0 @@ -const { contract, accounts, web3 } = require("@openzeppelin/test-environment") -const { expectRevert, time } = require("@openzeppelin/test-helpers") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot") -const { initTokenStaking } = require("../helpers/initContracts") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -const KeepToken = contract.fromArtifact("KeepToken") -const TokenGrant = contract.fromArtifact("TokenGrant") -const KeepRegistry = contract.fromArtifact("KeepRegistry") -const DelegatedAuthorityStub = contract.fromArtifact("DelegatedAuthorityStub") - -const initializationPeriod = time.duration.seconds(10) - -let token -let registry -let stakingContract -let authorityDelegator -let badAuthorityDelegator -let innerRecursiveDelegator -let outerRecursiveDelegator -let minimumStake -let stakingAmount - -describe("TokenStaking/DelegatedAuthority", async () => { - const owner = accounts[0] - const operator = accounts[1] - const beneficiary = accounts[2] - const authorizer = accounts[3] - const recognizedContract = accounts[4] - const unrecognizedContract = accounts[5] - const unapprovedContract = accounts[6] - const recursivelyAuthorizedContract = accounts[7] - - before(async () => { - token = await KeepToken.new({ from: accounts[0] }) - grant = await TokenGrant.new(token.address, { from: accounts[0] }) - registry = await KeepRegistry.new() - const stakingContracts = await initTokenStaking( - token.address, - grant.address, - registry.address, - initializationPeriod, - contract.fromArtifact("TokenStaking") - ) - stakingContract = stakingContracts.tokenStaking - - minimumStake = await stakingContract.minimumStake() - stakingAmount = minimumStake.muln(20) - const tx = await delegate(operator, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - - authorityDelegator = await DelegatedAuthorityStub.new(recognizedContract) - badAuthorityDelegator = await DelegatedAuthorityStub.new(unapprovedContract) - await registry.approveOperatorContract(authorityDelegator.address) - - innerRecursiveDelegator = await DelegatedAuthorityStub.new( - recursivelyAuthorizedContract - ) - outerRecursiveDelegator = await DelegatedAuthorityStub.new( - innerRecursiveDelegator.address - ) - await registry.approveOperatorContract(outerRecursiveDelegator.address) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - async function delegate(operator, amount) { - const data = Buffer.concat([ - Buffer.from(beneficiary.substr(2), "hex"), - Buffer.from(operator.substr(2), "hex"), - Buffer.from(authorizer.substr(2), "hex"), - ]) - - return token.approveAndCall( - stakingContract.address, - amount, - "0x" + data.toString("hex"), - { from: owner } - ) - } - - async function hasDelegatedAuthorization(operatorContract) { - return stakingContract.isAuthorizedForOperator(operator, operatorContract) - } - - async function authorize(operatorContract) { - stakingContract.authorizeOperatorContract( - operator, - operatorContract.address, - { from: authorizer } - ) - } - - async function disable(operatorContract) { - await registry.disableOperatorContract(operatorContract.address) - } - - describe("claimDelegatedAuthority", async () => { - it("lets contracts claim delegated authority", async () => { - await stakingContract.claimDelegatedAuthority( - authorityDelegator.address, - { from: recognizedContract } - ) - - expect( - await stakingContract.getAuthoritySource(recognizedContract) - ).to.equal(authorityDelegator.address) - }) - - it("doesn't give unrecognized contracts delegated authority", async () => { - await expectRevert( - stakingContract.claimDelegatedAuthority(authorityDelegator.address, { - from: unrecognizedContract, - }), - "Unrecognized claimant" - ) - }) - - it("doesn't give delegated authority through unapproved contracts", async () => { - await expectRevert( - stakingContract.claimDelegatedAuthority(badAuthorityDelegator.address, { - from: unapprovedContract, - }), - "Operator contract unapproved" - ) - }) - - it("delegates authority recursively", async () => { - await innerRecursiveDelegator.claimAuthorityRecursively( - stakingContract.address, - outerRecursiveDelegator.address - ) - await stakingContract.claimDelegatedAuthority( - innerRecursiveDelegator.address, - { from: recursivelyAuthorizedContract } - ) - - expect( - await stakingContract.getAuthoritySource(recursivelyAuthorizedContract) - ).to.equal(outerRecursiveDelegator.address) - }) - }) - - describe("after authority delegation", async () => { - before(async () => { - await stakingContract.claimDelegatedAuthority( - authorityDelegator.address, - { from: recognizedContract } - ) - }) - - describe("isAuthorizedForOperator", async () => { - before(async () => { - await stakingContract.claimDelegatedAuthority( - authorityDelegator.address, - { from: recognizedContract } - ) - }) - - it("delegates authorization correctly", async () => { - expect(await hasDelegatedAuthorization(recognizedContract)).to.be.false - await authorize(authorityDelegator) - expect(await hasDelegatedAuthorization(recognizedContract)).to.be.true - }) - - it("disables delegated authorization with the panic button", async () => { - await authorize(authorityDelegator) - await disable(authorityDelegator) - // Indirect test; - // `claimDelegatedAuthority` checks `onlyApprovedOperatorContract` - await expectRevert( - stakingContract.claimDelegatedAuthority(recognizedContract, { - from: unrecognizedContract, - }), - "Operator contract unapproved" - ) - }) - - it("works recursively", async () => { - await innerRecursiveDelegator.claimAuthorityRecursively( - stakingContract.address, - outerRecursiveDelegator.address - ) - await stakingContract.claimDelegatedAuthority( - innerRecursiveDelegator.address, - { from: recursivelyAuthorizedContract } - ) - await authorize(outerRecursiveDelegator) - expect(await hasDelegatedAuthorization(recursivelyAuthorizedContract)) - .to.be.true - }) - }) - - describe("authorizeOperatorContract", async () => { - it("doesn't authorize contracts using delegated authority", async () => { - await expectRevert( - stakingContract.authorizeOperatorContract( - operator, - recognizedContract, - { from: authorizer } - ), - "Delegated authority used" - ) - }) - }) - - describe("slash", async () => { - it("uses delegated authorization correctly", async () => { - await expectRevert( - stakingContract.slash(minimumStake, [operator], { - from: recognizedContract, - }), - "Not authorized" - ) - await authorize(authorityDelegator) - await stakingContract.slash(minimumStake, [operator], { - from: recognizedContract, - }) - // no error - }) - }) - - describe("seize", async () => { - it("uses delegated authorization correctly", async () => { - await expectRevert( - stakingContract.seize(minimumStake, 100, beneficiary, [operator], { - from: recognizedContract, - }), - "Not authorized" - ) - await authorize(authorityDelegator) - await stakingContract.seize( - minimumStake, - 100, - beneficiary, - [operator], - { from: recognizedContract } - ) - // no error - }) - }) - - describe("lockStake", async () => { - it("uses delegated authorization correctly", async () => { - const lockPeriod = time.duration.weeks(12) - await expectRevert( - stakingContract.lockStake(operator, lockPeriod, { - from: recognizedContract, - }), - "Not authorized" - ) - await authorize(authorityDelegator) - await stakingContract.lockStake(operator, lockPeriod, { - from: recognizedContract, - }) - // no error - }) - }) - - describe("releaseExpiredLock", async () => { - it("reverts for authority delegator", async () => { - await authorize(authorityDelegator) - const lockPeriod = time.duration.weeks(12) - await stakingContract.lockStake(operator, lockPeriod, { - from: recognizedContract, - }) - - await expectRevert( - stakingContract.releaseExpiredLock( - operator, - authorityDelegator.address - ), - "No matching lock present" - ) - }) - - it("uses delegated authorization correctly and validates expiration", async () => { - await authorize(authorityDelegator) - const lockPeriod = time.duration.weeks(12) - await stakingContract.lockStake(operator, lockPeriod, { - from: recognizedContract, - }) - - await expectRevert( - stakingContract.releaseExpiredLock( - operator, - authorityDelegator.address - ), - "No matching lock present" - ) - - await expectRevert( - stakingContract.releaseExpiredLock(operator, recognizedContract), - "Lock still active and valid" - ) - - time.increase(lockPeriod.addn(1)) - - await stakingContract.releaseExpiredLock(operator, recognizedContract) - // no error - }) - - it("uses delegated authorization correctly and checks if operator contract is enabled", async () => { - await authorize(authorityDelegator) - const lockPeriod = time.duration.weeks(12) - await stakingContract.lockStake(operator, lockPeriod, { - from: recognizedContract, - }) - - await expectRevert( - stakingContract.releaseExpiredLock(operator, recognizedContract), - "Lock still active and valid" - ) - - await disable(authorityDelegator) - - await stakingContract.releaseExpiredLock(operator, recognizedContract) - // no error - }) - }) - - describe("isStakeLocked", async () => { - it("uses delegated authorization correctly", async () => { - await authorize(authorityDelegator) - const lockPeriod = time.duration.weeks(12) - await stakingContract.lockStake(operator, lockPeriod, { - from: recognizedContract, - }) - - expect(await stakingContract.isStakeLocked(operator)).to.be.true - }) - }) - - describe("eligibleStake", async () => { - it("uses delegated authorization correctly", async () => { - expect( - await stakingContract.eligibleStake(operator, recognizedContract) - ).to.eq.BN(0) - await authorize(authorityDelegator) - expect( - await stakingContract.eligibleStake(operator, recognizedContract) - ).to.eq.BN(stakingAmount) - }) - }) - - describe("activeStake", async () => { - it("uses delegated authorization correctly", async () => { - expect( - await stakingContract.activeStake(operator, recognizedContract) - ).to.eq.BN(0) - await authorize(authorityDelegator) - expect( - await stakingContract.activeStake(operator, recognizedContract) - ).to.eq.BN(stakingAmount) - }) - }) - }) -}) diff --git a/solidity-v1/test/token_stake/TestGrantStakingLib.js b/solidity-v1/test/token_stake/TestGrantStakingLib.js deleted file mode 100644 index fe76a6b528..0000000000 --- a/solidity-v1/test/token_stake/TestGrantStakingLib.js +++ /dev/null @@ -1,90 +0,0 @@ -const { accounts, contract, web3 } = require("@openzeppelin/test-environment") -const { constants, expectRevert } = require("@openzeppelin/test-helpers") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot") - -const assert = require("chai").assert -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -const GrantStaking = contract.fromArtifact("GrantStaking") -const GrantStakingStub = contract.fromArtifact("GrantStakingStub") - -describe("GrantStaking", () => { - const deployer = accounts[0] - const operator1 = accounts[1] - operator2 = accounts[2] - operator3 = accounts[3] - operator4 = accounts[4] - - let info - - before(async () => { - const infoLib = await GrantStaking.new({ from: deployer }) - await GrantStakingStub.detectNetwork() - await GrantStakingStub.link("GrantStaking", infoLib.address) - info = await GrantStakingStub.new({ from: deployer }) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("hasGrantDelegated", async () => { - it("returns true if grant is set for operator", async () => { - await info.setGrantForOperator(operator1, 0) - await info.setGrantForOperator(operator2, 1) - await info.setGrantForOperator(operator3, 200) - await info.setGrantForOperator(operator4, constants.MAX_UINT256) - - assert.isTrue(await info.hasGrantDelegated(operator1)) - assert.isTrue(await info.hasGrantDelegated(operator2)) - assert.isTrue(await info.hasGrantDelegated(operator3)) - assert.isTrue(await info.hasGrantDelegated(operator4)) - }) - - it("returns false if grant is not set for operator", async () => { - assert.isFalse(await info.hasGrantDelegated(operator1)) - assert.isFalse(await info.hasGrantDelegated(operator2)) - assert.isFalse(await info.hasGrantDelegated(operator3)) - assert.isFalse(await info.hasGrantDelegated(operator4)) - - await info.setGrantForOperator(operator2, 0) - - assert.isFalse(await info.hasGrantDelegated(operator1)) - assert.isFalse(await info.hasGrantDelegated(operator3)) - assert.isFalse(await info.hasGrantDelegated(operator4)) - }) - }) - - describe("getGrantForOperator", async () => { - it("returns grant ID for operator having grant staked", async () => { - await info.setGrantForOperator(operator1, 0) - await info.setGrantForOperator(operator2, 10) - await info.setGrantForOperator(operator3, 200) - await info.setGrantForOperator(operator4, constants.MAX_UINT256) - - const operator1GrantId = await info.getGrantForOperator(operator1) - const operator2GrantId = await info.getGrantForOperator(operator2) - const operator3GrantId = await info.getGrantForOperator(operator3) - const operator4GrantId = await info.getGrantForOperator(operator4) - - expect(operator1GrantId).to.eq.BN(0) - expect(operator2GrantId).to.eq.BN(10) - expect(operator3GrantId).to.eq.BN(200) - expect(operator4GrantId).to.eq.BN(constants.MAX_UINT256) - }) - - it("reverts where there is no grant for operator", async () => { - await expectRevert( - info.getGrantForOperator(operator1), - "No grant for the operator" - ) - }) - }) -}) diff --git a/solidity-v1/test/token_stake/TestLockUtils.js b/solidity-v1/test/token_stake/TestLockUtils.js deleted file mode 100644 index 602808b1b4..0000000000 --- a/solidity-v1/test/token_stake/TestLockUtils.js +++ /dev/null @@ -1,94 +0,0 @@ -const { contract, accounts, web3 } = require("@openzeppelin/test-environment") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -const LockStub = contract.fromArtifact("LockStub") - -describe("LockUtils", () => { - let locks - - const alice = accounts[0] - const bob = accounts[1] - const carol = accounts[2] - - before(async () => { - locks = await LockStub.new() - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - it("sets locks", async () => { - expect(await locks.publicContains(alice)).to.be.false - await locks.publicSetLock(alice, 1) - expect(await locks.publicContains(alice)).to.be.true - }) - - it("releases locks", async () => { - await locks.publicSetLock(alice, 1) - expect(await locks.publicContains(alice)).to.be.true - await locks.publicReleaseLock(alice) - expect(await locks.publicContains(alice)).to.be.false - }) - - it("overwrites existing locks", async () => { - await locks.publicSetLock(alice, 2) - await locks.publicSetLock(bob, 2) - const creatorsPre = await locks.publicEnumerateCreators() - expect(creatorsPre[0]).to.equal(alice) - expect(creatorsPre[1]).to.equal(bob) - expect(await locks.publicGetLockTime(alice)).to.eq.BN(2) - expect(await locks.publicGetLockTime(bob)).to.eq.BN(2) - - await locks.publicSetLock(alice, 1) - await locks.publicSetLock(bob, 3) - const creatorsPost = await locks.publicEnumerateCreators() - expect(creatorsPost[0]).to.equal(alice) - expect(creatorsPost[1]).to.equal(bob) - expect(await locks.publicGetLockTime(alice)).to.eq.BN(1) - expect(await locks.publicGetLockTime(bob)).to.eq.BN(3) - }) - - it("reorders locks correctly when deleting", async () => { - await locks.publicSetLock(alice, 1) - await locks.publicSetLock(bob, 2) - await locks.publicSetLock(carol, 3) - const creatorsPre = await locks.publicEnumerateCreators() - expect(creatorsPre[0]).to.equal(alice) - expect(creatorsPre[1]).to.equal(bob) - expect(creatorsPre[2]).to.equal(carol) - - await locks.publicReleaseLock(bob) - const creatorsPost = await locks.publicEnumerateCreators() - expect(creatorsPost[0]).to.equal(alice) - expect(creatorsPost[1]).to.equal(carol) - - await locks.publicSetLock(bob, 2) - const creatorsDoublePost = await locks.publicEnumerateCreators() - expect(creatorsDoublePost[0]).to.equal(alice) - expect(creatorsDoublePost[1]).to.equal(carol) - expect(creatorsDoublePost[2]).to.equal(bob) - - await locks.publicReleaseLock(alice) - const creatorsTriplePost = await locks.publicEnumerateCreators() - expect(creatorsTriplePost[0]).to.equal(bob) - expect(creatorsTriplePost[1]).to.equal(carol) - - await locks.publicReleaseLock(bob) - const creatorsQuadPost = await locks.publicEnumerateCreators() - expect(creatorsQuadPost[0]).to.equal(carol) - - await locks.publicReleaseLock(carol) - const creatorsPentaPost = await locks.publicEnumerateCreators() - expect(creatorsPentaPost.length).to.equal(0) - }) -}) diff --git a/solidity-v1/test/token_stake/TestMinimumStake.js b/solidity-v1/test/token_stake/TestMinimumStake.js deleted file mode 100644 index f0c3407f59..0000000000 --- a/solidity-v1/test/token_stake/TestMinimumStake.js +++ /dev/null @@ -1,82 +0,0 @@ -const { contract, web3 } = require("@openzeppelin/test-environment") -const { time } = require("@openzeppelin/test-helpers") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -const MinimumStakeScheduleStub = contract.fromArtifact( - "MinimumStakeScheduleStub" -) - -describe("TokenStaking/MinimumStake", function () { - let scheduleLib - let scheduleStart - - const schedule = web3.utils.toBN(86400 * 365 * 2) - const steps = web3.utils.toBN(10) - const stepDuration = schedule.div(steps) // 2 years / 10 intervals - - const keepDecimals = web3.utils.toBN(10).pow(web3.utils.toBN(18)) - - before(async () => { - scheduleLib = await MinimumStakeScheduleStub.new() - scheduleStart = await time.latest() - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("minimumStake", async () => { - it("returns max value when the schedule starts", async () => { - expect(await scheduleLib.current()).to.eq.BN( - web3.utils.toBN(100000).mul(keepDecimals), - "Unexpected minimum stake amount" - ) - }) - - it("returns max value right before the next schedule step", async () => { - const timeForStepOne = scheduleStart.add(stepDuration) - // Rounding timestamp jump to 1 minute less (looks like increaseTime() can occasionally add extra seconds) - await time.increase( - timeForStepOne.sub(await time.latest()).sub(time.duration.minutes(1)) - ) - expect(await scheduleLib.current()).to.eq.BN( - web3.utils.toBN(100000).mul(keepDecimals), - "Unexpected minimum stake amount" - ) - }) - - it("returns correct value right after the first schedule step", async () => { - const timeForStepOne = scheduleStart.add(stepDuration) - await time.increase(timeForStepOne.sub(await time.latest())) - expect(await scheduleLib.current()).to.eq.BN( - web3.utils.toBN(90000).mul(keepDecimals), - "Unexpected minimum stake amount" - ) - }) - - it("returns half value in the middle of the schedule", async () => { - await time.increase(schedule.divn(2).toNumber()) - expect(await scheduleLib.current()).to.eq.BN( - web3.utils.toBN(50000).mul(keepDecimals), - "Unexpected minimum stake amount" - ) - }) - - it("returns min value when the schedule ends", async () => { - await time.increase(schedule.toNumber()) - expect(await scheduleLib.current()).to.eq.BN( - web3.utils.toBN(10000).mul(keepDecimals), - "Unexpected minimum stake amount" - ) - }) - }) -}) diff --git a/solidity-v1/test/token_stake/TestPunishment.js b/solidity-v1/test/token_stake/TestPunishment.js deleted file mode 100644 index f4df68841f..0000000000 --- a/solidity-v1/test/token_stake/TestPunishment.js +++ /dev/null @@ -1,285 +0,0 @@ -const { contract, accounts, web3 } = require("@openzeppelin/test-environment") -const { expectRevert, time } = require("@openzeppelin/test-helpers") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot") -const { initTokenStaking } = require("../helpers/initContracts") -const stakeDelegate = require("../helpers/stakeDelegate") - -const KeepToken = contract.fromArtifact("KeepToken") -const TokenGrant = contract.fromArtifact("TokenGrant") -const KeepRegistry = contract.fromArtifact("KeepRegistry") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -describe("TokenStaking/Punishment", () => { - let token - let registry - let stakingContract - - const owner = accounts[0] - const registryKeeper = accounts[1] - const operator = accounts[2] - const authorizer = accounts[3] - const operatorContract = accounts[4] - const tattletale = accounts[5] - - let largeStake - let minimumStake - - const initializationPeriod = time.duration.seconds(10) - - before(async () => { - token = await KeepToken.new({ from: owner }) - tokenGrant = await TokenGrant.new(token.address, { from: owner }) - registry = await KeepRegistry.new({ from: owner }) - const stakingContracts = await initTokenStaking( - token.address, - tokenGrant.address, - registry.address, - initializationPeriod, - contract.fromArtifact("TokenStakingStub") - ) - stakingContract = stakingContracts.tokenStaking - - await registry.setRegistryKeeper(registryKeeper, { from: owner }) - - minimumStake = await stakingContract.minimumStake() - largeStake = minimumStake.muln(2) - - await registry.approveOperatorContract(operatorContract, { - from: registryKeeper, - }) - - await stakeDelegate( - stakingContract, - token, - owner, - operator, - owner, - authorizer, - largeStake - ) - - await stakingContract.authorizeOperatorContract( - operator, - operatorContract, - { from: authorizer } - ) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("slash", () => { - it("should slash token amount from stake", async () => { - time.increase((await stakingContract.initializationPeriod()).addn(1)) - - const amountToSlash = web3.utils.toBN(42000000) - - const balanceBeforeSlashing = await stakingContract.balanceOf(operator) - await stakingContract.slash(amountToSlash, [operator], { - from: operatorContract, - }) - const balanceAfterSlashing = await stakingContract.balanceOf(operator) - - expect(balanceAfterSlashing).to.eq.BN( - balanceBeforeSlashing.sub(amountToSlash) - ) - }) - - it("should slash no more than available on stake", async () => { - time.increase((await stakingContract.initializationPeriod()).addn(1)) - - const amountToSlash = largeStake.add(web3.utils.toBN(100)) - await stakingContract.slash(amountToSlash, [operator], { - from: operatorContract, - }) - const balanceAfterSlashing = await stakingContract.balanceOf(operator) - - expect(balanceAfterSlashing).to.eq.BN(0) - }) - - it("should not fail if operator is slashed to zero", async () => { - time.increase((await stakingContract.initializationPeriod()).addn(1)) - - const amountToSlash = largeStake - - // the first slash will slash to 0, the second one has nothing - // to slash; it should not fail - await stakingContract.slash(amountToSlash, [operator], { - from: operatorContract, - }) - await stakingContract.slash(amountToSlash, [operator], { - from: operatorContract, - }) - - const balanceAfterSlashing = await stakingContract.balanceOf(operator) - expect(balanceAfterSlashing).to.eq.BN(0) - }) - - it("should fail when operator stake is not active yet", async () => { - const amountToSlash = web3.utils.toBN(1000) - await expectRevert( - stakingContract.slash(amountToSlash, [operator], { - from: operatorContract, - }), - "Inactive stake" - ) - }) - - it("should fail when operator stake is released", async () => { - time.increase((await stakingContract.initializationPeriod()).addn(1)) - await stakingContract.undelegate(operator, { from: owner }) - time.increase((await stakingContract.undelegationPeriod()).addn(1)) - - const amountToSlash = web3.utils.toBN(100) - await expectRevert( - stakingContract.slash(amountToSlash, [operator], { - from: operatorContract, - }), - "Stake is released" - ) - }) - }) - - describe("seize", () => { - it("should seize token amount from stake", async () => { - time.increase((await stakingContract.initializationPeriod()).addn(1)) - - const operatorBalanceBeforeSeizing = await stakingContract.balanceOf( - operator - ) - const tattletaleBalanceBeforeSeizing = await token.balanceOf(tattletale) - - const amountToSeize = web3.utils.toBN(42000000) - const rewardMultiplier = web3.utils.toBN(25) - await stakingContract.seize( - amountToSeize, - rewardMultiplier, - tattletale, - [operator], - { from: operatorContract } - ) - - const operatorBalanceAfterSeizing = await stakingContract.balanceOf( - operator - ) - const tattletaleBalanceAfterSeizing = await token.balanceOf(tattletale) - - expect(operatorBalanceAfterSeizing).to.eq.BN( - operatorBalanceBeforeSeizing.sub(amountToSeize) - ) - - // 525000 = (42000000 * 5 / 100) * 25 / 100 - const expectedTattletaleReward = web3.utils.toBN(525000) - expect(tattletaleBalanceAfterSeizing).to.eq.BN( - tattletaleBalanceBeforeSeizing.add(expectedTattletaleReward) - ) - }) - - it("should seize no more than available on stake", async () => { - time.increase((await stakingContract.initializationPeriod()).addn(1)) - - const tattletaleBalanceBeforeSeizing = await token.balanceOf(tattletale) - - // we test with a higher excess to ensure that the tattletale reward - // is calculated from the applied penalty, not the requested penalty - const amountToSeize = largeStake.muln(2) // 400000000000000000000000 - const rewardMultiplier = web3.utils.toBN(10) - await stakingContract.seize( - amountToSeize, - rewardMultiplier, - tattletale, - [operator], - { from: operatorContract } - ) - - const operatorBalanceAfterSeizing = await stakingContract.balanceOf( - operator - ) - const tattletaleBalanceAfterSeizing = await token.balanceOf(tattletale) - - expect(operatorBalanceAfterSeizing).to.eq.BN(0) - - // 1000000000000000000000 = (200000000000000000000000 * 5 / 100) * 10 / 100 - const expectedTattletaleReward = web3.utils.toBN("1000000000000000000000") - expect(tattletaleBalanceAfterSeizing).to.eq.BN( - tattletaleBalanceBeforeSeizing.add(expectedTattletaleReward) - ) - }) - - it("should not fail if operator is slashed to zero", async () => { - time.increase((await stakingContract.initializationPeriod()).addn(1)) - - const amountToSlash = largeStake - const amountToSeize = largeStake - const rewardMultiplier = web3.utils.toBN(10) - - const tattletaleBalanceBeforeSeizing = await token.balanceOf(tattletale) - - // the first slash will slash to 0, the seize happening later - // should not fail - await stakingContract.slash(amountToSlash, [operator], { - from: operatorContract, - }) - await stakingContract.seize( - amountToSeize, - rewardMultiplier, - tattletale, - [operator], - { from: operatorContract } - ) - - const operatorBalanceAfterSeizing = await stakingContract.balanceOf( - operator - ) - const tattletaleBalanceAfterSeizing = await token.balanceOf(tattletale) - - expect(operatorBalanceAfterSeizing).to.eq.BN(0) - expect(tattletaleBalanceAfterSeizing).to.eq.BN( - tattletaleBalanceBeforeSeizing - ) - }) - - it("should fail when operator stake is not active yet", async () => { - const amountToSeize = web3.utils.toBN(42000000) - const rewardMultiplier = web3.utils.toBN(25) - await expectRevert( - stakingContract.seize( - amountToSeize, - rewardMultiplier, - tattletale, - [operator], - { from: operatorContract } - ), - "Inactive stake" - ) - }) - - it("should fail when operator stake is released", async () => { - time.increase((await stakingContract.initializationPeriod()).addn(1)) - await stakingContract.undelegate(operator, { from: owner }) - time.increase((await stakingContract.undelegationPeriod()).addn(1)) - - const amountToSeize = web3.utils.toBN(10000) - const rewardMultiplier = web3.utils.toBN(25) - await expectRevert( - stakingContract.seize( - amountToSeize, - rewardMultiplier, - tattletale, - [operator], - { from: operatorContract } - ), - "Stake is released" - ) - }) - }) -}) diff --git a/solidity-v1/test/token_stake/TestStakingPortBacker.js b/solidity-v1/test/token_stake/TestStakingPortBacker.js deleted file mode 100644 index d0b885ecfd..0000000000 --- a/solidity-v1/test/token_stake/TestStakingPortBacker.js +++ /dev/null @@ -1,779 +0,0 @@ -const { contract, accounts, web3 } = require("@openzeppelin/test-environment") -const { - expectRevert, - expectEvent, - time, -} = require("@openzeppelin/test-helpers") -const { initTokenStaking } = require("../helpers/initContracts") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot") - -const { - grantTokens, - grantTokensToManagedGrant, -} = require("../helpers/grantTokens") -const { - delegateStake, - delegateStakeFromGrant, - delegateStakeFromManagedGrant, -} = require("../helpers/delegateStake") - -const KeepToken = contract.fromArtifact("KeepToken") -const KeepRegistry = contract.fromArtifact("KeepRegistry") -const TokenGrant = contract.fromArtifact("TokenGrant") -const PermissiveStakingPolicy = contract.fromArtifact("PermissiveStakingPolicy") -const ManagedGrantFactory = contract.fromArtifact("ManagedGrantFactory") -const ManagedGrant = contract.fromArtifact("ManagedGrant") -const StakingPortBacker = contract.fromArtifact("StakingPortBacker") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -describe("TokenStaking/StakingPortBacker", () => { - const deployer = accounts[0] - const owner = accounts[1] - ;(grantManager = accounts[2]), - (grantee = accounts[3]), - (managedGrantee = accounts[4]), - (tokenOwner = accounts[5]), - (operatorOne = accounts[6]), - (operatorTwo = accounts[7]), - (operatorThree = accounts[8]), - (operatorFour = accounts[9]), - (thirdParty = accounts[10]), - (authorizerOne = accounts[11]), - (authorizerTwo = "0x79a6a0eaA71954Bfe9F5bEE10B5AF2FbadE44994"), - (authorizerThree = "0x2E9D84B5c9330903314C9312617138FA3735563a") - ;(beneficiaryOne = "0xa52f52B17dcbDCFEd54C6b9eA5878920974FC69a"), - (beneficiaryTwo = "0x0A8298210F3037AF8c1526F536683D5E4AEA3803"), - (beneficiaryThree = "0xbcD762a1493b5350070E6eB93baeC06EE3D47Ea7") - - const initializationPeriod = time.duration.seconds(10) - const grantStart = time.duration.seconds(0) - const grantUnlockingDuration = time.duration.years(100) - const grantCliff = time.duration.seconds(0) - const grantRevocable = true - - let token - let tokenGrant - let registry - - let oldTokenStaking - let newTokenStaking - - let stakingPortBacker - - let grantId - let managedGrant - let grantedAmount - let delegatedAmount - - before(async () => { - // - // Deploy KEEP token contract. - // Transfer 50% of all tokens to grant manager and 1% of tokens - // to token owner (account delegating liquid tokens in tests). - // - token = await KeepToken.new({ from: deployer }) - const allTokens = await token.balanceOf(deployer) - await token.transfer(grantManager, allTokens.divn(2), { from: deployer }) - await token.transfer(tokenOwner, allTokens.divn(100), { from: deployer }) - - // - // Deploy TokenGrant, ManagedGrantFactory, KeepRegistry - // - tokenGrant = await TokenGrant.new(token.address, { from: deployer }) - const permissivePolicy = await PermissiveStakingPolicy.new() - const managedGrantFactory = await ManagedGrantFactory.new( - token.address, - tokenGrant.address, - { from: deployer } - ) - registry = await KeepRegistry.new({ from: deployer }) - - // - // Deploy TokenStaking that will act as the previous - // staking contract instance. - // - const oldStakingContracts = await initTokenStaking( - token.address, - tokenGrant.address, - registry.address, - initializationPeriod, - contract.fromArtifact("TokenStaking") - ) - oldTokenStaking = oldStakingContracts.tokenStaking - await tokenGrant.authorizeStakingContract(oldTokenStaking.address, { - from: grantManager, - }) - - // - // Deploy TokenStaking that will act as the new - // staking contract instance. - // - const newStakingContracts = await initTokenStaking( - token.address, - tokenGrant.address, - registry.address, - initializationPeriod, - contract.fromArtifact("TokenStaking") - ) - newTokenStaking = newStakingContracts.tokenStaking - await tokenGrant.authorizeStakingContract(newTokenStaking.address, { - from: grantManager, - }) - - // - // Deploy StakingPortBacker - the contract under the test. - // - stakingPortBacker = await StakingPortBacker.new( - token.address, - tokenGrant.address, - oldTokenStaking.address, - newTokenStaking.address, - { from: deployer } - ) - await stakingPortBacker.transferOwnership(owner, { from: deployer }) - - // - // Create two grants: standard grant and managed grant. - // - const minimumStake = await oldTokenStaking.minimumStake() - grantedAmount = minimumStake.muln(40) - delegatedAmount = minimumStake.muln(20) - - grantId = await grantTokens( - tokenGrant, - token, - grantedAmount, - grantManager, - grantee, - grantUnlockingDuration, - grantStart, - grantCliff, - grantRevocable, - permissivePolicy.address - ) - const managedGrantAddress = await grantTokensToManagedGrant( - managedGrantFactory, - token, - grantedAmount, - grantManager, - managedGrantee, - grantUnlockingDuration, - grantStart, - grantCliff, - false, - permissivePolicy.address - ) - managedGrant = await ManagedGrant.at(managedGrantAddress) - - // - // Delegate stakes to the old staking contract: - // - operatorOne receives delegation from liquid tokens of tokenOwner - // - operatorTwo receives delegation from granted tokens of grantee - // from the first grant - // - operatorThree receives delegation from granted tokens of managed - // grantee. - // - await delegateStake( - token, - oldTokenStaking, - tokenOwner, - operatorOne, - beneficiaryOne, - authorizerOne, - delegatedAmount - ) - await delegateStakeFromGrant( - tokenGrant, - oldTokenStaking.address, - grantee, - operatorTwo, - beneficiaryTwo, - authorizerTwo, - delegatedAmount, - grantId - ) - await delegateStakeFromManagedGrant( - managedGrant, - oldTokenStaking.address, - managedGrantee, - operatorThree, - beneficiaryThree, - authorizerThree, - delegatedAmount - ) - - // transfer the same amount of tokens as staked in old staking contract - // to StakingPortBacker. - const allDelegatedTokens = await token.balanceOf(oldTokenStaking.address) - await token.transfer(stakingPortBacker.address, allDelegatedTokens, { - from: deployer, - }) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - describe("allowOperator", async () => { - it("fails when not called by the owner", async () => { - await expectRevert( - stakingPortBacker.allowOperator(operatorOne, { from: deployer }), - "Ownable: caller is not the owner" - ) - await expectRevert( - stakingPortBacker.allowOperator(operatorOne, { from: operatorOne }), - "Ownable: caller is not the owner" - ) - await expectRevert( - stakingPortBacker.allowOperator(operatorOne, { from: tokenOwner }), - "Ownable: caller is not the owner" - ) - }) - - it("can be called by the owner", async () => { - await stakingPortBacker.allowOperator(operatorOne, { from: owner }) - // ok, no revert - }) - - it("lets the allowed operator copy its stake", async () => { - await stakingPortBacker.allowOperator(operatorOne, { from: owner }) - await stakingPortBacker.allowOperator(operatorTwo, { from: owner }) - await stakingPortBacker.allowOperator(operatorThree, { from: owner }) - - await stakingPortBacker.copyStake(operatorOne, { from: tokenOwner }) - await stakingPortBacker.copyStake(operatorTwo, { from: grantee }) - await stakingPortBacker.copyStake(operatorThree, { from: managedGrantee }) - // ok, no revert - }) - }) - - describe("allowOperators", async () => { - it("fails when not called by the owner", async () => { - await expectRevert( - stakingPortBacker.allowOperators([operatorOne, operatorTwo], { - from: deployer, - }), - "Ownable: caller is not the owner" - ) - await expectRevert( - stakingPortBacker.allowOperators([operatorOne, operatorTwo], { - from: operatorOne, - }), - "Ownable: caller is not the owner" - ) - await expectRevert( - stakingPortBacker.allowOperators([operatorOne, operatorTwo], { - from: tokenOwner, - }), - "Ownable: caller is not the owner" - ) - }) - - it("can be called by the owner", async () => { - await stakingPortBacker.allowOperators( - [operatorOne, operatorTwo, operatorThree], - { from: owner } - ) - }) - - it("lets all allowed operators copy their stake", async () => { - await stakingPortBacker.allowOperators( - [operatorOne, operatorTwo, operatorThree], - { from: owner } - ) - - await stakingPortBacker.copyStake(operatorOne, { from: tokenOwner }) - await stakingPortBacker.copyStake(operatorTwo, { from: grantee }) - await stakingPortBacker.copyStake(operatorThree, { from: managedGrantee }) - // ok, no revert - }) - }) - - describe("copyStake", async () => { - beforeEach(async () => { - await stakingPortBacker.allowOperators( - [operatorOne, operatorTwo, operatorThree], - { from: owner } - ) - }) - - it("fails when operator is not staked on the old contract", async () => { - await stakingPortBacker.allowOperator(operatorFour, { from: owner }) - await expectRevert( - stakingPortBacker.copyStake(operatorFour), - "No stake on the old staking contract" - ) - }) - - it("fails when the operator is not on the allowed operators list", async () => { - await delegateStake( - token, - oldTokenStaking, - tokenOwner, - operatorFour, - beneficiaryOne, - authorizerOne, - delegatedAmount - ) - - await expectRevert( - stakingPortBacker.copyStake(operatorFour), - "Operator not allowed" - ) - }) - - it("copies liquid tokens stake to the new staking contract", async () => { - await stakingPortBacker.copyStake(operatorOne, { from: tokenOwner }) - - expect(await newTokenStaking.beneficiaryOf(operatorOne)).to.equal( - beneficiaryOne - ) - expect(await newTokenStaking.authorizerOf(operatorOne)).to.equal( - authorizerOne - ) - expect(await newTokenStaking.balanceOf(operatorOne)).to.eq.BN( - delegatedAmount - ) - expect(await newTokenStaking.ownerOf(operatorOne)).to.equal( - stakingPortBacker.address - ) - }) - - it("copies grant stake to the new staking contract", async () => { - await stakingPortBacker.copyStake(operatorTwo, { from: grantee }) - - expect(await newTokenStaking.beneficiaryOf(operatorTwo)).to.equal( - beneficiaryTwo - ) - expect(await newTokenStaking.authorizerOf(operatorTwo)).to.equal( - authorizerTwo - ) - expect(await newTokenStaking.balanceOf(operatorTwo)).to.eq.BN( - delegatedAmount - ) - expect(await newTokenStaking.ownerOf(operatorTwo)).to.equal( - stakingPortBacker.address - ) - }) - - it("fails when there is no grant delegation for grantee and operator", async () => { - await expectRevert( - stakingPortBacker.copyStake(operatorOne, { from: grantee }), - "No grant delegated for the operator" - ) - }) - - it("fails when not called by grant delegation owner", async () => { - await expectRevert( - stakingPortBacker.copyStake(operatorTwo, { from: operatorTwo }), - "Not authorized" - ) - await expectRevert( - stakingPortBacker.copyStake(operatorTwo, { from: thirdParty }), - "Not authorized" - ) - }) - - it("copies managed grant stake to the new staking contract", async () => { - await stakingPortBacker.copyStake(operatorThree, { from: managedGrantee }) - - expect(await newTokenStaking.beneficiaryOf(operatorThree)).to.equal( - beneficiaryThree - ) - expect(await newTokenStaking.authorizerOf(operatorThree)).to.equal( - authorizerThree - ) - expect(await newTokenStaking.balanceOf(operatorThree)).to.eq.BN( - delegatedAmount - ) - expect(await newTokenStaking.ownerOf(operatorThree)).to.equal( - stakingPortBacker.address - ) - }) - - it("allows to copy stake only one time", async () => { - await stakingPortBacker.copyStake(operatorOne, { from: tokenOwner }) - await stakingPortBacker.copyStake(operatorTwo, { from: grantee }) - await stakingPortBacker.copyStake(operatorThree, { from: managedGrantee }) - - await expectRevert( - stakingPortBacker.copyStake(operatorOne, { from: tokenOwner }), - "Stake already copied" - ) - await expectRevert( - stakingPortBacker.copyStake(operatorTwo, { from: grantee }), - "Stake already copied" - ) - await expectRevert( - stakingPortBacker.copyStake(operatorThree, { from: managedGrantee }), - "Stake already copied" - ) - }) - - it("allows to copy stake only one time even if it's been recovered", async () => { - await stakingPortBacker.copyStake(operatorOne, { from: tokenOwner }) - await stakingPortBacker.copyStake(operatorTwo, { from: grantee }) - await stakingPortBacker.copyStake(operatorThree, { from: managedGrantee }) - - await time.increase(time.duration.days(91)) - - await stakingPortBacker.undelegate(operatorOne, { from: tokenOwner }) - await stakingPortBacker.undelegate(operatorTwo, { from: grantee }) - await stakingPortBacker.undelegate(operatorThree, { - from: managedGrantee, - }) - - const undelegationPeriod = await newTokenStaking.undelegationPeriod() - await time.increase(undelegationPeriod.addn(1)) - - await stakingPortBacker.recoverStake(operatorOne, { from: tokenOwner }) - await stakingPortBacker.recoverStake(operatorTwo, { from: grantee }) - await stakingPortBacker.recoverStake(operatorThree, { - from: managedGrantee, - }) - - await expectRevert( - stakingPortBacker.copyStake(operatorOne, { from: tokenOwner }), - "Stake already copied" - ) - await expectRevert( - stakingPortBacker.copyStake(operatorTwo, { from: grantee }), - "Stake already copied" - ) - await expectRevert( - stakingPortBacker.copyStake(operatorThree, { from: managedGrantee }), - "Stake already copied" - ) - }) - - it("emits an event", async () => { - const receipt = await stakingPortBacker.copyStake(operatorOne, { - from: tokenOwner, - }) - await expectEvent(receipt, "StakeCopied", { - owner: tokenOwner, - operator: operatorOne, - value: delegatedAmount, - }) - }) - }) - - describe("repaying backed balances", async () => { - beforeEach(async () => { - await stakingPortBacker.allowOperators( - [operatorOne, operatorTwo, operatorThree], - { from: owner } - ) - - await stakingPortBacker.copyStake(operatorOne, { from: tokenOwner }) - await stakingPortBacker.copyStake(operatorTwo, { from: grantee }) - await stakingPortBacker.copyStake(operatorThree, { from: managedGrantee }) - - await time.increase(initializationPeriod.addn(1)) - }) - - it("fails for unknown token", async () => { - const anotherToken = await KeepToken.new({ from: deployer }) - const data = web3.eth.abi.encodeParameters(["address"], [operatorOne]) - await expectRevert( - anotherToken.approveAndCall( - stakingPortBacker.address, - delegatedAmount, - data, - { from: tokenOwner } - ), - "Not a KEEP token" - ) - }) - - it("fails for less tokens than backed", async () => { - const data = web3.eth.abi.encodeParameters(["address"], [operatorOne]) - await expectRevert( - token.approveAndCall( - stakingPortBacker.address, - delegatedAmount.subn(1), - data, - { from: tokenOwner } - ), - "Unexpected amount" - ) - }) - - it("fails for more tokens than backed", async () => { - const data = web3.eth.abi.encodeParameters(["address"], [operatorOne]) - await expectRevert( - token.approveAndCall( - stakingPortBacker.address, - delegatedAmount.addn(1), - data, - { from: tokenOwner } - ), - "Unexpected amount" - ) - }) - - it("fails for operator with no tokens backed", async () => { - const data = web3.eth.abi.encodeParameters(["address"], [operatorFour]) - await expectRevert( - token.approveAndCall(stakingPortBacker.address, delegatedAmount, data, { - from: tokenOwner, - }), - "Stake not copied for the operator" - ) - }) - - it("fails for corrupted input data", async () => { - await expectRevert( - token.approveAndCall( - stakingPortBacker.address, - delegatedAmount, - web3.eth.abi.encodeParameters(["uint256", "uint256"], [1, 2]), - { from: tokenOwner } - ), - "Corrupted input data" - ) - }) - - it("can be done only one time for the operator", async () => { - const data = web3.eth.abi.encodeParameters(["address"], [operatorOne]) - await token.approveAndCall( - stakingPortBacker.address, - delegatedAmount, - data, - { from: tokenOwner } - ) - await expectRevert( - token.approveAndCall(stakingPortBacker.address, delegatedAmount, data, { - from: tokenOwner, - }), - "Already paid back" - ) - }) - - it("changes liquid tokens staking relationship owner to token owner", async () => { - const data = web3.eth.abi.encodeParameters(["address"], [operatorOne]) - await token.approveAndCall( - stakingPortBacker.address, - delegatedAmount, - data, - { from: tokenOwner } - ) - - expect(await newTokenStaking.ownerOf(operatorOne)).to.equal(tokenOwner) - }) - - it("changes grant staking relationship owner to grantee", async () => { - const data = web3.eth.abi.encodeParameters(["address"], [operatorTwo]) - await token.transfer(grantee, delegatedAmount, { from: deployer }) - await token.approveAndCall( - stakingPortBacker.address, - delegatedAmount, - data, - { from: grantee } - ) - - expect(await newTokenStaking.ownerOf(operatorTwo)).to.equal(grantee) - }) - - it("changes managed grant staking relationship owner to managed grantee", async () => { - const data = web3.eth.abi.encodeParameters(["address"], [operatorThree]) - await token.transfer(managedGrantee, delegatedAmount, { from: deployer }) - await token.approveAndCall( - stakingPortBacker.address, - delegatedAmount, - data, - { from: managedGrantee } - ) - - expect(await newTokenStaking.ownerOf(operatorThree)).to.equal( - managedGrantee - ) - }) - - it("fails when not done by the eventual staking relationship owner", async () => { - const data = web3.eth.abi.encodeParameters(["address"], [operatorOne]) - await expectRevert( - token.approveAndCall(stakingPortBacker.address, delegatedAmount, data, { - from: operatorOne, - }), - "Not authorized to pay back" - ) - await expectRevert( - token.approveAndCall(stakingPortBacker.address, delegatedAmount, data, { - from: thirdParty, - }), - "Not authorized to pay back" - ) - }) - - it("expects the original amount to be repaid if slashed", async () => { - // let's assume third party address is the operator contract - const operatorContract = thirdParty - - await registry.approveOperatorContract(operatorContract, { - from: deployer, - }) - await newTokenStaking.authorizeOperatorContract( - operatorOne, - operatorContract, - { from: authorizerOne } - ) - - const amountToSlash = 10000 - await newTokenStaking.slash(amountToSlash, [operatorOne], { - from: operatorContract, - }) - const currentBalance = await newTokenStaking.balanceOf(operatorOne) - - const data = web3.eth.abi.encodeParameters(["address"], [operatorOne]) - await expectRevert( - token.approveAndCall(stakingPortBacker.address, currentBalance, data, { - from: tokenOwner, - }), - "Unexpected amount" - ) // reverts - tokens were slashed but we expect the original amount to - // be repaid; - - await token.approveAndCall( - stakingPortBacker.address, - delegatedAmount, - data, - { from: tokenOwner } - ) - // ok, no revert - the original copied amount has been paid back - }) - }) - - describe("withdraw", async () => { - it("fails when not called by the owner", async () => { - await expectRevert( - stakingPortBacker.withdraw(1000, { from: thirdParty }), - "Ownable: caller is not the owner" - ) - }) - - it("allows owner to withdraw tokens", async () => { - const balanceBefore = await token.balanceOf(owner) - await stakingPortBacker.withdraw(9999, { from: owner }) - const balanceAfter = await token.balanceOf(owner) - - expect(balanceAfter.sub(balanceBefore)).to.eq.BN(9999) - }) - }) - - describe("undelegate", async () => { - beforeEach(async () => { - await stakingPortBacker.allowOperators( - [operatorOne, operatorTwo, operatorThree], - { from: owner } - ) - await stakingPortBacker.copyStake(operatorOne, { from: tokenOwner }) - await stakingPortBacker.copyStake(operatorTwo, { from: grantee }) - await stakingPortBacker.copyStake(operatorThree, { from: managedGrantee }) - - await time.increase(initializationPeriod.addn(1)) - }) - - it("fails when not called by the relationship owner or operator", async () => { - await expectRevert( - stakingPortBacker.undelegate(operatorOne, { from: owner }), - "Not authorized" - ) - await expectRevert( - stakingPortBacker.undelegate(operatorOne, { from: grantee }), - "Not authorized" - ) - await expectRevert( - stakingPortBacker.undelegate(operatorTwo, { from: tokenOwner }), - "Not authorized" - ) - }) - - it("can be called by the relationship owner", async () => { - await stakingPortBacker.undelegate(operatorOne, { from: tokenOwner }) - await stakingPortBacker.undelegate(operatorTwo, { from: grantee }) - await stakingPortBacker.undelegate(operatorThree, { - from: managedGrantee, - }) - // ok, no revert - }) - - it("can be called by the operator", async () => { - await stakingPortBacker.undelegate(operatorOne, { from: operatorOne }) - await stakingPortBacker.undelegate(operatorTwo, { from: operatorTwo }) - await stakingPortBacker.undelegate(operatorThree, { from: operatorThree }) - // ok, no revert - }) - - it("undelegates stake from the operator", async () => { - await stakingPortBacker.undelegate(operatorThree, { - from: managedGrantee, - }) - const delegationInfo = await newTokenStaking.getDelegationInfo( - operatorThree - ) - expect(delegationInfo.undelegatedAt).to.gt.BN(0) - expect(delegationInfo.undelegatedAt).to.lte.BN(await time.latest()) - }) - }) - - describe("forceUndelegate", async () => { - beforeEach(async () => { - await stakingPortBacker.allowOperator(operatorOne, { from: owner }) - await stakingPortBacker.copyStake(operatorOne, { from: tokenOwner }) - }) - - it("fails when not called by the owner", async () => { - await expectRevert( - stakingPortBacker.forceUndelegate(operatorOne, { from: operatorOne }), - "Ownable: caller is not the owner" - ) - }) - - it("fails when the maximum backing duration has not passed yet", async () => { - await time.increase(time.duration.days(59)) - await expectRevert( - stakingPortBacker.forceUndelegate(operatorOne, { from: owner }), - "Maximum allowed backing duration not exceeded yet" - ) - }) - - it("undelegates stake from the operator", async () => { - await time.increase(time.duration.days(91)) - await stakingPortBacker.forceUndelegate(operatorOne, { from: owner }) - const delegationInfo = await newTokenStaking.getDelegationInfo( - operatorOne - ) - expect(delegationInfo.undelegatedAt).to.gt.BN(0) - expect(delegationInfo.undelegatedAt).to.lte.BN(await time.latest()) - }) - }) - - describe("recoverStake", async () => { - beforeEach(async () => { - await stakingPortBacker.allowOperator(operatorOne, { from: owner }) - await stakingPortBacker.copyStake(operatorOne, { from: tokenOwner }) - }) - - it("allows to recover previously undelegated stake", async () => { - await time.increase(time.duration.days(91)) - await stakingPortBacker.undelegate(operatorOne, { from: tokenOwner }) - const undelegationPeriod = await newTokenStaking.undelegationPeriod() - await time.increase(undelegationPeriod.addn(1)) - - const balanceBefore = await token.balanceOf(stakingPortBacker.address) - await stakingPortBacker.recoverStake(operatorOne, { from: owner }) - const balanceAfter = await token.balanceOf(stakingPortBacker.address) - - expect(balanceAfter.sub(balanceBefore)).to.eq.BN(delegatedAmount) - }) - }) -}) diff --git a/solidity-v1/test/token_stake/TestTokenStake.js b/solidity-v1/test/token_stake/TestTokenStake.js deleted file mode 100644 index 34944ca8fe..0000000000 --- a/solidity-v1/test/token_stake/TestTokenStake.js +++ /dev/null @@ -1,1075 +0,0 @@ -const { contract, accounts, web3 } = require("@openzeppelin/test-environment") -const { - expectRevert, - expectEvent, - time, -} = require("@openzeppelin/test-helpers") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot") -const { initTokenStaking } = require("../helpers/initContracts") - -const BN = web3.utils.BN -const chai = require("chai") -chai.use(require("bn-chai")(BN)) -const expect = chai.expect - -// Depending on test network increaseTimeTo can be inconsistent and add -// extra time. As a workaround we subtract timeRoundMargin in all cases -// that test times before initialization/undelegation periods end. -const timeRoundMargin = time.duration.minutes(1) - -const KeepToken = contract.fromArtifact("KeepToken") -const TokenGrant = contract.fromArtifact("TokenGrant") -const KeepRegistry = contract.fromArtifact("KeepRegistry") - -describe("TokenStaking", function () { - let token - let tokenGrant - let registry - let stakingContract - let stakingAmount - let minimumStake - - const owner = accounts[0] - const operatorOne = accounts[2] - const operatorTwo = accounts[3] - const beneficiary = accounts[4] - const authorizer = accounts[5] - const operatorContract = accounts[6] - const thirdParty = accounts[7] - - const initializationPeriod = time.duration.minutes(10) - let undelegationPeriod - - before(async () => { - token = await KeepToken.new({ from: accounts[0] }) - tokenGrant = await TokenGrant.new(token.address, { from: accounts[0] }) - registry = await KeepRegistry.new({ from: accounts[0] }) - const stakingContracts = await initTokenStaking( - token.address, - tokenGrant.address, - registry.address, - initializationPeriod, - contract.fromArtifact("TokenStaking") - ) - stakingContract = stakingContracts.tokenStaking - - undelegationPeriod = await stakingContract.undelegationPeriod() - - await registry.approveOperatorContract(operatorContract, { - from: accounts[0], - }) - - minimumStake = await stakingContract.minimumStake() - stakingAmount = minimumStake.muln(20) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - async function delegate(operator, amount) { - const data = Buffer.concat([ - Buffer.from(beneficiary.substr(2), "hex"), - Buffer.from(operator.substr(2), "hex"), - Buffer.from(authorizer.substr(2), "hex"), - ]) - - return token.approveAndCall( - stakingContract.address, - amount, - "0x" + data.toString("hex"), - { from: owner } - ) - } - - describe("undelegationPeriod", async () => { - const twoWeeks = web3.utils.toBN("1209600") // [sec] - const twoMonths = web3.utils.toBN("5184000") // [sec] - - it("is two weeks right after deploying the contract", async () => { - expect(await stakingContract.undelegationPeriod()).to.eq.BN(twoWeeks) - }) - - it("is two weeks one month after deploying the contract", async () => { - await time.increase(time.duration.days(30)) - expect(await stakingContract.undelegationPeriod()).to.eq.BN(twoWeeks) - }) - - it("is two weeks before two months after the deployment passes", async () => { - await time.increase(time.duration.days(59)) - await time.increase(time.duration.hours(23)) - expect(await stakingContract.undelegationPeriod()).to.eq.BN(twoWeeks) - }) - - it("is two months after two months after the deployment passes", async () => { - await time.increase(time.duration.days(60)) - expect(await stakingContract.undelegationPeriod()).to.eq.BN(twoMonths) - }) - - it("remains as two months after two months after the deployment passes", async () => { - await time.increase(time.duration.days(180)) - expect(await stakingContract.undelegationPeriod()).to.eq.BN(twoMonths) - await time.increase(time.duration.days(360)) - expect(await stakingContract.undelegationPeriod()).to.eq.BN(twoMonths) - }) - }) - - describe("delegate", async () => { - it("should update balances", async () => { - const ownerStartBalance = await token.balanceOf.call(owner) - - await delegate(operatorOne, stakingAmount) - - const ownerEndBalance = await token.balanceOf.call(owner) - const operatorEndStakeBalance = await stakingContract.balanceOf.call( - operatorOne - ) - - expect(ownerEndBalance).to.eq.BN( - ownerStartBalance.sub(stakingAmount), - "Staking amount should be transferred from owner balance" - ) - expect(operatorEndStakeBalance).to.eq.BN( - stakingAmount, - "Staking amount should be added to the operator balance" - ) - }) - - it("should not allow to delegate to the same operator after recovering stake", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - await stakingContract.undelegate(operatorOne, { from: owner }) - await time.increase(undelegationPeriod.addn(1)) - await stakingContract.recoverStake(operatorOne) - - await expectRevert( - delegate(operatorOne, stakingAmount), - "Stake undelegated" - ) - }) - - it("should not allow to delegate less than the minimum stake", async () => { - await expectRevert( - delegate(operatorOne, minimumStake.subn(1)), - "Less than the minimum stake" - ) - }) - - it("should allow to delegate the minimum stake", async () => { - await delegate(operatorOne, minimumStake) - // ok, no reverts - }) - - it("should allow to delegate to two different operators", async () => { - const ownerStartBalance = await token.balanceOf.call(owner) - - await delegate(operatorOne, stakingAmount) - await delegate(operatorTwo, stakingAmount) - - const ownerEndBalance = await token.balanceOf.call(owner) - const operatorOneEndStakeBalance = await stakingContract.balanceOf.call( - operatorOne - ) - const operatorTwoEndStakeBalance = await stakingContract.balanceOf.call( - operatorTwo - ) - - expect(ownerEndBalance).to.eq.BN( - ownerStartBalance.sub(stakingAmount).sub(stakingAmount), - "Staking amount should be transferred from owner balance" - ) - expect(operatorOneEndStakeBalance).to.eq.BN( - stakingAmount, - "Staking amount should be added to the operator balance" - ) - expect(operatorTwoEndStakeBalance).to.eq.BN( - stakingAmount, - "Staking amount should be added to the operator balance" - ) - }) - - it("should emit OperatorStaked event", async () => { - await delegate(operatorOne, stakingAmount) - - const operatorStakedEvents = await stakingContract.getPastEvents( - "OperatorStaked" - ) - expect(operatorStakedEvents.length).to.equal(1) - const operatorStakedEvent = operatorStakedEvents[0] - expect(operatorStakedEvent.args["operator"]).to.equal(operatorOne) - expect(operatorStakedEvent.args["beneficiary"]).to.equal(beneficiary) - expect(operatorStakedEvent.args["authorizer"]).to.equal(authorizer) - }) - - it("should emit StakeDelegated event", async () => { - await delegate(operatorOne, stakingAmount) - - const stakeDelegatedEvents = await stakingContract.getPastEvents( - "StakeDelegated" - ) - expect(stakeDelegatedEvents.length).to.equal(1) - const stakeDelegatedEvent = stakeDelegatedEvents[0] - expect(stakeDelegatedEvent.args["owner"]).to.equal(owner) - expect(stakeDelegatedEvent.args["operator"]).to.equal(operatorOne) - }) - }) - - describe("cancelStake", async () => { - it("should let operator cancel delegation", async () => { - await delegate(operatorOne, stakingAmount) - - await stakingContract.cancelStake(operatorOne, { from: operatorOne }) - // ok, no revert - }) - - it("should not allow third party to cancel delegation", async () => { - await delegate(operatorOne, stakingAmount) - - await expectRevert( - stakingContract.cancelStake(operatorOne, { from: operatorTwo }), - "Not authorized" - ) - }) - - it("should allow to cancel delegation right away", async () => { - await delegate(operatorOne, stakingAmount) - - await stakingContract.cancelStake(operatorOne, { from: owner }) - // ok, no revert - }) - - it("should allow to cancel delegation just before initialization period is over", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo( - createdAt.add(initializationPeriod).sub(timeRoundMargin) - ) - - await stakingContract.cancelStake(operatorOne, { from: owner }) - // ok, no revert - }) - - it("should not allow to cancel delegation after initialization period is over", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - - await expectRevert( - stakingContract.cancelStake(operatorOne, { from: owner }), - "Initialized stake" - ) - }) - - it("should transfer tokens back to the owner", async () => { - const ownerStartBalance = await token.balanceOf.call(owner) - - await delegate(operatorOne, stakingAmount) - - await stakingContract.cancelStake(operatorOne, { from: owner }) - - const ownerEndBalance = await token.balanceOf.call(owner) - const operatorEndStakeBalance = await stakingContract.balanceOf.call( - operatorOne - ) - - expect(ownerEndBalance).to.eq.BN( - ownerStartBalance, - "Staking amount should be transferred back to owner" - ) - expect(operatorEndStakeBalance).to.eq.BN( - 0, - "Staking amount should be removed from operator balance" - ) - }) - - it("should retain delegation info", async () => { - await delegate(operatorOne, stakingAmount) - - const delegationInfoBefore = await stakingContract.getDelegationInfo.call( - operatorOne - ) - - await stakingContract.cancelStake(operatorOne, { from: owner }) - - const delegationInfoAfter = await stakingContract.getDelegationInfo.call( - operatorOne - ) - - expect(delegationInfoAfter.createdAt).to.eq.BN( - delegationInfoBefore.createdAt, - "Unexpected delegation creation time" - ) - expect(delegationInfoAfter.amount).to.eq.BN( - 0, - "Should have no delegated tokens" - ) - expect(delegationInfoAfter.undelegatedAt).to.eq.BN( - 0, - "Unexpected undelegation time" - ) - }) - - it("should not allow top-up on a cancelled stake within initialization period", async () => { - await delegate(operatorOne, stakingAmount) - await stakingContract.cancelStake(operatorOne, { from: owner }) - - // createdAt is preserved after cancel, so receiveApproval routes to topUp - // (not a new delegation). instantComplete must reject the cancelled operator. - await expectRevert( - delegate(operatorOne, stakingAmount), - "Operator stake already cancelled" - ) - }) - - it("should not allow top-up on a cancelled stake after initialization period passes", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await stakingContract.cancelStake(operatorOne, { from: owner }) - - // Advance past init period so the topUp path hits initiate() instead of - // instantComplete(). Both must reject the cancelled operator. - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - - await expectRevert( - delegate(operatorOne, stakingAmount), - "Operator stake already cancelled" - ) - }) - }) - - describe("undelegate", async () => { - it("should let operator undelegate", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - await stakingContract.undelegate(operatorOne, { from: operatorOne }) - // ok, no revert - }) - - it("should not allow third party to undelegate", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - await expectRevert( - stakingContract.undelegate(operatorOne, { from: operatorTwo }), - "Not authorized" - ) - }) - - it( - "should permit undelegating at the time when initialization " + - "period passed", - async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - await stakingContract.undelegate(operatorOne, { from: operatorOne }) - // ok, no revert - } - ) - - it( - "should not permit undelegating at the time before initialization " + - "period passed", - async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - await time.increaseTo( - createdAt.add(initializationPeriod).sub(timeRoundMargin) - ) - await expectRevert( - stakingContract.undelegate(operatorOne, { from: operatorOne }), - "Invalid timestamp" - ) - } - ) - - it("should let the operator undelegate earlier", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - const currentTime = await time.latest() - - await stakingContract.undelegateAt(operatorOne, currentTime.addn(20), { - from: operatorOne, - }) - - await stakingContract.undelegate(operatorOne, { from: operatorOne }) - // ok, no revert - }) - - it("should let the owner postpone undelegation", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - await stakingContract.undelegate(operatorOne, { from: operatorOne }) - - await stakingContract.undelegate(operatorOne, { from: owner }) - // ok, no revert - }) - - it("should not let the operator postpone undelegation", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - await stakingContract.undelegate(operatorOne, { from: operatorOne }) - - await expectRevert( - stakingContract.undelegate(operatorOne, { from: operatorOne }), - "Operator may not postpone" - ) - }) - }) - - describe("undelegateAt", async () => { - it("should let operator undelegate", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - - const currentTime = await time.latest() - - await stakingContract.undelegateAt(operatorOne, currentTime.addn(1), { - from: operatorOne, - }) - // ok, no revert - }) - - it("should not allow third party to undelegate", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - - const currentTime = await time.latest() - - await expectRevert( - stakingContract.undelegateAt(operatorOne, currentTime.addn(10), { - from: operatorTwo, - }), - "Not authorized" - ) - }) - - it("should permit undelegating at the current time", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - - const currentTime = await time.latest() - - await stakingContract.undelegateAt(operatorOne, currentTime.addn(1), { - from: operatorOne, - }) - // ok, no revert - }) - - it( - "should permit undelegating at the time when initialization " + - "period passed", - async () => { - await delegate(operatorOne, stakingAmount) - - const currentTime = await time.latest() - await stakingContract.undelegateAt( - operatorOne, - currentTime.add(initializationPeriod).addn(1), - { from: operatorOne } - ) - // ok, no revert - } - ) - - it( - "should not permit undelegating at the time before initialization " + - "period passed", - async () => { - await delegate(operatorOne, stakingAmount) - - const currentTime = await time.latest() - await expectRevert( - stakingContract.undelegateAt( - operatorOne, - currentTime.add(initializationPeriod).sub(timeRoundMargin), - { from: operatorOne } - ), - "Invalid timestamp" - ) - } - ) - - it("should not permit undelegating in the past", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - - const currentTime = await time.latest() - - await expectRevert( - stakingContract.undelegateAt(operatorOne, currentTime - 1, { - from: operatorOne, - }), - "Invalid timestamp" - ) - }) - - it("should let the operator undelegate earlier", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - const currentTime = await time.latest() - - await stakingContract.undelegateAt(operatorOne, currentTime.addn(20), { - from: operatorOne, - }) - - await stakingContract.undelegateAt(operatorOne, currentTime.addn(1), { - from: operatorOne, - }) - // ok, no revert - }) - - it("should let the owner postpone undelegation", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - await stakingContract.undelegate(operatorOne, { from: operatorOne }) - - const currentTime = await time.latest() - - await stakingContract.undelegateAt(operatorOne, currentTime.addn(1), { - from: owner, - }) - // ok, no revert - }) - - it("should not let the operator postpone undelegation", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - await stakingContract.undelegate(operatorOne, { from: operatorOne }) - - const currentTime = await time.latest() - - await expectRevert( - stakingContract.undelegateAt(operatorOne, currentTime.addn(1), { - from: operatorOne, - }), - "Operator may not postpone" - ) - }) - }) - - describe("recoverStake", async () => { - it("should not allow to recover stake without undelegating first", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo( - createdAt.add(initializationPeriod).add(undelegationPeriod) - ) - - await expectRevert( - stakingContract.recoverStake(operatorOne), - "Not undelegated" - ) - }) - - it("should not allow to recover stake before undelegation period is over", async () => { - let tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - tx = await stakingContract.undelegate(operatorOne, { from: owner }) - const undelegatedAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - await time.increaseTo( - undelegatedAt.add(undelegationPeriod).sub(timeRoundMargin) - ) - - await expectRevert( - stakingContract.recoverStake(operatorOne), - "Still undelegating" - ) - }) - - it("should transfer tokens back to the owner", async () => { - const ownerStartBalance = await token.balanceOf.call(owner) - - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - - await stakingContract.undelegate(operatorOne, { from: owner }) - await time.increase(undelegationPeriod.addn(1)) - await stakingContract.recoverStake(operatorOne) - - const ownerEndBalance = await token.balanceOf.call(owner) - const operatorEndStakeBalance = await stakingContract.balanceOf.call( - operatorOne - ) - - expect(ownerEndBalance).to.eq.BN( - ownerStartBalance, - "Staking amount should be transferred back to owner" - ) - expect(operatorEndStakeBalance).to.eq.BN( - 0, - "Staking amount should be removed from operator balance" - ) - }) - - it("should retain delegation info", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - - const delegationInfoBefore = await stakingContract.getDelegationInfo.call( - operatorOne - ) - - await stakingContract.undelegate(operatorOne, { from: owner }) - const blockNumber = await web3.eth.getBlockNumber() - const undelegationBlock = await web3.eth.getBlock(blockNumber) - - await time.increase(undelegationPeriod.addn(1)) - await stakingContract.recoverStake(operatorOne) - - const delegationInfoAfter = await stakingContract.getDelegationInfo.call( - operatorOne - ) - - expect(delegationInfoAfter.createdAt).to.eq.BN( - delegationInfoBefore.createdAt, - "Unexpected delegation creation time" - ) - expect(delegationInfoAfter.amount).to.eq.BN( - 0, - "Should have no delegated tokens" - ) - expect(delegationInfoAfter.undelegatedAt).to.eq.BN( - undelegationBlock.timestamp, - "Unexpected undelegation time" - ) - }) - - it("should withdraw no more tokens when called twice", async () => { - const tx = await delegate(operatorOne, stakingAmount) - await delegate(operatorTwo, stakingAmount) - // staking contract should now have 2 stakingAmount of KEEP - - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - - await stakingContract.undelegate(operatorOne, { from: owner }) - await time.increase(undelegationPeriod.addn(1)) - - // recover stake and capture owner and staking contract KEEP balances - await stakingContract.recoverStake(operatorOne) - const contractBalanceAfter = await token.balanceOf( - stakingContract.address - ) - const ownerBalanceAfter = await token.balanceOf(owner) - - // recover stake one more time and see that: - // - owner KEEP balance hasn't changed - // - staking contract KEEP balance hasn't changed - await stakingContract.recoverStake(operatorOne) - - await stakingContract.recoverStake(operatorOne) - expect(await token.balanceOf.call(owner)).to.eq.BN( - ownerBalanceAfter, - "Owner should receive no more tokens" - ) - expect(await token.balanceOf.call(stakingContract.address)).to.eq.BN( - contractBalanceAfter, - "Staking contract should send no more tokens" - ) - }) - }) - - describe("activeStake", async () => { - it("should report active stake after initialization period is over", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - await stakingContract.authorizeOperatorContract( - operatorOne, - operatorContract, - { from: authorizer } - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - - const activeStake = await stakingContract.activeStake.call( - operatorOne, - operatorContract - ) - - expect(activeStake).to.eq.BN( - stakingAmount, - "Active stake should equal staked amount" - ) - }) - - it("should report no active stake before initialization period is over", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - await stakingContract.authorizeOperatorContract( - operatorOne, - operatorContract, - { from: authorizer } - ) - - await time.increaseTo( - createdAt.add(initializationPeriod).sub(timeRoundMargin) - ) - - const activeStake = await stakingContract.activeStake.call( - operatorOne, - operatorContract - ) - - expect(activeStake).to.eq.BN(0, "There should be no active stake") - }) - - it("should report no active stake for not authorized operator contract", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - - const activeStake = await stakingContract.activeStake.call( - operatorOne, - operatorContract - ) - - expect(activeStake).to.eq.BN(0, "There should be no active stake") - }) - - it("should report no active stake after cancelling delegation", async () => { - await delegate(operatorOne, stakingAmount) - await stakingContract.authorizeOperatorContract( - operatorOne, - operatorContract, - { from: authorizer } - ) - - await stakingContract.cancelStake(operatorOne, { from: owner }) - - const activeStake = await stakingContract.activeStake.call( - operatorOne, - operatorContract - ) - - expect(activeStake).to.eq.BN(0, "There should be no active stake") - }) - - it("should report no active stake after undelegation is finished", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - await stakingContract.authorizeOperatorContract( - operatorOne, - operatorContract, - { from: authorizer } - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - await stakingContract.undelegate(operatorOne, { from: owner }) - await time.increase(undelegationPeriod.addn(1)) - - const activeStake = await stakingContract.activeStake.call( - operatorOne, - operatorContract - ) - - expect(activeStake).to.eq.BN(0, "There should be no active stake") - }) - }) - - describe("eligibleStake", async () => { - it("should report eligible stake after initialization period is over", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - await stakingContract.authorizeOperatorContract( - operatorOne, - operatorContract, - { from: authorizer } - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - - const eligibleStake = await stakingContract.eligibleStake.call( - operatorOne, - operatorContract - ) - - expect(eligibleStake).to.eq.BN( - stakingAmount, - "Eligible stake should equal staked amount" - ) - }) - - it("should report no eligible stake before initialization period is over", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - await stakingContract.authorizeOperatorContract( - operatorOne, - operatorContract, - { from: authorizer } - ) - await time.increaseTo( - createdAt.add(initializationPeriod).sub(timeRoundMargin) - ) - const eligibleStake = await stakingContract.eligibleStake.call( - operatorOne, - operatorContract - ) - - expect(eligibleStake).to.eq.BN(0, "There should be no active stake") - }) - - it("should report no eligible stake for not authorized operator contract", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - - const eligibleStake = await stakingContract.eligibleStake.call( - operatorOne, - operatorContract - ) - - expect(eligibleStake).to.eq.BN(0, "There should be no eligible stake") - }) - - it("should report no eligible stake after cancelling delegation", async () => { - await delegate(operatorOne, stakingAmount) - await stakingContract.authorizeOperatorContract( - operatorOne, - operatorContract, - { from: authorizer } - ) - - await stakingContract.cancelStake(operatorOne, { from: owner }) - - const eligibleStake = await stakingContract.eligibleStake.call( - operatorOne, - operatorContract - ) - - expect(eligibleStake).to.eq.BN(0, "There should be no eligible stake") - }) - - it("should report no eligible stake when undelegating", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - await stakingContract.authorizeOperatorContract( - operatorOne, - operatorContract, - { from: authorizer } - ) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - await stakingContract.undelegate(operatorOne, { from: owner }) - - await time.increase(1) - - const eligibleStake = await stakingContract.eligibleStake.call( - operatorOne, - operatorContract - ) - - expect(eligibleStake).to.eq.BN(0, "There should be no eligible stake") - }) - - it("should report eligible stake for future undelegation", async () => { - const tx = await delegate(operatorOne, stakingAmount) - const createdAt = web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - await stakingContract.authorizeOperatorContract( - operatorOne, - operatorContract, - { from: authorizer } - ) - - const delegationTime = time.duration.seconds(10) - - const currentTime = await time.latest() - const undelegateAt = currentTime - .add(initializationPeriod) - .add(delegationTime) - await stakingContract.undelegateAt(operatorOne, undelegateAt, { - from: owner, - }) - - await time.increaseTo(createdAt.add(initializationPeriod).addn(1)) - let eligibleStake = await stakingContract.eligibleStake.call( - operatorOne, - operatorContract - ) - expect(eligibleStake).to.eq.BN( - stakingAmount, - "Eligible stake should equal staked amount" - ) - - await time.increaseTo(undelegateAt.subn(1)) - eligibleStake = await stakingContract.eligibleStake.call( - operatorOne, - operatorContract - ) - expect(eligibleStake).to.eq.BN( - stakingAmount, - "Eligible stake should equal staked amount" - ) - }) - - it("should report no eligible stake for passed future undelegation", async () => { - await delegate(operatorOne, stakingAmount) - await stakingContract.authorizeOperatorContract( - operatorOne, - operatorContract, - { from: authorizer } - ) - - const delegationTime = time.duration.seconds(10) - - const currentTime = await time.latest() - const undelegateAt = currentTime - .add(initializationPeriod) - .add(delegationTime) - - await stakingContract.undelegateAt(operatorOne, undelegateAt, { - from: owner, - }) - - await time.increaseTo(undelegateAt.addn(1)) - - const eligibleStake = await stakingContract.eligibleStake.call( - operatorOne, - operatorContract - ) - expect(eligibleStake).to.eq.BN(0, "There should be no active stake") - }) - }) - - describe("transferStakeOwnership", async () => { - it("fails when not called by staking relationship owner", async () => { - await delegate(operatorOne, stakingAmount) - await expectRevert( - stakingContract.transferStakeOwnership(operatorOne, thirdParty, { - from: thirdParty, - }), - "Not authorized" - ) - }) - - it("transfers stake relationship ownership", async () => { - await delegate(operatorOne, stakingAmount) - await stakingContract.transferStakeOwnership(operatorOne, thirdParty, { - from: owner, - }) - const newOwner = await stakingContract.ownerOf(operatorOne) - expect(newOwner).to.equal(thirdParty) - }) - - it("emits an event", async () => { - await delegate(operatorOne, stakingAmount) - const receipt = await stakingContract.transferStakeOwnership( - operatorOne, - thirdParty, - { from: owner } - ) - - await expectEvent(receipt, "StakeOwnershipTransferred", { - operator: operatorOne, - newOwner: thirdParty, - }) - }) - }) -}) diff --git a/solidity-v1/test/token_stake/TestTokenStakeLock.js b/solidity-v1/test/token_stake/TestTokenStakeLock.js deleted file mode 100644 index 287e7356eb..0000000000 --- a/solidity-v1/test/token_stake/TestTokenStakeLock.js +++ /dev/null @@ -1,351 +0,0 @@ -const { contract, accounts, web3 } = require("@openzeppelin/test-environment") -const { expectRevert, time } = require("@openzeppelin/test-helpers") -const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") -const { initTokenStaking } = require("../helpers/initContracts") - -const KeepToken = contract.fromArtifact("KeepToken") -const TokenGrant = contract.fromArtifact("TokenGrant") -const KeepRegistry = contract.fromArtifact("KeepRegistry") - -describe("TokenStaking/Lock", () => { - let token - let registry - let stakingContract - let stakingAmount - let minimumStake - const owner = accounts[0] - const operator1 = accounts[1] - const operator2 = accounts[2] - const operator3 = accounts[3] - const beneficiary = accounts[4] - const authorizer = accounts[5] - const operatorContract = accounts[6] - const operatorContract2 = accounts[7] - - const initializationPeriod = time.duration.days(10) - let undelegationPeriod - const lockPeriod = time.duration.weeks(12) - - let createdAt - let operator - - before(async () => { - token = await KeepToken.new({ from: owner }) - grant = await TokenGrant.new(token.address, { from: owner }) - registry = await KeepRegistry.new({ from: owner }) - const stakingContracts = await initTokenStaking( - token.address, - grant.address, - registry.address, - initializationPeriod, - contract.fromArtifact("TokenStaking") - ) - stakingContract = stakingContracts.tokenStaking - - undelegationPeriod = await stakingContract.undelegationPeriod() - - await registry.approveOperatorContract(operatorContract, { from: owner }) - await registry.approveOperatorContract(operatorContract2, { from: owner }) - - minimumStake = await stakingContract.minimumStake() - stakingAmount = minimumStake.muln(20) - }) - - beforeEach(async () => { - await createSnapshot() - }) - - afterEach(async () => { - await restoreSnapshot() - }) - - async function delegate(operator, amount) { - const data = Buffer.concat([ - Buffer.from(beneficiary.substr(2), "hex"), - Buffer.from(operator.substr(2), "hex"), - Buffer.from(authorizer.substr(2), "hex"), - ]) - - return token.approveAndCall( - stakingContract.address, - amount, - "0x" + data.toString("hex"), - { from: owner } - ) - } - - async function timestampOf(tx) { - return web3.utils.toBN( - (await web3.eth.getBlock(tx.receipt.blockNumber)).timestamp - ) - } - - async function undelegate(operator) { - const tx = await stakingContract.undelegate(operator, { from: operator }) - const undelegatedAt = await timestampOf(tx) - await time.increaseTo(undelegationPeriod.add(undelegatedAt).addn(1)) - } - - describe("setting locks", async () => { - before(async () => { - operator = operator1 - const tx = await delegate(operator, stakingAmount) - await stakingContract.authorizeOperatorContract( - operator, - operatorContract, - { from: authorizer } - ) - - createdAt = await timestampOf(tx) - }) - - it("should not permit locks on non-initialized operators", async () => { - await expectRevert( - stakingContract.lockStake(operator, lockPeriod, { - from: operatorContract, - }), - "Inactive stake" - ) - }) - - it("should not permit locks on undelegating operators", async () => { - await time.increaseTo(initializationPeriod.add(createdAt).addn(1)) - const tx = await stakingContract.undelegate(operator, { from: operator }) - const undelegatedAt = await timestampOf(tx) - await time.increaseTo(undelegatedAt.addn(1)) - await expectRevert( - stakingContract.lockStake(operator, lockPeriod, { - from: operatorContract, - }), - "Undelegating stake" - ) - }) - - it("should not permit locks from unauthorized operator contracts", async () => { - await time.increaseTo(initializationPeriod.add(createdAt).addn(1)) - await expectRevert( - stakingContract.lockStake(operator, lockPeriod, { - from: operatorContract2, - }), - "Not authorized" - ) - }) - - it("should not permit locks from disabled operator contracts", async () => { - await time.increaseTo(initializationPeriod.add(createdAt).addn(1)) - await registry.disableOperatorContract(operatorContract, { from: owner }) - await expectRevert( - stakingContract.lockStake(operator, lockPeriod, { - from: operatorContract, - }), - "Operator contract unapproved" - ) - }) - - it("should not permit locks from unapproved operator contracts", async () => { - await time.increaseTo(initializationPeriod.add(createdAt).addn(1)) - await expectRevert( - stakingContract.lockStake(operator, lockPeriod, { from: operator }), - "Operator contract unapproved" - ) - }) - - it("should not permit locks that exceed the maximum lock duration", async () => { - await time.increaseTo(initializationPeriod.add(createdAt).addn(1)) - const maximumDuration = time.duration.days(200) - const longPeriod = maximumDuration.addn(1) - await expectRevert( - stakingContract.lockStake(operator, longPeriod, { - from: operatorContract, - }), - "Lock duration too long" - ) - }) - }) - - describe("single lock", async () => { - before(async () => { - operator = operator2 - const tx = await delegate(operator, stakingAmount) - await stakingContract.authorizeOperatorContract( - operator, - operatorContract, - { from: authorizer } - ) - - createdAt = await timestampOf(tx) - await time.increaseTo(initializationPeriod.add(createdAt).addn(1)) - await stakingContract.lockStake(operator, lockPeriod, { - from: operatorContract, - }) - }) - - it("should only permit recover unlocked stake", async () => { - await undelegate(operator) - await expectRevert(stakingContract.recoverStake(operator), "Locked stake") - - await stakingContract.unlockStake(operator, { from: operatorContract }) - await stakingContract.recoverStake(operator) - // ok, no revert - }) - - it("should allow recover locked stake after lock duration has expired", async () => { - await undelegate(operator) - await expectRevert(stakingContract.recoverStake(operator), "Locked stake") - - await time.increase(lockPeriod) - await stakingContract.recoverStake(operator, { from: operator }) - // ok, no revert - }) - - it("should allow recover locked stake after operator contract has been disabled", async () => { - await undelegate(operator) - await expectRevert(stakingContract.recoverStake(operator), "Locked stake") - - // disable operator contract with panic button - await registry.disableOperatorContract(operatorContract, { from: owner }) - - await stakingContract.recoverStake(operator, { from: operator }) - // ok, no revert - }) - - it("should be able to reduce the duration of existing locks", async () => { - await stakingContract.lockStake( - operator, - undelegationPeriod.add(time.duration.minutes(5)), - { from: operatorContract } - ) - - await undelegate(operator) - // 5 minutes left in lock - await expectRevert(stakingContract.recoverStake(operator), "Locked stake") - - await time.increase(time.duration.minutes(5)) - await stakingContract.recoverStake(operator, { from: operator }) - // ok, no revert - }) - - it("should allow slashing/seizing locked stake after undelegation", async () => { - await undelegate(operator) - - await stakingContract.slash(minimumStake, [operator], { - from: operatorContract, - }) - await stakingContract.seize(minimumStake, 100, beneficiary, [operator], { - from: operatorContract, - }) - // ok, no revert - }) - - it("should not allow slashing/seizing non-locked stake after undelegation", async () => { - await undelegate(operator) - - await time.increase(lockPeriod) - - await expectRevert( - stakingContract.slash(minimumStake, [operator], { - from: operatorContract, - }), - "Stake is released" - ) - await expectRevert( - stakingContract.seize(minimumStake, 100, beneficiary, [operator], { - from: operatorContract, - }), - "Stake is released" - ) - }) - - it("should not allow slashing/seizing unlocked stake after undelegation", async () => { - await undelegate(operator) - await stakingContract.unlockStake(operator, { from: operatorContract }) - - await expectRevert( - stakingContract.slash(minimumStake, [operator], { - from: operatorContract, - }), - "Stake is released" - ) - - await expectRevert( - stakingContract.seize(minimumStake, 100, beneficiary, [operator], { - from: operatorContract, - }), - "Stake is released" - ) - }) - - it("should only allow the lock creator to slash/seize after undelegation", async () => { - await stakingContract.authorizeOperatorContract( - operator, - operatorContract2, - { from: authorizer } - ) - await undelegate(operator) - - await expectRevert( - stakingContract.slash(minimumStake, [operator], { - from: operatorContract2, - }), - "Stake is released" - ) - await expectRevert( - stakingContract.seize(minimumStake, 100, beneficiary, [operator], { - from: operatorContract2, - }), - "Stake is released" - ) - }) - }) - - describe("multiple locks", async () => { - before(async () => { - operator = operator3 - const tx = await delegate(operator, stakingAmount) - await stakingContract.authorizeOperatorContract( - operator, - operatorContract, - { from: authorizer } - ) - - await stakingContract.authorizeOperatorContract( - operator, - operatorContract2, - { from: authorizer } - ) - - createdAt = await timestampOf(tx) - await time.increaseTo(initializationPeriod.add(createdAt).addn(1)) - await stakingContract.lockStake(operator, lockPeriod, { - from: operatorContract, - }) - await stakingContract.lockStake(operator, lockPeriod, { - from: operatorContract2, - }) - }) - - it("should require all locks to be released before recovering tokens", async () => { - await undelegate(operator) - await stakingContract.unlockStake(operator, { from: operatorContract }) - - await expectRevert(stakingContract.recoverStake(operator), "Locked stake") - - await stakingContract.unlockStake(operator, { from: operatorContract2 }) - - await stakingContract.recoverStake(operator, { from: operator }) - // ok, no revert - }) - - it("should count disabled contracts' locks as invalid", async () => { - await undelegate(operator) - await stakingContract.unlockStake(operator, { from: operatorContract }) - - await expectRevert(stakingContract.recoverStake(operator), "Locked stake") - - await registry.disableOperatorContract(operatorContract2, { from: owner }) - - await stakingContract.recoverStake(operator, { from: operator }) - // ok, no revert - }) - }) -}) diff --git a/solidity-v1/truffle-config.js b/solidity-v1/truffle-config.js deleted file mode 100644 index b10d2c2cda..0000000000 --- a/solidity-v1/truffle-config.js +++ /dev/null @@ -1,84 +0,0 @@ -require("babel-register"); -require("babel-polyfill"); -const HDWalletProvider = require("@truffle/hdwallet-provider"); -const Kit = require("@celo/contractkit"); - -module.exports = { - networks: { - local: { - host: "localhost", - port: 8545, - network_id: "*", - }, - keep_dev: { - provider: function () { - return new HDWalletProvider({ - privateKeys: [process.env.CONTRACT_OWNER_ACCOUNT_PRIVATE_KEY], - providerOrUrl: "http://localhost:8545", - }); - }, - gas: 6721975, - network_id: 1101, - }, - - keep_dev_vpn: { - provider: function () { - return new HDWalletProvider({ - privateKeys: [process.env.CONTRACT_OWNER_ACCOUNT_PRIVATE_KEY], - providerOrUrl: "http://eth-tx-node.default.svc.cluster.local:8545", - }); - }, - gas: 6721975, - network_id: 1101, - }, - - sepolia: { - provider: function () { - return new HDWalletProvider({ - privateKeys: [process.env.CONTRACT_OWNER_ACCOUNT_PRIVATE_KEY], - providerOrUrl: process.env.CHAIN_API_URL, - }); - }, - gas: 6000000, - network_id: 11155111, - skipDryRun: true, - networkCheckTimeout: 120000, - timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50) - }, - - alfajores: { - provider: function () { - const kit = Kit.newKit(process.env.CHAIN_API_URL); - kit.addAccount(process.env.CONTRACT_OWNER_ACCOUNT_PRIVATE_KEY); - return kit.web3.currentProvider; - }, - network_id: 44787, - }, - }, - - mocha: { - useColors: true, - reporter: "eth-gas-reporter", - reporterOptions: { - currency: "USD", - gasPrice: 21, - showTimeSpent: true, - }, - }, - - compilers: { - solc: { - version: "0.5.17", - optimizer: { - enabled: true, - runs: 200, - }, - }, - }, - - plugins: ["truffle-plugin-verify"], - - api_keys: { - etherscan: process.env.ETHERSCAN_API_KEY, - }, -}; diff --git a/solidity/random-beacon/README.adoc b/solidity/random-beacon/README.adoc index 9450365e95..4b15095d5d 100644 --- a/solidity/random-beacon/README.adoc +++ b/solidity/random-beacon/README.adoc @@ -41,7 +41,7 @@ blockchain. The basic functioning of the relay is: == Prior Work Smart contracts for the first version of the random beacon are available in -link:https://github.com/keep-network/keep-core/tree/main/solidity-v1[`solidity-v1` directory]. +link:https://github.com/threshold-network/keep-core-v1/tree/main/solidity[the `keep-core-v1` repository]. The new version uses the same approach for BLS signatures as v1 but replaces ticket-based group selection with an optimistic sortition pool call. It also redesigns staker rewards and offers a more operator-friendly approach for From 8199ff76dd23049b260bb90d78ba7fbe255f58f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Ros=C5=82aniec?= Date: Sun, 24 May 2026 07:44:34 +0000 Subject: [PATCH 2/3] chore: drop dead allowlists and clarify retired-components paths Second-pass cleanup of references missed in the first sweep: - .dockerignore: remove the `crytic-config.json` exclusion (the file was deleted in the previous commit) and the dead `!pkg/chain/gen` allowlist (the directory does not exist anywhere in the tree; the current Go bindings live under pkg/chain/ethereum/*/gen/). - docs/retired-components.md: restore the original v1-prefixed paths as historical references. The retired files (TokenStakingEscrow.sol, withdraw-old-rewards.js, dashboard/) were already removed in earlier PRs, so they do not exist in the current keep-core-v1 tree either -- only the v1 history records them. The previous wording implied they were present in keep-core-v1, which was misleading. --- .dockerignore | 5 ----- docs/retired-components.md | 21 +++++++++++---------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/.dockerignore b/.dockerignore index 6f381299e4..5d24df6262 100644 --- a/.dockerignore +++ b/.dockerignore @@ -9,7 +9,6 @@ tmp/ # Top-level files unrealted to the build. CODEOWNERS -crytic-config.json Dockerfile *.adoc @@ -31,10 +30,6 @@ token-tracker/ !**/gen/gen.go !**/gen/cmd/cmd.go -# Legacy V1 contracts bindings. -# We won't generate new bindings in the docker build process, but use the existing ones. -!pkg/chain/gen - # Contract addresses. # We do not want to overwrite extracted contract addresses with empty content while # coping local root directory to docker image context. diff --git a/docs/retired-components.md b/docs/retired-components.md index 6cd6d31f30..3f524cd8cf 100644 --- a/docs/retired-components.md +++ b/docs/retired-components.md @@ -3,15 +3,15 @@ KEEP-era staking and distribution surfaces have been retired in favor of the Threshold Network T token and the current contracts under `solidity/`. -This repository no longer carries the following legacy components. Paths -prefixed with `solidity/` below refer to the -[`threshold-network/keep-core-v1`](https://github.com/threshold-network/keep-core-v1) -repository, where the legacy v1 random beacon sources now live: +This repository no longer carries the following legacy components. The paths +below are the original locations under the now-extracted v1 tree (formerly +`solidity-v1/` in this repo); the v1 history they appear in has been moved to +[`threshold-network/keep-core-v1`](https://github.com/threshold-network/keep-core-v1): -- `solidity/contracts/TokenStakingEscrow.sol` (in `keep-core-v1`) +- `solidity-v1/contracts/TokenStakingEscrow.sol` - `token-stakedrop/` -- `solidity/scripts/withdraw-old-rewards.js` (in `keep-core-v1`; previously removed there) -- `solidity/dashboard/` (in `keep-core-v1`; previously removed there) +- `solidity-v1/scripts/withdraw-old-rewards.js` +- `solidity-v1/dashboard/` - KEEP token dashboard Kubernetes manifests under `infrastructure/kube/keep-*` - `scripts/start_dashboard.sh` @@ -22,6 +22,7 @@ contained a committed mainnet private key (since rotated and no longer active), and the retired staking escrow had no remaining ETH, KEEP, or T balance on Ethereum mainnet when checked before removal. -Historical documents under the `docs/` tree of `keep-core-v1` may still mention -these components for release history and archival context. They should not be -used as operational runbooks for current Threshold Network deployments. +Historical documents under the `docs/` tree of `keep-core-v1` (formerly +`docs-v1/` here) may still mention these components for release history and +archival context. They should not be used as operational runbooks for current +Threshold Network deployments. From 59d80129ce9b811c974ac16dceec7e5b42990fb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Ros=C5=82aniec?= Date: Sun, 24 May 2026 07:56:22 +0000 Subject: [PATCH 3/3] chore: remove dead Ropsten v1 testnet infrastructure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ropsten was deprecated by the Ethereum Foundation in Q4 2022. The associated v1 testnet contract artifacts, kube manifests, GCP cloud function, helper scripts, and Terraform resources have been non-functional ever since. Removing them now alongside the docs-v1/ and solidity-v1/ extraction. Removed: - infrastructure/eth-networks/keep-test/ropsten/ (3.1 MB of v1 KeepToken / TokenStaking / KeepRandomBeaconOperator deployment JSONs plus per-participant client configs and keyfiles for the Ropsten testnet beacon). - infrastructure/eth-networks/scripts/ (stake-accounts.js, fetch-contract-data.sh, prepare-participant-bundles.sh and the truffle/hdwallet-provider package-lock.json that supported them; create-eth-accounts.sh was only useful in this Ropsten context). - infrastructure/gcp/keep-test/google-functions/keep-faucet/ (KEEP token grant faucet Cloud Function targeting Ropsten via the long-deprecated nodejs10 runtime). - 11 Kubernetes manifests under infrastructure/kube/keep-dev/ for eth-miner-ropsten and eth-tx-ropsten (statefulsets, services, storage class and config map). - Ropsten load balancer Terraform resources, variables and outputs under infrastructure/terraform/keep-dev/. - .pre-commit-config.yaml: dropped the lint-faucet-js hook that targeted the removed faucet. Out of scope (left for separate review): - infrastructure/eth-networks/private-testnet/ (Görli-era v2 bundle generator; Görli is also deprecated but the tree is v2-aware). - solidity/random-beacon/.hardhat/networks_TEMPLATE.ts still includes a Ropsten entry in a v2 hardhat config template. --- .pre-commit-config.yaml | 6 - .../ropsten/KeepRandomBeaconOperator.json | 39934 ---------------- .../keep-test/ropsten/KeepToken.json | 2646 - .../keep-test/ropsten/TokenStaking.json | 26677 ----------- .../keep-test/ropsten/changelog.adoc | 164 - .../bisontrails/config/eth-account-keyfile | 1 - .../config/keep-client-config.toml | 33 - .../blockdaemon/config/eth-account-keyfile | 1 - .../config/keep-client-config.toml | 33 - .../figment/config/eth-account-keyfile | 1 - .../figment/config/keep-client-config.toml | 33 - .../maker/config/eth-account-keyfile | 1 - .../maker/config/keep-client-config.toml | 33 - .../raghav/config/eth-account-keyfile | 1 - .../raghav/config/keep-client-config.toml | 33 - .../stake-capital/config/eth-account-keyfile | 1 - .../config/keep-client-config.toml | 33 - .../staked/config/eth-account-keyfile | 1 - .../staked/config/keep-client-config.toml | 33 - .../synapse/config/eth-account-keyfile | 1 - .../synapse/config/keep-client-config.toml | 33 - .../scripts/create-eth-accounts.sh | 39 - .../scripts/fetch-contract-data.sh | 27 - .../eth-networks/scripts/package-lock.json | 5591 --- .../eth-networks/scripts/package.json | 7 - .../scripts/prepare-participant-bundles.sh | 65 - .../eth-networks/scripts/stake-accounts.js | 105 - .../google-functions/keep-faucet/.eslintrc | 12 - .../keep-faucet/.gcloudignore | 19 - .../keep-faucet/deploy-faucet.sh | 7 - .../keep-faucet/issue-grant.js | 289 - .../keep-faucet/package-lock.json | 6128 --- .../google-functions/keep-faucet/package.json | 19 - .../eth-miner-ropsten-p2p-tcp-service.yaml | 18 - .../eth-miner-ropsten-p2p-udp-service.yaml | 19 - .../eth-miner-ropsten-rpc-ws-service.yaml | 19 - .../eth-miner-ropsten-statefulset.yaml | 42 - .../eth-miner-ropsten-storageclass.yaml | 14 - .../eth-network-ropsten-configmap.yaml | 10 - .../eth-tx-ropsten-p2p-tcp-service.yaml | 18 - .../eth-tx-ropsten-p2p-udp-service.yaml | 19 - .../eth-tx-ropsten-rpc-ws-service.yaml | 20 - .../keep-dev/eth-tx-ropsten-statefulset.yaml | 40 - .../keep-dev/eth-tx-ropsten-storageclass.yaml | 14 - infrastructure/terraform/keep-dev/main.tf | 16 - infrastructure/terraform/keep-dev/outputs.tf | 4 - .../terraform/keep-dev/variables.tf | 20 - 47 files changed, 82280 deletions(-) delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/KeepRandomBeaconOperator.json delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/KeepToken.json delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/TokenStaking.json delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/changelog.adoc delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/participants/bisontrails/config/eth-account-keyfile delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/participants/bisontrails/config/keep-client-config.toml delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/participants/blockdaemon/config/eth-account-keyfile delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/participants/blockdaemon/config/keep-client-config.toml delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/participants/figment/config/eth-account-keyfile delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/participants/figment/config/keep-client-config.toml delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/participants/maker/config/eth-account-keyfile delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/participants/maker/config/keep-client-config.toml delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/participants/raghav/config/eth-account-keyfile delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/participants/raghav/config/keep-client-config.toml delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/participants/stake-capital/config/eth-account-keyfile delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/participants/stake-capital/config/keep-client-config.toml delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/participants/staked/config/eth-account-keyfile delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/participants/staked/config/keep-client-config.toml delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/participants/synapse/config/eth-account-keyfile delete mode 100644 infrastructure/eth-networks/keep-test/ropsten/participants/synapse/config/keep-client-config.toml delete mode 100755 infrastructure/eth-networks/scripts/create-eth-accounts.sh delete mode 100755 infrastructure/eth-networks/scripts/fetch-contract-data.sh delete mode 100644 infrastructure/eth-networks/scripts/package-lock.json delete mode 100644 infrastructure/eth-networks/scripts/package.json delete mode 100755 infrastructure/eth-networks/scripts/prepare-participant-bundles.sh delete mode 100644 infrastructure/eth-networks/scripts/stake-accounts.js delete mode 100644 infrastructure/gcp/keep-test/google-functions/keep-faucet/.eslintrc delete mode 100644 infrastructure/gcp/keep-test/google-functions/keep-faucet/.gcloudignore delete mode 100755 infrastructure/gcp/keep-test/google-functions/keep-faucet/deploy-faucet.sh delete mode 100644 infrastructure/gcp/keep-test/google-functions/keep-faucet/issue-grant.js delete mode 100644 infrastructure/gcp/keep-test/google-functions/keep-faucet/package-lock.json delete mode 100644 infrastructure/gcp/keep-test/google-functions/keep-faucet/package.json delete mode 100644 infrastructure/kube/keep-dev/eth-miner-ropsten-p2p-tcp-service.yaml delete mode 100644 infrastructure/kube/keep-dev/eth-miner-ropsten-p2p-udp-service.yaml delete mode 100644 infrastructure/kube/keep-dev/eth-miner-ropsten-rpc-ws-service.yaml delete mode 100644 infrastructure/kube/keep-dev/eth-miner-ropsten-statefulset.yaml delete mode 100644 infrastructure/kube/keep-dev/eth-miner-ropsten-storageclass.yaml delete mode 100644 infrastructure/kube/keep-dev/eth-network-ropsten-configmap.yaml delete mode 100644 infrastructure/kube/keep-dev/eth-tx-ropsten-p2p-tcp-service.yaml delete mode 100644 infrastructure/kube/keep-dev/eth-tx-ropsten-p2p-udp-service.yaml delete mode 100644 infrastructure/kube/keep-dev/eth-tx-ropsten-rpc-ws-service.yaml delete mode 100644 infrastructure/kube/keep-dev/eth-tx-ropsten-statefulset.yaml delete mode 100644 infrastructure/kube/keep-dev/eth-tx-ropsten-storageclass.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 344fb1e331..5f3c0cb025 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -30,9 +30,3 @@ repos: files: '\.(json|yaml)$' language: script description: "Checks JSON/YAML code according to the package's linter configuration" - - id: lint-faucet-js - name: 'lint faucet js' - entry: /usr/bin/env bash -c "cd infrastructure/gcp/keep-test/google-functions/keep-faucet && npm run lint:js" - files: 'infrastructure\/gcp\/keep-test\/google-functions\/keep-faucet\/.*\.js$' - language: script - description: "Checks JS code according to the package's linter configuration" diff --git a/infrastructure/eth-networks/keep-test/ropsten/KeepRandomBeaconOperator.json b/infrastructure/eth-networks/keep-test/ropsten/KeepRandomBeaconOperator.json deleted file mode 100644 index 707061bf0d..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/KeepRandomBeaconOperator.json +++ /dev/null @@ -1,39934 +0,0 @@ -{ - "contractName": "KeepRandomBeaconOperator", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_serviceContract", - "type": "address" - }, - { - "internalType": "address", - "name": "_stakingContract", - "type": "address" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes", - "name": "groupPubKey", - "type": "bytes" - } - ], - "name": "DkgResultPublishedEvent", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "beneficiary", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "groupIndex", - "type": "uint256" - } - ], - "name": "GroupMemberRewardsWithdrawn", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "newEntry", - "type": "uint256" - } - ], - "name": "GroupSelectionStarted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes", - "name": "groupPubKey", - "type": "bytes" - } - ], - "name": "OnGroupRegistered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes", - "name": "previousEntry", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "groupPublicKey", - "type": "bytes" - } - ], - "name": "RelayEntryRequested", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "RelayEntrySubmitted", - "type": "event" - }, - { - "constant": true, - "inputs": [], - "name": "dkgGasEstimate", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "dkgSubmitterReimbursementFee", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "entryVerificationGasEstimate", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "gasPriceCeiling", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "groupMemberBaseReward", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "groupSelectionGasEstimate", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "groupSize", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "groupThreshold", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "relayEntryGenerationTime", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "relayEntryTimeout", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "resultPublicationBlockStep", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "genesis", - "outputs": [], - "payable": true, - "stateMutability": "payable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "serviceContract", - "type": "address" - } - ], - "name": "addServiceContract", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "serviceContract", - "type": "address" - } - ], - "name": "removeServiceContract", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "_newEntry", - "type": "uint256" - }, - { - "internalType": "address payable", - "name": "submitter", - "type": "address" - } - ], - "name": "createGroup", - "outputs": [], - "payable": true, - "stateMutability": "payable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "isGroupSelectionPossible", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "bytes32", - "name": "ticket", - "type": "bytes32" - } - ], - "name": "submitTicket", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "ticketSubmissionTimeout", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "submittedTicketsCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "selectedParticipants", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "submitterMemberIndex", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "groupPubKey", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "misbehaved", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signatures", - "type": "bytes" - }, - { - "internalType": "uint256[]", - "name": "signingMembersIndexes", - "type": "uint256[]" - } - ], - "name": "submitDkgResult", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "requestId", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "previousEntry", - "type": "bytes" - } - ], - "name": "sign", - "outputs": [], - "payable": true, - "stateMutability": "payable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "bytes", - "name": "_groupSignature", - "type": "bytes" - } - ], - "name": "relayEntry", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "reportRelayEntryTimeout", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "groupProfitFee", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "staker", - "type": "address" - } - ], - "name": "hasMinimumStake", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "groupPubKey", - "type": "bytes" - } - ], - "name": "isGroupRegistered", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "groupPubKey", - "type": "bytes" - } - ], - "name": "isStaleGroup", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "numberOfGroups", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "groupPubKey", - "type": "bytes" - } - ], - "name": "getGroupMemberRewards", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "groupPubKey", - "type": "bytes" - }, - { - "internalType": "address", - "name": "member", - "type": "address" - } - ], - "name": "getGroupMemberIndices", - "outputs": [ - { - "internalType": "uint256[]", - "name": "indices", - "type": "uint256[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "internalType": "uint256", - "name": "groupIndex", - "type": "uint256" - }, - { - "internalType": "uint256[]", - "name": "groupMemberIndices", - "type": "uint256[]" - } - ], - "name": "withdrawGroupMemberRewards", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getFirstActiveGroupIndex", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "uint256", - "name": "groupIndex", - "type": "uint256" - } - ], - "name": "getGroupPublicKey", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "entryVerificationFee", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "groupCreationFee", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes", - "name": "groupPubKey", - "type": "bytes" - } - ], - "name": "getGroupMembers", - "outputs": [ - { - "internalType": "address[]", - "name": "members", - "type": "address[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "groupIndex", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "signedMsgSender", - "type": "bytes" - } - ], - "name": "reportUnauthorizedSigning", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } - ], - "metadata": "{\"compiler\":{\"version\":\"0.5.14+commit.01f1aaa4\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_serviceContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_stakingContract\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"groupPubKey\",\"type\":\"bytes\"}],\"name\":\"DkgResultPublishedEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"groupIndex\",\"type\":\"uint256\"}],\"name\":\"GroupMemberRewardsWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newEntry\",\"type\":\"uint256\"}],\"name\":\"GroupSelectionStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"groupPubKey\",\"type\":\"bytes\"}],\"name\":\"OnGroupRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousEntry\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"groupPublicKey\",\"type\":\"bytes\"}],\"name\":\"RelayEntryRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"RelayEntrySubmitted\",\"type\":\"event\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceContract\",\"type\":\"address\"}],\"name\":\"addServiceContract\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newEntry\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"submitter\",\"type\":\"address\"}],\"name\":\"createGroup\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"dkgGasEstimate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"dkgSubmitterReimbursementFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"entryVerificationFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"entryVerificationGasEstimate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"gasPriceCeiling\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"genesis\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getFirstActiveGroupIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"groupPubKey\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"member\",\"type\":\"address\"}],\"name\":\"getGroupMemberIndices\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"indices\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"groupPubKey\",\"type\":\"bytes\"}],\"name\":\"getGroupMemberRewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"groupPubKey\",\"type\":\"bytes\"}],\"name\":\"getGroupMembers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"members\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"groupIndex\",\"type\":\"uint256\"}],\"name\":\"getGroupPublicKey\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"groupCreationFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"groupMemberBaseReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"groupProfitFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"groupSelectionGasEstimate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"groupSize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"groupThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"hasMinimumStake\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"groupPubKey\",\"type\":\"bytes\"}],\"name\":\"isGroupRegistered\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isGroupSelectionPossible\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"groupPubKey\",\"type\":\"bytes\"}],\"name\":\"isStaleGroup\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"numberOfGroups\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_groupSignature\",\"type\":\"bytes\"}],\"name\":\"relayEntry\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"relayEntryGenerationTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"relayEntryTimeout\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"serviceContract\",\"type\":\"address\"}],\"name\":\"removeServiceContract\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"reportRelayEntryTimeout\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"groupIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"signedMsgSender\",\"type\":\"bytes\"}],\"name\":\"reportUnauthorizedSigning\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"resultPublicationBlockStep\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"selectedParticipants\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"previousEntry\",\"type\":\"bytes\"}],\"name\":\"sign\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"submitterMemberIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"groupPubKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"misbehaved\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signatures\",\"type\":\"bytes\"},{\"internalType\":\"uint256[]\",\"name\":\"signingMembersIndexes\",\"type\":\"uint256[]\"}],\"name\":\"submitDkgResult\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"ticket\",\"type\":\"bytes32\"}],\"name\":\"submitTicket\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"submittedTicketsCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ticketSubmissionTimeout\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"groupIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"groupMemberIndices\",\"type\":\"uint256[]\"}],\"name\":\"withdrawGroupMemberRewards\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Keep client facing contract for random beacon security-critical operations. Handles group creation and expiration, BLS signature verification and incentives. The contract is not upgradeable. New functionality can be implemented by deploying new versions following Keep client update and re-authorization by the stakers.\",\"methods\":{\"addServiceContract(address)\":{\"details\":\"Adds service contract\",\"params\":{\"serviceContract\":\"Address of the service contract.\"}},\"createGroup(uint256,address)\":{\"details\":\"Triggers the selection process of a new candidate group.\",\"params\":{\"_newEntry\":\"New random beacon value that stakers will use to generate their tickets.\",\"submitter\":\"Operator of this contract.\"}},\"entryVerificationFee()\":{\"details\":\"Returns fee for entry verification in wei. Does not include group profit fee, DKG contribution or callback fee.\"},\"genesis()\":{\"details\":\"Triggers the first group selection. Genesis can be called only when there are no groups on the operator contract.\"},\"getFirstActiveGroupIndex()\":{\"details\":\"Gets the index of the first active group.\"},\"getGroupMemberIndices(bytes,address)\":{\"details\":\"Gets all indices in the provided group for a member.\"},\"getGroupMemberRewards(bytes)\":{\"details\":\"Returns accumulated group member rewards for provided group.\"},\"getGroupMembers(bytes)\":{\"details\":\"Returns members of the given group by group public key.\"},\"getGroupPublicKey(uint256)\":{\"details\":\"Gets group public key.\"},\"groupCreationFee()\":{\"details\":\"Returns fee for group creation in wei. Includes the cost of DKG and the cost of triggering group selection.\"},\"groupProfitFee()\":{\"details\":\"Gets group profit fee expressed in wei.\"},\"hasMinimumStake(address)\":{\"details\":\"Checks if the specified account has enough active stake to become network operator and that this contract has been authorized for potential slashing. * Having the required minimum of active stake makes the operator eligible to join the network. If the active stake is not currently undelegating, operator is also eligible for work selection.\",\"params\":{\"staker\":\"Staker's address\"},\"return\":\"True if has enough active stake to participate in the network, false otherwise.\"},\"isGroupRegistered(bytes)\":{\"details\":\"Checks if group with the given public key is registered.\"},\"isStaleGroup(bytes)\":{\"details\":\"Checks if a group with the given public key is a stale group. Stale group is an expired group which is no longer performing any operations. It is important to understand that an expired group may still perform some operations for which it was selected when it was still active. We consider a group to be stale when it's expired and when its expiration time and potentially executed operation timeout are both in the past.\"},\"numberOfGroups()\":{\"details\":\"Gets the number of active groups. Expired and terminated groups are not counted as active.\"},\"relayEntry(bytes)\":{\"details\":\"Creates a new relay entry and stores the associated data on the chain.\",\"params\":{\"_groupSignature\":\"Group BLS signature over the concatenation of the previous entry and seed.\"}},\"removeServiceContract(address)\":{\"details\":\"Removes service contract\",\"params\":{\"serviceContract\":\"Address of the service contract.\"}},\"reportRelayEntryTimeout()\":{\"details\":\"Function used to inform about the fact the currently ongoing new relay entry generation operation timed out. As a result, the group which was supposed to produce a new relay entry is immediately terminated and a new group is selected to produce a new relay entry. All members of the group are punished by seizing minimum stake of their tokens. The submitter of the transaction is rewarded with a tattletale reward which is limited to min(1, 20 / group_size) of the maximum tattletale reward.\"},\"reportUnauthorizedSigning(uint256,bytes)\":{\"details\":\"Reports unauthorized signing for the provided group. Must provide a valid signature of the tattletale address as a message. Successful signature verification means the private key has been leaked and all group members should be punished by seizing\\u00a0their tokens. The submitter of this proof is rewarded with 5% of the total seized amount scaled by the reward adjustment parameter and the rest 95% is burned.\"},\"selectedParticipants()\":{\"details\":\"Gets selected participants in ascending order of their tickets.\"},\"sign(uint256,bytes)\":{\"details\":\"Creates a request to generate a new relay entry, which will include a random number (by signing the previous entry's random number).\",\"params\":{\"previousEntry\":\"Previous relay entry\",\"requestId\":\"Request Id trackable by service contract\"}},\"submitDkgResult(uint256,bytes,bytes,bytes,uint256[])\":{\"details\":\"Submits result of DKG protocol. It is on-chain part of phase 14 of the protocol.\",\"params\":{\"groupPubKey\":\"Generated candidate group public key\",\"misbehaved\":\"Bytes array of misbehaved (disqualified or inactive) group members indexes in ascending order; Indexes reflect positions of members in the group as outputted by the group selection protocol.\",\"signatures\":\"Concatenation of signatures from members supporting the result.\",\"signingMembersIndexes\":\"Indices of members corresponding to each signature.\",\"submitterMemberIndex\":\"Claimed submitter candidate group member index\"}},\"submitTicket(bytes32)\":{\"details\":\"Submits ticket to request to participate in a new candidate group.\",\"params\":{\"ticket\":\"Bytes representation of a ticket that holds the following: - ticketValue: first 8 bytes of a result of keccak256 cryptography hash function on the combination of the group selection seed (previous beacon output), staker-specific value (address) and virtual staker index. - stakerValue: a staker-specific value which is the address of the staker. - virtualStakerIndex: 4-bytes number within a range of 1 to staker's weight; has to be unique for all tickets submitted by the given staker for the current candidate group selection.\"}},\"submittedTicketsCount()\":{\"details\":\"Gets the number of submitted group candidate tickets so far.\"},\"ticketSubmissionTimeout()\":{\"details\":\"Gets the timeout in blocks after which group candidate ticket submission is finished.\"},\"withdrawGroupMemberRewards(address,uint256,uint256[])\":{\"details\":\"Withdraws accumulated group member rewards for operator using the provided group index and member indices. Once the accumulated reward is withdrawn from the selected group, member is removed from it. Rewards can be withdrawn only from stale group.\",\"params\":{\"groupIndex\":\"Group index.\",\"groupMemberIndices\":\"Array of member indices for the group member.\",\"operator\":\"Operator address.\"}}},\"title\":\"KeepRandomBeaconOperator\"},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/KeepRandomBeaconOperator.sol\":\"KeepRandomBeaconOperator\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/KeepRandomBeaconOperator.sol\":{\"keccak256\":\"0x698adbce600122f1a528503028abb553731dcdd3d3da4203a31c6262c7c3562e\",\"urls\":[\"bzz-raw://19121e5c4c1ec4a5784e3b7b18a538dbd3254fdc9bbfa23e72d4247674a5f07a\",\"dweb:/ipfs/QmeaAbTKPPi4QDbLmw4sabx2aiiRLsk49dhyN9XHTN3G6o\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/Registry.sol\":{\"keccak256\":\"0x4f6fef443c1336786eedeb6ecf4e4ec4be9d3045fea1992f27319877f5d4edd5\",\"urls\":[\"bzz-raw://e989329d2aa565402c0fa74f9140d2b31321286a37a3fde42dad3d5242751896\",\"dweb:/ipfs/QmRTZMGzxaspq3nRNpwHhJkQQTBp8eoEW16rW5RdWeammT\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/StakeDelegatable.sol\":{\"keccak256\":\"0x0c03cada5ad67b0e5630d6d69eacabc4f3302b5cb9fd23169baa326a5899faba\",\"urls\":[\"bzz-raw://46a02efef4d155ab89898f36a603f268b0e4f28603d32edca78a2f3cff90ff08\",\"dweb:/ipfs/QmNwNC2vyQVWaK8mXu6XPhPxBBupvHf83RiTUKswM7PfMH\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/TokenStaking.sol\":{\"keccak256\":\"0xa2b8532e48f4fd810e99af2067512879e5b082a473e2cdbb66da66a6909a3860\",\"urls\":[\"bzz-raw://6f2d521a35d49aeeb0b0357ed39202c0cee6776ac5f380ea210a01f61d1f7df2\",\"dweb:/ipfs/Qmbkb7frkLjWGa5Firkug3mEARHyvW3aVX2PcWsh7dZKhN\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/cryptography/AltBn128.sol\":{\"keccak256\":\"0x433b67c7a4cd05f5c5e35d1beb15dbf73fa32a8ddea3df80409493a741834025\",\"urls\":[\"bzz-raw://cd85c898235523f5f233d70acac64097965827a09493d8f45860dd9b80e062f7\",\"dweb:/ipfs/QmP8eZx71pWhW93hoFTw4P7UWgnBJ2MZiQcY7U6a5TkJ8e\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/cryptography/BLS.sol\":{\"keccak256\":\"0xb205989c6d70010842ccdf3fa5cb579e13a3353eb9d5d75f7812846aedd74678\",\"urls\":[\"bzz-raw://4db0d5fa14186828ee7d730163f644558105f58a9fe8d57377f9d133b44411a3\",\"dweb:/ipfs/QmR8wxf27HQUqqU93pTcAnmjNCXDa3UEoQqk354MiqEdz9\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/libraries/operator/DKGResultVerification.sol\":{\"keccak256\":\"0xe20016834dfdd30762d2b1be6ba28b094322b29fac0fc0e09d3e9081579c1902\",\"urls\":[\"bzz-raw://2b6f071322d9bf13efb7ecae25cc4be6cadcb5b010244329a474ecbfd0f166d0\",\"dweb:/ipfs/Qmeh8oqaqYpWbLrvmWYLntNdmJN14oWJcx25DgbTaoUWQg\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/libraries/operator/GroupSelection.sol\":{\"keccak256\":\"0x83dff36ed974b58f24ece6d747706ae469ade929967788340fab83fb607677bc\",\"urls\":[\"bzz-raw://8201fda42a18b901750ee949d79fbe3ed96bcdb80adaee5a3cb50d8479860252\",\"dweb:/ipfs/QmPgyMrHf5G1j5b4GoFUqKXdcRmyzSHZwGLJ683UgBkzMb\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/libraries/operator/Groups.sol\":{\"keccak256\":\"0xbca34fc11012c5ab15719d53194baab1c1bc15776f246fb96eeb0b9315542e95\",\"urls\":[\"bzz-raw://1d1e1ffc6815b8505174c57007d54a4b942ae621f21ec264f79673f9be40d8f7\",\"dweb:/ipfs/QmfXy3exduUQWCWE5xxwEisvmqtmHu8a8CZStUebXYzcFk\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/libraries/operator/Reimbursements.sol\":{\"keccak256\":\"0x48dbd13cd82e5be42a74d5b763b7f65c04cbd4575a03535aa858c4c908fa69b8\",\"urls\":[\"bzz-raw://45e67e47044006b6faa623a1a7937d9fd7c93eb6864dcd6f258022534156192b\",\"dweb:/ipfs/QmfJimipimoJGhxGQSB11E3Mrqapi68CRTQatzzofeEREz\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/utils/AddressArrayUtils.sol\":{\"keccak256\":\"0x1e2fa13708e5e5132828166429e0448f7896ac800d4cd1b8f3fee7cc86fd0fe2\",\"urls\":[\"bzz-raw://e6d846f394fb993e0ed817dc6bb073479cf27be2d79c9645de29c75053f46679\",\"dweb:/ipfs/QmXfP33iWfvHkmgKkePfPZcz8tuu3qqqA6tELzYgD61QGY\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/utils/BytesLib.sol\":{\"keccak256\":\"0xd5cf94f3e0b64669bf3dc5327e9f4e3a2f27cbf866682a13cfeef87e7a3c02f7\",\"urls\":[\"bzz-raw://3d556b1560fe4b273f2ccfed1c38a4399c08467bd6b66070396f47b545c8e725\",\"dweb:/ipfs/QmZdJooqvwL5GhGx9pJZ8CHsbp3Ggj7Bh5WFXx77KMbcY1\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/utils/ModUtils.sol\":{\"keccak256\":\"0x31f1b891f3cf57f40615e3b8b4b3b26e3b0597833a4bbf896624c8975ab95ca2\",\"urls\":[\"bzz-raw://b33bf46182bc723c2a76555831e0d53e7e3777a190e5c0b81a0fc2b51dc2769d\",\"dweb:/ipfs/QmSTJbY9ew5U4Ps9oB2Ys57c3G5VpSx6pCWSz8ab8EzwWA\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/utils/OperatorParams.sol\":{\"keccak256\":\"0xfba3dc1f5de166a89c3c3287c089795cc7a78072566b0fc610838d37aee2c98e\",\"urls\":[\"bzz-raw://876df6f572120a8c743c5d8e888732d61af3131db108e72e7c8f7b70544884e3\",\"dweb:/ipfs/QmTP1Co2U7Ea8KTzGSCvgwYff2ziF2fBS6vmrG4Yx8Pm6d\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/utils/PercentUtils.sol\":{\"keccak256\":\"0x2be7ede4269e27df4533bef3146017e61d3bfbdc73347b5e00045ce3f05828b5\",\"urls\":[\"bzz-raw://df953b0720ddc61473854471664fb0ef5ea6dcf353c24b9135bfecc4849396b0\",\"dweb:/ipfs/QmVDySNAqxwRvzVxs4BoeBpmzZ1V5evXy9SdraVhfxc1e3\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/utils/UintArrayUtils.sol\":{\"keccak256\":\"0x058717e1c0d234de225dc6efe59c37da8647d19499ee9e53f6203ad6097940ab\",\"urls\":[\"bzz-raw://423ccb1e227840fe503f594424192b846f9e77b153be1613b2f91f3a69fd3461\",\"dweb:/ipfs/QmetdgvmXsJD62VugQ5fdyXqhwULMGuRsDL49eHdFrzh2a\"]},\"openzeppelin-solidity/contracts/GSN/Context.sol\":{\"keccak256\":\"0x90a3995645af7562d84b9d69363ffa5ae7217714ab61e951bf7bc450f40e4061\",\"urls\":[\"bzz-raw://216ef9d6b614db4eb46970b4e84903f2534a45572dd30a79f0041f1a5830f436\",\"dweb:/ipfs/QmNPrJ4MWKUAWzKXpUqeyKRUfosaoANZAqXgvepdrCwZAG\"]},\"openzeppelin-solidity/contracts/cryptography/ECDSA.sol\":{\"keccak256\":\"0xc89ea7e48ba477b1781b24ae963442fff1bb2af33b6178dad679a3fa2f5ab2de\",\"urls\":[\"bzz-raw://b736ddad8143f8f1cd13c20809d4ebce5f5a8c7725081b0b703294078bd506d1\",\"dweb:/ipfs/QmdhTWCXFCuwG9JaPMjwnhkQoDj9su8R7KMPNvD5z9KeWD\"]},\"openzeppelin-solidity/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x640b6dee7a4b830bdfd52b5031a07fc2b12209f5b2e29e5d364a7d37f69d8076\",\"urls\":[\"bzz-raw://31113152e1ddb78fe7a4197f247591ca894e93f916867beb708d8e747b6cc74f\",\"dweb:/ipfs/QmbZaJyXdpsYGykVhHH9qpVGQg9DGCxE2QufbCUy3daTgq\"]},\"openzeppelin-solidity/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x65a4078c03875c25413a068ce9cfdd7e68a90f8786612d1189c89341e6e3b802\",\"urls\":[\"bzz-raw://45c0d95495b944fbb1aa09d900b0ab530903a432125ab8fddfa05064a7988991\",\"dweb:/ipfs/Qma2VeknkKA1THeubGzshWFk44BktXkXP1UKp9Un2uDSsu\"]},\"openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol\":{\"keccak256\":\"0x9b94356691f3cbf90a5d83ae3fdf6a5a662bb004d2bd8b034160d60221807e64\",\"urls\":[\"bzz-raw://14a9d33db455302b8bb9fdb28998efefbe5a1cb41b29e31391609f646b2ab351\",\"dweb:/ipfs/Qmd4wFr6GEMZnnxgXeq3gmp7cs8tqDuHp3TVNhCbjnux2V\"]},\"openzeppelin-solidity/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe5bb0f57cff3e299f360052ba50f1ea0fff046df2be070b6943e0e3c3fdad8a9\",\"urls\":[\"bzz-raw://59fd025151435da35faa8093a5c7a17de02de9d08ad27275c5cdf05050820d91\",\"dweb:/ipfs/QmQMvwEcPhoRXzbXyrdoeRtvLoifUW9Qh7Luho7bmUPRkc\"]},\"openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol\":{\"keccak256\":\"0x6f2c9955d65c522b80f4b8792f076512d2df947d2112cbc4d98a4781ed42ede2\",\"urls\":[\"bzz-raw://7d8ec81683520c06baeef3f7e06cd82bd6fd5fa611f26857f475f6c829540aff\",\"dweb:/ipfs/QmTDkFzKnrpiV1UKnSoiZAHPuguWzokrr4pFbSPvyaSo56\"]},\"openzeppelin-solidity/contracts/utils/Address.sol\":{\"keccak256\":\"0x70df50e240407aa50915ad14f61b1a901fa335b37de20955b99ed647be756af0\",\"urls\":[\"bzz-raw://9404711f3206610c08ea97fa52c7b6b4d2e9d536e96fc4b7210aa7e24f796c36\",\"dweb:/ipfs/QmZDzpVzjoap13SuPEq5pVCrmdjoKVZnTsQPLKXAbynTTW\"]},\"openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol\":{\"keccak256\":\"0xe86fdc15fbc379ecf14d6aa4f51b87c0be8476e114e23c171b790a6717230655\",\"urls\":[\"bzz-raw://81905037f66d37ed211a4e3430af74f36e18b3a5d5b688e6d7d5ee199824a41a\",\"dweb:/ipfs/QmTcpgNKqLVRbcgNSUHazAbVf2bz5uh5mPkAijGeYW7Sqb\"]}},\"version\":1}", - "bytecode": "0x6080604052650d300b5968006019556406fc23ac00601a556040601b556021601c556003601d556004601e55620000646200004d601d54601b54620002d960201b620040801790919060201c565b601e546200036460201b620047fd1790919060201c565b601f55620445c0602055621a8ce060215562030d406022553480156200008957600080fd5b5060405162005d1638038062005d1683398181016040526040811015620000af57600080fd5b810190808051906020019092919080519060200190929190505050600160008190555033601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060178290806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505080601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a60070160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663fdd1f9866040518163ffffffff1660e01b815260040160206040518083038186803b1580156200024557600080fd5b505afa1580156200025a573d6000803e3d6000fd5b505050506040513d60208110156200027157600080fd5b8101908080519060200190929190505050600a60000181905550600c600160030181905550601b546001600801819055506034601260000181905550601d54601260010181905550601b54601260020181905550601c546012600301819055505050620003ed565b600080831415620002ee57600090506200035e565b60008284029050828482816200030057fe5b041462000359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018062005cf56021913960400191505060405180910390fd5b809150505b92915050565b600080828401905083811015620003e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6158f880620003fd6000396000f3fe6080604052600436106102245760003560e01c80638a3a3da811610123578063c300d058116100ab578063d12f5e691161006f578063d12f5e6914611012578063e1f4d6321461112f578063e581ff741461115a578063eb9488d31461122c578063ef7c8f9c1461125757610224565b8063c300d05814610e06578063c443894614610e31578063c96e71fb14610e5c578063c98622fb14610eaa578063cb62c50d14610ed557610224565b8063ac374f4b116100f2578063ac374f4b14610c6c578063b1c77c8f14610d34578063b64ac8e414610d5f578063b99f0c4314610db0578063bf95249614610ddb57610224565b80638a3a3da814610a865780639b3d270a14610ac15780639dabee4414610b86578063a7f0b3de14610c6257610224565b8063517471a9116101b15780636dcc64f8116101755780636dcc64f81461072057806373f1daab1461074b5780637760c6c7146109df57806379f9fb7e14610a305780637d7d7dd914610a5b57610224565b8063517471a9146105475780635c1c0710146105725780635d6615d9146105db57806363b635ea146106ca578063650d89e7146106f557610224565b80631ed74070116101f85780631ed74070146103cb57806321a8f86c146103e257806324f17313146104115780632d6f8f311461043c57806336c857171461051c57610224565b80623bf87e146102295780630b19991f1461025457806310c3a173146102c05780631c524ac2146102eb575b600080fd5b34801561023557600080fd5b5061023e61130b565b6040518082815260200191505060405180910390f35b34801561026057600080fd5b50610269611311565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102ac578082015181840152602081019050610291565b505050509050019250505060405180910390f35b3480156102cc57600080fd5b506102d561143f565b6040518082815260200191505060405180910390f35b3480156102f757600080fd5b506103b16004803603602081101561030e57600080fd5b810190808035906020019064010000000081111561032b57600080fd5b82018360208201111561033d57600080fd5b8035906020019184600183028401116401000000008311171561035f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061144f565b604051808215151515815260200191505060405180910390f35b3480156103d757600080fd5b506103e061146c565b005b3480156103ee57600080fd5b506103f7611708565b604051808215151515815260200191505060405180910390f35b34801561041d57600080fd5b50610426611754565b6040518082815260200191505060405180910390f35b34801561044857600080fd5b506105026004803603602081101561045f57600080fd5b810190808035906020019064010000000081111561047c57600080fd5b82018360208201111561048e57600080fd5b803590602001918460018302840111640100000000831117156104b057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061175a565b604051808215151515815260200191505060405180910390f35b34801561052857600080fd5b5061053161185d565b6040518082815260200191505060405180910390f35b34801561055357600080fd5b5061055c611863565b6040518082815260200191505060405180910390f35b34801561057e57600080fd5b506105c16004803603602081101561059557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611881565b604051808215151515815260200191505060405180910390f35b3480156105e757600080fd5b506106c8600480360360608110156105fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561064557600080fd5b82018360208201111561065757600080fd5b8035906020019184602083028401116401000000008311171561067957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611998565b005b3480156106d657600080fd5b506106df611def565b6040518082815260200191505060405180910390f35b34801561070157600080fd5b5061070a611df5565b6040518082815260200191505060405180910390f35b34801561072c57600080fd5b50610735611dfb565b6040518082815260200191505060405180910390f35b34801561075757600080fd5b506109dd600480360360a081101561076e57600080fd5b81019080803590602001909291908035906020019064010000000081111561079557600080fd5b8201836020820111156107a757600080fd5b803590602001918460018302840111640100000000831117156107c957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561082c57600080fd5b82018360208201111561083e57600080fd5b8035906020019184600183028401116401000000008311171561086057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156108c357600080fd5b8201836020820111156108d557600080fd5b803590602001918460018302840111640100000000831117156108f757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561095a57600080fd5b82018360208201111561096c57600080fd5b8035906020019184602083028401116401000000008311171561098e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611e01565b005b3480156109eb57600080fd5b50610a2e60048036036020811015610a0257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121d2565b005b348015610a3c57600080fd5b50610a456122fe565b6040518082815260200191505060405180910390f35b348015610a6757600080fd5b50610a70612304565b6040518082815260200191505060405180910390f35b348015610a9257600080fd5b50610abf60048036036020811015610aa957600080fd5b810190808035906020019092919050505061230a565b005b610b8460048036036040811015610ad757600080fd5b810190808035906020019092919080359060200190640100000000811115610afe57600080fd5b820183602082011115610b1057600080fd5b80359060200191846001830284011164010000000083111715610b3257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612554565b005b348015610b9257600080fd5b50610c4c60048036036020811015610ba957600080fd5b8101908080359060200190640100000000811115610bc657600080fd5b820183602082011115610bd857600080fd5b80359060200191846001830284011164010000000083111715610bfa57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612707565b6040518082815260200191505060405180910390f35b610c6a61277d565b005b348015610c7857600080fd5b50610d3260048036036020811015610c8f57600080fd5b8101908080359060200190640100000000811115610cac57600080fd5b820183602082011115610cbe57600080fd5b80359060200191846001830284011164010000000083111715610ce057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506128b6565b005b348015610d4057600080fd5b50610d49613334565b6040518082815260200191505060405180910390f35b348015610d6b57600080fd5b50610dae60048036036020811015610d8257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061333a565b005b348015610dbc57600080fd5b50610dc5613415565b6040518082815260200191505060405180910390f35b348015610de757600080fd5b50610df061341b565b6040518082815260200191505060405180910390f35b348015610e1257600080fd5b50610e1b61342c565b6040518082815260200191505060405180910390f35b348015610e3d57600080fd5b50610e4661345e565b6040518082815260200191505060405180910390f35b610ea860048036036040811015610e7257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061347c565b005b348015610eb657600080fd5b50610ebf613780565b6040518082815260200191505060405180910390f35b348015610ee157600080fd5b50610fbb60048036036040811015610ef857600080fd5b8101908080359060200190640100000000811115610f1557600080fd5b820183602082011115610f2757600080fd5b80359060200191846001830284011164010000000083111715610f4957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061378d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610ffe578082015181840152602081019050610fe3565b505050509050019250505060405180910390f35b34801561101e57600080fd5b506110d86004803603602081101561103557600080fd5b810190808035906020019064010000000081111561105257600080fd5b82018360208201111561106457600080fd5b8035906020019184600183028401116401000000008311171561108657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061395f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561111b578082015181840152602081019050611100565b505050509050019250505060405180910390f35b34801561113b57600080fd5b50611144613afc565b6040518082815260200191505060405180910390f35b34801561116657600080fd5b5061122a6004803603604081101561117d57600080fd5b8101908080359060200190929190803590602001906401000000008111156111a457600080fd5b8201836020820111156111b657600080fd5b803590602001918460018302840111640100000000831117156111d857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613b02565b005b34801561123857600080fd5b50611241613c95565b6040518082815260200191505060405180910390f35b34801561126357600080fd5b506112906004803603602081101561127a57600080fd5b8101908080359060200190929190505050613ca2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156112d05780820151818401526020810190506112b5565b50505050905090810190601f1680156112fd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60215481565b6060600173__GroupSelection________________________63a3c6b2b390916040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b15801561136557600080fd5b505af4158015611379573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156113a357600080fd5b81019080805160405193929190846401000000008211156113c357600080fd5b838201915060208201858111156113d957600080fd5b82518660208202830111640100000000821117156113f657600080fd5b8083526020830192505050908051906020019060200280838360005b8381101561142d578082015181840152602081019050611412565b50505050905001604052505050905090565b6000600160000180549050905090565b600061146582600a613cbf90919063ffffffff16565b9050919050565b611474613d30565b6114e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f456e74727920646964206e6f742074696d65206f75740000000000000000000081525060200191505060405180910390fd5b6000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ec5ffac26040518163ffffffff1660e01b815260040160206040518083038186803b15801561155057600080fd5b505afa158015611564573d6000803e3d6000fd5b505050506040513d602081101561157a57600080fd5b81019080805190602001909291905050509050600a73__Groups________________________________63edaa60e89091602660030154601b54856040518563ffffffff1660e01b81526004018085815260200184815260200183815260200182815260200194505050505060006040518083038186803b1580156115fe57600080fd5b505af4158015611612573d6000803e3d6000fd5b50505050600061162061341b565b11156117055761170460266000015460266004018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116c85780601f1061169d576101008083540402835291602001916116c8565b820191906000526020600020905b8154815290600101906020018083116116ab57829003601f168201915b5050505050602660050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16602660010154602660020154613d4e565b5b50565b6000600160050160009054906101000a900460ff1661172a5760019050611751565b6000601d54601b540260126000015460016003015460016004015401010190508043119150505b90565b60225481565b6000600a73__Groups________________________________63cc9b37c29091846040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156117d05780820151818401526020810190506117b5565b50505050905090810190601f1680156117fd5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561181b57600080fd5b505af415801561182f573d6000803e3d6000fd5b505050506040513d602081101561184557600080fd5b81019080805190602001909291905050509050919050565b601d5481565b600061187c601a5460205461408090919063ffffffff16565b905090565b6000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166310a63ec083306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561195657600080fd5b505afa15801561196a573d6000803e3d6000fd5b505050506040513d602081101561198057600080fd5b81019080805190602001909291905050509050919050565b600160008082825401925050819055506000805490506000600a73__Groups________________________________63a58ef68990918787876040518563ffffffff1660e01b8152600401808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015611a61578082015181840152602081019050611a46565b505050509050019550505050505060206040518083038186803b158015611a8757600080fd5b505af4158015611a9b573d6000803e3d6000fd5b505050506040513d6020811015611ab157600080fd5b810190808051906020019092919050505090506000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631cdac873876040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611b6557600080fd5b505afa158015611b79573d6000803e3d6000fd5b505050506040513d6020811015611b8f57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d8060008114611bfd576040519150601f19603f3d011682016040523d82523d6000602084013e611c02565b606091505b505090508015611d7057601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631cdac873876040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cab57600080fd5b505afa158015611cbf573d6000803e3d6000fd5b505050506040513d6020811015611cd557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff167fd2d1d8bb9db82c3480418ddcddf25a021102ad139edec2a62b274595d408a88d878488604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a25b50506000548114611de9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b50505050565b601b5481565b601e5481565b601c5481565b6060611e0b611311565b9050601273__DKGResultVerification_________________63da0a16899091888888888888600160030154600160040154016040518963ffffffff1660e01b815260040180898152602001888152602001806020018060200180602001806020018060200187815260200186810386528c818151815260200191508051906020019080838360005b83811015611eaf578082015181840152602081019050611e94565b50505050905090810190601f168015611edc5780820380516001836020036101000a031916815260200191505b5086810385528b818151815260200191508051906020019080838360005b83811015611f15578082015181840152602081019050611efa565b50505050905090810190601f168015611f425780820380516001836020036101000a031916815260200191505b5086810384528a818151815260200191508051906020019080838360005b83811015611f7b578082015181840152602081019050611f60565b50505050905090810190601f168015611fa85780820380516001836020036101000a031916815260200191505b50868103835289818151815260200191508051906020019060200280838360005b83811015611fe4578082015181840152602081019050611fc9565b50505050905001868103825288818151815260200191508051906020019060200280838360005b8381101561202657808201518184015260208101905061200b565b505050509050019d505050505050505050505050505060206040518083038186803b15801561205457600080fd5b505af4158015612068573d6000803e3d6000fd5b505050506040513d602081101561207e57600080fd5b8101908080519060200190929190505050506120a8858286600a614106909392919063ffffffff16565b6120bc85600a61441b90919063ffffffff16565b6120c461448d565b7f405e4a54e1d4488d62b38c147cb419b76ca730eadc4b2c7a594e729f03946c49856040518080602001828103825283818151815260200191508051906020019080838360005b8381101561212657808201518184015260208101905061210b565b50505050905090810190601f1680156121535780820380516001836020036101000a031916815260200191505b509250505060405180910390a1600173__GroupSelection________________________63bbda566b90916040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b1580156121b257600080fd5b505af41580156121c6573d6000803e3d6000fd5b50505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612295576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f43616c6c6572206973206e6f7420746865206f776e657200000000000000000081525060200191505060405180910390fd5b60178190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60205481565b60195481565b6000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ec5ffac26040518163ffffffff1660e01b815260040160206040518083038186803b15801561237457600080fd5b505afa158015612388573d6000803e3d6000fd5b505050506040513d602081101561239e57600080fd5b8101908080519060200190929190505050905060006124d382601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663afff33ef33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561248a57600080fd5b505afa15801561249e573d6000803e3d6000fd5b505050506040513d60208110156124b457600080fd5b810190808051906020019092919050505061473890919063ffffffff16565b9050600173__GroupSelection________________________63fb6ed49c909185846040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060006040518083038186803b15801561253757600080fd5b505af415801561254b573d6000803e3d6000fd5b50505050505050565b6125ed3360178054806020026020016040519081016040528092919081815260200182805480156125da57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612590575b505050505061478290919063ffffffff16565b612642576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806158446024913960400191505060405180910390fd5b600061266561264f611863565b61265761345e565b6147fd90919063ffffffff16565b9050803410156126dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e73756666696369656e74206e657720656e7472792066656500000000000081525060200191505060405180910390fd5b60006126f2823461488590919063ffffffff16565b90506127018484338585613d4e565b50505050565b6000600a600501826040518082805190602001908083835b60208310612742578051825260208201915060208101905060208303925061271f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020549050919050565b600061278761341b565b146127fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f47726f757073206578697374000000000000000000000000000000000000000081525060200191505060405180910390fd5b6017612815600160178054905061488590919063ffffffff16565b8154811061281f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16602560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506128b47f4574c8c75d6e88acd28f7e467dac97b5c60c3838d9dad993900bdf402152228e346148cf565b565b600160008082825401925050819055506000805490506128d4614b06565b612946576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f456e74727920776173207375626d69747465640000000000000000000000000081525060200191505060405180910390fd5b61294e613d30565b156129c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f456e7472792074696d6564206f7574000000000000000000000000000000000081525060200191505060405180910390fd5b60606129dc602660030154600a614b1390919063ffffffff16565b905073__BLS___________________________________63de8f50a1826026600401866040518463ffffffff1660e01b815260040180806020018060200180602001848103845287818151815260200191508051906020019080838360005b83811015612a56578082015181840152602081019050612a3b565b50505050905090810190601f168015612a835780820380516001836020036101000a031916815260200191505b50848103835286818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015612b055780601f10612ada57610100808354040283529160200191612b05565b820191906000526020600020905b815481529060010190602001808311612ae857829003601f168201915b5050848103825285818151815260200191508051906020019080838360005b83811015612b3f578082015181840152602081019050612b24565b50505050905090810190601f168015612b6c5780820380516001836020036101000a031916815260200191505b50965050505050505060206040518083038186803b158015612b8d57600080fd5b505af4158015612ba1573d6000803e3d6000fd5b505050506040513d6020811015612bb757600080fd5b8101908080519060200190929190505050612c3a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b7f8711cae111460cf9bde0d890f0dc09abcb8851e39bf020f406e53e86394cdbd760405160405180910390a1602660050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612cb9619c406022546147fd90919063ffffffff16565b602660000154853360405160240180848152602001806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015612d3c578082015181840152602081019050612d21565b50505050905090810190601f168015612d695780820380516001836020036101000a031916815260200191505b509450505050506040516020818303038152906040527fef7284e3000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310612e205780518252602082019150602081019050602083039250612dfd565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038160008787f1925050503d8060008114612e83576040519150601f19603f3d011682016040523d82523d6000602084013e612e88565b606091505b50505060006026600201541115612fda57612fd960266040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612f6a5780601f10612f3f57610100808354040283529160200191612f6a565b820191906000526020600020905b815481529060010190602001808311612f4d57829003601f168201915b505050505081526020016005820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050848051906020012060001c614bd6565b5b6000806000612fe7614ec1565b9250925092506130038484600a614ff39092919063ffffffff16565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631cdac873336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156130a257600080fd5b505afa1580156130b6573d6000803e3d6000fd5b505050506040513d60208110156130cc57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d806000811461313a576040519150601f19603f3d011682016040523d82523d6000602084013e61313f565b606091505b50505060008111156132ad57602660050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166188b8826040516024016040516020818303038152906040527f11e816ee000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310613241578051825260208201915060208101905060208303925061321e565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381858888f193505050503d80600081146132a4576040519150601f19603f3d011682016040523d82523d6000602084013e6132a9565b606091505b5050505b6000602481905550505050506000548114613330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b60235481565b3373ffffffffffffffffffffffffffffffffffffffff16601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146133fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f43616c6c6572206973206e6f7420746865206f776e657200000000000000000081525060200191505060405180910390fd5b6134118160176150e590919063ffffffff16565b5050565b601f5481565b6000613427600a61524a565b905090565b6000613459601a5461344b6022546021546147fd90919063ffffffff16565b61408090919063ffffffff16565b905090565b6000613477601b5460195461408090919063ffffffff16565b905090565b61351533601780548060200260200160405190810160405280929190818152602001828054801561350257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116134b8575b505050505061478290919063ffffffff16565b61356a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806158446024913960400191505060405180910390fd5b6000613583601a5460225461408090919063ffffffff16565b905033602560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506135e2836135dd833461488590919063ffffffff16565b6148cf565b6000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631cdac873846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561368357600080fd5b505afa158015613697573d6000803e3d6000fd5b505050506040513d60208110156136ad57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d806000811461371b576040519150601f19603f3d011682016040523d82523d6000602084013e613720565b606091505b505090508061377a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180615889603b913960400191505060405180910390fd5b50505050565b6000600160030154905090565b6060600a73__Groups________________________________63abc47ee0909185856040518463ffffffff1660e01b815260040180848152602001806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561383657808201518184015260208101905061381b565b50505050905090810190601f1680156138635780820380516001836020036101000a031916815260200191505b5094505050505060006040518083038186803b15801561388257600080fd5b505af4158015613896573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156138c057600080fd5b81019080805160405193929190846401000000008211156138e057600080fd5b838201915060208201858111156138f657600080fd5b825186602082028301116401000000008211171561391357600080fd5b8083526020830192505050908051906020019060200280838360005b8381101561394a57808201518184015260208101905061392f565b50505050905001604052505050905092915050565b6060600a73__Groups________________________________63dc2627039091846040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156139d55780820151818401526020810190506139ba565b50505050905090810190601f168015613a025780820380516001836020036101000a031916815260200191505b50935050505060006040518083038186803b158015613a2057600080fd5b505af4158015613a34573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015613a5e57600080fd5b8101908080516040519392919084640100000000821115613a7e57600080fd5b83820191506020820185811115613a9457600080fd5b8251866020820283011164010000000082111715613ab157600080fd5b8083526020830192505050908051906020019060200280838360005b83811015613ae8578082015181840152602081019050613acd565b505050509050016040525050509050919050565b601a5481565b6000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ec5ffac26040518163ffffffff1660e01b815260040160206040518083038186803b158015613b6c57600080fd5b505afa158015613b80573d6000803e3d6000fd5b505050506040513d6020811015613b9657600080fd5b81019080805190602001909291905050509050600a73__Groups________________________________6320bc286690918585856040518563ffffffff1660e01b81526004018085815260200184815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015613c2b578082015181840152602081019050613c10565b50505050905090810190601f168015613c585780820380516001836020036101000a031916815260200191505b509550505050505060006040518083038186803b158015613c7857600080fd5b505af4158015613c8c573d6000803e3d6000fd5b50505050505050565b6000600a60060154905090565b6060613cb882600a614b1390919063ffffffff16565b9050919050565b600080600090505b8360020180549050811015613d2457613d0883856002018381548110613ce957fe5b906000526020600020906002020160000161528a90919063ffffffff16565b15613d17576001915050613d2a565b8080600101915050613cc7565b50600090505b92915050565b60008060245414158015613d495750601f546024540143115b905090565b613d56614b06565b1580613d665750613d65613d30565b5b613dd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426561636f6e206973206275737900000000000000000000000000000000000081525060200191505060405180910390fd5b436024819055506000600a73__Groups________________________________6337ed6ace9091878051906020012060001c6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015613e4557600080fd5b505af4158015613e59573d6000803e3d6000fd5b505050506040513d6020811015613e6f57600080fd5b810190808051906020019092919050505090506040518060c001604052808781526020018481526020018381526020018281526020018681526020018573ffffffffffffffffffffffffffffffffffffffff168152506026600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004019080519060200190613f0b929190615679565b5060a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050506060613f6c82600a614b1390919063ffffffff16565b90507ff3a8bf09e4f9146a48f9b91226985ac8d83d971beb4fc9ffdc569790e85a97e48682604051808060200180602001838103835285818151815260200191508051906020019080838360005b83811015613fd5578082015181840152602081019050613fba565b50505050905090810190601f1680156140025780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b8381101561403b578082015181840152602081019050614020565b50505050905090810190601f1680156140685780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a150505050505050565b6000808314156140935760009050614100565b60008284029050828482816140a457fe5b04146140fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806158686021913960400191505060405180910390fd5b809150505b92915050565b8184600401846040518082805190602001908083835b6020831061413f578051825260208201915060208101905060208303925061411c565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902090805190602001906141859291906156f9565b506000815190505b600081111561441457600060016141b0600184038561534290919063ffffffff16565b0360ff16905085600401856040518082805190602001908083835b602083106141ee57805182526020820191506020810190506020830392506141cb565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600187600401876040518082805190602001908083835b6020831061425b5780518252602082019150602081019050602083039250614238565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050038154811061429d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686600401866040518082805190602001908083835b6020831061430057805182526020820191506020810190506020830392506142dd565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811061433e57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600401856040518082805190602001908083835b602083106143be578051825260208201915060208101905060208303925061439b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054809190600190036144049190615783565b508180600190039250505061418d565b5050505050565b8160020160405180604001604052808381526020014381525090806001815401808255809150509060018203906000526020600020906002020160009091929091909150600082015181600001908051906020019061447b929190615679565b50602082015181600101555050505050565b6000601a54905060003a1180156144a55750601a543a105b156144ae573a90505b60006144c58260215461408090919063ffffffff16565b90506000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631cdac873336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561456857600080fd5b505afa15801561457c573d6000803e3d6000fd5b505050506040513d602081101561459257600080fd5b810190808051906020019092919050505090506023548210156146bf5760006145c68360235461488590919063ffffffff16565b905060006023819055508173ffffffffffffffffffffffffffffffffffffffff168360405180600001905060006040518083038185875af1925050503d806000811461462e576040519150601f19603f3d011682016040523d82523d6000602084013e614633565b606091505b505050602560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634611b648826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156146a057600080fd5b505af11580156146b4573d6000803e3d6000fd5b505050505050614733565b602354915060006023819055508073ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d806000811461472a576040519150601f19603f3d011682016040523d82523d6000602084013e61472f565b606091505b5050505b505050565b600061477a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506153d3565b905092915050565b600080600090505b83518110156147f15783818151811061479f57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156147e45760019150506147f7565b808060010191505061478a565b50600090505b92915050565b60008082840190508381101561487b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006148c783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615499565b905092915050565b6148e6602154601a5461408090919063ffffffff16565b81101561495b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e73756666696369656e7420444b472066656500000000000000000000000081525060200191505060405180910390fd5b614963611708565b6149d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f47726f75702073656c656374696f6e20696e2070726f6772657373000000000081525060200191505060405180910390fd5b60006023541115614a52576000602354905060006023819055503373ffffffffffffffffffffffffffffffffffffffff16634611b648826040518263ffffffff1660e01b81526004016000604051808303818588803b158015614a3757600080fd5b505af1158015614a4b573d6000803e3d6000fd5b5050505050505b600173__GroupSelection________________________6352f9b3b99091846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060006040518083038186803b158015614aac57600080fd5b505af4158015614ac0573d6000803e3d6000fd5b505050507f0769b89b6dbd96af3cdebccc7b68ce1e4ae748abc3e6b19a73b8b58460c57a94826040518082815260200191505060405180910390a1806023819055505050565b6000806024541415905090565b6060826002018281548110614b2457fe5b90600052602060002090600202016000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015614bc95780601f10614b9e57610100808354040283529160200191614bc9565b820191906000526020600020905b815481529060010190602001808311614bac57829003601f168201915b5050505050905092915050565b6000826040015190506000614bf6601a548361473890919063ffffffff16565b9050606060005a90508560a0015173ffffffffffffffffffffffffffffffffffffffff168387600001518760405160240180838152602001828152602001925050506040516020818303038152906040527ffc3fcec7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310614ce85780518252602082019150602081019050602083039250614cc5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038160008787f1925050503d8060008114614d4b576040519150601f19603f3d011682016040523d82523d6000602084013e614d50565b606091505b5090508092505060005a90506000614d71828461488590919063ffffffff16565b905073__Reimbursements________________________6346a50089601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601a5488858b8a6040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614e50578082015181840152602081019050614e35565b50505050905090810190601f168015614e7d5780820380516001836020036101000a031916815260200191505b5097505050505050505060006040518083038186803b158015614e9f57600080fd5b505af4158015614eb3573d6000803e3d6000fd5b505050505050505050505050565b600080600080662386f26fc1000090506000614edb615559565b9050614f0482614ef68360195461408090919063ffffffff16565b61473890919063ffffffff16565b94506000614f2f614f1e838561488590919063ffffffff16565b60195461408090919063ffffffff16565b90506000614f6d84614f5f6005614f51601b548761408090919063ffffffff16565b61564990919063ffffffff16565b61473890919063ffffffff16565b90506000614f90614f7c61345e565b60266001015461488590919063ffffffff16565b9050614fa582826147fd90919063ffffffff16565b9650614fe782614fd9614fc3601b548c61408090919063ffffffff16565b614fcb61345e565b61488590919063ffffffff16565b61488590919063ffffffff16565b95505050505050909192565b6150718184600501846040518082805190602001908083835b6020831061502f578051825260208201915060208101905060208303925061500c565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020546147fd90919063ffffffff16565b83600501836040518082805190602001908083835b602083106150a95780518252602082019150602081019050602083039250615086565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902081905550505050565b600080600090505b83805490508110156152405783818154811061510557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156152335760008190505b60018580549050038110156152135784600182018154811061518757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168582815481106151be57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080600101915050615169565b508380548091906001900361522891906157af565b508080600190039150505b80806001019150506150ed565b5082905092915050565b600061528382600301805490506152758460060154856002018054905061488590919063ffffffff16565b61488590919063ffffffff16565b9050919050565b600080600190508354600260018083161561010002038216048451808214600181146152b95760009450615334565b821561533357602083106001811461531757600189600052602060002060208a018581015b60028482841001141561530e5781518354146152fd5760009950600093505b6001830192506020820191506152de565b50505050615331565b6101008086040294506020880151851461533057600095505b5b505b5b505050508091505092915050565b600060018201835110156153be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f55696e743820636f6e76657273696f6e206f7574206f6620626f756e64732e0081525060200191505060405180910390fd5b60008260018501015190508091505092915050565b6000808311829061547f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615444578082015181840152602081019050615429565b50505050905090810190601f1680156154715780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161548b57fe5b049050809150509392505050565b6000838311158290615546576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561550b5780820151818401526020810190506154f0565b50505050905090810190601f1680156155385780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080662386f26fc10000905060006155926001615584601f546024546147fd90919063ffffffff16565b6147fd90919063ffffffff16565b905060006155c060016155b2601e546024546147fd90919063ffffffff16565b6147fd90919063ffffffff16565b90506000814311156155d257436155d4565b815b905060006155eb828561488590919063ffffffff16565b90506000615602848661488590919063ffffffff16565b905061563e86600261562f846156218b8861408090919063ffffffff16565b61473890919063ffffffff16565b0a61473890919063ffffffff16565b965050505050505090565b60006156716064615663848661408090919063ffffffff16565b61473890919063ffffffff16565b905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106156ba57805160ff19168380011785556156e8565b828001600101855582156156e8579182015b828111156156e75782518255916020019190600101906156cc565b5b5090506156f591906157db565b5090565b828054828255906000526020600020908101928215615772579160200282015b828111156157715782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190615719565b5b50905061577f9190615800565b5090565b8154818355818111156157aa578183600052602060002091820191016157a991906157db565b5b505050565b8154818355818111156157d6578183600052602060002091820191016157d591906157db565b5b505050565b6157fd91905b808211156157f95760008160009055506001016157e1565b5090565b90565b61584091905b8082111561583c57600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101615806565b5090565b9056fe43616c6c6572206973206e6f7420616e20617574686f72697a656420636f6e7472616374536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774661696c6564207265696d62757273696e67207375626d697474657220666f72207374617274696e6720612067726f75702073656c656374696f6ea265627a7a723158208efa69ff6ba464db8ab99fc99f0fca3a6350fd49d6958c5fdc1346c64fa3e5c064736f6c634300050e0032536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77", - "deployedBytecode": "0x6080604052600436106102245760003560e01c80638a3a3da811610123578063c300d058116100ab578063d12f5e691161006f578063d12f5e6914611012578063e1f4d6321461112f578063e581ff741461115a578063eb9488d31461122c578063ef7c8f9c1461125757610224565b8063c300d05814610e06578063c443894614610e31578063c96e71fb14610e5c578063c98622fb14610eaa578063cb62c50d14610ed557610224565b8063ac374f4b116100f2578063ac374f4b14610c6c578063b1c77c8f14610d34578063b64ac8e414610d5f578063b99f0c4314610db0578063bf95249614610ddb57610224565b80638a3a3da814610a865780639b3d270a14610ac15780639dabee4414610b86578063a7f0b3de14610c6257610224565b8063517471a9116101b15780636dcc64f8116101755780636dcc64f81461072057806373f1daab1461074b5780637760c6c7146109df57806379f9fb7e14610a305780637d7d7dd914610a5b57610224565b8063517471a9146105475780635c1c0710146105725780635d6615d9146105db57806363b635ea146106ca578063650d89e7146106f557610224565b80631ed74070116101f85780631ed74070146103cb57806321a8f86c146103e257806324f17313146104115780632d6f8f311461043c57806336c857171461051c57610224565b80623bf87e146102295780630b19991f1461025457806310c3a173146102c05780631c524ac2146102eb575b600080fd5b34801561023557600080fd5b5061023e61130b565b6040518082815260200191505060405180910390f35b34801561026057600080fd5b50610269611311565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102ac578082015181840152602081019050610291565b505050509050019250505060405180910390f35b3480156102cc57600080fd5b506102d561143f565b6040518082815260200191505060405180910390f35b3480156102f757600080fd5b506103b16004803603602081101561030e57600080fd5b810190808035906020019064010000000081111561032b57600080fd5b82018360208201111561033d57600080fd5b8035906020019184600183028401116401000000008311171561035f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061144f565b604051808215151515815260200191505060405180910390f35b3480156103d757600080fd5b506103e061146c565b005b3480156103ee57600080fd5b506103f7611708565b604051808215151515815260200191505060405180910390f35b34801561041d57600080fd5b50610426611754565b6040518082815260200191505060405180910390f35b34801561044857600080fd5b506105026004803603602081101561045f57600080fd5b810190808035906020019064010000000081111561047c57600080fd5b82018360208201111561048e57600080fd5b803590602001918460018302840111640100000000831117156104b057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061175a565b604051808215151515815260200191505060405180910390f35b34801561052857600080fd5b5061053161185d565b6040518082815260200191505060405180910390f35b34801561055357600080fd5b5061055c611863565b6040518082815260200191505060405180910390f35b34801561057e57600080fd5b506105c16004803603602081101561059557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611881565b604051808215151515815260200191505060405180910390f35b3480156105e757600080fd5b506106c8600480360360608110156105fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561064557600080fd5b82018360208201111561065757600080fd5b8035906020019184602083028401116401000000008311171561067957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611998565b005b3480156106d657600080fd5b506106df611def565b6040518082815260200191505060405180910390f35b34801561070157600080fd5b5061070a611df5565b6040518082815260200191505060405180910390f35b34801561072c57600080fd5b50610735611dfb565b6040518082815260200191505060405180910390f35b34801561075757600080fd5b506109dd600480360360a081101561076e57600080fd5b81019080803590602001909291908035906020019064010000000081111561079557600080fd5b8201836020820111156107a757600080fd5b803590602001918460018302840111640100000000831117156107c957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561082c57600080fd5b82018360208201111561083e57600080fd5b8035906020019184600183028401116401000000008311171561086057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156108c357600080fd5b8201836020820111156108d557600080fd5b803590602001918460018302840111640100000000831117156108f757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561095a57600080fd5b82018360208201111561096c57600080fd5b8035906020019184602083028401116401000000008311171561098e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611e01565b005b3480156109eb57600080fd5b50610a2e60048036036020811015610a0257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121d2565b005b348015610a3c57600080fd5b50610a456122fe565b6040518082815260200191505060405180910390f35b348015610a6757600080fd5b50610a70612304565b6040518082815260200191505060405180910390f35b348015610a9257600080fd5b50610abf60048036036020811015610aa957600080fd5b810190808035906020019092919050505061230a565b005b610b8460048036036040811015610ad757600080fd5b810190808035906020019092919080359060200190640100000000811115610afe57600080fd5b820183602082011115610b1057600080fd5b80359060200191846001830284011164010000000083111715610b3257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612554565b005b348015610b9257600080fd5b50610c4c60048036036020811015610ba957600080fd5b8101908080359060200190640100000000811115610bc657600080fd5b820183602082011115610bd857600080fd5b80359060200191846001830284011164010000000083111715610bfa57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612707565b6040518082815260200191505060405180910390f35b610c6a61277d565b005b348015610c7857600080fd5b50610d3260048036036020811015610c8f57600080fd5b8101908080359060200190640100000000811115610cac57600080fd5b820183602082011115610cbe57600080fd5b80359060200191846001830284011164010000000083111715610ce057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506128b6565b005b348015610d4057600080fd5b50610d49613334565b6040518082815260200191505060405180910390f35b348015610d6b57600080fd5b50610dae60048036036020811015610d8257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061333a565b005b348015610dbc57600080fd5b50610dc5613415565b6040518082815260200191505060405180910390f35b348015610de757600080fd5b50610df061341b565b6040518082815260200191505060405180910390f35b348015610e1257600080fd5b50610e1b61342c565b6040518082815260200191505060405180910390f35b348015610e3d57600080fd5b50610e4661345e565b6040518082815260200191505060405180910390f35b610ea860048036036040811015610e7257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061347c565b005b348015610eb657600080fd5b50610ebf613780565b6040518082815260200191505060405180910390f35b348015610ee157600080fd5b50610fbb60048036036040811015610ef857600080fd5b8101908080359060200190640100000000811115610f1557600080fd5b820183602082011115610f2757600080fd5b80359060200191846001830284011164010000000083111715610f4957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061378d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610ffe578082015181840152602081019050610fe3565b505050509050019250505060405180910390f35b34801561101e57600080fd5b506110d86004803603602081101561103557600080fd5b810190808035906020019064010000000081111561105257600080fd5b82018360208201111561106457600080fd5b8035906020019184600183028401116401000000008311171561108657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061395f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561111b578082015181840152602081019050611100565b505050509050019250505060405180910390f35b34801561113b57600080fd5b50611144613afc565b6040518082815260200191505060405180910390f35b34801561116657600080fd5b5061122a6004803603604081101561117d57600080fd5b8101908080359060200190929190803590602001906401000000008111156111a457600080fd5b8201836020820111156111b657600080fd5b803590602001918460018302840111640100000000831117156111d857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613b02565b005b34801561123857600080fd5b50611241613c95565b6040518082815260200191505060405180910390f35b34801561126357600080fd5b506112906004803603602081101561127a57600080fd5b8101908080359060200190929190505050613ca2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156112d05780820151818401526020810190506112b5565b50505050905090810190601f1680156112fd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60215481565b6060600173__GroupSelection________________________63a3c6b2b390916040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b15801561136557600080fd5b505af4158015611379573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156113a357600080fd5b81019080805160405193929190846401000000008211156113c357600080fd5b838201915060208201858111156113d957600080fd5b82518660208202830111640100000000821117156113f657600080fd5b8083526020830192505050908051906020019060200280838360005b8381101561142d578082015181840152602081019050611412565b50505050905001604052505050905090565b6000600160000180549050905090565b600061146582600a613cbf90919063ffffffff16565b9050919050565b611474613d30565b6114e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f456e74727920646964206e6f742074696d65206f75740000000000000000000081525060200191505060405180910390fd5b6000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ec5ffac26040518163ffffffff1660e01b815260040160206040518083038186803b15801561155057600080fd5b505afa158015611564573d6000803e3d6000fd5b505050506040513d602081101561157a57600080fd5b81019080805190602001909291905050509050600a73__Groups________________________________63edaa60e89091602660030154601b54856040518563ffffffff1660e01b81526004018085815260200184815260200183815260200182815260200194505050505060006040518083038186803b1580156115fe57600080fd5b505af4158015611612573d6000803e3d6000fd5b50505050600061162061341b565b11156117055761170460266000015460266004018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116c85780601f1061169d576101008083540402835291602001916116c8565b820191906000526020600020905b8154815290600101906020018083116116ab57829003601f168201915b5050505050602660050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16602660010154602660020154613d4e565b5b50565b6000600160050160009054906101000a900460ff1661172a5760019050611751565b6000601d54601b540260126000015460016003015460016004015401010190508043119150505b90565b60225481565b6000600a73__Groups________________________________63cc9b37c29091846040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156117d05780820151818401526020810190506117b5565b50505050905090810190601f1680156117fd5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561181b57600080fd5b505af415801561182f573d6000803e3d6000fd5b505050506040513d602081101561184557600080fd5b81019080805190602001909291905050509050919050565b601d5481565b600061187c601a5460205461408090919063ffffffff16565b905090565b6000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166310a63ec083306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561195657600080fd5b505afa15801561196a573d6000803e3d6000fd5b505050506040513d602081101561198057600080fd5b81019080805190602001909291905050509050919050565b600160008082825401925050819055506000805490506000600a73__Groups________________________________63a58ef68990918787876040518563ffffffff1660e01b8152600401808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015611a61578082015181840152602081019050611a46565b505050509050019550505050505060206040518083038186803b158015611a8757600080fd5b505af4158015611a9b573d6000803e3d6000fd5b505050506040513d6020811015611ab157600080fd5b810190808051906020019092919050505090506000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631cdac873876040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611b6557600080fd5b505afa158015611b79573d6000803e3d6000fd5b505050506040513d6020811015611b8f57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d8060008114611bfd576040519150601f19603f3d011682016040523d82523d6000602084013e611c02565b606091505b505090508015611d7057601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631cdac873876040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cab57600080fd5b505afa158015611cbf573d6000803e3d6000fd5b505050506040513d6020811015611cd557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff167fd2d1d8bb9db82c3480418ddcddf25a021102ad139edec2a62b274595d408a88d878488604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a25b50506000548114611de9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b50505050565b601b5481565b601e5481565b601c5481565b6060611e0b611311565b9050601273__DKGResultVerification_________________63da0a16899091888888888888600160030154600160040154016040518963ffffffff1660e01b815260040180898152602001888152602001806020018060200180602001806020018060200187815260200186810386528c818151815260200191508051906020019080838360005b83811015611eaf578082015181840152602081019050611e94565b50505050905090810190601f168015611edc5780820380516001836020036101000a031916815260200191505b5086810385528b818151815260200191508051906020019080838360005b83811015611f15578082015181840152602081019050611efa565b50505050905090810190601f168015611f425780820380516001836020036101000a031916815260200191505b5086810384528a818151815260200191508051906020019080838360005b83811015611f7b578082015181840152602081019050611f60565b50505050905090810190601f168015611fa85780820380516001836020036101000a031916815260200191505b50868103835289818151815260200191508051906020019060200280838360005b83811015611fe4578082015181840152602081019050611fc9565b50505050905001868103825288818151815260200191508051906020019060200280838360005b8381101561202657808201518184015260208101905061200b565b505050509050019d505050505050505050505050505060206040518083038186803b15801561205457600080fd5b505af4158015612068573d6000803e3d6000fd5b505050506040513d602081101561207e57600080fd5b8101908080519060200190929190505050506120a8858286600a614106909392919063ffffffff16565b6120bc85600a61441b90919063ffffffff16565b6120c461448d565b7f405e4a54e1d4488d62b38c147cb419b76ca730eadc4b2c7a594e729f03946c49856040518080602001828103825283818151815260200191508051906020019080838360005b8381101561212657808201518184015260208101905061210b565b50505050905090810190601f1680156121535780820380516001836020036101000a031916815260200191505b509250505060405180910390a1600173__GroupSelection________________________63bbda566b90916040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b1580156121b257600080fd5b505af41580156121c6573d6000803e3d6000fd5b50505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612295576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f43616c6c6572206973206e6f7420746865206f776e657200000000000000000081525060200191505060405180910390fd5b60178190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60205481565b60195481565b6000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ec5ffac26040518163ffffffff1660e01b815260040160206040518083038186803b15801561237457600080fd5b505afa158015612388573d6000803e3d6000fd5b505050506040513d602081101561239e57600080fd5b8101908080519060200190929190505050905060006124d382601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663afff33ef33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561248a57600080fd5b505afa15801561249e573d6000803e3d6000fd5b505050506040513d60208110156124b457600080fd5b810190808051906020019092919050505061473890919063ffffffff16565b9050600173__GroupSelection________________________63fb6ed49c909185846040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060006040518083038186803b15801561253757600080fd5b505af415801561254b573d6000803e3d6000fd5b50505050505050565b6125ed3360178054806020026020016040519081016040528092919081815260200182805480156125da57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612590575b505050505061478290919063ffffffff16565b612642576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806158446024913960400191505060405180910390fd5b600061266561264f611863565b61265761345e565b6147fd90919063ffffffff16565b9050803410156126dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e73756666696369656e74206e657720656e7472792066656500000000000081525060200191505060405180910390fd5b60006126f2823461488590919063ffffffff16565b90506127018484338585613d4e565b50505050565b6000600a600501826040518082805190602001908083835b60208310612742578051825260208201915060208101905060208303925061271f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020549050919050565b600061278761341b565b146127fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f47726f757073206578697374000000000000000000000000000000000000000081525060200191505060405180910390fd5b6017612815600160178054905061488590919063ffffffff16565b8154811061281f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16602560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506128b47f4574c8c75d6e88acd28f7e467dac97b5c60c3838d9dad993900bdf402152228e346148cf565b565b600160008082825401925050819055506000805490506128d4614b06565b612946576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f456e74727920776173207375626d69747465640000000000000000000000000081525060200191505060405180910390fd5b61294e613d30565b156129c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f456e7472792074696d6564206f7574000000000000000000000000000000000081525060200191505060405180910390fd5b60606129dc602660030154600a614b1390919063ffffffff16565b905073__BLS___________________________________63de8f50a1826026600401866040518463ffffffff1660e01b815260040180806020018060200180602001848103845287818151815260200191508051906020019080838360005b83811015612a56578082015181840152602081019050612a3b565b50505050905090810190601f168015612a835780820380516001836020036101000a031916815260200191505b50848103835286818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015612b055780601f10612ada57610100808354040283529160200191612b05565b820191906000526020600020905b815481529060010190602001808311612ae857829003601f168201915b5050848103825285818151815260200191508051906020019080838360005b83811015612b3f578082015181840152602081019050612b24565b50505050905090810190601f168015612b6c5780820380516001836020036101000a031916815260200191505b50965050505050505060206040518083038186803b158015612b8d57600080fd5b505af4158015612ba1573d6000803e3d6000fd5b505050506040513d6020811015612bb757600080fd5b8101908080519060200190929190505050612c3a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b7f8711cae111460cf9bde0d890f0dc09abcb8851e39bf020f406e53e86394cdbd760405160405180910390a1602660050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612cb9619c406022546147fd90919063ffffffff16565b602660000154853360405160240180848152602001806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015612d3c578082015181840152602081019050612d21565b50505050905090810190601f168015612d695780820380516001836020036101000a031916815260200191505b509450505050506040516020818303038152906040527fef7284e3000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310612e205780518252602082019150602081019050602083039250612dfd565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038160008787f1925050503d8060008114612e83576040519150601f19603f3d011682016040523d82523d6000602084013e612e88565b606091505b50505060006026600201541115612fda57612fd960266040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612f6a5780601f10612f3f57610100808354040283529160200191612f6a565b820191906000526020600020905b815481529060010190602001808311612f4d57829003601f168201915b505050505081526020016005820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050848051906020012060001c614bd6565b5b6000806000612fe7614ec1565b9250925092506130038484600a614ff39092919063ffffffff16565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631cdac873336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156130a257600080fd5b505afa1580156130b6573d6000803e3d6000fd5b505050506040513d60208110156130cc57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d806000811461313a576040519150601f19603f3d011682016040523d82523d6000602084013e61313f565b606091505b50505060008111156132ad57602660050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166188b8826040516024016040516020818303038152906040527f11e816ee000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310613241578051825260208201915060208101905060208303925061321e565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381858888f193505050503d80600081146132a4576040519150601f19603f3d011682016040523d82523d6000602084013e6132a9565b606091505b5050505b6000602481905550505050506000548114613330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b60235481565b3373ffffffffffffffffffffffffffffffffffffffff16601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146133fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f43616c6c6572206973206e6f7420746865206f776e657200000000000000000081525060200191505060405180910390fd5b6134118160176150e590919063ffffffff16565b5050565b601f5481565b6000613427600a61524a565b905090565b6000613459601a5461344b6022546021546147fd90919063ffffffff16565b61408090919063ffffffff16565b905090565b6000613477601b5460195461408090919063ffffffff16565b905090565b61351533601780548060200260200160405190810160405280929190818152602001828054801561350257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116134b8575b505050505061478290919063ffffffff16565b61356a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806158446024913960400191505060405180910390fd5b6000613583601a5460225461408090919063ffffffff16565b905033602560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506135e2836135dd833461488590919063ffffffff16565b6148cf565b6000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631cdac873846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561368357600080fd5b505afa158015613697573d6000803e3d6000fd5b505050506040513d60208110156136ad57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d806000811461371b576040519150601f19603f3d011682016040523d82523d6000602084013e613720565b606091505b505090508061377a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180615889603b913960400191505060405180910390fd5b50505050565b6000600160030154905090565b6060600a73__Groups________________________________63abc47ee0909185856040518463ffffffff1660e01b815260040180848152602001806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561383657808201518184015260208101905061381b565b50505050905090810190601f1680156138635780820380516001836020036101000a031916815260200191505b5094505050505060006040518083038186803b15801561388257600080fd5b505af4158015613896573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156138c057600080fd5b81019080805160405193929190846401000000008211156138e057600080fd5b838201915060208201858111156138f657600080fd5b825186602082028301116401000000008211171561391357600080fd5b8083526020830192505050908051906020019060200280838360005b8381101561394a57808201518184015260208101905061392f565b50505050905001604052505050905092915050565b6060600a73__Groups________________________________63dc2627039091846040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156139d55780820151818401526020810190506139ba565b50505050905090810190601f168015613a025780820380516001836020036101000a031916815260200191505b50935050505060006040518083038186803b158015613a2057600080fd5b505af4158015613a34573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015613a5e57600080fd5b8101908080516040519392919084640100000000821115613a7e57600080fd5b83820191506020820185811115613a9457600080fd5b8251866020820283011164010000000082111715613ab157600080fd5b8083526020830192505050908051906020019060200280838360005b83811015613ae8578082015181840152602081019050613acd565b505050509050016040525050509050919050565b601a5481565b6000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ec5ffac26040518163ffffffff1660e01b815260040160206040518083038186803b158015613b6c57600080fd5b505afa158015613b80573d6000803e3d6000fd5b505050506040513d6020811015613b9657600080fd5b81019080805190602001909291905050509050600a73__Groups________________________________6320bc286690918585856040518563ffffffff1660e01b81526004018085815260200184815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015613c2b578082015181840152602081019050613c10565b50505050905090810190601f168015613c585780820380516001836020036101000a031916815260200191505b509550505050505060006040518083038186803b158015613c7857600080fd5b505af4158015613c8c573d6000803e3d6000fd5b50505050505050565b6000600a60060154905090565b6060613cb882600a614b1390919063ffffffff16565b9050919050565b600080600090505b8360020180549050811015613d2457613d0883856002018381548110613ce957fe5b906000526020600020906002020160000161528a90919063ffffffff16565b15613d17576001915050613d2a565b8080600101915050613cc7565b50600090505b92915050565b60008060245414158015613d495750601f546024540143115b905090565b613d56614b06565b1580613d665750613d65613d30565b5b613dd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426561636f6e206973206275737900000000000000000000000000000000000081525060200191505060405180910390fd5b436024819055506000600a73__Groups________________________________6337ed6ace9091878051906020012060001c6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015613e4557600080fd5b505af4158015613e59573d6000803e3d6000fd5b505050506040513d6020811015613e6f57600080fd5b810190808051906020019092919050505090506040518060c001604052808781526020018481526020018381526020018281526020018681526020018573ffffffffffffffffffffffffffffffffffffffff168152506026600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004019080519060200190613f0b929190615679565b5060a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050506060613f6c82600a614b1390919063ffffffff16565b90507ff3a8bf09e4f9146a48f9b91226985ac8d83d971beb4fc9ffdc569790e85a97e48682604051808060200180602001838103835285818151815260200191508051906020019080838360005b83811015613fd5578082015181840152602081019050613fba565b50505050905090810190601f1680156140025780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b8381101561403b578082015181840152602081019050614020565b50505050905090810190601f1680156140685780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a150505050505050565b6000808314156140935760009050614100565b60008284029050828482816140a457fe5b04146140fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806158686021913960400191505060405180910390fd5b809150505b92915050565b8184600401846040518082805190602001908083835b6020831061413f578051825260208201915060208101905060208303925061411c565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902090805190602001906141859291906156f9565b506000815190505b600081111561441457600060016141b0600184038561534290919063ffffffff16565b0360ff16905085600401856040518082805190602001908083835b602083106141ee57805182526020820191506020810190506020830392506141cb565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600187600401876040518082805190602001908083835b6020831061425b5780518252602082019150602081019050602083039250614238565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050038154811061429d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686600401866040518082805190602001908083835b6020831061430057805182526020820191506020810190506020830392506142dd565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811061433e57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600401856040518082805190602001908083835b602083106143be578051825260208201915060208101905060208303925061439b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054809190600190036144049190615783565b508180600190039250505061418d565b5050505050565b8160020160405180604001604052808381526020014381525090806001815401808255809150509060018203906000526020600020906002020160009091929091909150600082015181600001908051906020019061447b929190615679565b50602082015181600101555050505050565b6000601a54905060003a1180156144a55750601a543a105b156144ae573a90505b60006144c58260215461408090919063ffffffff16565b90506000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631cdac873336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561456857600080fd5b505afa15801561457c573d6000803e3d6000fd5b505050506040513d602081101561459257600080fd5b810190808051906020019092919050505090506023548210156146bf5760006145c68360235461488590919063ffffffff16565b905060006023819055508173ffffffffffffffffffffffffffffffffffffffff168360405180600001905060006040518083038185875af1925050503d806000811461462e576040519150601f19603f3d011682016040523d82523d6000602084013e614633565b606091505b505050602560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634611b648826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156146a057600080fd5b505af11580156146b4573d6000803e3d6000fd5b505050505050614733565b602354915060006023819055508073ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d806000811461472a576040519150601f19603f3d011682016040523d82523d6000602084013e61472f565b606091505b5050505b505050565b600061477a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506153d3565b905092915050565b600080600090505b83518110156147f15783818151811061479f57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156147e45760019150506147f7565b808060010191505061478a565b50600090505b92915050565b60008082840190508381101561487b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006148c783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615499565b905092915050565b6148e6602154601a5461408090919063ffffffff16565b81101561495b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e73756666696369656e7420444b472066656500000000000000000000000081525060200191505060405180910390fd5b614963611708565b6149d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f47726f75702073656c656374696f6e20696e2070726f6772657373000000000081525060200191505060405180910390fd5b60006023541115614a52576000602354905060006023819055503373ffffffffffffffffffffffffffffffffffffffff16634611b648826040518263ffffffff1660e01b81526004016000604051808303818588803b158015614a3757600080fd5b505af1158015614a4b573d6000803e3d6000fd5b5050505050505b600173__GroupSelection________________________6352f9b3b99091846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060006040518083038186803b158015614aac57600080fd5b505af4158015614ac0573d6000803e3d6000fd5b505050507f0769b89b6dbd96af3cdebccc7b68ce1e4ae748abc3e6b19a73b8b58460c57a94826040518082815260200191505060405180910390a1806023819055505050565b6000806024541415905090565b6060826002018281548110614b2457fe5b90600052602060002090600202016000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015614bc95780601f10614b9e57610100808354040283529160200191614bc9565b820191906000526020600020905b815481529060010190602001808311614bac57829003601f168201915b5050505050905092915050565b6000826040015190506000614bf6601a548361473890919063ffffffff16565b9050606060005a90508560a0015173ffffffffffffffffffffffffffffffffffffffff168387600001518760405160240180838152602001828152602001925050506040516020818303038152906040527ffc3fcec7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310614ce85780518252602082019150602081019050602083039250614cc5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038160008787f1925050503d8060008114614d4b576040519150601f19603f3d011682016040523d82523d6000602084013e614d50565b606091505b5090508092505060005a90506000614d71828461488590919063ffffffff16565b905073__Reimbursements________________________6346a50089601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601a5488858b8a6040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614e50578082015181840152602081019050614e35565b50505050905090810190601f168015614e7d5780820380516001836020036101000a031916815260200191505b5097505050505050505060006040518083038186803b158015614e9f57600080fd5b505af4158015614eb3573d6000803e3d6000fd5b505050505050505050505050565b600080600080662386f26fc1000090506000614edb615559565b9050614f0482614ef68360195461408090919063ffffffff16565b61473890919063ffffffff16565b94506000614f2f614f1e838561488590919063ffffffff16565b60195461408090919063ffffffff16565b90506000614f6d84614f5f6005614f51601b548761408090919063ffffffff16565b61564990919063ffffffff16565b61473890919063ffffffff16565b90506000614f90614f7c61345e565b60266001015461488590919063ffffffff16565b9050614fa582826147fd90919063ffffffff16565b9650614fe782614fd9614fc3601b548c61408090919063ffffffff16565b614fcb61345e565b61488590919063ffffffff16565b61488590919063ffffffff16565b95505050505050909192565b6150718184600501846040518082805190602001908083835b6020831061502f578051825260208201915060208101905060208303925061500c565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020546147fd90919063ffffffff16565b83600501836040518082805190602001908083835b602083106150a95780518252602082019150602081019050602083039250615086565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902081905550505050565b600080600090505b83805490508110156152405783818154811061510557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156152335760008190505b60018580549050038110156152135784600182018154811061518757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168582815481106151be57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080600101915050615169565b508380548091906001900361522891906157af565b508080600190039150505b80806001019150506150ed565b5082905092915050565b600061528382600301805490506152758460060154856002018054905061488590919063ffffffff16565b61488590919063ffffffff16565b9050919050565b600080600190508354600260018083161561010002038216048451808214600181146152b95760009450615334565b821561533357602083106001811461531757600189600052602060002060208a018581015b60028482841001141561530e5781518354146152fd5760009950600093505b6001830192506020820191506152de565b50505050615331565b6101008086040294506020880151851461533057600095505b5b505b5b505050508091505092915050565b600060018201835110156153be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f55696e743820636f6e76657273696f6e206f7574206f6620626f756e64732e0081525060200191505060405180910390fd5b60008260018501015190508091505092915050565b6000808311829061547f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615444578082015181840152602081019050615429565b50505050905090810190601f1680156154715780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161548b57fe5b049050809150509392505050565b6000838311158290615546576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561550b5780820151818401526020810190506154f0565b50505050905090810190601f1680156155385780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080662386f26fc10000905060006155926001615584601f546024546147fd90919063ffffffff16565b6147fd90919063ffffffff16565b905060006155c060016155b2601e546024546147fd90919063ffffffff16565b6147fd90919063ffffffff16565b90506000814311156155d257436155d4565b815b905060006155eb828561488590919063ffffffff16565b90506000615602848661488590919063ffffffff16565b905061563e86600261562f846156218b8861408090919063ffffffff16565b61473890919063ffffffff16565b0a61473890919063ffffffff16565b965050505050505090565b60006156716064615663848661408090919063ffffffff16565b61473890919063ffffffff16565b905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106156ba57805160ff19168380011785556156e8565b828001600101855582156156e8579182015b828111156156e75782518255916020019190600101906156cc565b5b5090506156f591906157db565b5090565b828054828255906000526020600020908101928215615772579160200282015b828111156157715782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190615719565b5b50905061577f9190615800565b5090565b8154818355818111156157aa578183600052602060002091820191016157a991906157db565b5b505050565b8154818355818111156157d6578183600052602060002091820191016157d591906157db565b5b505050565b6157fd91905b808211156157f95760008160009055506001016157e1565b5090565b90565b61584091905b8082111561583c57600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101615806565b5090565b9056fe43616c6c6572206973206e6f7420616e20617574686f72697a656420636f6e7472616374536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774661696c6564207265696d62757273696e67207375626d697474657220666f72207374617274696e6720612067726f75702073656c656374696f6ea265627a7a723158208efa69ff6ba464db8ab99fc99f0fca3a6350fd49d6958c5fdc1346c64fa3e5c064736f6c634300050e0032", - "sourceMap": "1112:29154:2:-;;;2347:8;2308:47;;2699:6;2666:39;;2815:2;2788:29;;2973:2;2941:34;;3123:1;3079:45;;3300:3;3257:47;;3711:71;3740:41;3754:26;;3740:9;;:13;;;;;;:41;;;;:::i;:::-;3711:24;;:28;;;;;;:71;;;;:::i;:::-;3676:106;;4002:6;3956:52;;4129:7;4097:39;;4249:6;4206:49;;6299:937;8:9:-1;5:2;;;30:1;27;20:12;5:2;6299:937:2;;;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6299:937:2;;;;;;;;;;;;;;;;;;;;;;;;;879:1:51;863:13;:17;;;;6388:10:2;6380:5;;:18;;;;;;;;;;;;;;;;;;6409:16;6431;6409:39;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;6409:39:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6489:16;6458:15;;:48;;;;;;;;;;;;;;;;;;6555:16;6517:6;:22;;;:55;;;;;;;;;;;;;;;;;;6620:16;6607:49;;;:51;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6607:51:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6607:51:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6607:51:2;;;;;;;;;;;;;;;;6582:6;:22;;:76;;;;6710:2;6669:14;:38;;:43;;;;6749:9;;6722:14;:24;;:36;;;;6801:18;6769:21;:29;;:50;;;;6880:26;;6829:21;:48;;:77;;;;6950:9;;6916:21;:31;;:43;;;;7215:14;;7172:21;:40;;:57;;;;6299:937;;1112:29154;;2159:459:45;2217:7;2463:1;2458;:6;2454:45;;;2487:1;2480:8;;;;2454:45;2509:9;2525:1;2521;:5;2509:17;;2553:1;2548;2544;:5;;;;;;:10;2536:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2610:1;2603:8;;;2159:459;;;;;:::o;834:176::-;892:7;911:9;927:1;923;:5;911:17;;951:1;946;:6;;938:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1002:1;995:8;;;834:176;;;;:::o;1112:29154:2:-;;;;;;;", - "deployedSourceMap": "1112:29154:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4097:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4097:39:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11484:132;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11484:132:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;11484:132:2;;;;;;;;;;;;;;;;;11270:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11270:116:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25815:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25815:140:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25815:140:2;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;25815:140:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;25815:140:2;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;25815:140:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;25815:140:2;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24045:782;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24045:782:2;;;:::i;:::-;;9382:548;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9382:548:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;4206:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4206:49:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26453:130;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26453:130:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26453:130:2;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;26453:130:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;26453:130:2;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;26453:130:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;26453:130:2;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3079:45;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3079:45:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28839:135;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28839:135:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25579:145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25579:145:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25579:145:2;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27802:498;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27802:498:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27802:498:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;27802:498:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;27802:498:2;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27802:498:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;27802:498:2;;;;;;;;;;;;;;;:::i;:::-;;2788:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2788:29:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3257:47;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3257:47:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2941:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2941:34:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12311:815;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12311:815:2;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;12311:815:2;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;12311:815:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12311:815:2;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;12311:815:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;12311:815:2;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;12311:815:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12311:815:2;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;12311:815:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;12311:815:2;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;12311:815:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12311:815:2;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;12311:815:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;12311:815:2;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;12311:815:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12311:815:2;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;12311:815:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;12311:815:2;;;;;;;;;;;;;;;:::i;:::-;;7355:125;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7355:125:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7355:125:2;;;;;;;;;;;;;;;;;;;:::i;:::-;;3956:52;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3956:52:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2308:47;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2308:47:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10638:283;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10638:283:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10638:283:2;;;;;;;;;;;;;;;;;:::i;:::-;;15033:582;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15033:582:2;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;15033:582:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;15033:582:2;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;15033:582:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;15033:582:2;;;;;;;;;;;;;;;:::i;:::-;;26912:149;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26912:149:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26912:149:2;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;26912:149:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;26912:149:2;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;26912:149:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;26912:149:2;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5487:369;;;:::i;:::-;;16626:1606;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16626:1606:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16626:1606:2;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;16626:1606:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;16626:1606:2;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;16626:1606:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;16626:1606:2;;;;;;;;;;;;;;;:::i;:::-;;4592:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4592:43:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7602:137;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7602:137:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7602:137:2;;;;;;;;;;;;;;;;;;;:::i;:::-;;3676:106;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3676:106:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26715:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26715:102:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29123:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29123:148:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24901:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24901:115:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7985:606;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7985:606:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11048:127;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11048:127:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27148:193;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27148:193:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27148:193:2;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;27148:193:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;27148:193:2;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;27148:193:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;27148:193:2;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;27148:193:2;;;;;;;;;;;;;;;;;29361:157;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29361:157:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29361:157:2;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;29361:157:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;29361:157:2;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;29361:157:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;29361:157:2;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;29361:157:2;;;;;;;;;;;;;;;;;2666:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2666:39:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29995:269;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29995:269:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29995:269:2;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;29995:269:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;29995:269:2;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;29995:269:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;29995:269:2;;;;;;;;;;;;;;;:::i;:::-;;28374:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28374:115:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28544:142;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28544:142:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28544:142:2;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;28544:142:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4097:39;;;;:::o;11484:132::-;11537:16;11572:14;:35;;;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11572:37:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11572:37:2;;;;;;39:16:-1;36:1;17:17;2:54;11572:37:2;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11572:37:2;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;385:12;380:3;373:25;421:4;416:3;412:14;405:21;;0:433;;11572:37:2;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;11572:37:2;;;;;;;;;;;11565:44;;11484:132;:::o;11270:116::-;11324:7;11350:14;:22;;:29;;;;11343:36;;11270:116;:::o;25815:140::-;25888:4;25911:37;25936:11;25911:6;:24;;:37;;;;:::i;:::-;25904:44;;25815:140;;;:::o;24045:782::-;24105:18;:16;:18::i;:::-;24097:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24161:20;24184:15;;;;;;;;;;;:28;;;:30;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24184:30:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24184:30:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24184:30:2;;;;;;;;;;;;;;;;24161:53;;24224:6;:30;;;;24255:14;:25;;;24282:9;;24293:12;24224:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24224:82:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24224:82:2;;;;24518:1;24499:16;:14;:16::i;:::-;:20;24495:326;;;24535:275;24567:14;:29;;;24614:14;:28;;24535:275;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24660:14;:30;;;;;;;;;;;;24708:14;:44;;;24770:14;:26;;;24535:14;:275::i;:::-;24495:326;24045:782;:::o;9382:548::-;9439:4;9460:14;:25;;;;;;;;;;;;9455:68;;9508:4;9501:11;;;;9455:68;9680:18;9854:26;;9842:9;;:38;9802:21;:29;;;9753:14;:38;;;9701:14;:41;;;:90;:130;:179;9680:200;;9913:10;9898:12;:25;9891:32;;;9382:548;;:::o;4206:49::-;;;;:::o;26453:130::-;26521:4;26544:6;:19;;;;26564:11;26544:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;26544:32:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26544:32:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26544:32:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26544:32:2;;;;;;;;;;;;;;;;26537:39;;26453:130;;;:::o;3079:45::-;;;;:::o;28839:135::-;28892:7;28918:49;28951:15;;28918:28;;:32;;:49;;;;:::i;:::-;28911:56;;28839:135;:::o;25579:145::-;25640:4;25663:15;;;;;;;;;;;:31;;;25695:6;25711:4;25663:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25663:54:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25663:54:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25663:54:2;;;;;;;;;;;;;;;;25656:61;;25579:145;;;:::o;27802:498::-;1313:1:51;1296:13;;:18;;;;;;;;;;;1324:20;1347:13;;1324:36;;27943:26:2;27972:6;:24;;;;27997:8;28007:10;28019:18;27972:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;27972:66:2;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27972:66:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27972:66:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27972:66:2;;;;;;;;;;;;;;;;27943:95;;28049:12;28067:15;;;;;;;;;;;:24;;;28092:8;28067:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28067:34:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28067:34:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28067:34:2;;;;;;;;;;;;;;;;:39;;28113:18;28067:69;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;28048:88:2;;;28150:7;28146:148;;;28206:15;;;;;;;;;;;:24;;;28231:8;28206:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28206:34:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28206:34:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28206:34:2;;;;;;;;;;;;;;;;28178:105;;;28242:8;28252:18;28272:10;28178:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28146:148;1370:1:51;;1405:13;;1389:12;:29;1381:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27802:498:2;;;;:::o;2788:29::-;;;;:::o;3257:47::-;;;;:::o;2941:34::-;;;;:::o;12311:815::-;12542:24;12569:22;:20;:22::i;:::-;12542:49;;12602:21;:28;;;;12644:20;12678:11;12703:10;12727;12751:21;12786:7;12851:14;:38;;;12807:14;:41;;;:82;12602:297;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;12602:297:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;12602:297:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;12602:297:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;12602:297:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;12602:297:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12602:297:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12602:297:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12602:297:2;;;;;;;;;;;;;;;;;12910:56;12933:11;12946:7;12955:10;12910:6;:22;;:56;;;;;;:::i;:::-;12976:28;12992:11;12976:6;:15;;:28;;;;:::i;:::-;13014:23;:21;:23::i;:::-;13052:36;13076:11;13052:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;13052:36:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13098:14;:19;;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13098:21:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13098:21:2;;;;12311:815;;;;;;:::o;7355:125::-;5992:10;5983:19;;:5;;;;;;;;;;;:19;;;5975:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7435:16;7457:15;7435:38;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;7435:38:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7355:125;:::o;3956:52::-;;;;:::o;2308:47::-;;;;:::o;10638:283::-;10693:20;10716:15;;;;;;;;;;;:28;;;:30;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10716:30:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10716:30:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10716:30:2;;;;;;;;;;;;;;;;10693:53;;10756:21;10780:74;10841:12;10780:15;;;;;;;;;;;:29;;;10810:10;10830:4;10780:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10780:56:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10780:56:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10780:56:2;;;;;;;;;;;;;;;;:60;;:74;;;;:::i;:::-;10756:98;;10864:14;:27;;;;10892:6;10900:13;10864:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10864:50:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10864:50:2;;;;10638:283;;;:::o;15033:582::-;6176:37;6202:10;6176:16;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;6155:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15161:37;15201:66;15235:22;:20;:22::i;:::-;15201:16;:14;:16::i;:::-;:20;;:66;;;;:::i;:::-;15161:106;;15311:29;15298:9;:42;;15277:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15402:19;15424:44;15438:29;15424:9;:13;;:44;;;;:::i;:::-;15402:66;;15478:130;15506:9;15517:13;15532:10;15556:29;15587:11;15478:14;:130::i;:::-;6285:1;;15033:582;;:::o;26912:149::-;26990:7;27016:6;:25;;27042:11;27016:38;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;27016:38:2;;;;;;;;;;;;;;;;;;;;;;27009:45;;26912:149;;;:::o;5487:369::-;5559:1;5539:16;:14;:16::i;:::-;:21;5531:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5741:16;5758:30;5786:1;5758:16;:23;;;;:27;;:30;;;;:::i;:::-;5741:48;;;;;;;;;;;;;;;;;;;;;;;;;5693:29;;:97;;;;;;;;;;;;;;;;;;5800:49;4851:77;5839:9;5800:19;:49::i;:::-;5487:369::o;16626:1606::-;1313:1:51;1296:13;;:18;;;;;;;;;;;1324:20;1347:13;;1324:36;;16714:19:2;:17;:19::i;:::-;16706:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16776:18;:16;:18::i;:::-;16775:19;16767:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16825:24;16852:51;16877:14;:25;;;16852:6;:24;;:51;;;;:::i;:::-;16825:78;;16935:3;:10;16963:11;16992:14;:28;;17038:15;16935:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;16935:132:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;16935:132:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16935:132:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16935:132:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16935:132:2;;;;;;;;;;;;;;;;16914:196;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17126:21;;;;;;;;;;17322:14;:30;;;;;;;;;;;;:35;;17362:36;17392:5;17362:25;;:29;;:36;;;;:::i;:::-;17509:14;:29;;;17556:15;17589:10;17413:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;17413:200:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;17413:200:2;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;17413:200:2;17322:301;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;17322:301:2;;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;17322:301:2;;17667:1;17638:14;:26;;;:30;17634:129;;;17684:68;17700:14;17684:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17734:15;17724:26;;;;;;17716:35;;17684:15;:68::i;:::-;17634:129;17774:25;17801:23;17826:15;17845:26;:24;:26::i;:::-;17773:98;;;;;;17881:59;17909:11;17922:17;17881:6;:27;;:59;;;;;:::i;:::-;17951:15;;;;;;;;;;;:24;;;17976:10;17951:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17951:36:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17951:36:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17951:36:2;;;;;;;;;;;;;;;;:41;;17999:15;17951:68;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;17951:68:2;;18044:1;18034:7;:11;18030:159;;;18061:14;:30;;;;;;;;;;;;:35;;18101:5;18114:7;18123:54;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;18123:54:2;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;18123:54:2;18061:117;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;18061:117:2;;;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;18061:117:2;;18030:159;18224:1;18199:22;:26;;;;1370:1:51;;;;1405:13;;1389:12;:29;1381:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16626:1606:2;;:::o;4592:43::-;;;;:::o;7602:137::-;5992:10;5983:19;;:5;;;;;;;;;;;:19;;;5975:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7685:47;7716:15;7685:16;:30;;:47;;;;:::i;:::-;;7602:137;:::o;3676:106::-;;;;:::o;26715:102::-;26761:7;26787:23;:6;:21;:23::i;:::-;26780:30;;26715:102;:::o;29123:148::-;29172:7;29198:66;29248:15;;29198:45;29217:25;;29198:14;;:18;;:45;;;;:::i;:::-;:49;;:66;;;;:::i;:::-;29191:73;;29123:148;:::o;24901:115::-;24947:7;24973:36;24999:9;;24973:21;;:25;;:36;;;;:::i;:::-;24966:43;;24901:115;:::o;7985:606::-;6176:37;6202:10;6176:16;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;6155:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8097:30;8130:46;8160:15;;8130:25;;:29;;:46;;;;:::i;:::-;8097:79;;8235:10;8187:29;;:59;;;;;;;;;;;;;;;;;;8256:69;8276:9;8287:37;8301:22;8287:9;:13;;:37;;;;:::i;:::-;8256:19;:69::i;:::-;8403:12;8421:15;;;;;;;;;;;:24;;;8446:9;8421:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8421:35:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8421:35:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8421:35:2;;;;;;;;;;;;;;;;:40;;8468:22;8421:74;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;8402:93:2;;;8513:7;8505:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6285:1;;7985:606;;:::o;11048:127::-;11104:7;11130:14;:38;;;11123:45;;11048:127;:::o;27148:193::-;27242:24;27285:6;:28;;;;27314:11;27327:6;27285:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;27285:49:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27285:49:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27285:49:2;;;;;;39:16:-1;36:1;17:17;2:54;27285:49:2;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27285:49:2;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;385:12;380:3;373:25;421:4;416:3;412:14;405:21;;0:433;;27285:49:2;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;27285:49:2;;;;;;;;;;;27278:56;;27148:193;;;;:::o;29361:157::-;29433:24;29476:6;:22;;;;29499:11;29476:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;29476:35:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29476:35:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29476:35:2;;;;;;39:16:-1;36:1;17:17;2:54;29476:35:2;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29476:35:2;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;385:12;380:3;373:25;421:4;416:3;412:14;405:21;;0:433;;29476:35:2;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;29476:35:2;;;;;;;;;;;29469:42;;29361:157;;;:::o;2666:39::-;;;;:::o;29995:269::-;30119:20;30142:15;;;;;;;;;;;:28;;;:30;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30142:30:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30142:30:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30142:30:2;;;;;;;;;;;;;;;;30119:53;;30182:6;:32;;;;30215:10;30227:15;30244:12;30182:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;30182:75:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30182:75:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30182:75:2;;;;29995:269;;;:::o;28374:115::-;28431:7;28457:6;:25;;;28450:32;;28374:115;:::o;28544:142::-;28612:12;28643:36;28668:10;28643:6;:24;;:36;;;;:::i;:::-;28636:43;;28544:142;;;:::o;5559:335:18:-;5678:4;5699:6;5708:1;5699:10;;5694:172;5715:4;:11;;:18;;;;5711:1;:22;5694:172;;;5758:52;5798:11;5758:4;:11;;5770:1;5758:14;;;;;;;;;;;;;;;;;;:26;;:39;;:52;;;;:::i;:::-;5754:102;;;5837:4;5830:11;;;;;5754:102;5735:3;;;;;;;5694:172;;;;5882:5;5875:12;;5559:335;;;;;:::o;23301:169:2:-;23352:4;23401:1;23375:22;;:27;;:88;;;;;23446:17;;23421:22;;:42;23406:12;:57;23375:88;23368:95;;23301:169;:::o;15621:788::-;15851:19;:17;:19::i;:::-;15850:20;:42;;;;15874:18;:16;:18::i;:::-;15850:42;15842:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15947:12;15922:22;:37;;;;15970:18;15991:6;:18;;;;16028:13;16018:24;;;;;;16010:33;;15991:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15991:53:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15991:53:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15991:53:2;;;;;;;;;;;;;;;;15970:74;;16071:195;;;;;;;;16099:9;16071:195;;;;16122:29;16071:195;;;;16165:11;16071:195;;;;16190:10;16071:195;;;;16214:13;16071:195;;;;16241:15;16071:195;;;;;16054:14;:212;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16277:24;16304:36;16329:10;16304:6;:24;;:36;;;;:::i;:::-;16277:63;;16355:47;16375:13;16390:11;16355:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;16355:47:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;16355:47:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15621:788;;;;;;;:::o;2159:459:45:-;2217:7;2463:1;2458;:6;2454:45;;;2487:1;2480:8;;;;2454:45;2509:9;2525:1;2521;:5;2509:17;;2553:1;2548;2544;:5;;;;;;:10;2536:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2610:1;2603:8;;;2159:459;;;;;:::o;2121:798:18:-;2335:7;2302:4;:17;;2320:11;2302:30;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2302:30:18;;;;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;:::i;:::-;;2483:9;2495:10;:17;2483:29;;2522:391;2533:1;2529;:5;2522:391;;;2632:27;2690:1;2662:25;2685:1;2681;:5;2662:10;:18;;:25;;;;:::i;:::-;:29;2632:59;;;;2759:4;:17;;2777:11;2759:30;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2759:30:18;;;;;;;;;;;;;;;;;;;;;2830:1;2790:4;:17;;2808:11;2790:30;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2790:30:18;;;;;;;;;;;;;;;;;;;;;:37;;;;:41;2759:73;;;;;;;;;;;;;;;;;;;;;;;;;2705:4;:17;;2723:11;2705:30;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2705:30:18;;;;;;;;;;;;;;;;;;;;;2736:19;2705:51;;;;;;;;;;;;;;;;:127;;;;;;;;;;;;;;;;;;2846:4;:17;;2864:11;2846:30;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2846:30:18;;;;;;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;:::i;:::-;;2899:3;;;;;;;;2522:391;;;;2121:798;;;;;:::o;1375:164::-;1482:4;:11;;1499:32;;;;;;;;1505:11;1499:32;;;;1518:12;1499:32;;;1482:50;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;1482:50:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1375:164;;:::o;13508:1237:2:-;13560:16;13579:15;;13560:34;;13791:1;13777:11;:15;:48;;;;;13810:15;;13796:11;:29;13777:48;13773:101;;;13852:11;13841:22;;13773:101;13884:24;13911:28;13930:8;13911:14;;:18;;:28;;;;:::i;:::-;13884:55;;13949:22;13974:15;;;;;;;;;;;:24;;;13999:10;13974:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13974:36:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13974:36:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13974:36:2;;;;;;;;;;;;;;;;13949:61;;14044:28;;14025:16;:47;14021:718;;;14088:15;14106:50;14139:16;14106:28;;:32;;:50;;;;:::i;:::-;14088:68;;14201:1;14170:28;:32;;;;14273:6;:11;;14291:16;14273:39;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;14273:39:2;;14391:29;;;;;;;;;;;:44;;;14442:7;14391:61;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14391:61:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14391:61:2;;;;;14021:718;;;;14601:28;;14582:47;;14674:1;14643:28;:32;;;;14689:6;:11;;14707:16;14689:39;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;14689:39:2;;14021:718;13508:1237;;;:::o;3073:130:45:-;3131:7;3157:39;3161:1;3164;3157:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3150:46;;3073:130;;;;:::o;59:286:32:-;165:4;190:6;199:1;190:10;;185:132;206:4;:11;202:1;:15;185:132;;;254:4;259:1;254:7;;;;;;;;;;;;;;242:19;;:8;:19;;;238:69;;;288:4;281:11;;;;;238:69;219:3;;;;;;;185:132;;;;333:5;326:12;;59:286;;;;;:::o;834:176:45:-;892:7;911:9;927:1;923;:5;911:17;;951:1;946;:6;;938:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1002:1;995:8;;;834:176;;;;:::o;1274:134::-;1332:7;1358:43;1362:1;1365;1358:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1351:50;;1274:134;;;;:::o;8597:779:2:-;8715:35;8735:14;;8715:15;;:19;;:35;;;;:::i;:::-;8703:8;:47;;8682:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8815:26;:24;:26::i;:::-;8807:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9039:1;9008:28;;:32;9004:228;;;9056:15;9074:28;;9056:46;;9147:1;9116:28;:32;;;;9178:10;9162:42;;;9211:7;9162:59;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9162:59:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9162:59:2;;;;;9004:228;;9242:14;:20;;;;9263:9;9242:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9242:31:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9242:31:2;;;;9288:32;9310:9;9288:32;;;;;;;;;;;;;;;;;;9361:8;9330:28;:39;;;;8597:779;;:::o;22962:109::-;23014:4;23063:1;23037:22;;:27;;23030:34;;22962:109;:::o;3620:187:18:-;3734:12;3765:4;:11;;3777:10;3765:23;;;;;;;;;;;;;;;;;;:35;;3758:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3620:187;;;;:::o;18460:996:2:-;18557:19;18579:14;:26;;;18557:48;;18732:16;18751:32;18767:15;;18751:11;:15;;:32;;;;:::i;:::-;18732:51;;18794:31;18835:25;18863:9;18835:37;;18907:14;:30;;;:35;;18960:8;19064:14;:29;;;19107:5;18979:143;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;18979:143:2;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;18979:143:2;18907:216;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;18907:216:2;;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;18882:241:2;;;;;;19133:24;19160:9;19133:36;;19179:16;19198:39;19220:16;19198:17;:21;;:39;;;;:::i;:::-;19179:58;;19248:14;:32;19294:15;;;;;;;;;;;19323;;19352:8;19374;19396:11;19421:18;19248:201;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;19248:201:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19248:201:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19248:201:2;;;;18460:996;;;;;;;;:::o;19573:1335::-;19631:25;19658:23;19683:15;19710:16;19729:4;19710:23;;19793:19;19815:16;:14;:16::i;:::-;19793:38;;19861:52;19904:8;19861:38;19887:11;19861:21;;:25;;:38;;;;:::i;:::-;:42;;:52;;;;:::i;:::-;19841:72;;19984:31;20018:52;20044:25;20057:11;20044:8;:12;;:25;;;;:::i;:::-;20018:21;;:25;;:52;;;;:::i;:::-;19984:86;;20422:28;20453:63;20507:8;20453:49;20500:1;20453:38;20481:9;;20453:23;:27;;:38;;;;:::i;:::-;:46;;:49;;;;:::i;:::-;:53;;:63;;;;:::i;:::-;20422:94;;20526:28;20557:66;20606:16;:14;:16::i;:::-;20557:14;:44;;;:48;;:66;;;;:::i;:::-;20526:97;;20651:46;20676:20;20651;:24;;:46;;;;:::i;:::-;20633:64;;20821:80;20880:20;20821:54;20842:32;20864:9;;20842:17;:21;;:32;;;;:::i;:::-;20821:16;:14;:16::i;:::-;:20;;:54;;;;:::i;:::-;:58;;:80;;;;:::i;:::-;20811:90;;19573:1335;;;;;;;;:::o;3038:237:18:-;3220:48;3261:6;3220:4;:23;;3244:11;3220:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3220:36:18;;;;;;;;;;;;;;;;;;;;;;:40;;:48;;;;:::i;:::-;3181:4;:23;;3205:11;3181:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3181:36:18;;;;;;;;;;;;;;;;;;;;;:87;;;;3038:237;;;:::o;351:553:32:-;458:17;496:6;505:1;496:10;;491:386;512:4;:11;;;;508:1;:15;491:386;;;613:4;618:1;613:7;;;;;;;;;;;;;;;;;;;;;;;;;593:27;;:16;:27;;;589:278;;;705:6;714:1;705:10;;700:101;733:1;721:4;:11;;;;:13;717:1;:17;700:101;;;773:4;780:1;778;:3;773:9;;;;;;;;;;;;;;;;;;;;;;;;;763:4;768:1;763:7;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;;;;;;;736:3;;;;;;;700:101;;;;818:4;:13;;;;;;;;;;;;:::i;:::-;;849:3;;;;;;;;589:278;525:3;;;;;;;491:386;;;;893:4;886:11;;351:553;;;;:::o;8509:196:18:-;8591:7;8617:81;8669:4;:21;;:28;;;;8617:47;8640:4;:23;;;8617:4;:11;;:18;;;;:22;;:47;;;;:::i;:::-;:51;;:81;;;;:::i;:::-;8610:88;;8509:196;;;:::o;13903:2657:33:-;13998:4;14014:12;14029:4;14014:19;;14131:14;14125:21;14311:1;14306;14300;14293:5;14289:13;14282:21;14275:5;14271:33;14267:41;14260:5;14256:53;14252:61;14347:10;14341:17;14454:7;14445;14442:20;14480:1;14475:1949;;;;16504:1;16493:12;;14435:2084;;14475:1949;14783:7;14776:15;14766:2;;14834;14825:7;14822:15;14863:1;14858:347;;;;15513:1;15632:14;15627:3;15620:27;15697:4;15692:3;15682:20;15754:4;15742:10;15738:21;15803:7;15799:2;15795:16;15960:410;15992:1;15987:2;15981:3;15977:2;15974:11;15970:20;15967:27;15960:410;;;16176:2;16170:9;16165:2;16159:9;16156:24;16146:2;;16273:1;16262:12;;16313:1;16307:7;;16146:2;16039:1;16035:2;16031:10;16025:16;;16084:4;16080:2;16076:13;16070:19;;15960:410;;;15234:1158;;;;14815:1577;;14858:347;14990:5;14982;14975;14971:17;14967:29;14958:38;;15064:4;15052:10;15048:21;15042:28;15035:5;15032:39;15022:2;;15156:1;15145:12;;15022:2;14815:1577;;14766:2;14435:2084;;14053:2476;;;16546:7;16539:14;;;13903:2657;;;;:::o;11778:313::-;11853:5;11905:1;11896:6;:10;11878:6;:13;:29;;11870:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11953:14;12041:6;12035:3;12027:6;12023:16;12019:29;12013:36;12001:48;;12076:8;12069:15;;;11778:313;;;;:::o;3718:338:45:-;3804:7;3901:1;3897;:5;3904:12;3889:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3889:28:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3927:9;3943:1;3939;:5;;;;;;3927:17;;4048:1;4041:8;;;3718:338;;;;;:::o;1732:187::-;1818:7;1850:1;1845;:6;;1853:12;1837:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1837:29:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1876:9;1892:1;1888;:5;1876:17;;1911:1;1904:8;;;1732:187;;;;;:::o;21068:1779:2:-;21116:19;21147:16;21166:4;21147:23;;21571:21;21595:52;21645:1;21595:45;21622:17;;21595:22;;:26;;:45;;;;:::i;:::-;:49;;:52;;;;:::i;:::-;21571:76;;21887:28;21918:59;21975:1;21918:52;21945:24;;21918:22;;:26;;:52;;;;:::i;:::-;:56;;:59;;;;:::i;:::-;21887:90;;22094:26;22139:20;22123:12;:36;;:72;;22183:12;22123:72;;;22162:20;22123:72;22094:101;;22255:23;22281:37;22299:18;22281:13;:17;;:37;;;;:::i;:::-;22255:63;;22361:24;22388:39;22406:20;22388:13;:17;;:39;;;;:::i;:::-;22361:66;;22768:72;22831:8;22824:1;22770:51;22804:16;22770:29;22790:8;22770:15;:19;;:29;;;;:::i;:::-;:33;;:51;;;;:::i;:::-;22769:56;22768:62;;:72;;;;:::i;:::-;22754:86;;21068:1779;;;;;;;:::o;237:112:36:-;299:7;325:17;338:3;325:8;331:1;325;:5;;:8;;;;:::i;:::-;:12;;:17;;;;:::i;:::-;318:24;;237:112;;;;:::o;1112:29154:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", - "source": "pragma solidity ^0.5.4;\n\nimport \"openzeppelin-solidity/contracts/math/SafeMath.sol\";\nimport \"openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol\";\nimport \"./TokenStaking.sol\";\nimport \"./cryptography/BLS.sol\";\nimport \"./utils/AddressArrayUtils.sol\";\nimport \"./utils/PercentUtils.sol\";\nimport \"./libraries/operator/GroupSelection.sol\";\nimport \"./libraries/operator/Groups.sol\";\nimport \"./libraries/operator/DKGResultVerification.sol\";\nimport \"./libraries/operator/Reimbursements.sol\";\n\ninterface ServiceContract {\n function entryCreated(uint256 requestId, bytes calldata entry, address payable submitter) external;\n function fundRequestSubsidyFeePool() external payable;\n function fundDkgFeePool() external payable;\n}\n\n/**\n * @title KeepRandomBeaconOperator\n * @dev Keep client facing contract for random beacon security-critical operations.\n * Handles group creation and expiration, BLS signature verification and incentives.\n * The contract is not upgradeable. New functionality can be implemented by deploying\n * new versions following Keep client update and re-authorization by the stakers.\n */\ncontract KeepRandomBeaconOperator is ReentrancyGuard {\n using SafeMath for uint256;\n using PercentUtils for uint256;\n using AddressArrayUtils for address[];\n using GroupSelection for GroupSelection.Storage;\n using Groups for Groups.Storage;\n using DKGResultVerification for DKGResultVerification.Storage;\n\n event OnGroupRegistered(bytes groupPubKey);\n\n // TODO: Rename to DkgResultSubmittedEvent\n // TODO: Add memberIndex\n event DkgResultPublishedEvent(bytes groupPubKey);\n\n event RelayEntryRequested(bytes previousEntry, bytes groupPublicKey);\n event RelayEntrySubmitted();\n\n event GroupSelectionStarted(uint256 newEntry);\n\n event GroupMemberRewardsWithdrawn(address indexed beneficiary, address operator, uint256 amount, uint256 groupIndex);\n\n GroupSelection.Storage groupSelection;\n Groups.Storage groups;\n DKGResultVerification.Storage dkgResultVerification;\n\n // Contract owner.\n address internal owner;\n\n address[] internal serviceContracts;\n\n // TODO: replace with a secure authorization protocol (addressed in RFC 11).\n TokenStaking internal stakingContract;\n\n // Each signing group member reward expressed in wei.\n uint256 public groupMemberBaseReward = 145*1e11; // 14500 Gwei, 10% of operational cost\n\n // Gas price ceiling value used to calculate the gas price for reimbursement\n // next to the actual gas price from the transaction. We use gas price\n // ceiling to defend against malicious miner-submitters who can manipulate\n // transaction gas price.\n uint256 public gasPriceCeiling = 30*1e9; // (30 Gwei = 30 * 10^9 wei)\n\n // Size of a group in the threshold relay.\n uint256 public groupSize = 64;\n\n // Minimum number of group members needed to interact according to the\n // protocol to produce a relay entry.\n uint256 public groupThreshold = 33;\n\n // Time in blocks after which the next group member is eligible\n // to submit the result.\n uint256 public resultPublicationBlockStep = 3;\n\n // Time in blocks it takes off-chain cluster to generate a new relay entry\n // and be ready to submit it to the chain.\n uint256 public relayEntryGenerationTime = (1+3);\n\n // Timeout in blocks for a relay entry to appear on the chain. Blocks are\n // counted from the moment relay request occur.\n //\n // Timeout is never shorter than the time needed by clients to generate\n // relay entry and the time it takes for the last group member to become\n // eligible to submit the result plus at least one block to submit it.\n uint256 public relayEntryTimeout = relayEntryGenerationTime.add(groupSize.mul(resultPublicationBlockStep));\n\n // Gas required to verify BLS signature and produce successful relay\n // entry. Excludes callback and DKG gas. The worst case (most expensive)\n // scenario.\n uint256 public entryVerificationGasEstimate = 280000;\n\n // Gas required to submit DKG result. Excludes initiation of group selection.\n uint256 public dkgGasEstimate = 1740000;\n\n // Gas required to trigger DKG (starting group selection).\n uint256 public groupSelectionGasEstimate = 200000;\n\n // Reimbursement for the submitter of the DKG result. This value is set when\n // a new DKG request comes to the operator contract.\n //\n // When submitting DKG result, the submitter is reimbursed with the actual cost\n // and some part of the fee stored in this field may be returned to the service\n // contract.\n uint256 public dkgSubmitterReimbursementFee;\n\n uint256 internal currentEntryStartBlock;\n\n // Seed value used for the genesis group selection.\n // https://www.wolframalpha.com/input/?i=pi+to+78+digits\n uint256 internal constant _genesisGroupSeed = 31415926535897932384626433832795028841971693993751058209749445923078164062862;\n\n // Service contract that triggered current group selection.\n ServiceContract internal groupSelectionStarterContract;\n\n struct SigningRequest {\n uint256 relayRequestId;\n uint256 entryVerificationAndProfitFee;\n uint256 callbackFee;\n uint256 groupIndex;\n bytes previousEntry;\n address serviceContract;\n }\n SigningRequest internal signingRequest;\n\n\n /**\n * @dev Triggers the first group selection. Genesis can be called only when\n * there are no groups on the operator contract.\n */\n function genesis() public payable {\n require(numberOfGroups() == 0, \"Groups exist\");\n // Set latest added service contract as a group selection starter to receive any DKG fee surplus.\n groupSelectionStarterContract = ServiceContract(serviceContracts[serviceContracts.length.sub(1)]);\n startGroupSelection(_genesisGroupSeed, msg.value);\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner == msg.sender, \"Caller is not the owner\");\n _;\n }\n\n /**\n * @dev Checks if sender is authorized.\n */\n modifier onlyServiceContract() {\n require(\n serviceContracts.contains(msg.sender),\n \"Caller is not an authorized contract\"\n );\n _;\n }\n\n constructor(address _serviceContract, address _stakingContract) public {\n owner = msg.sender;\n\n serviceContracts.push(_serviceContract);\n stakingContract = TokenStaking(_stakingContract);\n\n groups.stakingContract = TokenStaking(_stakingContract);\n groups.groupActiveTime = TokenStaking(_stakingContract).undelegationPeriod();\n\n groupSelection.ticketSubmissionTimeout = 12;\n groupSelection.groupSize = groupSize;\n\n dkgResultVerification.timeDKG = 5*(1+5) + 2*(1+10);\n dkgResultVerification.resultPublicationBlockStep = resultPublicationBlockStep;\n dkgResultVerification.groupSize = groupSize;\n // TODO: For now, the required number of signatures is equal to group\n // threshold. This should be updated to keep a safety margin for\n // participants misbehaving during signing.\n dkgResultVerification.signatureThreshold = groupThreshold;\n }\n\n /**\n * @dev Adds service contract\n * @param serviceContract Address of the service contract.\n */\n function addServiceContract(address serviceContract) public onlyOwner {\n serviceContracts.push(serviceContract);\n }\n\n /**\n * @dev Removes service contract\n * @param serviceContract Address of the service contract.\n */\n function removeServiceContract(address serviceContract) public onlyOwner {\n serviceContracts.removeAddress(serviceContract);\n }\n\n /**\n * @dev Triggers the selection process of a new candidate group.\n * @param _newEntry New random beacon value that stakers will use to\n * generate their tickets.\n * @param submitter Operator of this contract.\n */\n function createGroup(uint256 _newEntry, address payable submitter) public payable onlyServiceContract {\n uint256 groupSelectionStartFee = groupSelectionGasEstimate.mul(gasPriceCeiling);\n\n groupSelectionStarterContract = ServiceContract(msg.sender);\n startGroupSelection(_newEntry, msg.value.sub(groupSelectionStartFee));\n\n // reimbursing a submitter that triggered group selection\n (bool success, ) = stakingContract.beneficiaryOf(submitter).call.value(groupSelectionStartFee)(\"\");\n require(success, \"Failed reimbursing submitter for starting a group selection\");\n }\n\n function startGroupSelection(uint256 _newEntry, uint256 _payment) internal {\n require(\n _payment >= gasPriceCeiling.mul(dkgGasEstimate),\n \"Insufficient DKG fee\"\n );\n\n require(isGroupSelectionPossible(), \"Group selection in progress\");\n\n // If previous group selection failed and there is reimbursement left\n // return it to the DKG fee pool.\n if (dkgSubmitterReimbursementFee > 0) {\n uint256 surplus = dkgSubmitterReimbursementFee;\n dkgSubmitterReimbursementFee = 0;\n ServiceContract(msg.sender).fundDkgFeePool.value(surplus)();\n }\n\n groupSelection.start(_newEntry);\n emit GroupSelectionStarted(_newEntry);\n dkgSubmitterReimbursementFee = _payment;\n }\n\n function isGroupSelectionPossible() public view returns (bool) {\n if (!groupSelection.inProgress) {\n return true;\n }\n\n // dkgTimeout is the time after key generation protocol is expected to\n // be complete plus the expected time to submit the result.\n uint256 dkgTimeout = groupSelection.ticketSubmissionStartBlock +\n groupSelection.ticketSubmissionTimeout +\n dkgResultVerification.timeDKG +\n groupSize * resultPublicationBlockStep;\n\n return block.number > dkgTimeout;\n }\n\n /**\n * @dev Submits ticket to request to participate in a new candidate group.\n * @param ticket Bytes representation of a ticket that holds the following:\n * - ticketValue: first 8 bytes of a result of keccak256 cryptography hash\n * function on the combination of the group selection seed (previous\n * beacon output), staker-specific value (address) and virtual staker index.\n * - stakerValue: a staker-specific value which is the address of the staker.\n * - virtualStakerIndex: 4-bytes number within a range of 1 to staker's weight;\n * has to be unique for all tickets submitted by the given staker for the\n * current candidate group selection.\n */\n function submitTicket(bytes32 ticket) public {\n uint256 minimumStake = stakingContract.minimumStake();\n uint256 stakingWeight = stakingContract.eligibleStake(msg.sender, address(this)).div(minimumStake);\n groupSelection.submitTicket(ticket, stakingWeight);\n }\n\n /**\n * @dev Gets the timeout in blocks after which group candidate ticket\n * submission is finished.\n */\n function ticketSubmissionTimeout() public view returns (uint256) {\n return groupSelection.ticketSubmissionTimeout;\n }\n\n /**\n * @dev Gets the number of submitted group candidate tickets so far.\n */\n function submittedTicketsCount() public view returns (uint256) {\n return groupSelection.tickets.length;\n }\n\n /**\n * @dev Gets selected participants in ascending order of their tickets.\n */\n function selectedParticipants() public view returns (address[] memory) {\n return groupSelection.selectedParticipants();\n }\n\n /**\n * @dev Submits result of DKG protocol. It is on-chain part of phase 14 of\n * the protocol.\n *\n * @param submitterMemberIndex Claimed submitter candidate group member index\n * @param groupPubKey Generated candidate group public key\n * @param misbehaved Bytes array of misbehaved (disqualified or inactive)\n * group members indexes in ascending order; Indexes reflect positions of\n * members in the group as outputted by the group selection protocol.\n * @param signatures Concatenation of signatures from members supporting the\n * result.\n * @param signingMembersIndexes Indices of members corresponding to each\n * signature.\n */\n function submitDkgResult(\n uint256 submitterMemberIndex,\n bytes memory groupPubKey,\n bytes memory misbehaved,\n bytes memory signatures,\n uint[] memory signingMembersIndexes\n ) public {\n address[] memory members = selectedParticipants();\n\n dkgResultVerification.verify(\n submitterMemberIndex,\n groupPubKey,\n misbehaved,\n signatures,\n signingMembersIndexes,\n members,\n groupSelection.ticketSubmissionStartBlock + groupSelection.ticketSubmissionTimeout\n );\n\n groups.setGroupMembers(groupPubKey, members, misbehaved);\n groups.addGroup(groupPubKey);\n reimburseDkgSubmitter();\n emit DkgResultPublishedEvent(groupPubKey);\n groupSelection.stop();\n }\n\n /**\n * @dev Compare the reimbursement fee calculated based on the current transaction gas\n * price and the current price feed estimate with the DKG reimbursement fee calculated\n * and paid at the moment when the DKG was requested. If there is any surplus, it will\n * be returned to the DKG fee pool of the service contract which triggered the DKG.\n */\n function reimburseDkgSubmitter() internal {\n uint256 gasPrice = gasPriceCeiling;\n // We need to check if tx.gasprice is non-zero as a workaround to a bug\n // in go-ethereum:\n // https://github.com/ethereum/go-ethereum/pull/20189\n if (tx.gasprice > 0 && tx.gasprice < gasPriceCeiling) {\n gasPrice = tx.gasprice;\n }\n\n uint256 reimbursementFee = dkgGasEstimate.mul(gasPrice);\n address payable beneficiary = stakingContract.beneficiaryOf(msg.sender);\n\n if (reimbursementFee < dkgSubmitterReimbursementFee) {\n uint256 surplus = dkgSubmitterReimbursementFee.sub(reimbursementFee);\n dkgSubmitterReimbursementFee = 0;\n // Reimburse submitter with actual DKG cost.\n beneficiary.call.value(reimbursementFee)(\"\");\n\n // Return surplus to the contract that started DKG.\n groupSelectionStarterContract.fundDkgFeePool.value(surplus)();\n } else {\n // If submitter used higher gas price reimburse only dkgSubmitterReimbursementFee max.\n reimbursementFee = dkgSubmitterReimbursementFee;\n dkgSubmitterReimbursementFee = 0;\n beneficiary.call.value(reimbursementFee)(\"\");\n }\n }\n\n /**\n * @dev Creates a request to generate a new relay entry, which will include a\n * random number (by signing the previous entry's random number).\n * @param requestId Request Id trackable by service contract\n * @param previousEntry Previous relay entry\n */\n function sign(\n uint256 requestId,\n bytes memory previousEntry\n ) public payable onlyServiceContract {\n uint256 entryVerificationAndProfitFee = groupProfitFee().add(\n entryVerificationFee()\n );\n require(\n msg.value >= entryVerificationAndProfitFee,\n \"Insufficient new entry fee\"\n );\n uint256 callbackFee = msg.value.sub(entryVerificationAndProfitFee);\n signRelayEntry(\n requestId, previousEntry, msg.sender,\n entryVerificationAndProfitFee, callbackFee\n );\n }\n\n function signRelayEntry(\n uint256 requestId,\n bytes memory previousEntry,\n address serviceContract,\n uint256 entryVerificationAndProfitFee,\n uint256 callbackFee\n ) internal {\n require(!isEntryInProgress() || hasEntryTimedOut(), \"Beacon is busy\");\n\n currentEntryStartBlock = block.number;\n\n uint256 groupIndex = groups.selectGroup(uint256(keccak256(previousEntry)));\n signingRequest = SigningRequest(\n requestId,\n entryVerificationAndProfitFee,\n callbackFee,\n groupIndex,\n previousEntry,\n serviceContract\n );\n\n bytes memory groupPubKey = groups.getGroupPublicKey(groupIndex);\n emit RelayEntryRequested(previousEntry, groupPubKey);\n }\n\n /**\n * @dev Creates a new relay entry and stores the associated data on the chain.\n * @param _groupSignature Group BLS signature over the concatenation of the\n * previous entry and seed.\n */\n function relayEntry(bytes memory _groupSignature) public nonReentrant {\n require(isEntryInProgress(), \"Entry was submitted\");\n require(!hasEntryTimedOut(), \"Entry timed out\");\n\n bytes memory groupPubKey = groups.getGroupPublicKey(signingRequest.groupIndex);\n\n require(\n BLS.verify(\n groupPubKey,\n signingRequest.previousEntry,\n _groupSignature\n ),\n \"Invalid signature\"\n );\n\n emit RelayEntrySubmitted();\n\n // Spend no more than groupSelectionGasEstimate + 40000 gas max\n // This will prevent relayEntry failure in case the service contract is compromised\n signingRequest.serviceContract.call.gas(groupSelectionGasEstimate.add(40000))(\n abi.encodeWithSignature(\n \"entryCreated(uint256,bytes,address)\",\n signingRequest.relayRequestId,\n _groupSignature,\n msg.sender\n )\n );\n\n if (signingRequest.callbackFee > 0) {\n executeCallback(signingRequest, uint256(keccak256(_groupSignature)));\n }\n\n (uint256 groupMemberReward, uint256 submitterReward, uint256 subsidy) = newEntryRewardsBreakdown();\n groups.addGroupMemberReward(groupPubKey, groupMemberReward);\n\n stakingContract.beneficiaryOf(msg.sender).call.value(submitterReward)(\"\");\n\n if (subsidy > 0) {\n signingRequest.serviceContract.call.gas(35000).value(subsidy)(abi.encodeWithSignature(\"fundRequestSubsidyFeePool()\"));\n }\n\n currentEntryStartBlock = 0;\n }\n\n /**\n * @dev Executes customer specified callback for the relay entry request.\n * @param signingRequest Request data tracked internally by this contract.\n * @param entry The generated random number.\n */\n function executeCallback(SigningRequest memory signingRequest, uint256 entry) internal {\n uint256 callbackFee = signingRequest.callbackFee;\n\n // Make sure not to spend more than what was received from the service\n // contract for the callback\n uint256 gasLimit = callbackFee.div(gasPriceCeiling);\n\n bytes memory callbackReturnData;\n uint256 gasBeforeCallback = gasleft();\n (, callbackReturnData) = signingRequest.serviceContract.call.gas(\n gasLimit\n )(abi.encodeWithSignature(\n \"executeCallback(uint256,uint256)\",\n signingRequest.relayRequestId,\n entry\n ));\n uint256 gasAfterCallback = gasleft();\n uint256 gasSpent = gasBeforeCallback.sub(gasAfterCallback);\n\n Reimbursements.reimburseCallback(\n stakingContract,\n gasPriceCeiling,\n gasLimit,\n gasSpent,\n callbackFee,\n callbackReturnData\n );\n }\n\n /**\n * @dev Get rewards breakdown in wei for successful entry for the current signing request.\n */\n function newEntryRewardsBreakdown() internal view returns(uint256 groupMemberReward, uint256 submitterReward, uint256 subsidy) {\n uint256 decimals = 1e16; // Adding 16 decimals to perform float division.\n\n uint256 delayFactor = getDelayFactor();\n groupMemberReward = groupMemberBaseReward.mul(delayFactor).div(decimals);\n\n // delay penalty = base reward * (1 - delay factor)\n uint256 groupMemberDelayPenalty = groupMemberBaseReward.mul(decimals.sub(delayFactor));\n\n // The submitter reward consists of:\n // The callback gas expenditure (reimbursed by the service contract)\n // The entry verification fee to cover the cost of verifying the submission,\n // paid regardless of their gas expenditure\n // Submitter extra reward - 5% of the delay penalties of the entire group\n uint256 submitterExtraReward = groupMemberDelayPenalty.mul(groupSize).percent(5).div(decimals);\n uint256 entryVerificationFee = signingRequest.entryVerificationAndProfitFee.sub(groupProfitFee());\n submitterReward = entryVerificationFee.add(submitterExtraReward);\n\n // Rewards not paid out to the operators are paid out to requesters to subsidize new requests.\n subsidy = groupProfitFee().sub(groupMemberReward.mul(groupSize)).sub(submitterExtraReward);\n }\n\n /**\n * @dev Gets delay factor for rewards calculation.\n * @return Integer representing floating-point number with 16 decimals places.\n */\n function getDelayFactor() internal view returns(uint256 delayFactor) {\n uint256 decimals = 1e16; // Adding 16 decimals to perform float division.\n\n // T_deadline is the earliest block when no submissions are accepted\n // and an entry timed out. The last block the entry can be published in is\n // currentEntryStartBlock + relayEntryTimeout\n // and submission are no longer accepted from block\n // currentEntryStartBlock + relayEntryTimeout + 1.\n uint256 deadlineBlock = currentEntryStartBlock.add(relayEntryTimeout).add(1);\n\n // T_begin is the earliest block the result can be published in.\n // It takes relayEntryGenerationTime to generate a new entry, so it can\n // be published at block relayEntryGenerationTime + 1 the earliest.\n uint256 submissionStartBlock = currentEntryStartBlock.add(relayEntryGenerationTime).add(1);\n\n // Use submissionStartBlock block as entryReceivedBlock if entry submitted earlier than expected.\n uint256 entryReceivedBlock = block.number <= submissionStartBlock ? submissionStartBlock:block.number;\n\n // T_remaining = T_deadline - T_received\n uint256 remainingBlocks = deadlineBlock.sub(entryReceivedBlock);\n\n // T_deadline - T_begin\n uint256 submissionWindow = deadlineBlock.sub(submissionStartBlock);\n\n // delay factor = [ T_remaining / (T_deadline - T_begin)]^2\n //\n // Since we add 16 decimal places to perform float division, we do:\n // delay factor = [ T_temaining * decimals / (T_deadline - T_begin)]^2 / decimals =\n // = [T_remaining / (T_deadline - T_begin) ]^2 * decimals\n delayFactor = ((remainingBlocks.mul(decimals).div(submissionWindow))**2).div(decimals);\n }\n\n /**\n * @dev Returns true if generation of a new relay entry is currently in\n * progress.\n */\n function isEntryInProgress() internal view returns (bool) {\n return currentEntryStartBlock != 0;\n }\n\n /**\n * @dev Returns true if the currently ongoing new relay entry generation\n * operation timed out. There is a certain timeout for a new relay entry\n * to be produced, see `relayEntryTimeout` value.\n */\n function hasEntryTimedOut() internal view returns (bool) {\n return currentEntryStartBlock != 0 && block.number > currentEntryStartBlock + relayEntryTimeout;\n }\n\n /**\n * @dev Function used to inform about the fact the currently ongoing\n * new relay entry generation operation timed out. As a result, the group\n * which was supposed to produce a new relay entry is immediately\n * terminated and a new group is selected to produce a new relay entry.\n * All members of the group are punished by seizing minimum stake of\n * their tokens. The submitter of the transaction is rewarded with a\n * tattletale reward which is limited to min(1, 20 / group_size) of the\n * maximum tattletale reward.\n */\n function reportRelayEntryTimeout() public {\n require(hasEntryTimedOut(), \"Entry did not time out\");\n\n uint256 minimumStake = stakingContract.minimumStake();\n groups.reportRelayEntryTimeout(signingRequest.groupIndex, groupSize, minimumStake);\n\n // We could terminate the last active group. If that's the case,\n // do not try to execute signing again because there is no group\n // which can handle it.\n if (numberOfGroups() > 0) {\n signRelayEntry(\n signingRequest.relayRequestId,\n signingRequest.previousEntry,\n signingRequest.serviceContract,\n signingRequest.entryVerificationAndProfitFee,\n signingRequest.callbackFee\n );\n }\n }\n\n /**\n * @dev Gets group profit fee expressed in wei.\n */\n function groupProfitFee() public view returns(uint256) {\n return groupMemberBaseReward.mul(groupSize);\n }\n\n /**\n * @dev Checks if the specified account has enough active stake to become\n * network operator and that this contract has been authorized for potential\n * slashing.\n *\n * Having the required minimum of active stake makes the operator eligible\n * to join the network. If the active stake is not currently undelegating,\n * operator is also eligible for work selection.\n *\n * @param staker Staker's address\n * @return True if has enough active stake to participate in the network,\n * false otherwise.\n */\n function hasMinimumStake(address staker) public view returns(bool) {\n return stakingContract.hasMinimumStake(staker, address(this));\n }\n\n /**\n * @dev Checks if group with the given public key is registered.\n */\n function isGroupRegistered(bytes memory groupPubKey) public view returns(bool) {\n return groups.isGroupRegistered(groupPubKey);\n }\n\n /**\n * @dev Checks if a group with the given public key is a stale group.\n * Stale group is an expired group which is no longer performing any\n * operations. It is important to understand that an expired group may\n * still perform some operations for which it was selected when it was still\n * active. We consider a group to be stale when it's expired and when its\n * expiration time and potentially executed operation timeout are both in\n * the past.\n */\n function isStaleGroup(bytes memory groupPubKey) public view returns(bool) {\n return groups.isStaleGroup(groupPubKey);\n }\n\n /**\n * @dev Gets the number of active groups. Expired and terminated groups are\n * not counted as active.\n */\n function numberOfGroups() public view returns(uint256) {\n return groups.numberOfGroups();\n }\n\n /**\n * @dev Returns accumulated group member rewards for provided group.\n */\n function getGroupMemberRewards(bytes memory groupPubKey) public view returns (uint256) {\n return groups.groupMemberRewards[groupPubKey];\n }\n\n /**\n * @dev Gets all indices in the provided group for a member.\n */\n function getGroupMemberIndices(bytes memory groupPubKey, address member) public view returns (uint256[] memory indices) {\n return groups.getGroupMemberIndices(groupPubKey, member);\n }\n\n /**\n * @dev Withdraws accumulated group member rewards for operator\n * using the provided group index and member indices. Once the\n * accumulated reward is withdrawn from the selected group, member is\n * removed from it. Rewards can be withdrawn only from stale group.\n * @param operator Operator address.\n * @param groupIndex Group index.\n * @param groupMemberIndices Array of member indices for the group member.\n */\n function withdrawGroupMemberRewards(address operator, uint256 groupIndex, uint256[] memory groupMemberIndices) public nonReentrant {\n uint256 accumulatedRewards = groups.withdrawFromGroup(operator, groupIndex, groupMemberIndices);\n (bool success, ) = stakingContract.beneficiaryOf(operator).call.value(accumulatedRewards)(\"\");\n if (success) {\n emit GroupMemberRewardsWithdrawn(stakingContract.beneficiaryOf(operator), operator, accumulatedRewards, groupIndex);\n }\n }\n\n /**\n * @dev Gets the index of the first active group.\n */\n function getFirstActiveGroupIndex() public view returns (uint256) {\n return groups.expiredGroupOffset;\n }\n\n /**\n * @dev Gets group public key.\n */\n function getGroupPublicKey(uint256 groupIndex) public view returns (bytes memory) {\n return groups.getGroupPublicKey(groupIndex);\n }\n\n /**\n * @dev Returns fee for entry verification in wei. Does not include group\n * profit fee, DKG contribution or callback fee.\n */\n function entryVerificationFee() public view returns (uint256) {\n return entryVerificationGasEstimate.mul(gasPriceCeiling);\n }\n\n /**\n * @dev Returns fee for group creation in wei. Includes the cost of DKG\n * and the cost of triggering group selection.\n */\n function groupCreationFee() public view returns (uint256) {\n return dkgGasEstimate.add(groupSelectionGasEstimate).mul(gasPriceCeiling);\n }\n\n /**\n * @dev Returns members of the given group by group public key.\n */\n function getGroupMembers(bytes memory groupPubKey) public view returns (address[] memory members) {\n return groups.getGroupMembers(groupPubKey);\n }\n\n /**\n * @dev Reports unauthorized signing for the provided group. Must provide\n * a valid signature of the tattletale address as a message. Successful signature\n * verification means the private key has been leaked and all group members\n * should be punished by seizing their tokens. The submitter of this proof is\n * rewarded with 5% of the total seized amount scaled by the reward adjustment\n * parameter and the rest 95% is burned.\n */\n function reportUnauthorizedSigning(\n uint256 groupIndex,\n bytes memory signedMsgSender\n ) public {\n uint256 minimumStake = stakingContract.minimumStake();\n groups.reportUnauthorizedSigning(groupIndex, signedMsgSender, minimumStake);\n }\n}\n", - "sourcePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/KeepRandomBeaconOperator.sol", - "ast": { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/KeepRandomBeaconOperator.sol", - "exportedSymbols": { - "KeepRandomBeaconOperator": [ - 1568 - ], - "ServiceContract": [ - 135 - ] - }, - "id": 1569, - "nodeType": "SourceUnit", - "nodes": [ - { - "id": 109, - "literals": [ - "solidity", - "^", - "0.5", - ".4" - ], - "nodeType": "PragmaDirective", - "src": "0:23:2" - }, - { - "absolutePath": "openzeppelin-solidity/contracts/math/SafeMath.sol", - "file": "openzeppelin-solidity/contracts/math/SafeMath.sol", - "id": 110, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 11945, - "src": "25:59:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol", - "file": "openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol", - "id": 111, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 12780, - "src": "85:67:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/TokenStaking.sol", - "file": "./TokenStaking.sol", - "id": 112, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 5650, - "src": "153:28:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/cryptography/BLS.sol", - "file": "./cryptography/BLS.sol", - "id": 113, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 6861, - "src": "182:32:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/utils/AddressArrayUtils.sol", - "file": "./utils/AddressArrayUtils.sol", - "id": 114, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 10466, - "src": "215:39:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/utils/PercentUtils.sol", - "file": "./utils/PercentUtils.sol", - "id": 115, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 11278, - "src": "255:34:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/libraries/operator/GroupSelection.sol", - "file": "./libraries/operator/GroupSelection.sol", - "id": 116, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 8151, - "src": "290:49:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/libraries/operator/Groups.sol", - "file": "./libraries/operator/Groups.sol", - "id": 117, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 9115, - "src": "340:41:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/libraries/operator/DKGResultVerification.sol", - "file": "./libraries/operator/DKGResultVerification.sol", - "id": 118, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 7171, - "src": "382:56:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/libraries/operator/Reimbursements.sol", - "file": "./libraries/operator/Reimbursements.sol", - "id": 119, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 9246, - "src": "439:49:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "baseContracts": [], - "contractDependencies": [], - "contractKind": "interface", - "documentation": null, - "fullyImplemented": false, - "id": 135, - "linearizedBaseContracts": [ - 135 - ], - "name": "ServiceContract", - "nodeType": "ContractDefinition", - "nodes": [ - { - "body": null, - "documentation": null, - "id": 128, - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "entryCreated", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 126, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 121, - "name": "requestId", - "nodeType": "VariableDeclaration", - "scope": 128, - "src": "544:17:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 120, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "544:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 123, - "name": "entry", - "nodeType": "VariableDeclaration", - "scope": 128, - "src": "563:20:2", - "stateVariable": false, - "storageLocation": "calldata", - "typeDescriptions": { - "typeIdentifier": "t_bytes_calldata_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 122, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "563:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 125, - "name": "submitter", - "nodeType": "VariableDeclaration", - "scope": 128, - "src": "585:25:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - "typeName": { - "id": 124, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "585:15:2", - "stateMutability": "payable", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "543:68:2" - }, - "returnParameters": { - "id": 127, - "nodeType": "ParameterList", - "parameters": [], - "src": "620:0:2" - }, - "scope": 135, - "src": "522:99:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "external" - }, - { - "body": null, - "documentation": null, - "id": 131, - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "fundRequestSubsidyFeePool", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 129, - "nodeType": "ParameterList", - "parameters": [], - "src": "660:2:2" - }, - "returnParameters": { - "id": 130, - "nodeType": "ParameterList", - "parameters": [], - "src": "679:0:2" - }, - "scope": 135, - "src": "626:54:2", - "stateMutability": "payable", - "superFunction": null, - "visibility": "external" - }, - { - "body": null, - "documentation": null, - "id": 134, - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "fundDkgFeePool", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 132, - "nodeType": "ParameterList", - "parameters": [], - "src": "708:2:2" - }, - "returnParameters": { - "id": 133, - "nodeType": "ParameterList", - "parameters": [], - "src": "727:0:2" - }, - "scope": 135, - "src": "685:43:2", - "stateMutability": "payable", - "superFunction": null, - "visibility": "external" - } - ], - "scope": 1569, - "src": "490:240:2" - }, - { - "baseContracts": [ - { - "arguments": null, - "baseName": { - "contractScope": null, - "id": 136, - "name": "ReentrancyGuard", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 12779, - "src": "1149:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ReentrancyGuard_$12779", - "typeString": "contract ReentrancyGuard" - } - }, - "id": 137, - "nodeType": "InheritanceSpecifier", - "src": "1149:15:2" - } - ], - "contractDependencies": [ - 12779 - ], - "contractKind": "contract", - "documentation": "@title KeepRandomBeaconOperator\n@dev Keep client facing contract for random beacon security-critical operations.\nHandles group creation and expiration, BLS signature verification and incentives.\nThe contract is not upgradeable. New functionality can be implemented by deploying\nnew versions following Keep client update and re-authorization by the stakers.", - "fullyImplemented": true, - "id": 1568, - "linearizedBaseContracts": [ - 1568, - 12779 - ], - "name": "KeepRandomBeaconOperator", - "nodeType": "ContractDefinition", - "nodes": [ - { - "id": 140, - "libraryName": { - "contractScope": null, - "id": 138, - "name": "SafeMath", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 11944, - "src": "1177:8:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_SafeMath_$11944", - "typeString": "library SafeMath" - } - }, - "nodeType": "UsingForDirective", - "src": "1171:27:2", - "typeName": { - "id": 139, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1190:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - }, - { - "id": 143, - "libraryName": { - "contractScope": null, - "id": 141, - "name": "PercentUtils", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 11277, - "src": "1209:12:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_PercentUtils_$11277", - "typeString": "library PercentUtils" - } - }, - "nodeType": "UsingForDirective", - "src": "1203:31:2", - "typeName": { - "id": 142, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1226:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - }, - { - "id": 147, - "libraryName": { - "contractScope": null, - "id": 144, - "name": "AddressArrayUtils", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 10465, - "src": "1245:17:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_AddressArrayUtils_$10465", - "typeString": "library AddressArrayUtils" - } - }, - "nodeType": "UsingForDirective", - "src": "1239:38:2", - "typeName": { - "baseType": { - "id": 145, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1267:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 146, - "length": null, - "nodeType": "ArrayTypeName", - "src": "1267:9:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[]" - } - } - }, - { - "id": 150, - "libraryName": { - "contractScope": null, - "id": 148, - "name": "GroupSelection", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 8150, - "src": "1288:14:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_GroupSelection_$8150", - "typeString": "library GroupSelection" - } - }, - "nodeType": "UsingForDirective", - "src": "1282:48:2", - "typeName": { - "contractScope": null, - "id": 149, - "name": "GroupSelection.Storage", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 7202, - "src": "1307:22:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage_ptr", - "typeString": "struct GroupSelection.Storage" - } - } - }, - { - "id": 153, - "libraryName": { - "contractScope": null, - "id": 151, - "name": "Groups", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 9114, - "src": "1341:6:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_Groups_$9114", - "typeString": "library Groups" - } - }, - "nodeType": "UsingForDirective", - "src": "1335:32:2", - "typeName": { - "contractScope": null, - "id": 152, - "name": "Groups.Storage", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 8192, - "src": "1352:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage_ptr", - "typeString": "struct Groups.Storage" - } - } - }, - { - "id": 156, - "libraryName": { - "contractScope": null, - "id": 154, - "name": "DKGResultVerification", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 7170, - "src": "1378:21:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_DKGResultVerification_$7170", - "typeString": "library DKGResultVerification" - } - }, - "nodeType": "UsingForDirective", - "src": "1372:62:2", - "typeName": { - "contractScope": null, - "id": 155, - "name": "DKGResultVerification.Storage", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 6983, - "src": "1404:29:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$6983_storage_ptr", - "typeString": "struct DKGResultVerification.Storage" - } - } - }, - { - "anonymous": false, - "documentation": null, - "id": 160, - "name": "OnGroupRegistered", - "nodeType": "EventDefinition", - "parameters": { - "id": 159, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 158, - "indexed": false, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 160, - "src": "1464:17:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 157, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "1464:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1463:19:2" - }, - "src": "1440:43:2" - }, - { - "anonymous": false, - "documentation": null, - "id": 164, - "name": "DkgResultPublishedEvent", - "nodeType": "EventDefinition", - "parameters": { - "id": 163, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 162, - "indexed": false, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 164, - "src": "1595:17:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 161, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "1595:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1594:19:2" - }, - "src": "1565:49:2" - }, - { - "anonymous": false, - "documentation": null, - "id": 170, - "name": "RelayEntryRequested", - "nodeType": "EventDefinition", - "parameters": { - "id": 169, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 166, - "indexed": false, - "name": "previousEntry", - "nodeType": "VariableDeclaration", - "scope": 170, - "src": "1646:19:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 165, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "1646:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 168, - "indexed": false, - "name": "groupPublicKey", - "nodeType": "VariableDeclaration", - "scope": 170, - "src": "1667:20:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 167, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "1667:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1645:43:2" - }, - "src": "1620:69:2" - }, - { - "anonymous": false, - "documentation": null, - "id": 172, - "name": "RelayEntrySubmitted", - "nodeType": "EventDefinition", - "parameters": { - "id": 171, - "nodeType": "ParameterList", - "parameters": [], - "src": "1719:2:2" - }, - "src": "1694:28:2" - }, - { - "anonymous": false, - "documentation": null, - "id": 176, - "name": "GroupSelectionStarted", - "nodeType": "EventDefinition", - "parameters": { - "id": 175, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 174, - "indexed": false, - "name": "newEntry", - "nodeType": "VariableDeclaration", - "scope": 176, - "src": "1756:16:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 173, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1756:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1755:18:2" - }, - "src": "1728:46:2" - }, - { - "anonymous": false, - "documentation": null, - "id": 186, - "name": "GroupMemberRewardsWithdrawn", - "nodeType": "EventDefinition", - "parameters": { - "id": 185, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 178, - "indexed": true, - "name": "beneficiary", - "nodeType": "VariableDeclaration", - "scope": 186, - "src": "1814:27:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 177, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1814:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 180, - "indexed": false, - "name": "operator", - "nodeType": "VariableDeclaration", - "scope": 186, - "src": "1843:16:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 179, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1843:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 182, - "indexed": false, - "name": "amount", - "nodeType": "VariableDeclaration", - "scope": 186, - "src": "1861:14:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 181, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1861:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 184, - "indexed": false, - "name": "groupIndex", - "nodeType": "VariableDeclaration", - "scope": 186, - "src": "1877:18:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 183, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1877:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1813:83:2" - }, - "src": "1780:117:2" - }, - { - "constant": false, - "id": 188, - "name": "groupSelection", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "1903:37:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage" - }, - "typeName": { - "contractScope": null, - "id": 187, - "name": "GroupSelection.Storage", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 7202, - "src": "1903:22:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage_ptr", - "typeString": "struct GroupSelection.Storage" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 190, - "name": "groups", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "1946:21:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage" - }, - "typeName": { - "contractScope": null, - "id": 189, - "name": "Groups.Storage", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 8192, - "src": "1946:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage_ptr", - "typeString": "struct Groups.Storage" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 192, - "name": "dkgResultVerification", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "1973:51:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$6983_storage", - "typeString": "struct DKGResultVerification.Storage" - }, - "typeName": { - "contractScope": null, - "id": 191, - "name": "DKGResultVerification.Storage", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 6983, - "src": "1973:29:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$6983_storage_ptr", - "typeString": "struct DKGResultVerification.Storage" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 194, - "name": "owner", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "2054:22:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 193, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "2054:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 197, - "name": "serviceContracts", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "2083:35:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage", - "typeString": "address[]" - }, - "typeName": { - "baseType": { - "id": 195, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "2083:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 196, - "length": null, - "nodeType": "ArrayTypeName", - "src": "2083:9:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[]" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 199, - "name": "stakingContract", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "2206:37:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - }, - "typeName": { - "contractScope": null, - "id": 198, - "name": "TokenStaking", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 5649, - "src": "2206:12:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 204, - "name": "groupMemberBaseReward", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "2308:47:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 200, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2308:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_14500000000000_by_1", - "typeString": "int_const 14500000000000" - }, - "id": 203, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "hexValue": "313435", - "id": 201, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "2347:3:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_145_by_1", - "typeString": "int_const 145" - }, - "value": "145" - }, - "nodeType": "BinaryOperation", - "operator": "*", - "rightExpression": { - "argumentTypes": null, - "hexValue": "31653131", - "id": 202, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "2351:4:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_100000000000_by_1", - "typeString": "int_const 100000000000" - }, - "value": "1e11" - }, - "src": "2347:8:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_14500000000000_by_1", - "typeString": "int_const 14500000000000" - } - }, - "visibility": "public" - }, - { - "constant": false, - "id": 209, - "name": "gasPriceCeiling", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "2666:39:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 205, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2666:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_30000000000_by_1", - "typeString": "int_const 30000000000" - }, - "id": 208, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "hexValue": "3330", - "id": 206, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "2699:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_30_by_1", - "typeString": "int_const 30" - }, - "value": "30" - }, - "nodeType": "BinaryOperation", - "operator": "*", - "rightExpression": { - "argumentTypes": null, - "hexValue": "316539", - "id": 207, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "2702:3:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1000000000_by_1", - "typeString": "int_const 1000000000" - }, - "value": "1e9" - }, - "src": "2699:6:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_30000000000_by_1", - "typeString": "int_const 30000000000" - } - }, - "visibility": "public" - }, - { - "constant": false, - "id": 212, - "name": "groupSize", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "2788:29:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 210, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2788:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "3634", - "id": 211, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "2815:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_64_by_1", - "typeString": "int_const 64" - }, - "value": "64" - }, - "visibility": "public" - }, - { - "constant": false, - "id": 215, - "name": "groupThreshold", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "2941:34:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 213, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2941:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "3333", - "id": 214, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "2973:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_33_by_1", - "typeString": "int_const 33" - }, - "value": "33" - }, - "visibility": "public" - }, - { - "constant": false, - "id": 218, - "name": "resultPublicationBlockStep", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "3079:45:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 216, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3079:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "33", - "id": 217, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3123:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_3_by_1", - "typeString": "int_const 3" - }, - "value": "3" - }, - "visibility": "public" - }, - { - "constant": false, - "id": 224, - "name": "relayEntryGenerationTime", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "3257:47:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 219, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3257:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "components": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_4_by_1", - "typeString": "int_const 4" - }, - "id": 222, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "hexValue": "31", - "id": 220, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3300:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - }, - "value": "1" - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "hexValue": "33", - "id": 221, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3302:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_3_by_1", - "typeString": "int_const 3" - }, - "value": "3" - }, - "src": "3300:3:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_4_by_1", - "typeString": "int_const 4" - } - } - ], - "id": 223, - "isConstant": false, - "isInlineArray": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "TupleExpression", - "src": "3299:5:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_4_by_1", - "typeString": "int_const 4" - } - }, - "visibility": "public" - }, - { - "constant": false, - "id": 233, - "name": "relayEntryTimeout", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "3676:106:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 225, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3676:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 230, - "name": "resultPublicationBlockStep", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 218, - "src": "3754:26:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 228, - "name": "groupSize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 212, - "src": "3740:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 229, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "3740:13:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 231, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3740:41:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 226, - "name": "relayEntryGenerationTime", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 224, - "src": "3711:24:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 227, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "3711:28:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 232, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3711:71:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "public" - }, - { - "constant": false, - "id": 236, - "name": "entryVerificationGasEstimate", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "3956:52:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 234, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3956:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "323830303030", - "id": 235, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "4002:6:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_280000_by_1", - "typeString": "int_const 280000" - }, - "value": "280000" - }, - "visibility": "public" - }, - { - "constant": false, - "id": 239, - "name": "dkgGasEstimate", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "4097:39:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 237, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "4097:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "31373430303030", - "id": 238, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "4129:7:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1740000_by_1", - "typeString": "int_const 1740000" - }, - "value": "1740000" - }, - "visibility": "public" - }, - { - "constant": false, - "id": 242, - "name": "groupSelectionGasEstimate", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "4206:49:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 240, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "4206:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "323030303030", - "id": 241, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "4249:6:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_200000_by_1", - "typeString": "int_const 200000" - }, - "value": "200000" - }, - "visibility": "public" - }, - { - "constant": false, - "id": 244, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "4592:43:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 243, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "4592:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "public" - }, - { - "constant": false, - "id": 246, - "name": "currentEntryStartBlock", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "4642:39:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 245, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "4642:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": true, - "id": 249, - "name": "_genesisGroupSeed", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "4805:123:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 247, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "4805:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "3331343135393236353335383937393332333834363236343333383332373935303238383431393731363933393933373531303538323039373439343435393233303738313634303632383632", - "id": 248, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "4851:77:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_31415926535897932384626433832795028841971693993751058209749445923078164062862_by_1", - "typeString": "int_const 3141...(69 digits omitted)...2862" - }, - "value": "31415926535897932384626433832795028841971693993751058209749445923078164062862" - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 251, - "name": "groupSelectionStarterContract", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "4999:54:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - }, - "typeName": { - "contractScope": null, - "id": 250, - "name": "ServiceContract", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 135, - "src": "4999:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - } - }, - "value": null, - "visibility": "internal" - }, - { - "canonicalName": "KeepRandomBeaconOperator.SigningRequest", - "id": 264, - "members": [ - { - "constant": false, - "id": 253, - "name": "relayRequestId", - "nodeType": "VariableDeclaration", - "scope": 264, - "src": "5092:22:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 252, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "5092:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 255, - "name": "entryVerificationAndProfitFee", - "nodeType": "VariableDeclaration", - "scope": 264, - "src": "5124:37:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 254, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "5124:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 257, - "name": "callbackFee", - "nodeType": "VariableDeclaration", - "scope": 264, - "src": "5171:19:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 256, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "5171:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 259, - "name": "groupIndex", - "nodeType": "VariableDeclaration", - "scope": 264, - "src": "5200:18:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 258, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "5200:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 261, - "name": "previousEntry", - "nodeType": "VariableDeclaration", - "scope": 264, - "src": "5228:19:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 260, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "5228:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 263, - "name": "serviceContract", - "nodeType": "VariableDeclaration", - "scope": 264, - "src": "5257:23:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 262, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "5257:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "name": "SigningRequest", - "nodeType": "StructDefinition", - "scope": 1568, - "src": "5060:227:2", - "visibility": "public" - }, - { - "constant": false, - "id": 266, - "name": "signingRequest", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "5292:38:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest" - }, - "typeName": { - "contractScope": null, - "id": 265, - "name": "SigningRequest", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 264, - "src": "5292:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage_ptr", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest" - } - }, - "value": null, - "visibility": "internal" - }, - { - "body": { - "id": 295, - "nodeType": "Block", - "src": "5521:335:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 273, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 270, - "name": "numberOfGroups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1406, - "src": "5539:14:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", - "typeString": "function () view returns (uint256)" - } - }, - "id": 271, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5539:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 272, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "5559:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "5539:21:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "47726f757073206578697374", - "id": 274, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "5562:14:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_d29dcd61fb1ec8d7aeab0b64bb7a74769b4d6787b62f3ba7c3958cb51f8f3580", - "typeString": "literal_string \"Groups exist\"" - }, - "value": "Groups exist" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_d29dcd61fb1ec8d7aeab0b64bb7a74769b4d6787b62f3ba7c3958cb51f8f3580", - "typeString": "literal_string \"Groups exist\"" - } - ], - "id": 269, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "5531:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 275, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5531:46:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 276, - "nodeType": "ExpressionStatement", - "src": "5531:46:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 287, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 277, - "name": "groupSelectionStarterContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 251, - "src": "5693:29:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 279, - "name": "serviceContracts", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 197, - "src": "5741:16:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage", - "typeString": "address[] storage ref" - } - }, - "id": 285, - "indexExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "31", - "id": 283, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "5786:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - }, - "value": "1" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 280, - "name": "serviceContracts", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 197, - "src": "5758:16:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage", - "typeString": "address[] storage ref" - } - }, - "id": 281, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "length", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "5758:23:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 282, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "5758:27:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 284, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5758:30:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "5741:48:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 278, - "name": "ServiceContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 135, - "src": "5725:15:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_ServiceContract_$135_$", - "typeString": "type(contract ServiceContract)" - } - }, - "id": 286, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5725:65:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - } - }, - "src": "5693:97:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - } - }, - "id": 288, - "nodeType": "ExpressionStatement", - "src": "5693:97:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 290, - "name": "_genesisGroupSeed", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 249, - "src": "5820:17:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 291, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "5839:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 292, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "5839:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 289, - "name": "startGroupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 552, - "src": "5800:19:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_uint256_$returns$__$", - "typeString": "function (uint256,uint256)" - } - }, - "id": 293, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5800:49:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 294, - "nodeType": "ExpressionStatement", - "src": "5800:49:2" - } - ] - }, - "documentation": "@dev Triggers the first group selection. Genesis can be called only when\nthere are no groups on the operator contract.", - "id": 296, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "genesis", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 267, - "nodeType": "ParameterList", - "parameters": [], - "src": "5503:2:2" - }, - "returnParameters": { - "id": 268, - "nodeType": "ParameterList", - "parameters": [], - "src": "5521:0:2" - }, - "scope": 1568, - "src": "5487:369:2", - "stateMutability": "payable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 307, - "nodeType": "Block", - "src": "5965:83:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 302, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 299, - "name": "owner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 194, - "src": "5983:5:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 300, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "5992:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 301, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "5992:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "src": "5983:19:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "43616c6c6572206973206e6f7420746865206f776e6572", - "id": 303, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6004:25:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_15ed5034391ed5ef65b8bb8dbcb08f9b6c4034ebcf89f76344a17e1651e92b33", - "typeString": "literal_string \"Caller is not the owner\"" - }, - "value": "Caller is not the owner" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_15ed5034391ed5ef65b8bb8dbcb08f9b6c4034ebcf89f76344a17e1651e92b33", - "typeString": "literal_string \"Caller is not the owner\"" - } - ], - "id": 298, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "5975:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 304, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5975:55:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 305, - "nodeType": "ExpressionStatement", - "src": "5975:55:2" - }, - { - "id": 306, - "nodeType": "PlaceholderStatement", - "src": "6040:1:2" - } - ] - }, - "documentation": "@dev Throws if called by any account other than the owner.", - "id": 308, - "name": "onlyOwner", - "nodeType": "ModifierDefinition", - "parameters": { - "id": 297, - "nodeType": "ParameterList", - "parameters": [], - "src": "5962:2:2" - }, - "src": "5944:104:2", - "visibility": "internal" - }, - { - "body": { - "id": 320, - "nodeType": "Block", - "src": "6145:148:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 313, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "6202:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 314, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "6202:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - ], - "expression": { - "argumentTypes": null, - "id": 311, - "name": "serviceContracts", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 197, - "src": "6176:16:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage", - "typeString": "address[] storage ref" - } - }, - "id": 312, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "contains", - "nodeType": "MemberAccess", - "referencedDeclaration": 10397, - "src": "6176:25:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_array$_t_address_$dyn_memory_ptr_$_t_address_$returns$_t_bool_$bound_to$_t_array$_t_address_$dyn_memory_ptr_$", - "typeString": "function (address[] memory,address) pure returns (bool)" - } - }, - "id": 315, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6176:37:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "43616c6c6572206973206e6f7420616e20617574686f72697a656420636f6e7472616374", - "id": 316, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6227:38:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_278c5ce8365f6a15388fdf8bd669bac1e4324c5ef139bca0eef4ba512f3b8b61", - "typeString": "literal_string \"Caller is not an authorized contract\"" - }, - "value": "Caller is not an authorized contract" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_278c5ce8365f6a15388fdf8bd669bac1e4324c5ef139bca0eef4ba512f3b8b61", - "typeString": "literal_string \"Caller is not an authorized contract\"" - } - ], - "id": 310, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "6155:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 317, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6155:120:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 318, - "nodeType": "ExpressionStatement", - "src": "6155:120:2" - }, - { - "id": 319, - "nodeType": "PlaceholderStatement", - "src": "6285:1:2" - } - ] - }, - "documentation": "@dev Checks if sender is authorized.", - "id": 321, - "name": "onlyServiceContract", - "nodeType": "ModifierDefinition", - "parameters": { - "id": 309, - "nodeType": "ParameterList", - "parameters": [], - "src": "6142:2:2" - }, - "src": "6114:179:2", - "visibility": "internal" - }, - { - "body": { - "id": 411, - "nodeType": "Block", - "src": "6370:866:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 331, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 328, - "name": "owner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 194, - "src": "6380:5:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 329, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "6388:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 330, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "6388:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "src": "6380:18:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 332, - "nodeType": "ExpressionStatement", - "src": "6380:18:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 336, - "name": "_serviceContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 323, - "src": "6431:16:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "id": 333, - "name": "serviceContracts", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 197, - "src": "6409:16:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage", - "typeString": "address[] storage ref" - } - }, - "id": 335, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "push", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "6409:21:2", - "typeDescriptions": { - "typeIdentifier": "t_function_arraypush_nonpayable$_t_address_$returns$_t_uint256_$", - "typeString": "function (address) returns (uint256)" - } - }, - "id": 337, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6409:39:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 338, - "nodeType": "ExpressionStatement", - "src": "6409:39:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 343, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 339, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "6458:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 341, - "name": "_stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 325, - "src": "6489:16:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 340, - "name": "TokenStaking", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5649, - "src": "6476:12:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_TokenStaking_$5649_$", - "typeString": "type(contract TokenStaking)" - } - }, - "id": 342, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6476:30:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "src": "6458:48:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 344, - "nodeType": "ExpressionStatement", - "src": "6458:48:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 351, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 345, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "6517:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 347, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "stakingContract", - "nodeType": "MemberAccess", - "referencedDeclaration": 8191, - "src": "6517:22:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 349, - "name": "_stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 325, - "src": "6555:16:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 348, - "name": "TokenStaking", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5649, - "src": "6542:12:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_TokenStaking_$5649_$", - "typeString": "type(contract TokenStaking)" - } - }, - "id": 350, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6542:30:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "src": "6517:55:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 352, - "nodeType": "ExpressionStatement", - "src": "6517:55:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 361, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 353, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "6582:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 355, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "groupActiveTime", - "nodeType": "MemberAccess", - "referencedDeclaration": 8170, - "src": "6582:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 357, - "name": "_stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 325, - "src": "6620:16:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 356, - "name": "TokenStaking", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5649, - "src": "6607:12:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_TokenStaking_$5649_$", - "typeString": "type(contract TokenStaking)" - } - }, - "id": 358, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6607:30:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 359, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "undelegationPeriod", - "nodeType": "MemberAccess", - "referencedDeclaration": 3305, - "src": "6607:49:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$", - "typeString": "function () view external returns (uint256)" - } - }, - "id": 360, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6607:51:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "6582:76:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 362, - "nodeType": "ExpressionStatement", - "src": "6582:76:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 367, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 363, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "6669:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 365, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "ticketSubmissionTimeout", - "nodeType": "MemberAccess", - "referencedDeclaration": 7191, - "src": "6669:38:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "hexValue": "3132", - "id": 366, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6710:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_12_by_1", - "typeString": "int_const 12" - }, - "value": "12" - }, - "src": "6669:43:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 368, - "nodeType": "ExpressionStatement", - "src": "6669:43:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 373, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 369, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "6722:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 371, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "groupSize", - "nodeType": "MemberAccess", - "referencedDeclaration": 7201, - "src": "6722:24:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "id": 372, - "name": "groupSize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 212, - "src": "6749:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "6722:36:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 374, - "nodeType": "ExpressionStatement", - "src": "6722:36:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 391, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 375, - "name": "dkgResultVerification", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 192, - "src": "6769:21:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$6983_storage", - "typeString": "struct DKGResultVerification.Storage storage ref" - } - }, - "id": 377, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "timeDKG", - "nodeType": "MemberAccess", - "referencedDeclaration": 6976, - "src": "6769:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_52_by_1", - "typeString": "int_const 52" - }, - "id": 390, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_30_by_1", - "typeString": "int_const 30" - }, - "id": 383, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "hexValue": "35", - "id": 378, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6801:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_5_by_1", - "typeString": "int_const 5" - }, - "value": "5" - }, - "nodeType": "BinaryOperation", - "operator": "*", - "rightExpression": { - "argumentTypes": null, - "components": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_6_by_1", - "typeString": "int_const 6" - }, - "id": 381, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "hexValue": "31", - "id": 379, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6804:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - }, - "value": "1" - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "hexValue": "35", - "id": 380, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6806:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_5_by_1", - "typeString": "int_const 5" - }, - "value": "5" - }, - "src": "6804:3:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_6_by_1", - "typeString": "int_const 6" - } - } - ], - "id": 382, - "isConstant": false, - "isInlineArray": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "TupleExpression", - "src": "6803:5:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_6_by_1", - "typeString": "int_const 6" - } - }, - "src": "6801:7:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_30_by_1", - "typeString": "int_const 30" - } - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_22_by_1", - "typeString": "int_const 22" - }, - "id": 389, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "hexValue": "32", - "id": 384, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6811:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_2_by_1", - "typeString": "int_const 2" - }, - "value": "2" - }, - "nodeType": "BinaryOperation", - "operator": "*", - "rightExpression": { - "argumentTypes": null, - "components": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_11_by_1", - "typeString": "int_const 11" - }, - "id": 387, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "hexValue": "31", - "id": 385, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6814:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - }, - "value": "1" - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "hexValue": "3130", - "id": 386, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6816:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_10_by_1", - "typeString": "int_const 10" - }, - "value": "10" - }, - "src": "6814:4:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_11_by_1", - "typeString": "int_const 11" - } - } - ], - "id": 388, - "isConstant": false, - "isInlineArray": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "TupleExpression", - "src": "6813:6:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_11_by_1", - "typeString": "int_const 11" - } - }, - "src": "6811:8:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_22_by_1", - "typeString": "int_const 22" - } - }, - "src": "6801:18:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_52_by_1", - "typeString": "int_const 52" - } - }, - "src": "6769:50:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 392, - "nodeType": "ExpressionStatement", - "src": "6769:50:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 397, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 393, - "name": "dkgResultVerification", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 192, - "src": "6829:21:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$6983_storage", - "typeString": "struct DKGResultVerification.Storage storage ref" - } - }, - "id": 395, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "resultPublicationBlockStep", - "nodeType": "MemberAccess", - "referencedDeclaration": 6978, - "src": "6829:48:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "id": 396, - "name": "resultPublicationBlockStep", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 218, - "src": "6880:26:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "6829:77:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 398, - "nodeType": "ExpressionStatement", - "src": "6829:77:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 403, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 399, - "name": "dkgResultVerification", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 192, - "src": "6916:21:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$6983_storage", - "typeString": "struct DKGResultVerification.Storage storage ref" - } - }, - "id": 401, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "groupSize", - "nodeType": "MemberAccess", - "referencedDeclaration": 6980, - "src": "6916:31:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "id": 402, - "name": "groupSize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 212, - "src": "6950:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "6916:43:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 404, - "nodeType": "ExpressionStatement", - "src": "6916:43:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 409, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 405, - "name": "dkgResultVerification", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 192, - "src": "7172:21:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$6983_storage", - "typeString": "struct DKGResultVerification.Storage storage ref" - } - }, - "id": 407, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "signatureThreshold", - "nodeType": "MemberAccess", - "referencedDeclaration": 6982, - "src": "7172:40:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "id": 408, - "name": "groupThreshold", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 215, - "src": "7215:14:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "7172:57:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 410, - "nodeType": "ExpressionStatement", - "src": "7172:57:2" - } - ] - }, - "documentation": null, - "id": 412, - "implemented": true, - "kind": "constructor", - "modifiers": [], - "name": "", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 326, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 323, - "name": "_serviceContract", - "nodeType": "VariableDeclaration", - "scope": 412, - "src": "6311:24:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 322, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "6311:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 325, - "name": "_stakingContract", - "nodeType": "VariableDeclaration", - "scope": 412, - "src": "6337:24:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 324, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "6337:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "6310:52:2" - }, - "returnParameters": { - "id": 327, - "nodeType": "ParameterList", - "parameters": [], - "src": "6370:0:2" - }, - "scope": 1568, - "src": "6299:937:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 425, - "nodeType": "Block", - "src": "7425:55:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 422, - "name": "serviceContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 414, - "src": "7457:15:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "id": 419, - "name": "serviceContracts", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 197, - "src": "7435:16:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage", - "typeString": "address[] storage ref" - } - }, - "id": 421, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "push", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "7435:21:2", - "typeDescriptions": { - "typeIdentifier": "t_function_arraypush_nonpayable$_t_address_$returns$_t_uint256_$", - "typeString": "function (address) returns (uint256)" - } - }, - "id": 423, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "7435:38:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 424, - "nodeType": "ExpressionStatement", - "src": "7435:38:2" - } - ] - }, - "documentation": "@dev Adds service contract\n@param serviceContract Address of the service contract.", - "id": 426, - "implemented": true, - "kind": "function", - "modifiers": [ - { - "arguments": null, - "id": 417, - "modifierName": { - "argumentTypes": null, - "id": 416, - "name": "onlyOwner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 308, - "src": "7415:9:2", - "typeDescriptions": { - "typeIdentifier": "t_modifier$__$", - "typeString": "modifier ()" - } - }, - "nodeType": "ModifierInvocation", - "src": "7415:9:2" - } - ], - "name": "addServiceContract", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 415, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 414, - "name": "serviceContract", - "nodeType": "VariableDeclaration", - "scope": 426, - "src": "7383:23:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 413, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "7383:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "7382:25:2" - }, - "returnParameters": { - "id": 418, - "nodeType": "ParameterList", - "parameters": [], - "src": "7425:0:2" - }, - "scope": 1568, - "src": "7355:125:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 439, - "nodeType": "Block", - "src": "7675:64:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 436, - "name": "serviceContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 428, - "src": "7716:15:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "id": 433, - "name": "serviceContracts", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 197, - "src": "7685:16:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage", - "typeString": "address[] storage ref" - } - }, - "id": 435, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "removeAddress", - "nodeType": "MemberAccess", - "referencedDeclaration": 10464, - "src": "7685:30:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_array$_t_address_$dyn_storage_ptr_$_t_address_$returns$_t_array$_t_address_$dyn_storage_ptr_$bound_to$_t_array$_t_address_$dyn_storage_ptr_$", - "typeString": "function (address[] storage pointer,address) returns (address[] storage pointer)" - } - }, - "id": 437, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "7685:47:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[] storage pointer" - } - }, - "id": 438, - "nodeType": "ExpressionStatement", - "src": "7685:47:2" - } - ] - }, - "documentation": "@dev Removes service contract\n@param serviceContract Address of the service contract.", - "id": 440, - "implemented": true, - "kind": "function", - "modifiers": [ - { - "arguments": null, - "id": 431, - "modifierName": { - "argumentTypes": null, - "id": 430, - "name": "onlyOwner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 308, - "src": "7665:9:2", - "typeDescriptions": { - "typeIdentifier": "t_modifier$__$", - "typeString": "modifier ()" - } - }, - "nodeType": "ModifierInvocation", - "src": "7665:9:2" - } - ], - "name": "removeServiceContract", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 429, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 428, - "name": "serviceContract", - "nodeType": "VariableDeclaration", - "scope": 440, - "src": "7633:23:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 427, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "7633:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "7632:25:2" - }, - "returnParameters": { - "id": 432, - "nodeType": "ParameterList", - "parameters": [], - "src": "7675:0:2" - }, - "scope": 1568, - "src": "7602:137:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 490, - "nodeType": "Block", - "src": "8087:504:2", - "statements": [ - { - "assignments": [ - 450 - ], - "declarations": [ - { - "constant": false, - "id": 450, - "name": "groupSelectionStartFee", - "nodeType": "VariableDeclaration", - "scope": 490, - "src": "8097:30:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 449, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "8097:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 455, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 453, - "name": "gasPriceCeiling", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 209, - "src": "8160:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 451, - "name": "groupSelectionGasEstimate", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 242, - "src": "8130:25:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 452, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "8130:29:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 454, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8130:46:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "8097:79:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 461, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 456, - "name": "groupSelectionStarterContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 251, - "src": "8187:29:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 458, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "8235:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 459, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "8235:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - ], - "id": 457, - "name": "ServiceContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 135, - "src": "8219:15:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_ServiceContract_$135_$", - "typeString": "type(contract ServiceContract)" - } - }, - "id": 460, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8219:27:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - } - }, - "src": "8187:59:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - } - }, - "id": 462, - "nodeType": "ExpressionStatement", - "src": "8187:59:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 464, - "name": "_newEntry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 442, - "src": "8276:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 468, - "name": "groupSelectionStartFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 450, - "src": "8301:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 465, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "8287:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 466, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "8287:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 467, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "8287:13:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 469, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8287:37:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 463, - "name": "startGroupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 552, - "src": "8256:19:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_uint256_$returns$__$", - "typeString": "function (uint256,uint256)" - } - }, - "id": 470, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8256:69:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 471, - "nodeType": "ExpressionStatement", - "src": "8256:69:2" - }, - { - "assignments": [ - 473, - null - ], - "declarations": [ - { - "constant": false, - "id": 473, - "name": "success", - "nodeType": "VariableDeclaration", - "scope": 490, - "src": "8403:12:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 472, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "8403:4:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - }, - null - ], - "id": 484, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "", - "id": 482, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "8492:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - }, - "value": "" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - } - ], - "arguments": [ - { - "argumentTypes": null, - "id": 480, - "name": "groupSelectionStartFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 450, - "src": "8468:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 476, - "name": "submitter", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 444, - "src": "8446:9:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - ], - "expression": { - "argumentTypes": null, - "id": 474, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "8421:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 475, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "beneficiaryOf", - "nodeType": "MemberAccess", - "referencedDeclaration": 3394, - "src": "8421:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_address_payable_$", - "typeString": "function (address) view external returns (address payable)" - } - }, - "id": 477, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8421:35:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "id": 478, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "call", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "8421:40:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 479, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "8421:46:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value_$", - "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" - } - }, - "id": 481, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8421:70:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 483, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8421:74:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "tuple(bool,bytes memory)" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "8402:93:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 486, - "name": "success", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 473, - "src": "8513:7:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4661696c6564207265696d62757273696e67207375626d697474657220666f72207374617274696e6720612067726f75702073656c656374696f6e", - "id": 487, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "8522:61:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_de0664998b1e1c3284c50a4b9d4003aa650e28854fc84b775da409a7f7eb9746", - "typeString": "literal_string \"Failed reimbursing submitter for starting a group selection\"" - }, - "value": "Failed reimbursing submitter for starting a group selection" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_de0664998b1e1c3284c50a4b9d4003aa650e28854fc84b775da409a7f7eb9746", - "typeString": "literal_string \"Failed reimbursing submitter for starting a group selection\"" - } - ], - "id": 485, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "8505:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 488, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8505:79:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 489, - "nodeType": "ExpressionStatement", - "src": "8505:79:2" - } - ] - }, - "documentation": "@dev Triggers the selection process of a new candidate group.\n@param _newEntry New random beacon value that stakers will use to\ngenerate their tickets.\n@param submitter Operator of this contract.", - "id": 491, - "implemented": true, - "kind": "function", - "modifiers": [ - { - "arguments": null, - "id": 447, - "modifierName": { - "argumentTypes": null, - "id": 446, - "name": "onlyServiceContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 321, - "src": "8067:19:2", - "typeDescriptions": { - "typeIdentifier": "t_modifier$__$", - "typeString": "modifier ()" - } - }, - "nodeType": "ModifierInvocation", - "src": "8067:19:2" - } - ], - "name": "createGroup", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 445, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 442, - "name": "_newEntry", - "nodeType": "VariableDeclaration", - "scope": 491, - "src": "8006:17:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 441, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "8006:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 444, - "name": "submitter", - "nodeType": "VariableDeclaration", - "scope": 491, - "src": "8025:25:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - "typeName": { - "id": 443, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "8025:15:2", - "stateMutability": "payable", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "8005:46:2" - }, - "returnParameters": { - "id": 448, - "nodeType": "ParameterList", - "parameters": [], - "src": "8087:0:2" - }, - "scope": 1568, - "src": "7985:606:2", - "stateMutability": "payable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 551, - "nodeType": "Block", - "src": "8672:704:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 504, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 499, - "name": "_payment", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 495, - "src": "8703:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">=", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 502, - "name": "dkgGasEstimate", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 239, - "src": "8735:14:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 500, - "name": "gasPriceCeiling", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 209, - "src": "8715:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 501, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "8715:19:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 503, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8715:35:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "8703:47:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "496e73756666696369656e7420444b4720666565", - "id": 505, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "8764:22:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_1755164d4245fc7da9d20df1bcbc3b7e73c6c16b21ce54fe6af632e55665d42e", - "typeString": "literal_string \"Insufficient DKG fee\"" - }, - "value": "Insufficient DKG fee" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_1755164d4245fc7da9d20df1bcbc3b7e73c6c16b21ce54fe6af632e55665d42e", - "typeString": "literal_string \"Insufficient DKG fee\"" - } - ], - "id": 498, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "8682:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 506, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8682:114:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 507, - "nodeType": "ExpressionStatement", - "src": "8682:114:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 509, - "name": "isGroupSelectionPossible", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 585, - "src": "8815:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$", - "typeString": "function () view returns (bool)" - } - }, - "id": 510, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8815:26:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "47726f75702073656c656374696f6e20696e2070726f6772657373", - "id": 511, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "8843:29:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_430f53fb41bac762d470327dd7fd8fd9bbdc99966be3725b3cdbe88946a541eb", - "typeString": "literal_string \"Group selection in progress\"" - }, - "value": "Group selection in progress" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_430f53fb41bac762d470327dd7fd8fd9bbdc99966be3725b3cdbe88946a541eb", - "typeString": "literal_string \"Group selection in progress\"" - } - ], - "id": 508, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "8807:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 512, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8807:66:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 513, - "nodeType": "ExpressionStatement", - "src": "8807:66:2" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 516, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 514, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 244, - "src": "9008:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 515, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "9039:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "9008:32:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 536, - "nodeType": "IfStatement", - "src": "9004:228:2", - "trueBody": { - "id": 535, - "nodeType": "Block", - "src": "9042:190:2", - "statements": [ - { - "assignments": [ - 518 - ], - "declarations": [ - { - "constant": false, - "id": 518, - "name": "surplus", - "nodeType": "VariableDeclaration", - "scope": 535, - "src": "9056:15:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 517, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "9056:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 520, - "initialValue": { - "argumentTypes": null, - "id": 519, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 244, - "src": "9074:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "9056:46:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 523, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 521, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 244, - "src": "9116:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "hexValue": "30", - "id": 522, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "9147:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "9116:32:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 524, - "nodeType": "ExpressionStatement", - "src": "9116:32:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "arguments": [ - { - "argumentTypes": null, - "id": 531, - "name": "surplus", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 518, - "src": "9211:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 526, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "9178:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 527, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "9178:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - ], - "id": 525, - "name": "ServiceContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 135, - "src": "9162:15:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_ServiceContract_$135_$", - "typeString": "type(contract ServiceContract)" - } - }, - "id": 528, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9162:27:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - } - }, - "id": 529, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "fundDkgFeePool", - "nodeType": "MemberAccess", - "referencedDeclaration": 134, - "src": "9162:42:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_payable$__$returns$__$", - "typeString": "function () payable external" - } - }, - "id": 530, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "9162:48:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_external_payable$__$returns$__$value_$", - "typeString": "function (uint256) pure returns (function () payable external)" - } - }, - "id": 532, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9162:57:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_payable$__$returns$__$value", - "typeString": "function () payable external" - } - }, - "id": 533, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9162:59:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 534, - "nodeType": "ExpressionStatement", - "src": "9162:59:2" - } - ] - } - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 540, - "name": "_newEntry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 493, - "src": "9263:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 537, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "9242:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 539, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "start", - "nodeType": "MemberAccess", - "referencedDeclaration": 7233, - "src": "9242:20:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_nonpayable$_t_struct$_Storage_$7202_storage_ptr_$_t_uint256_$returns$__$bound_to$_t_struct$_Storage_$7202_storage_ptr_$", - "typeString": "function (struct GroupSelection.Storage storage pointer,uint256)" - } - }, - "id": 541, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9242:31:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 542, - "nodeType": "ExpressionStatement", - "src": "9242:31:2" - }, - { - "eventCall": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 544, - "name": "_newEntry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 493, - "src": "9310:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 543, - "name": "GroupSelectionStarted", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 176, - "src": "9288:21:2", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$", - "typeString": "function (uint256)" - } - }, - "id": 545, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9288:32:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 546, - "nodeType": "EmitStatement", - "src": "9283:37:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 549, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 547, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 244, - "src": "9330:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "id": 548, - "name": "_payment", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 495, - "src": "9361:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "9330:39:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 550, - "nodeType": "ExpressionStatement", - "src": "9330:39:2" - } - ] - }, - "documentation": null, - "id": 552, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "startGroupSelection", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 496, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 493, - "name": "_newEntry", - "nodeType": "VariableDeclaration", - "scope": 552, - "src": "8626:17:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 492, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "8626:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 495, - "name": "_payment", - "nodeType": "VariableDeclaration", - "scope": 552, - "src": "8645:16:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 494, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "8645:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "8625:37:2" - }, - "returnParameters": { - "id": 497, - "nodeType": "ParameterList", - "parameters": [], - "src": "8672:0:2" - }, - "scope": 1568, - "src": "8597:779:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 584, - "nodeType": "Block", - "src": "9445:485:2", - "statements": [ - { - "condition": { - "argumentTypes": null, - "id": 559, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "UnaryOperation", - "operator": "!", - "prefix": true, - "src": "9459:26:2", - "subExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 557, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "9460:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 558, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "inProgress", - "nodeType": "MemberAccess", - "referencedDeclaration": 7195, - "src": "9460:25:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 563, - "nodeType": "IfStatement", - "src": "9455:68:2", - "trueBody": { - "id": 562, - "nodeType": "Block", - "src": "9487:36:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "hexValue": "74727565", - "id": 560, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "bool", - "lValueRequested": false, - "nodeType": "Literal", - "src": "9508:4:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "value": "true" - }, - "functionReturnParameters": 556, - "id": 561, - "nodeType": "Return", - "src": "9501:11:2" - } - ] - } - }, - { - "assignments": [ - 565 - ], - "declarations": [ - { - "constant": false, - "id": 565, - "name": "dkgTimeout", - "nodeType": "VariableDeclaration", - "scope": 584, - "src": "9680:18:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 564, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "9680:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 578, - "initialValue": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 577, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 573, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 570, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 566, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "9701:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 567, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "ticketSubmissionStartBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 7193, - "src": "9701:41:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 568, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "9753:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 569, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "ticketSubmissionTimeout", - "nodeType": "MemberAccess", - "referencedDeclaration": 7191, - "src": "9753:38:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "9701:90:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 571, - "name": "dkgResultVerification", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 192, - "src": "9802:21:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$6983_storage", - "typeString": "struct DKGResultVerification.Storage storage ref" - } - }, - "id": 572, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "timeDKG", - "nodeType": "MemberAccess", - "referencedDeclaration": 6976, - "src": "9802:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "9701:130:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 576, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 574, - "name": "groupSize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 212, - "src": "9842:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "*", - "rightExpression": { - "argumentTypes": null, - "id": 575, - "name": "resultPublicationBlockStep", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 218, - "src": "9854:26:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "9842:38:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "9701:179:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "9680:200:2" - }, - { - "expression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 582, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 579, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "9898:5:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 580, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "9898:12:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "id": 581, - "name": "dkgTimeout", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 565, - "src": "9913:10:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "9898:25:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "functionReturnParameters": 556, - "id": 583, - "nodeType": "Return", - "src": "9891:32:2" - } - ] - }, - "documentation": null, - "id": 585, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "isGroupSelectionPossible", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 553, - "nodeType": "ParameterList", - "parameters": [], - "src": "9415:2:2" - }, - "returnParameters": { - "id": 556, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 555, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 585, - "src": "9439:4:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 554, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "9439:4:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "9438:6:2" - }, - "scope": 1568, - "src": "9382:548:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 617, - "nodeType": "Block", - "src": "10683:238:2", - "statements": [ - { - "assignments": [ - 591 - ], - "declarations": [ - { - "constant": false, - "id": 591, - "name": "minimumStake", - "nodeType": "VariableDeclaration", - "scope": 617, - "src": "10693:20:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 590, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "10693:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 595, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 592, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "10716:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 593, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "minimumStake", - "nodeType": "MemberAccess", - "referencedDeclaration": 4728, - "src": "10716:28:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$", - "typeString": "function () view external returns (uint256)" - } - }, - "id": 594, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10716:30:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "10693:53:2" - }, - { - "assignments": [ - 597 - ], - "declarations": [ - { - "constant": false, - "id": 597, - "name": "stakingWeight", - "nodeType": "VariableDeclaration", - "scope": 617, - "src": "10756:21:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 596, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "10756:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 609, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 607, - "name": "minimumStake", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 591, - "src": "10841:12:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 600, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "10810:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 601, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "10810:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 603, - "name": "this", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12868, - "src": "10830:4:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_KeepRandomBeaconOperator_$1568", - "typeString": "contract KeepRandomBeaconOperator" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_contract$_KeepRandomBeaconOperator_$1568", - "typeString": "contract KeepRandomBeaconOperator" - } - ], - "id": 602, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "10822:7:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": "address" - }, - "id": 604, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10822:13:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "id": 598, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "10780:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 599, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "eligibleStake", - "nodeType": "MemberAccess", - "referencedDeclaration": 5579, - "src": "10780:29:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$", - "typeString": "function (address,address) view external returns (uint256)" - } - }, - "id": 605, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10780:56:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 606, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "div", - "nodeType": "MemberAccess", - "referencedDeclaration": 11877, - "src": "10780:60:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 608, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10780:74:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "10756:98:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 613, - "name": "ticket", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 587, - "src": "10892:6:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - { - "argumentTypes": null, - "id": 614, - "name": "stakingWeight", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 597, - "src": "10900:13:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 610, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "10864:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 612, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "submitTicket", - "nodeType": "MemberAccess", - "referencedDeclaration": 7292, - "src": "10864:27:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_nonpayable$_t_struct$_Storage_$7202_storage_ptr_$_t_bytes32_$_t_uint256_$returns$__$bound_to$_t_struct$_Storage_$7202_storage_ptr_$", - "typeString": "function (struct GroupSelection.Storage storage pointer,bytes32,uint256)" - } - }, - "id": 615, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10864:50:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 616, - "nodeType": "ExpressionStatement", - "src": "10864:50:2" - } - ] - }, - "documentation": "@dev Submits ticket to request to participate in a new candidate group.\n@param ticket Bytes representation of a ticket that holds the following:\n- ticketValue: first 8 bytes of a result of keccak256 cryptography hash\n function on the combination of the group selection seed (previous\n beacon output), staker-specific value (address) and virtual staker index.\n- stakerValue: a staker-specific value which is the address of the staker.\n- virtualStakerIndex: 4-bytes number within a range of 1 to staker's weight;\n has to be unique for all tickets submitted by the given staker for the\n current candidate group selection.", - "id": 618, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "submitTicket", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 588, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 587, - "name": "ticket", - "nodeType": "VariableDeclaration", - "scope": 618, - "src": "10660:14:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 586, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "10660:7:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "10659:16:2" - }, - "returnParameters": { - "id": 589, - "nodeType": "ParameterList", - "parameters": [], - "src": "10683:0:2" - }, - "scope": 1568, - "src": "10638:283:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 626, - "nodeType": "Block", - "src": "11113:62:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 623, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "11130:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 624, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "ticketSubmissionTimeout", - "nodeType": "MemberAccess", - "referencedDeclaration": 7191, - "src": "11130:38:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 622, - "id": 625, - "nodeType": "Return", - "src": "11123:45:2" - } - ] - }, - "documentation": "@dev Gets the timeout in blocks after which group candidate ticket\nsubmission is finished.", - "id": 627, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "ticketSubmissionTimeout", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 619, - "nodeType": "ParameterList", - "parameters": [], - "src": "11080:2:2" - }, - "returnParameters": { - "id": 622, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 621, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 627, - "src": "11104:7:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 620, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "11104:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "11103:9:2" - }, - "scope": 1568, - "src": "11048:127:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 636, - "nodeType": "Block", - "src": "11333:53:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 632, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "11350:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 633, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "tickets", - "nodeType": "MemberAccess", - "referencedDeclaration": 7183, - "src": "11350:22:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint64_$dyn_storage", - "typeString": "uint64[] storage ref" - } - }, - "id": 634, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "length", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "11350:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 631, - "id": 635, - "nodeType": "Return", - "src": "11343:36:2" - } - ] - }, - "documentation": "@dev Gets the number of submitted group candidate tickets so far.", - "id": 637, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "submittedTicketsCount", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 628, - "nodeType": "ParameterList", - "parameters": [], - "src": "11300:2:2" - }, - "returnParameters": { - "id": 631, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 630, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 637, - "src": "11324:7:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 629, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "11324:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "11323:9:2" - }, - "scope": 1568, - "src": "11270:116:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 647, - "nodeType": "Block", - "src": "11555:61:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 643, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "11572:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 644, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "selectedParticipants", - "nodeType": "MemberAccess", - "referencedDeclaration": 8104, - "src": "11572:35:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_view$_t_struct$_Storage_$7202_storage_ptr_$returns$_t_array$_t_address_$dyn_memory_ptr_$bound_to$_t_struct$_Storage_$7202_storage_ptr_$", - "typeString": "function (struct GroupSelection.Storage storage pointer) view returns (address[] memory)" - } - }, - "id": 645, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11572:37:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - } - }, - "functionReturnParameters": 642, - "id": 646, - "nodeType": "Return", - "src": "11565:44:2" - } - ] - }, - "documentation": "@dev Gets selected participants in ascending order of their tickets.", - "id": 648, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "selectedParticipants", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 638, - "nodeType": "ParameterList", - "parameters": [], - "src": "11513:2:2" - }, - "returnParameters": { - "id": 642, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 641, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 648, - "src": "11537:16:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[]" - }, - "typeName": { - "baseType": { - "id": 639, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "11537:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 640, - "length": null, - "nodeType": "ArrayTypeName", - "src": "11537:9:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[]" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "11536:18:2" - }, - "scope": 1568, - "src": "11484:132:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 711, - "nodeType": "Block", - "src": "12532:594:2", - "statements": [ - { - "assignments": [ - 665 - ], - "declarations": [ - { - "constant": false, - "id": 665, - "name": "members", - "nodeType": "VariableDeclaration", - "scope": 711, - "src": "12542:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[]" - }, - "typeName": { - "baseType": { - "id": 663, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "12542:7:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 664, - "length": null, - "nodeType": "ArrayTypeName", - "src": "12542:9:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[]" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 668, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 666, - "name": "selectedParticipants", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 648, - "src": "12569:20:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_array$_t_address_$dyn_memory_ptr_$", - "typeString": "function () view returns (address[] memory)" - } - }, - "id": 667, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12569:22:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "12542:49:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 672, - "name": "submitterMemberIndex", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 650, - "src": "12644:20:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 673, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 652, - "src": "12678:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "id": 674, - "name": "misbehaved", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 654, - "src": "12703:10:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "id": 675, - "name": "signatures", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 656, - "src": "12727:10:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "id": 676, - "name": "signingMembersIndexes", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 659, - "src": "12751:21:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", - "typeString": "uint256[] memory" - } - }, - { - "argumentTypes": null, - "id": 677, - "name": "members", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 665, - "src": "12786:7:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - } - }, - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 682, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 678, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "12807:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 679, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "ticketSubmissionStartBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 7193, - "src": "12807:41:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 680, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "12851:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 681, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "ticketSubmissionTimeout", - "nodeType": "MemberAccess", - "referencedDeclaration": 7191, - "src": "12851:38:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "12807:82:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", - "typeString": "uint256[] memory" - }, - { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 669, - "name": "dkgResultVerification", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 192, - "src": "12602:21:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$6983_storage", - "typeString": "struct DKGResultVerification.Storage storage ref" - } - }, - "id": 671, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "verify", - "nodeType": "MemberAccess", - "referencedDeclaration": 7169, - "src": "12602:28:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_view$_t_struct$_Storage_$6983_storage_ptr_$_t_uint256_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_address_$dyn_memory_ptr_$_t_uint256_$returns$_t_bool_$bound_to$_t_struct$_Storage_$6983_storage_ptr_$", - "typeString": "function (struct DKGResultVerification.Storage storage pointer,uint256,bytes memory,bytes memory,bytes memory,uint256[] memory,address[] memory,uint256) view returns (bool)" - } - }, - "id": 683, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12602:297:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "id": 684, - "nodeType": "ExpressionStatement", - "src": "12602:297:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 688, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 652, - "src": "12933:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "id": 689, - "name": "members", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 665, - "src": "12946:7:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - } - }, - { - "argumentTypes": null, - "id": 690, - "name": "misbehaved", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 654, - "src": "12955:10:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "expression": { - "argumentTypes": null, - "id": 685, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "12910:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 687, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "setGroupMembers", - "nodeType": "MemberAccess", - "referencedDeclaration": 8286, - "src": "12910:22:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Storage_$8192_storage_ptr_$_t_bytes_memory_ptr_$_t_array$_t_address_$dyn_memory_ptr_$_t_bytes_memory_ptr_$returns$__$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,bytes memory,address[] memory,bytes memory)" - } - }, - "id": 691, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12910:56:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 692, - "nodeType": "ExpressionStatement", - "src": "12910:56:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 696, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 652, - "src": "12992:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "expression": { - "argumentTypes": null, - "id": 693, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "12976:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 695, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "addGroup", - "nodeType": "MemberAccess", - "referencedDeclaration": 8212, - "src": "12976:15:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Storage_$8192_storage_ptr_$_t_bytes_memory_ptr_$returns$__$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,bytes memory)" - } - }, - "id": 697, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12976:28:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 698, - "nodeType": "ExpressionStatement", - "src": "12976:28:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 699, - "name": "reimburseDkgSubmitter", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 805, - "src": "13014:21:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$", - "typeString": "function ()" - } - }, - "id": 700, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "13014:23:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 701, - "nodeType": "ExpressionStatement", - "src": "13014:23:2" - }, - { - "eventCall": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 703, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 652, - "src": "13076:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "id": 702, - "name": "DkgResultPublishedEvent", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 164, - "src": "13052:23:2", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$_t_bytes_memory_ptr_$returns$__$", - "typeString": "function (bytes memory)" - } - }, - "id": 704, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "13052:36:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 705, - "nodeType": "EmitStatement", - "src": "13047:41:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 706, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "13098:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 708, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "stop", - "nodeType": "MemberAccess", - "referencedDeclaration": 7253, - "src": "13098:19:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_nonpayable$_t_struct$_Storage_$7202_storage_ptr_$returns$__$bound_to$_t_struct$_Storage_$7202_storage_ptr_$", - "typeString": "function (struct GroupSelection.Storage storage pointer)" - } - }, - "id": 709, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "13098:21:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 710, - "nodeType": "ExpressionStatement", - "src": "13098:21:2" - } - ] - }, - "documentation": "@dev Submits result of DKG protocol. It is on-chain part of phase 14 of\nthe protocol.\n * @param submitterMemberIndex Claimed submitter candidate group member index\n@param groupPubKey Generated candidate group public key\n@param misbehaved Bytes array of misbehaved (disqualified or inactive)\ngroup members indexes in ascending order; Indexes reflect positions of\nmembers in the group as outputted by the group selection protocol.\n@param signatures Concatenation of signatures from members supporting the\nresult.\n@param signingMembersIndexes Indices of members corresponding to each\nsignature.", - "id": 712, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "submitDkgResult", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 660, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 650, - "name": "submitterMemberIndex", - "nodeType": "VariableDeclaration", - "scope": 712, - "src": "12345:28:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 649, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "12345:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 652, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 712, - "src": "12383:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 651, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "12383:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 654, - "name": "misbehaved", - "nodeType": "VariableDeclaration", - "scope": 712, - "src": "12417:23:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 653, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "12417:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 656, - "name": "signatures", - "nodeType": "VariableDeclaration", - "scope": 712, - "src": "12450:23:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 655, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "12450:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 659, - "name": "signingMembersIndexes", - "nodeType": "VariableDeclaration", - "scope": 712, - "src": "12483:35:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", - "typeString": "uint256[]" - }, - "typeName": { - "baseType": { - "id": 657, - "name": "uint", - "nodeType": "ElementaryTypeName", - "src": "12483:4:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 658, - "length": null, - "nodeType": "ArrayTypeName", - "src": "12483:6:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", - "typeString": "uint256[]" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "12335:189:2" - }, - "returnParameters": { - "id": 661, - "nodeType": "ParameterList", - "parameters": [], - "src": "12532:0:2" - }, - "scope": 1568, - "src": "12311:815:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 804, - "nodeType": "Block", - "src": "13550:1195:2", - "statements": [ - { - "assignments": [ - 716 - ], - "declarations": [ - { - "constant": false, - "id": 716, - "name": "gasPrice", - "nodeType": "VariableDeclaration", - "scope": 804, - "src": "13560:16:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 715, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "13560:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 718, - "initialValue": { - "argumentTypes": null, - "id": 717, - "name": "gasPriceCeiling", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 209, - "src": "13579:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "13560:34:2" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 727, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 722, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 719, - "name": "tx", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12806, - "src": "13777:2:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_transaction", - "typeString": "tx" - } - }, - "id": 720, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "gasprice", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "13777:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 721, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "13791:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "13777:15:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "&&", - "rightExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 726, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 723, - "name": "tx", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12806, - "src": "13796:2:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_transaction", - "typeString": "tx" - } - }, - "id": 724, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "gasprice", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "13796:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "<", - "rightExpression": { - "argumentTypes": null, - "id": 725, - "name": "gasPriceCeiling", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 209, - "src": "13810:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "13796:29:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "13777:48:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 734, - "nodeType": "IfStatement", - "src": "13773:101:2", - "trueBody": { - "id": 733, - "nodeType": "Block", - "src": "13827:47:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 731, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 728, - "name": "gasPrice", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 716, - "src": "13841:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 729, - "name": "tx", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12806, - "src": "13852:2:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_transaction", - "typeString": "tx" - } - }, - "id": 730, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "gasprice", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "13852:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "13841:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 732, - "nodeType": "ExpressionStatement", - "src": "13841:22:2" - } - ] - } - }, - { - "assignments": [ - 736 - ], - "declarations": [ - { - "constant": false, - "id": 736, - "name": "reimbursementFee", - "nodeType": "VariableDeclaration", - "scope": 804, - "src": "13884:24:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 735, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "13884:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 741, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 739, - "name": "gasPrice", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 716, - "src": "13930:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 737, - "name": "dkgGasEstimate", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 239, - "src": "13911:14:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 738, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "13911:18:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 740, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "13911:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "13884:55:2" - }, - { - "assignments": [ - 743 - ], - "declarations": [ - { - "constant": false, - "id": 743, - "name": "beneficiary", - "nodeType": "VariableDeclaration", - "scope": 804, - "src": "13949:22:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - "typeName": { - "id": 742, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "13949:15:2", - "stateMutability": "payable", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 749, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 746, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "13999:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 747, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "13999:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - ], - "expression": { - "argumentTypes": null, - "id": 744, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "13974:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 745, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "beneficiaryOf", - "nodeType": "MemberAccess", - "referencedDeclaration": 3394, - "src": "13974:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_address_payable_$", - "typeString": "function (address) view external returns (address payable)" - } - }, - "id": 748, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "13974:36:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "13949:61:2" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 752, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 750, - "name": "reimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 736, - "src": "14025:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "<", - "rightExpression": { - "argumentTypes": null, - "id": 751, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 244, - "src": "14044:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "14025:47:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": { - "id": 802, - "nodeType": "Block", - "src": "14469:270:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 786, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 784, - "name": "reimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 736, - "src": "14582:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "id": 785, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 244, - "src": "14601:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "14582:47:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 787, - "nodeType": "ExpressionStatement", - "src": "14582:47:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 790, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 788, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 244, - "src": "14643:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "hexValue": "30", - "id": 789, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "14674:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "14643:32:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 791, - "nodeType": "ExpressionStatement", - "src": "14643:32:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "", - "id": 799, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "14725:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - }, - "value": "" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - } - ], - "arguments": [ - { - "argumentTypes": null, - "id": 797, - "name": "reimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 736, - "src": "14707:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 792, - "name": "beneficiary", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 743, - "src": "14689:6:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "id": 795, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "call", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "14689:11:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 796, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "14689:17:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value_$", - "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" - } - }, - "id": 798, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14689:35:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 800, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14689:39:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "tuple(bool,bytes memory)" - } - }, - "id": 801, - "nodeType": "ExpressionStatement", - "src": "14689:39:2" - } - ] - }, - "id": 803, - "nodeType": "IfStatement", - "src": "14021:718:2", - "trueBody": { - "id": 783, - "nodeType": "Block", - "src": "14074:389:2", - "statements": [ - { - "assignments": [ - 754 - ], - "declarations": [ - { - "constant": false, - "id": 754, - "name": "surplus", - "nodeType": "VariableDeclaration", - "scope": 783, - "src": "14088:15:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 753, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "14088:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 759, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 757, - "name": "reimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 736, - "src": "14139:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 755, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 244, - "src": "14106:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 756, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "14106:32:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 758, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14106:50:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "14088:68:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 762, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 760, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 244, - "src": "14170:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "hexValue": "30", - "id": 761, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "14201:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "14170:32:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 763, - "nodeType": "ExpressionStatement", - "src": "14170:32:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "", - "id": 771, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "14309:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - }, - "value": "" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - } - ], - "arguments": [ - { - "argumentTypes": null, - "id": 769, - "name": "reimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 736, - "src": "14291:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 764, - "name": "beneficiary", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 743, - "src": "14273:6:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "id": 767, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "call", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "14273:11:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 768, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "14273:17:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value_$", - "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" - } - }, - "id": 770, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14273:35:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 772, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14273:39:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "tuple(bool,bytes memory)" - } - }, - "id": 773, - "nodeType": "ExpressionStatement", - "src": "14273:39:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "arguments": [ - { - "argumentTypes": null, - "id": 779, - "name": "surplus", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 754, - "src": "14442:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 774, - "name": "groupSelectionStarterContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 251, - "src": "14391:29:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - } - }, - "id": 777, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "fundDkgFeePool", - "nodeType": "MemberAccess", - "referencedDeclaration": 134, - "src": "14391:44:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_payable$__$returns$__$", - "typeString": "function () payable external" - } - }, - "id": 778, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "14391:50:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_external_payable$__$returns$__$value_$", - "typeString": "function (uint256) pure returns (function () payable external)" - } - }, - "id": 780, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14391:59:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_payable$__$returns$__$value", - "typeString": "function () payable external" - } - }, - "id": 781, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14391:61:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 782, - "nodeType": "ExpressionStatement", - "src": "14391:61:2" - } - ] - } - } - ] - }, - "documentation": "@dev Compare the reimbursement fee calculated based on the current transaction gas\nprice and the current price feed estimate with the DKG reimbursement fee calculated\nand paid at the moment when the DKG was requested. If there is any surplus, it will\nbe returned to the DKG fee pool of the service contract which triggered the DKG.", - "id": 805, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "reimburseDkgSubmitter", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 713, - "nodeType": "ParameterList", - "parameters": [], - "src": "13538:2:2" - }, - "returnParameters": { - "id": 714, - "nodeType": "ParameterList", - "parameters": [], - "src": "13550:0:2" - }, - "scope": 1568, - "src": "13508:1237:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 848, - "nodeType": "Block", - "src": "15151:464:2", - "statements": [ - { - "assignments": [ - 815 - ], - "declarations": [ - { - "constant": false, - "id": 815, - "name": "entryVerificationAndProfitFee", - "nodeType": "VariableDeclaration", - "scope": 848, - "src": "15161:37:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 814, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "15161:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 822, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 819, - "name": "entryVerificationFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1517, - "src": "15235:20:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", - "typeString": "function () view returns (uint256)" - } - }, - "id": 820, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15235:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 816, - "name": "groupProfitFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1354, - "src": "15201:14:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", - "typeString": "function () view returns (uint256)" - } - }, - "id": 817, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15201:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 818, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "15201:20:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 821, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15201:66:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "15161:106:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 827, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 824, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "15298:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 825, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "15298:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">=", - "rightExpression": { - "argumentTypes": null, - "id": 826, - "name": "entryVerificationAndProfitFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 815, - "src": "15311:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "15298:42:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "496e73756666696369656e74206e657720656e74727920666565", - "id": 828, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "15354:28:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_3a2e6ba6db2483144e18f6a2e8cdf217fbe337d442230bd5edaf68f424e9dbc5", - "typeString": "literal_string \"Insufficient new entry fee\"" - }, - "value": "Insufficient new entry fee" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_3a2e6ba6db2483144e18f6a2e8cdf217fbe337d442230bd5edaf68f424e9dbc5", - "typeString": "literal_string \"Insufficient new entry fee\"" - } - ], - "id": 823, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "15277:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 829, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15277:115:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 830, - "nodeType": "ExpressionStatement", - "src": "15277:115:2" - }, - { - "assignments": [ - 832 - ], - "declarations": [ - { - "constant": false, - "id": 832, - "name": "callbackFee", - "nodeType": "VariableDeclaration", - "scope": 848, - "src": "15402:19:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 831, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "15402:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 838, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 836, - "name": "entryVerificationAndProfitFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 815, - "src": "15438:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 833, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "15424:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 834, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "15424:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 835, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "15424:13:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 837, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15424:44:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "15402:66:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 840, - "name": "requestId", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 807, - "src": "15506:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 841, - "name": "previousEntry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 809, - "src": "15517:13:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 842, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "15532:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 843, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "15532:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - { - "argumentTypes": null, - "id": 844, - "name": "entryVerificationAndProfitFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 815, - "src": "15556:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 845, - "name": "callbackFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 832, - "src": "15587:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 839, - "name": "signRelayEntry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 912, - "src": "15478:14:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_bytes_memory_ptr_$_t_address_$_t_uint256_$_t_uint256_$returns$__$", - "typeString": "function (uint256,bytes memory,address,uint256,uint256)" - } - }, - "id": 846, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15478:130:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 847, - "nodeType": "ExpressionStatement", - "src": "15478:130:2" - } - ] - }, - "documentation": "@dev Creates a request to generate a new relay entry, which will include a\nrandom number (by signing the previous entry's random number).\n@param requestId Request Id trackable by service contract\n@param previousEntry Previous relay entry", - "id": 849, - "implemented": true, - "kind": "function", - "modifiers": [ - { - "arguments": null, - "id": 812, - "modifierName": { - "argumentTypes": null, - "id": 811, - "name": "onlyServiceContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 321, - "src": "15131:19:2", - "typeDescriptions": { - "typeIdentifier": "t_modifier$__$", - "typeString": "modifier ()" - } - }, - "nodeType": "ModifierInvocation", - "src": "15131:19:2" - } - ], - "name": "sign", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 810, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 807, - "name": "requestId", - "nodeType": "VariableDeclaration", - "scope": 849, - "src": "15056:17:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 806, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "15056:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 809, - "name": "previousEntry", - "nodeType": "VariableDeclaration", - "scope": 849, - "src": "15083:26:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 808, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "15083:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "15046:69:2" - }, - "returnParameters": { - "id": 813, - "nodeType": "ParameterList", - "parameters": [], - "src": "15151:0:2" - }, - "scope": 1568, - "src": "15033:582:2", - "stateMutability": "payable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 911, - "nodeType": "Block", - "src": "15832:577:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 868, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 865, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "UnaryOperation", - "operator": "!", - "prefix": true, - "src": "15850:20:2", - "subExpression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 863, - "name": "isEntryInProgress", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1282, - "src": "15851:17:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$", - "typeString": "function () view returns (bool)" - } - }, - "id": 864, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15851:19:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "||", - "rightExpression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 866, - "name": "hasEntryTimedOut", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1299, - "src": "15874:16:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$", - "typeString": "function () view returns (bool)" - } - }, - "id": 867, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15874:18:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "15850:42:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "426561636f6e2069732062757379", - "id": 869, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "15894:16:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_b7c992ba21bf3b13f04a54cda27e6329581aa6aee9f0eaeda22bd23be2185cfb", - "typeString": "literal_string \"Beacon is busy\"" - }, - "value": "Beacon is busy" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_b7c992ba21bf3b13f04a54cda27e6329581aa6aee9f0eaeda22bd23be2185cfb", - "typeString": "literal_string \"Beacon is busy\"" - } - ], - "id": 862, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "15842:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 870, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15842:69:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 871, - "nodeType": "ExpressionStatement", - "src": "15842:69:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 875, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 872, - "name": "currentEntryStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 246, - "src": "15922:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 873, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "15947:5:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 874, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "15947:12:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "15922:37:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 876, - "nodeType": "ExpressionStatement", - "src": "15922:37:2" - }, - { - "assignments": [ - 878 - ], - "declarations": [ - { - "constant": false, - "id": 878, - "name": "groupIndex", - "nodeType": "VariableDeclaration", - "scope": 911, - "src": "15970:18:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 877, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "15970:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 887, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 883, - "name": "previousEntry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 853, - "src": "16028:13:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "id": 882, - "name": "keccak256", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12788, - "src": "16018:9:2", - "typeDescriptions": { - "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", - "typeString": "function (bytes memory) pure returns (bytes32)" - } - }, - "id": 884, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16018:24:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - ], - "id": 881, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "16010:7:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_uint256_$", - "typeString": "type(uint256)" - }, - "typeName": "uint256" - }, - "id": 885, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16010:33:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 879, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "15991:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 880, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "selectGroup", - "nodeType": "MemberAccess", - "referencedDeclaration": 8790, - "src": "15991:18:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_nonpayable$_t_struct$_Storage_$8192_storage_ptr_$_t_uint256_$returns$_t_uint256_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,uint256) returns (uint256)" - } - }, - "id": 886, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15991:53:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "15970:74:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 897, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 888, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "16054:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 890, - "name": "requestId", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 851, - "src": "16099:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 891, - "name": "entryVerificationAndProfitFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 857, - "src": "16122:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 892, - "name": "callbackFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 859, - "src": "16165:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 893, - "name": "groupIndex", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 878, - "src": "16190:10:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 894, - "name": "previousEntry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 853, - "src": "16214:13:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "id": 895, - "name": "serviceContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 855, - "src": "16241:15:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 889, - "name": "SigningRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 264, - "src": "16071:14:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_struct$_SigningRequest_$264_storage_ptr_$", - "typeString": "type(struct KeepRandomBeaconOperator.SigningRequest storage pointer)" - } - }, - "id": 896, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "structConstructorCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16071:195:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_memory", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest memory" - } - }, - "src": "16054:212:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 898, - "nodeType": "ExpressionStatement", - "src": "16054:212:2" - }, - { - "assignments": [ - 900 - ], - "declarations": [ - { - "constant": false, - "id": 900, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 911, - "src": "16277:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 899, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "16277:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 905, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 903, - "name": "groupIndex", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 878, - "src": "16329:10:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 901, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "16304:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 902, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "getGroupPublicKey", - "nodeType": "MemberAccess", - "referencedDeclaration": 8341, - "src": "16304:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$_t_struct$_Storage_$8192_storage_ptr_$_t_uint256_$returns$_t_bytes_memory_ptr_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,uint256) view returns (bytes memory)" - } - }, - "id": 904, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16304:36:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "16277:63:2" - }, - { - "eventCall": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 907, - "name": "previousEntry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 853, - "src": "16375:13:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "id": 908, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 900, - "src": "16390:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "id": 906, - "name": "RelayEntryRequested", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 170, - "src": "16355:19:2", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$returns$__$", - "typeString": "function (bytes memory,bytes memory)" - } - }, - "id": 909, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16355:47:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 910, - "nodeType": "EmitStatement", - "src": "16350:52:2" - } - ] - }, - "documentation": null, - "id": 912, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "signRelayEntry", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 860, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 851, - "name": "requestId", - "nodeType": "VariableDeclaration", - "scope": 912, - "src": "15654:17:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 850, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "15654:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 853, - "name": "previousEntry", - "nodeType": "VariableDeclaration", - "scope": 912, - "src": "15681:26:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 852, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "15681:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 855, - "name": "serviceContract", - "nodeType": "VariableDeclaration", - "scope": 912, - "src": "15717:23:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 854, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "15717:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 857, - "name": "entryVerificationAndProfitFee", - "nodeType": "VariableDeclaration", - "scope": 912, - "src": "15750:37:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 856, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "15750:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 859, - "name": "callbackFee", - "nodeType": "VariableDeclaration", - "scope": 912, - "src": "15797:19:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 858, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "15797:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "15644:178:2" - }, - "returnParameters": { - "id": 861, - "nodeType": "ParameterList", - "parameters": [], - "src": "15832:0:2" - }, - "scope": 1568, - "src": "15621:788:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 1048, - "nodeType": "Block", - "src": "16696:1536:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 920, - "name": "isEntryInProgress", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1282, - "src": "16714:17:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$", - "typeString": "function () view returns (bool)" - } - }, - "id": 921, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16714:19:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "456e74727920776173207375626d6974746564", - "id": 922, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "16735:21:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_36a535b38d6f04d64bf170e63c6235ebdac3c434f6c6dc8260e1ebb7aaadac24", - "typeString": "literal_string \"Entry was submitted\"" - }, - "value": "Entry was submitted" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_36a535b38d6f04d64bf170e63c6235ebdac3c434f6c6dc8260e1ebb7aaadac24", - "typeString": "literal_string \"Entry was submitted\"" - } - ], - "id": 919, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "16706:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 923, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16706:51:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 924, - "nodeType": "ExpressionStatement", - "src": "16706:51:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 928, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "UnaryOperation", - "operator": "!", - "prefix": true, - "src": "16775:19:2", - "subExpression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 926, - "name": "hasEntryTimedOut", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1299, - "src": "16776:16:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$", - "typeString": "function () view returns (bool)" - } - }, - "id": 927, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16776:18:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "456e7472792074696d6564206f7574", - "id": 929, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "16796:17:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_c3e16ed73c26f55709a33ed20aa40ebc8b92197201cb3929b3861d24d1fe397d", - "typeString": "literal_string \"Entry timed out\"" - }, - "value": "Entry timed out" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_c3e16ed73c26f55709a33ed20aa40ebc8b92197201cb3929b3861d24d1fe397d", - "typeString": "literal_string \"Entry timed out\"" - } - ], - "id": 925, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "16767:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 930, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16767:47:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 931, - "nodeType": "ExpressionStatement", - "src": "16767:47:2" - }, - { - "assignments": [ - 933 - ], - "declarations": [ - { - "constant": false, - "id": 933, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 1048, - "src": "16825:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 932, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "16825:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 939, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 936, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "16877:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 937, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "groupIndex", - "nodeType": "MemberAccess", - "referencedDeclaration": 259, - "src": "16877:25:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 934, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "16852:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 935, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "getGroupPublicKey", - "nodeType": "MemberAccess", - "referencedDeclaration": 8341, - "src": "16852:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$_t_struct$_Storage_$8192_storage_ptr_$_t_uint256_$returns$_t_bytes_memory_ptr_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,uint256) view returns (bytes memory)" - } - }, - "id": 938, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16852:51:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "16825:78:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 943, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 933, - "src": "16963:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 944, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "16992:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 945, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "previousEntry", - "nodeType": "MemberAccess", - "referencedDeclaration": 261, - "src": "16992:28:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage", - "typeString": "bytes storage ref" - } - }, - { - "argumentTypes": null, - "id": 946, - "name": "_groupSignature", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 914, - "src": "17038:15:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_bytes_storage", - "typeString": "bytes storage ref" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "expression": { - "argumentTypes": null, - "id": 941, - "name": "BLS", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 6860, - "src": "16935:3:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_BLS_$6860_$", - "typeString": "type(library BLS)" - } - }, - "id": 942, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "verify", - "nodeType": "MemberAccess", - "referencedDeclaration": 6825, - "src": "16935:10:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_view$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$returns$_t_bool_$", - "typeString": "function (bytes memory,bytes memory,bytes memory) view returns (bool)" - } - }, - "id": 947, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16935:132:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "496e76616c6964207369676e6174757265", - "id": 948, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "17081:19:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_4f2d7dfcb27c0aafa13ae8c400de482c7832204d194018b6e45bd2bf244c74e7", - "typeString": "literal_string \"Invalid signature\"" - }, - "value": "Invalid signature" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_4f2d7dfcb27c0aafa13ae8c400de482c7832204d194018b6e45bd2bf244c74e7", - "typeString": "literal_string \"Invalid signature\"" - } - ], - "id": 940, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "16914:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 949, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16914:196:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 950, - "nodeType": "ExpressionStatement", - "src": "16914:196:2" - }, - { - "eventCall": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 951, - "name": "RelayEntrySubmitted", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 172, - "src": "17126:19:2", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$__$returns$__$", - "typeString": "function ()" - } - }, - "id": 952, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17126:21:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 953, - "nodeType": "EmitStatement", - "src": "17121:26:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "656e747279437265617465642875696e743235362c62797465732c6164647265737329", - "id": 968, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "17454:37:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_ef7284e32d2af1094e722e11249b8e2647886883790ea1c7315b889a521ce534", - "typeString": "literal_string \"entryCreated(uint256,bytes,address)\"" - }, - "value": "entryCreated(uint256,bytes,address)" - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 969, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "17509:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 970, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "relayRequestId", - "nodeType": "MemberAccess", - "referencedDeclaration": 253, - "src": "17509:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 971, - "name": "_groupSignature", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 914, - "src": "17556:15:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 972, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "17589:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 973, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "17589:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_stringliteral_ef7284e32d2af1094e722e11249b8e2647886883790ea1c7315b889a521ce534", - "typeString": "literal_string \"entryCreated(uint256,bytes,address)\"" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - ], - "expression": { - "argumentTypes": null, - "id": 966, - "name": "abi", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12781, - "src": "17413:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_abi", - "typeString": "abi" - } - }, - "id": 967, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "memberName": "encodeWithSignature", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "17413:23:2", - "typeDescriptions": { - "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$", - "typeString": "function (string memory) pure returns (bytes memory)" - } - }, - "id": 974, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17413:200:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "3430303030", - "id": 963, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "17392:5:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_40000_by_1", - "typeString": "int_const 40000" - }, - "value": "40000" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_40000_by_1", - "typeString": "int_const 40000" - } - ], - "expression": { - "argumentTypes": null, - "id": 961, - "name": "groupSelectionGasEstimate", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 242, - "src": "17362:25:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 962, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "17362:29:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 964, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17362:36:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 954, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "17322:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 958, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "serviceContract", - "nodeType": "MemberAccess", - "referencedDeclaration": 263, - "src": "17322:30:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 959, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "call", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "17322:35:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 960, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "gas", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "17322:39:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setgas_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gas_$", - "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" - } - }, - "id": 965, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17322:77:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gas", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 975, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17322:301:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "tuple(bool,bytes memory)" - } - }, - "id": 976, - "nodeType": "ExpressionStatement", - "src": "17322:301:2" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 980, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 977, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "17638:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 978, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "callbackFee", - "nodeType": "MemberAccess", - "referencedDeclaration": 257, - "src": "17638:26:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 979, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "17667:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "17638:30:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 991, - "nodeType": "IfStatement", - "src": "17634:129:2", - "trueBody": { - "id": 990, - "nodeType": "Block", - "src": "17670:93:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 982, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "17700:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 985, - "name": "_groupSignature", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 914, - "src": "17734:15:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "id": 984, - "name": "keccak256", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12788, - "src": "17724:9:2", - "typeDescriptions": { - "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", - "typeString": "function (bytes memory) pure returns (bytes32)" - } - }, - "id": 986, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17724:26:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - ], - "id": 983, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "17716:7:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_uint256_$", - "typeString": "type(uint256)" - }, - "typeName": "uint256" - }, - "id": 987, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17716:35:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 981, - "name": "executeCallback", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1118, - "src": "17684:15:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_SigningRequest_$264_memory_ptr_$_t_uint256_$returns$__$", - "typeString": "function (struct KeepRandomBeaconOperator.SigningRequest memory,uint256)" - } - }, - "id": 988, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17684:68:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 989, - "nodeType": "ExpressionStatement", - "src": "17684:68:2" - } - ] - } - }, - { - "assignments": [ - 993, - 995, - 997 - ], - "declarations": [ - { - "constant": false, - "id": 993, - "name": "groupMemberReward", - "nodeType": "VariableDeclaration", - "scope": 1048, - "src": "17774:25:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 992, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "17774:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 995, - "name": "submitterReward", - "nodeType": "VariableDeclaration", - "scope": 1048, - "src": "17801:23:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 994, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "17801:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 997, - "name": "subsidy", - "nodeType": "VariableDeclaration", - "scope": 1048, - "src": "17826:15:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 996, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "17826:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1000, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 998, - "name": "newEntryRewardsBreakdown", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1200, - "src": "17845:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$_t_uint256_$_t_uint256_$", - "typeString": "function () view returns (uint256,uint256,uint256)" - } - }, - "id": 999, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17845:26:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_uint256_$", - "typeString": "tuple(uint256,uint256,uint256)" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "17773:98:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1004, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 933, - "src": "17909:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "id": 1005, - "name": "groupMemberReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 993, - "src": "17922:17:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1001, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "17881:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1003, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "addGroupMemberReward", - "nodeType": "MemberAccess", - "referencedDeclaration": 8310, - "src": "17881:27:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Storage_$8192_storage_ptr_$_t_bytes_memory_ptr_$_t_uint256_$returns$__$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,bytes memory,uint256)" - } - }, - "id": 1006, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17881:59:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 1007, - "nodeType": "ExpressionStatement", - "src": "17881:59:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "", - "id": 1018, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "18016:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - }, - "value": "" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - } - ], - "arguments": [ - { - "argumentTypes": null, - "id": 1016, - "name": "submitterReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 995, - "src": "17999:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1011, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "17976:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 1012, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "17976:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - ], - "expression": { - "argumentTypes": null, - "id": 1008, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "17951:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 1010, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "beneficiaryOf", - "nodeType": "MemberAccess", - "referencedDeclaration": 3394, - "src": "17951:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_address_payable_$", - "typeString": "function (address) view external returns (address payable)" - } - }, - "id": 1013, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17951:36:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "id": 1014, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "call", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "17951:41:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 1015, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "17951:47:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value_$", - "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" - } - }, - "id": 1017, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17951:64:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 1019, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17951:68:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "tuple(bool,bytes memory)" - } - }, - "id": 1020, - "nodeType": "ExpressionStatement", - "src": "17951:68:2" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 1023, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 1021, - "name": "subsidy", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 997, - "src": "18034:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 1022, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "18044:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "18034:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 1043, - "nodeType": "IfStatement", - "src": "18030:159:2", - "trueBody": { - "id": 1042, - "nodeType": "Block", - "src": "18047:142:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "66756e645265717565737453756273696479466565506f6f6c2829", - "id": 1038, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "18147:29:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_11e816ee49abf05395cb93811d93f4b9415d3142dd310ce623c19270022a9f12", - "typeString": "literal_string \"fundRequestSubsidyFeePool()\"" - }, - "value": "fundRequestSubsidyFeePool()" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_stringliteral_11e816ee49abf05395cb93811d93f4b9415d3142dd310ce623c19270022a9f12", - "typeString": "literal_string \"fundRequestSubsidyFeePool()\"" - } - ], - "expression": { - "argumentTypes": null, - "id": 1036, - "name": "abi", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12781, - "src": "18123:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_abi", - "typeString": "abi" - } - }, - "id": 1037, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "memberName": "encodeWithSignature", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "18123:23:2", - "typeDescriptions": { - "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$", - "typeString": "function (string memory) pure returns (bytes memory)" - } - }, - "id": 1039, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18123:54:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "arguments": [ - { - "argumentTypes": null, - "id": 1034, - "name": "subsidy", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 997, - "src": "18114:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "3335303030", - "id": 1031, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "18101:5:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_35000_by_1", - "typeString": "int_const 35000" - }, - "value": "35000" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_35000_by_1", - "typeString": "int_const 35000" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1024, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "18061:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 1028, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "serviceContract", - "nodeType": "MemberAccess", - "referencedDeclaration": 263, - "src": "18061:30:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 1029, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "call", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "18061:35:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 1030, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "gas", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "18061:39:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setgas_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gas_$", - "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" - } - }, - "id": 1032, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18061:46:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gas", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 1033, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "18061:52:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gasvalue_$gas", - "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" - } - }, - "id": 1035, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18061:61:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gasvalue", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 1040, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18061:117:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "tuple(bool,bytes memory)" - } - }, - "id": 1041, - "nodeType": "ExpressionStatement", - "src": "18061:117:2" - } - ] - } - }, - { - "expression": { - "argumentTypes": null, - "id": 1046, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 1044, - "name": "currentEntryStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 246, - "src": "18199:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "hexValue": "30", - "id": 1045, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "18224:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "18199:26:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1047, - "nodeType": "ExpressionStatement", - "src": "18199:26:2" - } - ] - }, - "documentation": "@dev Creates a new relay entry and stores the associated data on the chain.\n@param _groupSignature Group BLS signature over the concatenation of the\nprevious entry and seed.", - "id": 1049, - "implemented": true, - "kind": "function", - "modifiers": [ - { - "arguments": null, - "id": 917, - "modifierName": { - "argumentTypes": null, - "id": 916, - "name": "nonReentrant", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12778, - "src": "16683:12:2", - "typeDescriptions": { - "typeIdentifier": "t_modifier$__$", - "typeString": "modifier ()" - } - }, - "nodeType": "ModifierInvocation", - "src": "16683:12:2" - } - ], - "name": "relayEntry", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 915, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 914, - "name": "_groupSignature", - "nodeType": "VariableDeclaration", - "scope": 1049, - "src": "16646:28:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 913, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "16646:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "16645:30:2" - }, - "returnParameters": { - "id": 918, - "nodeType": "ParameterList", - "parameters": [], - "src": "16696:0:2" - }, - "scope": 1568, - "src": "16626:1606:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1117, - "nodeType": "Block", - "src": "18547:909:2", - "statements": [ - { - "assignments": [ - 1057 - ], - "declarations": [ - { - "constant": false, - "id": 1057, - "name": "callbackFee", - "nodeType": "VariableDeclaration", - "scope": 1117, - "src": "18557:19:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1056, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "18557:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1060, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1058, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1051, - "src": "18579:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_memory_ptr", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest memory" - } - }, - "id": 1059, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "callbackFee", - "nodeType": "MemberAccess", - "referencedDeclaration": 257, - "src": "18579:26:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "18557:48:2" - }, - { - "assignments": [ - 1062 - ], - "declarations": [ - { - "constant": false, - "id": 1062, - "name": "gasLimit", - "nodeType": "VariableDeclaration", - "scope": 1117, - "src": "18732:16:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1061, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "18732:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1067, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1065, - "name": "gasPriceCeiling", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 209, - "src": "18767:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1063, - "name": "callbackFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1057, - "src": "18751:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1064, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "div", - "nodeType": "MemberAccess", - "referencedDeclaration": 11877, - "src": "18751:15:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1066, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18751:32:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "18732:51:2" - }, - { - "assignments": [ - 1069 - ], - "declarations": [ - { - "constant": false, - "id": 1069, - "name": "callbackReturnData", - "nodeType": "VariableDeclaration", - "scope": 1117, - "src": "18794:31:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 1068, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "18794:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1070, - "initialValue": null, - "nodeType": "VariableDeclarationStatement", - "src": "18794:31:2" - }, - { - "assignments": [ - 1072 - ], - "declarations": [ - { - "constant": false, - "id": 1072, - "name": "gasBeforeCallback", - "nodeType": "VariableDeclaration", - "scope": 1117, - "src": "18835:25:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1071, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "18835:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1075, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 1073, - "name": "gasleft", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12787, - "src": "18863:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_gasleft_view$__$returns$_t_uint256_$", - "typeString": "function () view returns (uint256)" - } - }, - "id": 1074, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18863:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "18835:37:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 1092, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "components": [ - null, - { - "argumentTypes": null, - "id": 1076, - "name": "callbackReturnData", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1069, - "src": "18885:18:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "id": 1077, - "isConstant": false, - "isInlineArray": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "nodeType": "TupleExpression", - "src": "18882:22:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$_t_bytes_memory_ptr_$", - "typeString": "tuple(,bytes memory)" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "6578656375746543616c6c6261636b2875696e743235362c75696e7432353629", - "id": 1086, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "19016:34:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_fc3fcec71de523a2fc245507047ce41e9a9b586954a6f751d4404173a2c19e27", - "typeString": "literal_string \"executeCallback(uint256,uint256)\"" - }, - "value": "executeCallback(uint256,uint256)" - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1087, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1051, - "src": "19064:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_memory_ptr", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest memory" - } - }, - "id": 1088, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "relayRequestId", - "nodeType": "MemberAccess", - "referencedDeclaration": 253, - "src": "19064:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1089, - "name": "entry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1053, - "src": "19107:5:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_stringliteral_fc3fcec71de523a2fc245507047ce41e9a9b586954a6f751d4404173a2c19e27", - "typeString": "literal_string \"executeCallback(uint256,uint256)\"" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1084, - "name": "abi", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12781, - "src": "18979:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_abi", - "typeString": "abi" - } - }, - "id": 1085, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "memberName": "encodeWithSignature", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "18979:23:2", - "typeDescriptions": { - "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$", - "typeString": "function (string memory) pure returns (bytes memory)" - } - }, - "id": 1090, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18979:143:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "arguments": [ - { - "argumentTypes": null, - "id": 1082, - "name": "gasLimit", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1062, - "src": "18960:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1078, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1051, - "src": "18907:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_memory_ptr", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest memory" - } - }, - "id": 1079, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "serviceContract", - "nodeType": "MemberAccess", - "referencedDeclaration": 263, - "src": "18907:30:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 1080, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "call", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "18907:35:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 1081, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "gas", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "18907:39:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setgas_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gas_$", - "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" - } - }, - "id": 1083, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18907:71:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gas", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 1091, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18907:216:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "tuple(bool,bytes memory)" - } - }, - "src": "18882:241:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 1093, - "nodeType": "ExpressionStatement", - "src": "18882:241:2" - }, - { - "assignments": [ - 1095 - ], - "declarations": [ - { - "constant": false, - "id": 1095, - "name": "gasAfterCallback", - "nodeType": "VariableDeclaration", - "scope": 1117, - "src": "19133:24:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1094, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "19133:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1098, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 1096, - "name": "gasleft", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12787, - "src": "19160:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_gasleft_view$__$returns$_t_uint256_$", - "typeString": "function () view returns (uint256)" - } - }, - "id": 1097, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "19160:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "19133:36:2" - }, - { - "assignments": [ - 1100 - ], - "declarations": [ - { - "constant": false, - "id": 1100, - "name": "gasSpent", - "nodeType": "VariableDeclaration", - "scope": 1117, - "src": "19179:16:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1099, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "19179:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1105, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1103, - "name": "gasAfterCallback", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1095, - "src": "19220:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1101, - "name": "gasBeforeCallback", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1072, - "src": "19198:17:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1102, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "19198:21:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1104, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "19198:39:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "19179:58:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1109, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "19294:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - { - "argumentTypes": null, - "id": 1110, - "name": "gasPriceCeiling", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 209, - "src": "19323:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1111, - "name": "gasLimit", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1062, - "src": "19352:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1112, - "name": "gasSpent", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1100, - "src": "19374:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1113, - "name": "callbackFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1057, - "src": "19396:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1114, - "name": "callbackReturnData", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1069, - "src": "19421:18:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "expression": { - "argumentTypes": null, - "id": 1106, - "name": "Reimbursements", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 9245, - "src": "19248:14:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_Reimbursements_$9245_$", - "typeString": "type(library Reimbursements)" - } - }, - "id": 1108, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "reimburseCallback", - "nodeType": "MemberAccess", - "referencedDeclaration": 9244, - "src": "19248:32:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_nonpayable$_t_contract$_TokenStaking_$5649_$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$", - "typeString": "function (contract TokenStaking,uint256,uint256,uint256,uint256,bytes memory)" - } - }, - "id": 1115, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "19248:201:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 1116, - "nodeType": "ExpressionStatement", - "src": "19248:201:2" - } - ] - }, - "documentation": "@dev Executes customer specified callback for the relay entry request.\n@param signingRequest Request data tracked internally by this contract.\n@param entry The generated random number.", - "id": 1118, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "executeCallback", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1054, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1051, - "name": "signingRequest", - "nodeType": "VariableDeclaration", - "scope": 1118, - "src": "18485:36:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_memory_ptr", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest" - }, - "typeName": { - "contractScope": null, - "id": 1050, - "name": "SigningRequest", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 264, - "src": "18485:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage_ptr", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 1053, - "name": "entry", - "nodeType": "VariableDeclaration", - "scope": 1118, - "src": "18523:13:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1052, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "18523:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "18484:53:2" - }, - "returnParameters": { - "id": 1055, - "nodeType": "ParameterList", - "parameters": [], - "src": "18547:0:2" - }, - "scope": 1568, - "src": "18460:996:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 1199, - "nodeType": "Block", - "src": "19700:1208:2", - "statements": [ - { - "assignments": [ - 1128 - ], - "declarations": [ - { - "constant": false, - "id": 1128, - "name": "decimals", - "nodeType": "VariableDeclaration", - "scope": 1199, - "src": "19710:16:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1127, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "19710:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1130, - "initialValue": { - "argumentTypes": null, - "hexValue": "31653136", - "id": 1129, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "19729:4:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_10000000000000000_by_1", - "typeString": "int_const 10000000000000000" - }, - "value": "1e16" - }, - "nodeType": "VariableDeclarationStatement", - "src": "19710:23:2" - }, - { - "assignments": [ - 1132 - ], - "declarations": [ - { - "constant": false, - "id": 1132, - "name": "delayFactor", - "nodeType": "VariableDeclaration", - "scope": 1199, - "src": "19793:19:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1131, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "19793:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1135, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 1133, - "name": "getDelayFactor", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1272, - "src": "19815:14:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", - "typeString": "function () view returns (uint256)" - } - }, - "id": 1134, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "19815:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "19793:38:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 1144, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 1136, - "name": "groupMemberReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1121, - "src": "19841:17:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1142, - "name": "decimals", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1128, - "src": "19904:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1139, - "name": "delayFactor", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1132, - "src": "19887:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1137, - "name": "groupMemberBaseReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 204, - "src": "19861:21:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1138, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "19861:25:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1140, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "19861:38:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1141, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "div", - "nodeType": "MemberAccess", - "referencedDeclaration": 11877, - "src": "19861:42:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1143, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "19861:52:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "19841:72:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1145, - "nodeType": "ExpressionStatement", - "src": "19841:72:2" - }, - { - "assignments": [ - 1147 - ], - "declarations": [ - { - "constant": false, - "id": 1147, - "name": "groupMemberDelayPenalty", - "nodeType": "VariableDeclaration", - "scope": 1199, - "src": "19984:31:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1146, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "19984:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1155, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1152, - "name": "delayFactor", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1132, - "src": "20057:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1150, - "name": "decimals", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1128, - "src": "20044:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1151, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "20044:12:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1153, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20044:25:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1148, - "name": "groupMemberBaseReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 204, - "src": "20018:21:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1149, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "20018:25:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1154, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20018:52:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "19984:86:2" - }, - { - "assignments": [ - 1157 - ], - "declarations": [ - { - "constant": false, - "id": 1157, - "name": "submitterExtraReward", - "nodeType": "VariableDeclaration", - "scope": 1199, - "src": "20422:28:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1156, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "20422:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1168, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1166, - "name": "decimals", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1128, - "src": "20507:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "35", - "id": 1163, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "20500:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_5_by_1", - "typeString": "int_const 5" - }, - "value": "5" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_5_by_1", - "typeString": "int_const 5" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1160, - "name": "groupSize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 212, - "src": "20481:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1158, - "name": "groupMemberDelayPenalty", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1147, - "src": "20453:23:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1159, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "20453:27:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1161, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20453:38:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1162, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "percent", - "nodeType": "MemberAccess", - "referencedDeclaration": 11258, - "src": "20453:46:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1164, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20453:49:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1165, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "div", - "nodeType": "MemberAccess", - "referencedDeclaration": 11877, - "src": "20453:53:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1167, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20453:63:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "20422:94:2" - }, - { - "assignments": [ - 1170 - ], - "declarations": [ - { - "constant": false, - "id": 1170, - "name": "entryVerificationFee", - "nodeType": "VariableDeclaration", - "scope": 1199, - "src": "20526:28:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1169, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "20526:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1177, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 1174, - "name": "groupProfitFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1354, - "src": "20606:14:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", - "typeString": "function () view returns (uint256)" - } - }, - "id": 1175, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20606:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1171, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "20557:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 1172, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "entryVerificationAndProfitFee", - "nodeType": "MemberAccess", - "referencedDeclaration": 255, - "src": "20557:44:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1173, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "20557:48:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1176, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20557:66:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "20526:97:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 1183, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 1178, - "name": "submitterReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1123, - "src": "20633:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1181, - "name": "submitterExtraReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1157, - "src": "20676:20:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1179, - "name": "entryVerificationFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1170, - "src": "20651:20:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1180, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "20651:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1182, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20651:46:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "20633:64:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1184, - "nodeType": "ExpressionStatement", - "src": "20633:64:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 1197, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 1185, - "name": "subsidy", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1125, - "src": "20811:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1195, - "name": "submitterExtraReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1157, - "src": "20880:20:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1191, - "name": "groupSize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 212, - "src": "20864:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1189, - "name": "groupMemberReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1121, - "src": "20842:17:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1190, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "20842:21:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1192, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20842:32:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 1186, - "name": "groupProfitFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1354, - "src": "20821:14:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", - "typeString": "function () view returns (uint256)" - } - }, - "id": 1187, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20821:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1188, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "20821:20:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1193, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20821:54:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1194, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "20821:58:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1196, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20821:80:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "20811:90:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1198, - "nodeType": "ExpressionStatement", - "src": "20811:90:2" - } - ] - }, - "documentation": "@dev Get rewards breakdown in wei for successful entry for the current signing request.", - "id": 1200, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "newEntryRewardsBreakdown", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1119, - "nodeType": "ParameterList", - "parameters": [], - "src": "19606:2:2" - }, - "returnParameters": { - "id": 1126, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1121, - "name": "groupMemberReward", - "nodeType": "VariableDeclaration", - "scope": 1200, - "src": "19631:25:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1120, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "19631:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 1123, - "name": "submitterReward", - "nodeType": "VariableDeclaration", - "scope": 1200, - "src": "19658:23:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1122, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "19658:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 1125, - "name": "subsidy", - "nodeType": "VariableDeclaration", - "scope": 1200, - "src": "19683:15:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1124, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "19683:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "19630:69:2" - }, - "scope": 1568, - "src": "19573:1335:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 1271, - "nodeType": "Block", - "src": "21137:1710:2", - "statements": [ - { - "assignments": [ - 1206 - ], - "declarations": [ - { - "constant": false, - "id": 1206, - "name": "decimals", - "nodeType": "VariableDeclaration", - "scope": 1271, - "src": "21147:16:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1205, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "21147:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1208, - "initialValue": { - "argumentTypes": null, - "hexValue": "31653136", - "id": 1207, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "21166:4:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_10000000000000000_by_1", - "typeString": "int_const 10000000000000000" - }, - "value": "1e16" - }, - "nodeType": "VariableDeclarationStatement", - "src": "21147:23:2" - }, - { - "assignments": [ - 1210 - ], - "declarations": [ - { - "constant": false, - "id": 1210, - "name": "deadlineBlock", - "nodeType": "VariableDeclaration", - "scope": 1271, - "src": "21571:21:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1209, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "21571:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1218, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "31", - "id": 1216, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "21645:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - }, - "value": "1" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1213, - "name": "relayEntryTimeout", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 233, - "src": "21622:17:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1211, - "name": "currentEntryStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 246, - "src": "21595:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1212, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "21595:26:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1214, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "21595:45:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1215, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "21595:49:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1217, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "21595:52:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "21571:76:2" - }, - { - "assignments": [ - 1220 - ], - "declarations": [ - { - "constant": false, - "id": 1220, - "name": "submissionStartBlock", - "nodeType": "VariableDeclaration", - "scope": 1271, - "src": "21887:28:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1219, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "21887:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1228, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "31", - "id": 1226, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "21975:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - }, - "value": "1" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1223, - "name": "relayEntryGenerationTime", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 224, - "src": "21945:24:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1221, - "name": "currentEntryStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 246, - "src": "21918:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1222, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "21918:26:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1224, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "21918:52:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1225, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "21918:56:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1227, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "21918:59:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "21887:90:2" - }, - { - "assignments": [ - 1230 - ], - "declarations": [ - { - "constant": false, - "id": 1230, - "name": "entryReceivedBlock", - "nodeType": "VariableDeclaration", - "scope": 1271, - "src": "22094:26:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1229, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "22094:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1239, - "initialValue": { - "argumentTypes": null, - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 1234, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1231, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "22123:5:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 1232, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "22123:12:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "<=", - "rightExpression": { - "argumentTypes": null, - "id": 1233, - "name": "submissionStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1220, - "src": "22139:20:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "22123:36:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1236, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "22183:5:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 1237, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "22183:12:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1238, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "Conditional", - "src": "22123:72:2", - "trueExpression": { - "argumentTypes": null, - "id": 1235, - "name": "submissionStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1220, - "src": "22162:20:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "22094:101:2" - }, - { - "assignments": [ - 1241 - ], - "declarations": [ - { - "constant": false, - "id": 1241, - "name": "remainingBlocks", - "nodeType": "VariableDeclaration", - "scope": 1271, - "src": "22255:23:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1240, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "22255:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1246, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1244, - "name": "entryReceivedBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1230, - "src": "22299:18:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1242, - "name": "deadlineBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1210, - "src": "22281:13:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1243, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "22281:17:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1245, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "22281:37:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "22255:63:2" - }, - { - "assignments": [ - 1248 - ], - "declarations": [ - { - "constant": false, - "id": 1248, - "name": "submissionWindow", - "nodeType": "VariableDeclaration", - "scope": 1271, - "src": "22361:24:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1247, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "22361:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1253, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1251, - "name": "submissionStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1220, - "src": "22406:20:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1249, - "name": "deadlineBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1210, - "src": "22388:13:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1250, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "22388:17:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1252, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "22388:39:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "22361:66:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 1269, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 1254, - "name": "delayFactor", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1203, - "src": "22754:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1267, - "name": "decimals", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1206, - "src": "22831:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "components": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 1264, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "components": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1260, - "name": "submissionWindow", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1248, - "src": "22804:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1257, - "name": "decimals", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1206, - "src": "22790:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1255, - "name": "remainingBlocks", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1241, - "src": "22770:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1256, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "22770:19:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1258, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "22770:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1259, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "div", - "nodeType": "MemberAccess", - "referencedDeclaration": 11877, - "src": "22770:33:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1261, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "22770:51:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "id": 1262, - "isConstant": false, - "isInlineArray": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "TupleExpression", - "src": "22769:53:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "**", - "rightExpression": { - "argumentTypes": null, - "hexValue": "32", - "id": 1263, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "22824:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_2_by_1", - "typeString": "int_const 2" - }, - "value": "2" - }, - "src": "22769:56:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "id": 1265, - "isConstant": false, - "isInlineArray": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "TupleExpression", - "src": "22768:58:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1266, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "div", - "nodeType": "MemberAccess", - "referencedDeclaration": 11877, - "src": "22768:62:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1268, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "22768:72:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "22754:86:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1270, - "nodeType": "ExpressionStatement", - "src": "22754:86:2" - } - ] - }, - "documentation": "@dev Gets delay factor for rewards calculation.\n@return Integer representing floating-point number with 16 decimals places.", - "id": 1272, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "getDelayFactor", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1201, - "nodeType": "ParameterList", - "parameters": [], - "src": "21091:2:2" - }, - "returnParameters": { - "id": 1204, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1203, - "name": "delayFactor", - "nodeType": "VariableDeclaration", - "scope": 1272, - "src": "21116:19:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1202, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "21116:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "21115:21:2" - }, - "scope": 1568, - "src": "21068:1779:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 1281, - "nodeType": "Block", - "src": "23020:51:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 1279, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 1277, - "name": "currentEntryStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 246, - "src": "23037:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "!=", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 1278, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "23063:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "23037:27:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "functionReturnParameters": 1276, - "id": 1280, - "nodeType": "Return", - "src": "23030:34:2" - } - ] - }, - "documentation": "@dev Returns true if generation of a new relay entry is currently in\nprogress.", - "id": 1282, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "isEntryInProgress", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1273, - "nodeType": "ParameterList", - "parameters": [], - "src": "22988:2:2" - }, - "returnParameters": { - "id": 1276, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1275, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1282, - "src": "23014:4:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 1274, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "23014:4:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "23013:6:2" - }, - "scope": 1568, - "src": "22962:109:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 1298, - "nodeType": "Block", - "src": "23358:112:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 1296, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 1289, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 1287, - "name": "currentEntryStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 246, - "src": "23375:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "!=", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 1288, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "23401:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "23375:27:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "&&", - "rightExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 1295, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1290, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "23406:5:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 1291, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "23406:12:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 1294, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 1292, - "name": "currentEntryStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 246, - "src": "23421:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "id": 1293, - "name": "relayEntryTimeout", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 233, - "src": "23446:17:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "23421:42:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "23406:57:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "23375:88:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "functionReturnParameters": 1286, - "id": 1297, - "nodeType": "Return", - "src": "23368:95:2" - } - ] - }, - "documentation": "@dev Returns true if the currently ongoing new relay entry generation\noperation timed out. There is a certain timeout for a new relay entry\nto be produced, see `relayEntryTimeout` value.", - "id": 1299, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "hasEntryTimedOut", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1283, - "nodeType": "ParameterList", - "parameters": [], - "src": "23326:2:2" - }, - "returnParameters": { - "id": 1286, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1285, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1299, - "src": "23352:4:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 1284, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "23352:4:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "23351:6:2" - }, - "scope": 1568, - "src": "23301:169:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 1342, - "nodeType": "Block", - "src": "24087:740:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 1303, - "name": "hasEntryTimedOut", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1299, - "src": "24105:16:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$", - "typeString": "function () view returns (bool)" - } - }, - "id": 1304, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "24105:18:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "456e74727920646964206e6f742074696d65206f7574", - "id": 1305, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "24125:24:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_bd0ed65969b48fa50b3e9e120922e4e93ce5d15edd6c3296bfcd4e765a7c5307", - "typeString": "literal_string \"Entry did not time out\"" - }, - "value": "Entry did not time out" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_bd0ed65969b48fa50b3e9e120922e4e93ce5d15edd6c3296bfcd4e765a7c5307", - "typeString": "literal_string \"Entry did not time out\"" - } - ], - "id": 1302, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "24097:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 1306, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "24097:53:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 1307, - "nodeType": "ExpressionStatement", - "src": "24097:53:2" - }, - { - "assignments": [ - 1309 - ], - "declarations": [ - { - "constant": false, - "id": 1309, - "name": "minimumStake", - "nodeType": "VariableDeclaration", - "scope": 1342, - "src": "24161:20:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1308, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "24161:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1313, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 1310, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "24184:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 1311, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "minimumStake", - "nodeType": "MemberAccess", - "referencedDeclaration": 4728, - "src": "24184:28:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$", - "typeString": "function () view external returns (uint256)" - } - }, - "id": 1312, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "24184:30:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "24161:53:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1317, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "24255:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 1318, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "groupIndex", - "nodeType": "MemberAccess", - "referencedDeclaration": 259, - "src": "24255:25:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1319, - "name": "groupSize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 212, - "src": "24282:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1320, - "name": "minimumStake", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1309, - "src": "24293:12:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1314, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "24224:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1316, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "reportRelayEntryTimeout", - "nodeType": "MemberAccess", - "referencedDeclaration": 9097, - "src": "24224:30:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_nonpayable$_t_struct$_Storage_$8192_storage_ptr_$_t_uint256_$_t_uint256_$_t_uint256_$returns$__$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,uint256,uint256,uint256)" - } - }, - "id": 1321, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "24224:82:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 1322, - "nodeType": "ExpressionStatement", - "src": "24224:82:2" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 1326, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 1323, - "name": "numberOfGroups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1406, - "src": "24499:14:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", - "typeString": "function () view returns (uint256)" - } - }, - "id": 1324, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "24499:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 1325, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "24518:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "24499:20:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 1341, - "nodeType": "IfStatement", - "src": "24495:326:2", - "trueBody": { - "id": 1340, - "nodeType": "Block", - "src": "24521:300:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1328, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "24567:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 1329, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "relayRequestId", - "nodeType": "MemberAccess", - "referencedDeclaration": 253, - "src": "24567:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1330, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "24614:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 1331, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "previousEntry", - "nodeType": "MemberAccess", - "referencedDeclaration": 261, - "src": "24614:28:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage", - "typeString": "bytes storage ref" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1332, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "24660:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 1333, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "serviceContract", - "nodeType": "MemberAccess", - "referencedDeclaration": 263, - "src": "24660:30:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1334, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "24708:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 1335, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "entryVerificationAndProfitFee", - "nodeType": "MemberAccess", - "referencedDeclaration": 255, - "src": "24708:44:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1336, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "24770:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 1337, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "callbackFee", - "nodeType": "MemberAccess", - "referencedDeclaration": 257, - "src": "24770:26:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_bytes_storage", - "typeString": "bytes storage ref" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 1327, - "name": "signRelayEntry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 912, - "src": "24535:14:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_bytes_memory_ptr_$_t_address_$_t_uint256_$_t_uint256_$returns$__$", - "typeString": "function (uint256,bytes memory,address,uint256,uint256)" - } - }, - "id": 1338, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "24535:275:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 1339, - "nodeType": "ExpressionStatement", - "src": "24535:275:2" - } - ] - } - } - ] - }, - "documentation": "@dev Function used to inform about the fact the currently ongoing\nnew relay entry generation operation timed out. As a result, the group\nwhich was supposed to produce a new relay entry is immediately\nterminated and a new group is selected to produce a new relay entry.\nAll members of the group are punished by seizing minimum stake of\ntheir tokens. The submitter of the transaction is rewarded with a\ntattletale reward which is limited to min(1, 20 / group_size) of the\nmaximum tattletale reward.", - "id": 1343, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "reportRelayEntryTimeout", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1300, - "nodeType": "ParameterList", - "parameters": [], - "src": "24077:2:2" - }, - "returnParameters": { - "id": 1301, - "nodeType": "ParameterList", - "parameters": [], - "src": "24087:0:2" - }, - "scope": 1568, - "src": "24045:782:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1353, - "nodeType": "Block", - "src": "24956:60:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1350, - "name": "groupSize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 212, - "src": "24999:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1348, - "name": "groupMemberBaseReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 204, - "src": "24973:21:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1349, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "24973:25:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1351, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "24973:36:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 1347, - "id": 1352, - "nodeType": "Return", - "src": "24966:43:2" - } - ] - }, - "documentation": "@dev Gets group profit fee expressed in wei.", - "id": 1354, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "groupProfitFee", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1344, - "nodeType": "ParameterList", - "parameters": [], - "src": "24924:2:2" - }, - "returnParameters": { - "id": 1347, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1346, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1354, - "src": "24947:7:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1345, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "24947:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "24946:9:2" - }, - "scope": 1568, - "src": "24901:115:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1369, - "nodeType": "Block", - "src": "25646:78:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1363, - "name": "staker", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1356, - "src": "25695:6:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1365, - "name": "this", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12868, - "src": "25711:4:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_KeepRandomBeaconOperator_$1568", - "typeString": "contract KeepRandomBeaconOperator" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_contract$_KeepRandomBeaconOperator_$1568", - "typeString": "contract KeepRandomBeaconOperator" - } - ], - "id": 1364, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "25703:7:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": "address" - }, - "id": 1366, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "25703:13:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "id": 1361, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "25663:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 1362, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "hasMinimumStake", - "nodeType": "MemberAccess", - "referencedDeclaration": 5648, - "src": "25663:31:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_bool_$", - "typeString": "function (address,address) view external returns (bool)" - } - }, - "id": 1367, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "25663:54:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "functionReturnParameters": 1360, - "id": 1368, - "nodeType": "Return", - "src": "25656:61:2" - } - ] - }, - "documentation": "@dev Checks if the specified account has enough active stake to become\nnetwork operator and that this contract has been authorized for potential\nslashing.\n * Having the required minimum of active stake makes the operator eligible\nto join the network. If the active stake is not currently undelegating,\noperator is also eligible for work selection.\n * @param staker Staker's address\n@return True if has enough active stake to participate in the network,\nfalse otherwise.", - "id": 1370, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "hasMinimumStake", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1357, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1356, - "name": "staker", - "nodeType": "VariableDeclaration", - "scope": 1370, - "src": "25604:14:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 1355, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "25604:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "25603:16:2" - }, - "returnParameters": { - "id": 1360, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1359, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1370, - "src": "25640:4:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 1358, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "25640:4:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "25639:6:2" - }, - "scope": 1568, - "src": "25579:145:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1382, - "nodeType": "Block", - "src": "25894:61:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1379, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1372, - "src": "25936:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "expression": { - "argumentTypes": null, - "id": 1377, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "25911:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1378, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "isGroupRegistered", - "nodeType": "MemberAccess", - "referencedDeclaration": 8542, - "src": "25911:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$_t_struct$_Storage_$8192_storage_ptr_$_t_bytes_memory_ptr_$returns$_t_bool_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,bytes memory) view returns (bool)" - } - }, - "id": 1380, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "25911:37:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "functionReturnParameters": 1376, - "id": 1381, - "nodeType": "Return", - "src": "25904:44:2" - } - ] - }, - "documentation": "@dev Checks if group with the given public key is registered.", - "id": 1383, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "isGroupRegistered", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1373, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1372, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 1383, - "src": "25842:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 1371, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "25842:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "25841:26:2" - }, - "returnParameters": { - "id": 1376, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1375, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1383, - "src": "25888:4:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 1374, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "25888:4:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "25887:6:2" - }, - "scope": 1568, - "src": "25815:140:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1395, - "nodeType": "Block", - "src": "26527:56:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1392, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1385, - "src": "26564:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "expression": { - "argumentTypes": null, - "id": 1390, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "26544:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1391, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "isStaleGroup", - "nodeType": "MemberAccess", - "referencedDeclaration": 8640, - "src": "26544:19:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_view$_t_struct$_Storage_$8192_storage_ptr_$_t_bytes_memory_ptr_$returns$_t_bool_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,bytes memory) view returns (bool)" - } - }, - "id": 1393, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "26544:32:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "functionReturnParameters": 1389, - "id": 1394, - "nodeType": "Return", - "src": "26537:39:2" - } - ] - }, - "documentation": "@dev Checks if a group with the given public key is a stale group.\nStale group is an expired group which is no longer performing any\noperations. It is important to understand that an expired group may\nstill perform some operations for which it was selected when it was still\nactive. We consider a group to be stale when it's expired and when its\nexpiration time and potentially executed operation timeout are both in\nthe past.", - "id": 1396, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "isStaleGroup", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1386, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1385, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 1396, - "src": "26475:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 1384, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "26475:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "26474:26:2" - }, - "returnParameters": { - "id": 1389, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1388, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1396, - "src": "26521:4:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 1387, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "26521:4:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "26520:6:2" - }, - "scope": 1568, - "src": "26453:130:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1405, - "nodeType": "Block", - "src": "26770:47:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 1401, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "26787:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1402, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "numberOfGroups", - "nodeType": "MemberAccess", - "referencedDeclaration": 8682, - "src": "26787:21:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$_t_struct$_Storage_$8192_storage_ptr_$returns$_t_uint256_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer) view returns (uint256)" - } - }, - "id": 1403, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "26787:23:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 1400, - "id": 1404, - "nodeType": "Return", - "src": "26780:30:2" - } - ] - }, - "documentation": "@dev Gets the number of active groups. Expired and terminated groups are\nnot counted as active.", - "id": 1406, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "numberOfGroups", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1397, - "nodeType": "ParameterList", - "parameters": [], - "src": "26738:2:2" - }, - "returnParameters": { - "id": 1400, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1399, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1406, - "src": "26761:7:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1398, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "26761:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "26760:9:2" - }, - "scope": 1568, - "src": "26715:102:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1418, - "nodeType": "Block", - "src": "26999:62:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1413, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "27016:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1414, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "groupMemberRewards", - "nodeType": "MemberAccess", - "referencedDeclaration": 8187, - "src": "27016:25:2", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_bytes_memory_$_t_uint256_$", - "typeString": "mapping(bytes memory => uint256)" - } - }, - "id": 1416, - "indexExpression": { - "argumentTypes": null, - "id": 1415, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1408, - "src": "27042:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "27016:38:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 1412, - "id": 1417, - "nodeType": "Return", - "src": "27009:45:2" - } - ] - }, - "documentation": "@dev Returns accumulated group member rewards for provided group.", - "id": 1419, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "getGroupMemberRewards", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1409, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1408, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 1419, - "src": "26943:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 1407, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "26943:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "26942:26:2" - }, - "returnParameters": { - "id": 1412, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1411, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1419, - "src": "26990:7:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1410, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "26990:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "26989:9:2" - }, - "scope": 1568, - "src": "26912:149:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1435, - "nodeType": "Block", - "src": "27268:73:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1431, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1421, - "src": "27314:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "id": 1432, - "name": "member", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1423, - "src": "27327:6:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "id": 1429, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "27285:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1430, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "getGroupMemberIndices", - "nodeType": "MemberAccess", - "referencedDeclaration": 8452, - "src": "27285:28:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_view$_t_struct$_Storage_$8192_storage_ptr_$_t_bytes_memory_ptr_$_t_address_$returns$_t_array$_t_uint256_$dyn_memory_ptr_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,bytes memory,address) view returns (uint256[] memory)" - } - }, - "id": 1433, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "27285:49:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", - "typeString": "uint256[] memory" - } - }, - "functionReturnParameters": 1428, - "id": 1434, - "nodeType": "Return", - "src": "27278:56:2" - } - ] - }, - "documentation": "@dev Gets all indices in the provided group for a member.", - "id": 1436, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "getGroupMemberIndices", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1424, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1421, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 1436, - "src": "27179:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 1420, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "27179:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 1423, - "name": "member", - "nodeType": "VariableDeclaration", - "scope": 1436, - "src": "27205:14:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 1422, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "27205:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "27178:42:2" - }, - "returnParameters": { - "id": 1428, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1427, - "name": "indices", - "nodeType": "VariableDeclaration", - "scope": 1436, - "src": "27242:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", - "typeString": "uint256[]" - }, - "typeName": { - "baseType": { - "id": 1425, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "27242:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1426, - "length": null, - "nodeType": "ArrayTypeName", - "src": "27242:9:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", - "typeString": "uint256[]" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "27241:26:2" - }, - "scope": 1568, - "src": "27148:193:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1483, - "nodeType": "Block", - "src": "27933:367:2", - "statements": [ - { - "assignments": [ - 1449 - ], - "declarations": [ - { - "constant": false, - "id": 1449, - "name": "accumulatedRewards", - "nodeType": "VariableDeclaration", - "scope": 1483, - "src": "27943:26:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1448, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "27943:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1456, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1452, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1438, - "src": "27997:8:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 1453, - "name": "groupIndex", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1440, - "src": "28007:10:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1454, - "name": "groupMemberIndices", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1443, - "src": "28019:18:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", - "typeString": "uint256[] memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", - "typeString": "uint256[] memory" - } - ], - "expression": { - "argumentTypes": null, - "id": 1450, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "27972:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1451, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "withdrawFromGroup", - "nodeType": "MemberAccess", - "referencedDeclaration": 8935, - "src": "27972:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_nonpayable$_t_struct$_Storage_$8192_storage_ptr_$_t_address_$_t_uint256_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$_t_uint256_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,address,uint256,uint256[] memory) returns (uint256)" - } - }, - "id": 1455, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "27972:66:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "27943:95:2" - }, - { - "assignments": [ - 1458, - null - ], - "declarations": [ - { - "constant": false, - "id": 1458, - "name": "success", - "nodeType": "VariableDeclaration", - "scope": 1483, - "src": "28049:12:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 1457, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "28049:4:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - }, - null - ], - "id": 1469, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "", - "id": 1467, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "28133:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - }, - "value": "" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - } - ], - "arguments": [ - { - "argumentTypes": null, - "id": 1465, - "name": "accumulatedRewards", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1449, - "src": "28113:18:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1461, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1438, - "src": "28092:8:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "id": 1459, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "28067:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 1460, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "beneficiaryOf", - "nodeType": "MemberAccess", - "referencedDeclaration": 3394, - "src": "28067:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_address_payable_$", - "typeString": "function (address) view external returns (address payable)" - } - }, - "id": 1462, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "28067:34:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "id": 1463, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "call", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "28067:39:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 1464, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "28067:45:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value_$", - "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" - } - }, - "id": 1466, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "28067:65:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 1468, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "28067:69:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "tuple(bool,bytes memory)" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "28048:88:2" - }, - { - "condition": { - "argumentTypes": null, - "id": 1470, - "name": "success", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1458, - "src": "28150:7:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 1482, - "nodeType": "IfStatement", - "src": "28146:148:2", - "trueBody": { - "id": 1481, - "nodeType": "Block", - "src": "28159:135:2", - "statements": [ - { - "eventCall": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1474, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1438, - "src": "28231:8:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "id": 1472, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "28206:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 1473, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "beneficiaryOf", - "nodeType": "MemberAccess", - "referencedDeclaration": 3394, - "src": "28206:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_address_payable_$", - "typeString": "function (address) view external returns (address payable)" - } - }, - "id": 1475, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "28206:34:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - { - "argumentTypes": null, - "id": 1476, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1438, - "src": "28242:8:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 1477, - "name": "accumulatedRewards", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1449, - "src": "28252:18:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1478, - "name": "groupIndex", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1440, - "src": "28272:10:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 1471, - "name": "GroupMemberRewardsWithdrawn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 186, - "src": "28178:27:2", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$", - "typeString": "function (address,address,uint256,uint256)" - } - }, - "id": 1479, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "28178:105:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 1480, - "nodeType": "EmitStatement", - "src": "28173:110:2" - } - ] - } - } - ] - }, - "documentation": "@dev Withdraws accumulated group member rewards for operator\nusing the provided group index and member indices. Once the\naccumulated reward is withdrawn from the selected group, member is\nremoved from it. Rewards can be withdrawn only from stale group.\n@param operator Operator address.\n@param groupIndex Group index.\n@param groupMemberIndices Array of member indices for the group member.", - "id": 1484, - "implemented": true, - "kind": "function", - "modifiers": [ - { - "arguments": null, - "id": 1446, - "modifierName": { - "argumentTypes": null, - "id": 1445, - "name": "nonReentrant", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12778, - "src": "27920:12:2", - "typeDescriptions": { - "typeIdentifier": "t_modifier$__$", - "typeString": "modifier ()" - } - }, - "nodeType": "ModifierInvocation", - "src": "27920:12:2" - } - ], - "name": "withdrawGroupMemberRewards", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1444, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1438, - "name": "operator", - "nodeType": "VariableDeclaration", - "scope": 1484, - "src": "27838:16:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 1437, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "27838:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 1440, - "name": "groupIndex", - "nodeType": "VariableDeclaration", - "scope": 1484, - "src": "27856:18:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1439, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "27856:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 1443, - "name": "groupMemberIndices", - "nodeType": "VariableDeclaration", - "scope": 1484, - "src": "27876:35:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", - "typeString": "uint256[]" - }, - "typeName": { - "baseType": { - "id": 1441, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "27876:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1442, - "length": null, - "nodeType": "ArrayTypeName", - "src": "27876:9:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", - "typeString": "uint256[]" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "27837:75:2" - }, - "returnParameters": { - "id": 1447, - "nodeType": "ParameterList", - "parameters": [], - "src": "27933:0:2" - }, - "scope": 1568, - "src": "27802:498:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1492, - "nodeType": "Block", - "src": "28440:49:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1489, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "28457:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1490, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "expiredGroupOffset", - "nodeType": "MemberAccess", - "referencedDeclaration": 8189, - "src": "28457:25:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 1488, - "id": 1491, - "nodeType": "Return", - "src": "28450:32:2" - } - ] - }, - "documentation": "@dev Gets the index of the first active group.", - "id": 1493, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "getFirstActiveGroupIndex", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1485, - "nodeType": "ParameterList", - "parameters": [], - "src": "28407:2:2" - }, - "returnParameters": { - "id": 1488, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1487, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1493, - "src": "28431:7:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1486, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "28431:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "28430:9:2" - }, - "scope": 1568, - "src": "28374:115:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1505, - "nodeType": "Block", - "src": "28626:60:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1502, - "name": "groupIndex", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1495, - "src": "28668:10:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1500, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "28643:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1501, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "getGroupPublicKey", - "nodeType": "MemberAccess", - "referencedDeclaration": 8341, - "src": "28643:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$_t_struct$_Storage_$8192_storage_ptr_$_t_uint256_$returns$_t_bytes_memory_ptr_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,uint256) view returns (bytes memory)" - } - }, - "id": 1503, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "28643:36:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - "functionReturnParameters": 1499, - "id": 1504, - "nodeType": "Return", - "src": "28636:43:2" - } - ] - }, - "documentation": "@dev Gets group public key.", - "id": 1506, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "getGroupPublicKey", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1496, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1495, - "name": "groupIndex", - "nodeType": "VariableDeclaration", - "scope": 1506, - "src": "28571:18:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1494, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "28571:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "28570:20:2" - }, - "returnParameters": { - "id": 1499, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1498, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1506, - "src": "28612:12:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 1497, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "28612:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "28611:14:2" - }, - "scope": 1568, - "src": "28544:142:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1516, - "nodeType": "Block", - "src": "28901:73:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1513, - "name": "gasPriceCeiling", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 209, - "src": "28951:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1511, - "name": "entryVerificationGasEstimate", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 236, - "src": "28918:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1512, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "28918:32:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1514, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "28918:49:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 1510, - "id": 1515, - "nodeType": "Return", - "src": "28911:56:2" - } - ] - }, - "documentation": "@dev Returns fee for entry verification in wei. Does not include group\nprofit fee, DKG contribution or callback fee.", - "id": 1517, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "entryVerificationFee", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1507, - "nodeType": "ParameterList", - "parameters": [], - "src": "28868:2:2" - }, - "returnParameters": { - "id": 1510, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1509, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1517, - "src": "28892:7:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1508, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "28892:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "28891:9:2" - }, - "scope": 1568, - "src": "28839:135:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1530, - "nodeType": "Block", - "src": "29181:90:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1527, - "name": "gasPriceCeiling", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 209, - "src": "29248:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1524, - "name": "groupSelectionGasEstimate", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 242, - "src": "29217:25:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1522, - "name": "dkgGasEstimate", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 239, - "src": "29198:14:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1523, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "29198:18:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1525, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "29198:45:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1526, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "29198:49:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1528, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "29198:66:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 1521, - "id": 1529, - "nodeType": "Return", - "src": "29191:73:2" - } - ] - }, - "documentation": "@dev Returns fee for group creation in wei. Includes the cost of DKG\nand the cost of triggering group selection.", - "id": 1531, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "groupCreationFee", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1518, - "nodeType": "ParameterList", - "parameters": [], - "src": "29148:2:2" - }, - "returnParameters": { - "id": 1521, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1520, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1531, - "src": "29172:7:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1519, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "29172:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "29171:9:2" - }, - "scope": 1568, - "src": "29123:148:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1544, - "nodeType": "Block", - "src": "29459:59:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1541, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1533, - "src": "29499:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "expression": { - "argumentTypes": null, - "id": 1539, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "29476:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1540, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "getGroupMembers", - "nodeType": "MemberAccess", - "referencedDeclaration": 9113, - "src": "29476:22:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_view$_t_struct$_Storage_$8192_storage_ptr_$_t_bytes_memory_ptr_$returns$_t_array$_t_address_$dyn_memory_ptr_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,bytes memory) view returns (address[] memory)" - } - }, - "id": 1542, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "29476:35:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - } - }, - "functionReturnParameters": 1538, - "id": 1543, - "nodeType": "Return", - "src": "29469:42:2" - } - ] - }, - "documentation": "@dev Returns members of the given group by group public key.", - "id": 1545, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "getGroupMembers", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1534, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1533, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 1545, - "src": "29386:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 1532, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "29386:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "29385:26:2" - }, - "returnParameters": { - "id": 1538, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1537, - "name": "members", - "nodeType": "VariableDeclaration", - "scope": 1545, - "src": "29433:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[]" - }, - "typeName": { - "baseType": { - "id": 1535, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "29433:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 1536, - "length": null, - "nodeType": "ArrayTypeName", - "src": "29433:9:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[]" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "29432:26:2" - }, - "scope": 1568, - "src": "29361:157:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1566, - "nodeType": "Block", - "src": "30109:155:2", - "statements": [ - { - "assignments": [ - 1553 - ], - "declarations": [ - { - "constant": false, - "id": 1553, - "name": "minimumStake", - "nodeType": "VariableDeclaration", - "scope": 1566, - "src": "30119:20:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1552, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "30119:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1557, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 1554, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "30142:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 1555, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "minimumStake", - "nodeType": "MemberAccess", - "referencedDeclaration": 4728, - "src": "30142:28:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$", - "typeString": "function () view external returns (uint256)" - } - }, - "id": 1556, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "30142:30:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "30119:53:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1561, - "name": "groupIndex", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1547, - "src": "30215:10:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1562, - "name": "signedMsgSender", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1549, - "src": "30227:15:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "id": 1563, - "name": "minimumStake", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1553, - "src": "30244:12:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1558, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "30182:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1560, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "reportUnauthorizedSigning", - "nodeType": "MemberAccess", - "referencedDeclaration": 9045, - "src": "30182:32:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_nonpayable$_t_struct$_Storage_$8192_storage_ptr_$_t_uint256_$_t_bytes_memory_ptr_$_t_uint256_$returns$__$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,uint256,bytes memory,uint256)" - } - }, - "id": 1564, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "30182:75:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 1565, - "nodeType": "ExpressionStatement", - "src": "30182:75:2" - } - ] - }, - "documentation": "@dev Reports unauthorized signing for the provided group. Must provide\na valid signature of the tattletale address as a message. Successful signature\nverification means the private key has been leaked and all group members\nshould be punished by seizing their tokens. The submitter of this proof is\nrewarded with 5% of the total seized amount scaled by the reward adjustment\nparameter and the rest 95% is burned.", - "id": 1567, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "reportUnauthorizedSigning", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1550, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1547, - "name": "groupIndex", - "nodeType": "VariableDeclaration", - "scope": 1567, - "src": "30039:18:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1546, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "30039:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 1549, - "name": "signedMsgSender", - "nodeType": "VariableDeclaration", - "scope": 1567, - "src": "30067:28:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 1548, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "30067:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "30029:72:2" - }, - "returnParameters": { - "id": 1551, - "nodeType": "ParameterList", - "parameters": [], - "src": "30109:0:2" - }, - "scope": 1568, - "src": "29995:269:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - } - ], - "scope": 1569, - "src": "1112:29154:2" - } - ], - "src": "0:30267:2" - }, - "legacyAST": { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/KeepRandomBeaconOperator.sol", - "exportedSymbols": { - "KeepRandomBeaconOperator": [ - 1568 - ], - "ServiceContract": [ - 135 - ] - }, - "id": 1569, - "nodeType": "SourceUnit", - "nodes": [ - { - "id": 109, - "literals": [ - "solidity", - "^", - "0.5", - ".4" - ], - "nodeType": "PragmaDirective", - "src": "0:23:2" - }, - { - "absolutePath": "openzeppelin-solidity/contracts/math/SafeMath.sol", - "file": "openzeppelin-solidity/contracts/math/SafeMath.sol", - "id": 110, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 11945, - "src": "25:59:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol", - "file": "openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol", - "id": 111, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 12780, - "src": "85:67:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/TokenStaking.sol", - "file": "./TokenStaking.sol", - "id": 112, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 5650, - "src": "153:28:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/cryptography/BLS.sol", - "file": "./cryptography/BLS.sol", - "id": 113, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 6861, - "src": "182:32:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/utils/AddressArrayUtils.sol", - "file": "./utils/AddressArrayUtils.sol", - "id": 114, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 10466, - "src": "215:39:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/utils/PercentUtils.sol", - "file": "./utils/PercentUtils.sol", - "id": 115, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 11278, - "src": "255:34:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/libraries/operator/GroupSelection.sol", - "file": "./libraries/operator/GroupSelection.sol", - "id": 116, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 8151, - "src": "290:49:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/libraries/operator/Groups.sol", - "file": "./libraries/operator/Groups.sol", - "id": 117, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 9115, - "src": "340:41:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/libraries/operator/DKGResultVerification.sol", - "file": "./libraries/operator/DKGResultVerification.sol", - "id": 118, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 7171, - "src": "382:56:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/libraries/operator/Reimbursements.sol", - "file": "./libraries/operator/Reimbursements.sol", - "id": 119, - "nodeType": "ImportDirective", - "scope": 1569, - "sourceUnit": 9246, - "src": "439:49:2", - "symbolAliases": [], - "unitAlias": "" - }, - { - "baseContracts": [], - "contractDependencies": [], - "contractKind": "interface", - "documentation": null, - "fullyImplemented": false, - "id": 135, - "linearizedBaseContracts": [ - 135 - ], - "name": "ServiceContract", - "nodeType": "ContractDefinition", - "nodes": [ - { - "body": null, - "documentation": null, - "id": 128, - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "entryCreated", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 126, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 121, - "name": "requestId", - "nodeType": "VariableDeclaration", - "scope": 128, - "src": "544:17:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 120, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "544:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 123, - "name": "entry", - "nodeType": "VariableDeclaration", - "scope": 128, - "src": "563:20:2", - "stateVariable": false, - "storageLocation": "calldata", - "typeDescriptions": { - "typeIdentifier": "t_bytes_calldata_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 122, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "563:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 125, - "name": "submitter", - "nodeType": "VariableDeclaration", - "scope": 128, - "src": "585:25:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - "typeName": { - "id": 124, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "585:15:2", - "stateMutability": "payable", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "543:68:2" - }, - "returnParameters": { - "id": 127, - "nodeType": "ParameterList", - "parameters": [], - "src": "620:0:2" - }, - "scope": 135, - "src": "522:99:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "external" - }, - { - "body": null, - "documentation": null, - "id": 131, - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "fundRequestSubsidyFeePool", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 129, - "nodeType": "ParameterList", - "parameters": [], - "src": "660:2:2" - }, - "returnParameters": { - "id": 130, - "nodeType": "ParameterList", - "parameters": [], - "src": "679:0:2" - }, - "scope": 135, - "src": "626:54:2", - "stateMutability": "payable", - "superFunction": null, - "visibility": "external" - }, - { - "body": null, - "documentation": null, - "id": 134, - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "fundDkgFeePool", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 132, - "nodeType": "ParameterList", - "parameters": [], - "src": "708:2:2" - }, - "returnParameters": { - "id": 133, - "nodeType": "ParameterList", - "parameters": [], - "src": "727:0:2" - }, - "scope": 135, - "src": "685:43:2", - "stateMutability": "payable", - "superFunction": null, - "visibility": "external" - } - ], - "scope": 1569, - "src": "490:240:2" - }, - { - "baseContracts": [ - { - "arguments": null, - "baseName": { - "contractScope": null, - "id": 136, - "name": "ReentrancyGuard", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 12779, - "src": "1149:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ReentrancyGuard_$12779", - "typeString": "contract ReentrancyGuard" - } - }, - "id": 137, - "nodeType": "InheritanceSpecifier", - "src": "1149:15:2" - } - ], - "contractDependencies": [ - 12779 - ], - "contractKind": "contract", - "documentation": "@title KeepRandomBeaconOperator\n@dev Keep client facing contract for random beacon security-critical operations.\nHandles group creation and expiration, BLS signature verification and incentives.\nThe contract is not upgradeable. New functionality can be implemented by deploying\nnew versions following Keep client update and re-authorization by the stakers.", - "fullyImplemented": true, - "id": 1568, - "linearizedBaseContracts": [ - 1568, - 12779 - ], - "name": "KeepRandomBeaconOperator", - "nodeType": "ContractDefinition", - "nodes": [ - { - "id": 140, - "libraryName": { - "contractScope": null, - "id": 138, - "name": "SafeMath", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 11944, - "src": "1177:8:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_SafeMath_$11944", - "typeString": "library SafeMath" - } - }, - "nodeType": "UsingForDirective", - "src": "1171:27:2", - "typeName": { - "id": 139, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1190:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - }, - { - "id": 143, - "libraryName": { - "contractScope": null, - "id": 141, - "name": "PercentUtils", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 11277, - "src": "1209:12:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_PercentUtils_$11277", - "typeString": "library PercentUtils" - } - }, - "nodeType": "UsingForDirective", - "src": "1203:31:2", - "typeName": { - "id": 142, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1226:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - }, - { - "id": 147, - "libraryName": { - "contractScope": null, - "id": 144, - "name": "AddressArrayUtils", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 10465, - "src": "1245:17:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_AddressArrayUtils_$10465", - "typeString": "library AddressArrayUtils" - } - }, - "nodeType": "UsingForDirective", - "src": "1239:38:2", - "typeName": { - "baseType": { - "id": 145, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1267:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 146, - "length": null, - "nodeType": "ArrayTypeName", - "src": "1267:9:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[]" - } - } - }, - { - "id": 150, - "libraryName": { - "contractScope": null, - "id": 148, - "name": "GroupSelection", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 8150, - "src": "1288:14:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_GroupSelection_$8150", - "typeString": "library GroupSelection" - } - }, - "nodeType": "UsingForDirective", - "src": "1282:48:2", - "typeName": { - "contractScope": null, - "id": 149, - "name": "GroupSelection.Storage", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 7202, - "src": "1307:22:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage_ptr", - "typeString": "struct GroupSelection.Storage" - } - } - }, - { - "id": 153, - "libraryName": { - "contractScope": null, - "id": 151, - "name": "Groups", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 9114, - "src": "1341:6:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_Groups_$9114", - "typeString": "library Groups" - } - }, - "nodeType": "UsingForDirective", - "src": "1335:32:2", - "typeName": { - "contractScope": null, - "id": 152, - "name": "Groups.Storage", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 8192, - "src": "1352:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage_ptr", - "typeString": "struct Groups.Storage" - } - } - }, - { - "id": 156, - "libraryName": { - "contractScope": null, - "id": 154, - "name": "DKGResultVerification", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 7170, - "src": "1378:21:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_DKGResultVerification_$7170", - "typeString": "library DKGResultVerification" - } - }, - "nodeType": "UsingForDirective", - "src": "1372:62:2", - "typeName": { - "contractScope": null, - "id": 155, - "name": "DKGResultVerification.Storage", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 6983, - "src": "1404:29:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$6983_storage_ptr", - "typeString": "struct DKGResultVerification.Storage" - } - } - }, - { - "anonymous": false, - "documentation": null, - "id": 160, - "name": "OnGroupRegistered", - "nodeType": "EventDefinition", - "parameters": { - "id": 159, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 158, - "indexed": false, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 160, - "src": "1464:17:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 157, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "1464:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1463:19:2" - }, - "src": "1440:43:2" - }, - { - "anonymous": false, - "documentation": null, - "id": 164, - "name": "DkgResultPublishedEvent", - "nodeType": "EventDefinition", - "parameters": { - "id": 163, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 162, - "indexed": false, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 164, - "src": "1595:17:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 161, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "1595:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1594:19:2" - }, - "src": "1565:49:2" - }, - { - "anonymous": false, - "documentation": null, - "id": 170, - "name": "RelayEntryRequested", - "nodeType": "EventDefinition", - "parameters": { - "id": 169, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 166, - "indexed": false, - "name": "previousEntry", - "nodeType": "VariableDeclaration", - "scope": 170, - "src": "1646:19:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 165, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "1646:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 168, - "indexed": false, - "name": "groupPublicKey", - "nodeType": "VariableDeclaration", - "scope": 170, - "src": "1667:20:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 167, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "1667:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1645:43:2" - }, - "src": "1620:69:2" - }, - { - "anonymous": false, - "documentation": null, - "id": 172, - "name": "RelayEntrySubmitted", - "nodeType": "EventDefinition", - "parameters": { - "id": 171, - "nodeType": "ParameterList", - "parameters": [], - "src": "1719:2:2" - }, - "src": "1694:28:2" - }, - { - "anonymous": false, - "documentation": null, - "id": 176, - "name": "GroupSelectionStarted", - "nodeType": "EventDefinition", - "parameters": { - "id": 175, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 174, - "indexed": false, - "name": "newEntry", - "nodeType": "VariableDeclaration", - "scope": 176, - "src": "1756:16:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 173, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1756:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1755:18:2" - }, - "src": "1728:46:2" - }, - { - "anonymous": false, - "documentation": null, - "id": 186, - "name": "GroupMemberRewardsWithdrawn", - "nodeType": "EventDefinition", - "parameters": { - "id": 185, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 178, - "indexed": true, - "name": "beneficiary", - "nodeType": "VariableDeclaration", - "scope": 186, - "src": "1814:27:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 177, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1814:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 180, - "indexed": false, - "name": "operator", - "nodeType": "VariableDeclaration", - "scope": 186, - "src": "1843:16:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 179, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1843:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 182, - "indexed": false, - "name": "amount", - "nodeType": "VariableDeclaration", - "scope": 186, - "src": "1861:14:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 181, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1861:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 184, - "indexed": false, - "name": "groupIndex", - "nodeType": "VariableDeclaration", - "scope": 186, - "src": "1877:18:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 183, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1877:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1813:83:2" - }, - "src": "1780:117:2" - }, - { - "constant": false, - "id": 188, - "name": "groupSelection", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "1903:37:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage" - }, - "typeName": { - "contractScope": null, - "id": 187, - "name": "GroupSelection.Storage", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 7202, - "src": "1903:22:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage_ptr", - "typeString": "struct GroupSelection.Storage" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 190, - "name": "groups", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "1946:21:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage" - }, - "typeName": { - "contractScope": null, - "id": 189, - "name": "Groups.Storage", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 8192, - "src": "1946:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage_ptr", - "typeString": "struct Groups.Storage" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 192, - "name": "dkgResultVerification", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "1973:51:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$6983_storage", - "typeString": "struct DKGResultVerification.Storage" - }, - "typeName": { - "contractScope": null, - "id": 191, - "name": "DKGResultVerification.Storage", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 6983, - "src": "1973:29:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$6983_storage_ptr", - "typeString": "struct DKGResultVerification.Storage" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 194, - "name": "owner", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "2054:22:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 193, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "2054:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 197, - "name": "serviceContracts", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "2083:35:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage", - "typeString": "address[]" - }, - "typeName": { - "baseType": { - "id": 195, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "2083:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 196, - "length": null, - "nodeType": "ArrayTypeName", - "src": "2083:9:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[]" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 199, - "name": "stakingContract", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "2206:37:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - }, - "typeName": { - "contractScope": null, - "id": 198, - "name": "TokenStaking", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 5649, - "src": "2206:12:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 204, - "name": "groupMemberBaseReward", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "2308:47:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 200, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2308:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_14500000000000_by_1", - "typeString": "int_const 14500000000000" - }, - "id": 203, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "hexValue": "313435", - "id": 201, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "2347:3:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_145_by_1", - "typeString": "int_const 145" - }, - "value": "145" - }, - "nodeType": "BinaryOperation", - "operator": "*", - "rightExpression": { - "argumentTypes": null, - "hexValue": "31653131", - "id": 202, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "2351:4:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_100000000000_by_1", - "typeString": "int_const 100000000000" - }, - "value": "1e11" - }, - "src": "2347:8:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_14500000000000_by_1", - "typeString": "int_const 14500000000000" - } - }, - "visibility": "public" - }, - { - "constant": false, - "id": 209, - "name": "gasPriceCeiling", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "2666:39:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 205, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2666:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_30000000000_by_1", - "typeString": "int_const 30000000000" - }, - "id": 208, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "hexValue": "3330", - "id": 206, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "2699:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_30_by_1", - "typeString": "int_const 30" - }, - "value": "30" - }, - "nodeType": "BinaryOperation", - "operator": "*", - "rightExpression": { - "argumentTypes": null, - "hexValue": "316539", - "id": 207, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "2702:3:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1000000000_by_1", - "typeString": "int_const 1000000000" - }, - "value": "1e9" - }, - "src": "2699:6:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_30000000000_by_1", - "typeString": "int_const 30000000000" - } - }, - "visibility": "public" - }, - { - "constant": false, - "id": 212, - "name": "groupSize", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "2788:29:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 210, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2788:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "3634", - "id": 211, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "2815:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_64_by_1", - "typeString": "int_const 64" - }, - "value": "64" - }, - "visibility": "public" - }, - { - "constant": false, - "id": 215, - "name": "groupThreshold", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "2941:34:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 213, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2941:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "3333", - "id": 214, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "2973:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_33_by_1", - "typeString": "int_const 33" - }, - "value": "33" - }, - "visibility": "public" - }, - { - "constant": false, - "id": 218, - "name": "resultPublicationBlockStep", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "3079:45:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 216, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3079:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "33", - "id": 217, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3123:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_3_by_1", - "typeString": "int_const 3" - }, - "value": "3" - }, - "visibility": "public" - }, - { - "constant": false, - "id": 224, - "name": "relayEntryGenerationTime", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "3257:47:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 219, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3257:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "components": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_4_by_1", - "typeString": "int_const 4" - }, - "id": 222, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "hexValue": "31", - "id": 220, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3300:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - }, - "value": "1" - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "hexValue": "33", - "id": 221, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3302:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_3_by_1", - "typeString": "int_const 3" - }, - "value": "3" - }, - "src": "3300:3:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_4_by_1", - "typeString": "int_const 4" - } - } - ], - "id": 223, - "isConstant": false, - "isInlineArray": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "TupleExpression", - "src": "3299:5:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_4_by_1", - "typeString": "int_const 4" - } - }, - "visibility": "public" - }, - { - "constant": false, - "id": 233, - "name": "relayEntryTimeout", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "3676:106:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 225, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3676:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 230, - "name": "resultPublicationBlockStep", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 218, - "src": "3754:26:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 228, - "name": "groupSize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 212, - "src": "3740:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 229, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "3740:13:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 231, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3740:41:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 226, - "name": "relayEntryGenerationTime", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 224, - "src": "3711:24:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 227, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "3711:28:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 232, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3711:71:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "public" - }, - { - "constant": false, - "id": 236, - "name": "entryVerificationGasEstimate", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "3956:52:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 234, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3956:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "323830303030", - "id": 235, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "4002:6:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_280000_by_1", - "typeString": "int_const 280000" - }, - "value": "280000" - }, - "visibility": "public" - }, - { - "constant": false, - "id": 239, - "name": "dkgGasEstimate", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "4097:39:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 237, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "4097:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "31373430303030", - "id": 238, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "4129:7:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1740000_by_1", - "typeString": "int_const 1740000" - }, - "value": "1740000" - }, - "visibility": "public" - }, - { - "constant": false, - "id": 242, - "name": "groupSelectionGasEstimate", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "4206:49:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 240, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "4206:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "323030303030", - "id": 241, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "4249:6:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_200000_by_1", - "typeString": "int_const 200000" - }, - "value": "200000" - }, - "visibility": "public" - }, - { - "constant": false, - "id": 244, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "4592:43:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 243, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "4592:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "public" - }, - { - "constant": false, - "id": 246, - "name": "currentEntryStartBlock", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "4642:39:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 245, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "4642:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": true, - "id": 249, - "name": "_genesisGroupSeed", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "4805:123:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 247, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "4805:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "3331343135393236353335383937393332333834363236343333383332373935303238383431393731363933393933373531303538323039373439343435393233303738313634303632383632", - "id": 248, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "4851:77:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_31415926535897932384626433832795028841971693993751058209749445923078164062862_by_1", - "typeString": "int_const 3141...(69 digits omitted)...2862" - }, - "value": "31415926535897932384626433832795028841971693993751058209749445923078164062862" - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 251, - "name": "groupSelectionStarterContract", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "4999:54:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - }, - "typeName": { - "contractScope": null, - "id": 250, - "name": "ServiceContract", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 135, - "src": "4999:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - } - }, - "value": null, - "visibility": "internal" - }, - { - "canonicalName": "KeepRandomBeaconOperator.SigningRequest", - "id": 264, - "members": [ - { - "constant": false, - "id": 253, - "name": "relayRequestId", - "nodeType": "VariableDeclaration", - "scope": 264, - "src": "5092:22:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 252, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "5092:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 255, - "name": "entryVerificationAndProfitFee", - "nodeType": "VariableDeclaration", - "scope": 264, - "src": "5124:37:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 254, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "5124:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 257, - "name": "callbackFee", - "nodeType": "VariableDeclaration", - "scope": 264, - "src": "5171:19:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 256, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "5171:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 259, - "name": "groupIndex", - "nodeType": "VariableDeclaration", - "scope": 264, - "src": "5200:18:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 258, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "5200:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 261, - "name": "previousEntry", - "nodeType": "VariableDeclaration", - "scope": 264, - "src": "5228:19:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 260, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "5228:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 263, - "name": "serviceContract", - "nodeType": "VariableDeclaration", - "scope": 264, - "src": "5257:23:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 262, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "5257:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "name": "SigningRequest", - "nodeType": "StructDefinition", - "scope": 1568, - "src": "5060:227:2", - "visibility": "public" - }, - { - "constant": false, - "id": 266, - "name": "signingRequest", - "nodeType": "VariableDeclaration", - "scope": 1568, - "src": "5292:38:2", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest" - }, - "typeName": { - "contractScope": null, - "id": 265, - "name": "SigningRequest", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 264, - "src": "5292:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage_ptr", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest" - } - }, - "value": null, - "visibility": "internal" - }, - { - "body": { - "id": 295, - "nodeType": "Block", - "src": "5521:335:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 273, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 270, - "name": "numberOfGroups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1406, - "src": "5539:14:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", - "typeString": "function () view returns (uint256)" - } - }, - "id": 271, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5539:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 272, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "5559:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "5539:21:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "47726f757073206578697374", - "id": 274, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "5562:14:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_d29dcd61fb1ec8d7aeab0b64bb7a74769b4d6787b62f3ba7c3958cb51f8f3580", - "typeString": "literal_string \"Groups exist\"" - }, - "value": "Groups exist" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_d29dcd61fb1ec8d7aeab0b64bb7a74769b4d6787b62f3ba7c3958cb51f8f3580", - "typeString": "literal_string \"Groups exist\"" - } - ], - "id": 269, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "5531:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 275, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5531:46:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 276, - "nodeType": "ExpressionStatement", - "src": "5531:46:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 287, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 277, - "name": "groupSelectionStarterContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 251, - "src": "5693:29:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 279, - "name": "serviceContracts", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 197, - "src": "5741:16:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage", - "typeString": "address[] storage ref" - } - }, - "id": 285, - "indexExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "31", - "id": 283, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "5786:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - }, - "value": "1" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 280, - "name": "serviceContracts", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 197, - "src": "5758:16:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage", - "typeString": "address[] storage ref" - } - }, - "id": 281, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "length", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "5758:23:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 282, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "5758:27:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 284, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5758:30:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "5741:48:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 278, - "name": "ServiceContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 135, - "src": "5725:15:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_ServiceContract_$135_$", - "typeString": "type(contract ServiceContract)" - } - }, - "id": 286, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5725:65:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - } - }, - "src": "5693:97:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - } - }, - "id": 288, - "nodeType": "ExpressionStatement", - "src": "5693:97:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 290, - "name": "_genesisGroupSeed", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 249, - "src": "5820:17:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 291, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "5839:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 292, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "5839:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 289, - "name": "startGroupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 552, - "src": "5800:19:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_uint256_$returns$__$", - "typeString": "function (uint256,uint256)" - } - }, - "id": 293, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5800:49:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 294, - "nodeType": "ExpressionStatement", - "src": "5800:49:2" - } - ] - }, - "documentation": "@dev Triggers the first group selection. Genesis can be called only when\nthere are no groups on the operator contract.", - "id": 296, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "genesis", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 267, - "nodeType": "ParameterList", - "parameters": [], - "src": "5503:2:2" - }, - "returnParameters": { - "id": 268, - "nodeType": "ParameterList", - "parameters": [], - "src": "5521:0:2" - }, - "scope": 1568, - "src": "5487:369:2", - "stateMutability": "payable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 307, - "nodeType": "Block", - "src": "5965:83:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 302, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 299, - "name": "owner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 194, - "src": "5983:5:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 300, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "5992:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 301, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "5992:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "src": "5983:19:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "43616c6c6572206973206e6f7420746865206f776e6572", - "id": 303, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6004:25:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_15ed5034391ed5ef65b8bb8dbcb08f9b6c4034ebcf89f76344a17e1651e92b33", - "typeString": "literal_string \"Caller is not the owner\"" - }, - "value": "Caller is not the owner" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_15ed5034391ed5ef65b8bb8dbcb08f9b6c4034ebcf89f76344a17e1651e92b33", - "typeString": "literal_string \"Caller is not the owner\"" - } - ], - "id": 298, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "5975:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 304, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5975:55:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 305, - "nodeType": "ExpressionStatement", - "src": "5975:55:2" - }, - { - "id": 306, - "nodeType": "PlaceholderStatement", - "src": "6040:1:2" - } - ] - }, - "documentation": "@dev Throws if called by any account other than the owner.", - "id": 308, - "name": "onlyOwner", - "nodeType": "ModifierDefinition", - "parameters": { - "id": 297, - "nodeType": "ParameterList", - "parameters": [], - "src": "5962:2:2" - }, - "src": "5944:104:2", - "visibility": "internal" - }, - { - "body": { - "id": 320, - "nodeType": "Block", - "src": "6145:148:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 313, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "6202:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 314, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "6202:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - ], - "expression": { - "argumentTypes": null, - "id": 311, - "name": "serviceContracts", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 197, - "src": "6176:16:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage", - "typeString": "address[] storage ref" - } - }, - "id": 312, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "contains", - "nodeType": "MemberAccess", - "referencedDeclaration": 10397, - "src": "6176:25:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_array$_t_address_$dyn_memory_ptr_$_t_address_$returns$_t_bool_$bound_to$_t_array$_t_address_$dyn_memory_ptr_$", - "typeString": "function (address[] memory,address) pure returns (bool)" - } - }, - "id": 315, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6176:37:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "43616c6c6572206973206e6f7420616e20617574686f72697a656420636f6e7472616374", - "id": 316, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6227:38:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_278c5ce8365f6a15388fdf8bd669bac1e4324c5ef139bca0eef4ba512f3b8b61", - "typeString": "literal_string \"Caller is not an authorized contract\"" - }, - "value": "Caller is not an authorized contract" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_278c5ce8365f6a15388fdf8bd669bac1e4324c5ef139bca0eef4ba512f3b8b61", - "typeString": "literal_string \"Caller is not an authorized contract\"" - } - ], - "id": 310, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "6155:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 317, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6155:120:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 318, - "nodeType": "ExpressionStatement", - "src": "6155:120:2" - }, - { - "id": 319, - "nodeType": "PlaceholderStatement", - "src": "6285:1:2" - } - ] - }, - "documentation": "@dev Checks if sender is authorized.", - "id": 321, - "name": "onlyServiceContract", - "nodeType": "ModifierDefinition", - "parameters": { - "id": 309, - "nodeType": "ParameterList", - "parameters": [], - "src": "6142:2:2" - }, - "src": "6114:179:2", - "visibility": "internal" - }, - { - "body": { - "id": 411, - "nodeType": "Block", - "src": "6370:866:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 331, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 328, - "name": "owner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 194, - "src": "6380:5:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 329, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "6388:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 330, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "6388:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "src": "6380:18:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 332, - "nodeType": "ExpressionStatement", - "src": "6380:18:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 336, - "name": "_serviceContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 323, - "src": "6431:16:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "id": 333, - "name": "serviceContracts", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 197, - "src": "6409:16:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage", - "typeString": "address[] storage ref" - } - }, - "id": 335, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "push", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "6409:21:2", - "typeDescriptions": { - "typeIdentifier": "t_function_arraypush_nonpayable$_t_address_$returns$_t_uint256_$", - "typeString": "function (address) returns (uint256)" - } - }, - "id": 337, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6409:39:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 338, - "nodeType": "ExpressionStatement", - "src": "6409:39:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 343, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 339, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "6458:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 341, - "name": "_stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 325, - "src": "6489:16:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 340, - "name": "TokenStaking", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5649, - "src": "6476:12:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_TokenStaking_$5649_$", - "typeString": "type(contract TokenStaking)" - } - }, - "id": 342, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6476:30:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "src": "6458:48:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 344, - "nodeType": "ExpressionStatement", - "src": "6458:48:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 351, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 345, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "6517:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 347, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "stakingContract", - "nodeType": "MemberAccess", - "referencedDeclaration": 8191, - "src": "6517:22:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 349, - "name": "_stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 325, - "src": "6555:16:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 348, - "name": "TokenStaking", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5649, - "src": "6542:12:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_TokenStaking_$5649_$", - "typeString": "type(contract TokenStaking)" - } - }, - "id": 350, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6542:30:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "src": "6517:55:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 352, - "nodeType": "ExpressionStatement", - "src": "6517:55:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 361, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 353, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "6582:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 355, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "groupActiveTime", - "nodeType": "MemberAccess", - "referencedDeclaration": 8170, - "src": "6582:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 357, - "name": "_stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 325, - "src": "6620:16:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 356, - "name": "TokenStaking", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5649, - "src": "6607:12:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_TokenStaking_$5649_$", - "typeString": "type(contract TokenStaking)" - } - }, - "id": 358, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6607:30:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 359, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "undelegationPeriod", - "nodeType": "MemberAccess", - "referencedDeclaration": 3305, - "src": "6607:49:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$", - "typeString": "function () view external returns (uint256)" - } - }, - "id": 360, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6607:51:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "6582:76:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 362, - "nodeType": "ExpressionStatement", - "src": "6582:76:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 367, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 363, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "6669:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 365, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "ticketSubmissionTimeout", - "nodeType": "MemberAccess", - "referencedDeclaration": 7191, - "src": "6669:38:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "hexValue": "3132", - "id": 366, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6710:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_12_by_1", - "typeString": "int_const 12" - }, - "value": "12" - }, - "src": "6669:43:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 368, - "nodeType": "ExpressionStatement", - "src": "6669:43:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 373, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 369, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "6722:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 371, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "groupSize", - "nodeType": "MemberAccess", - "referencedDeclaration": 7201, - "src": "6722:24:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "id": 372, - "name": "groupSize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 212, - "src": "6749:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "6722:36:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 374, - "nodeType": "ExpressionStatement", - "src": "6722:36:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 391, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 375, - "name": "dkgResultVerification", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 192, - "src": "6769:21:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$6983_storage", - "typeString": "struct DKGResultVerification.Storage storage ref" - } - }, - "id": 377, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "timeDKG", - "nodeType": "MemberAccess", - "referencedDeclaration": 6976, - "src": "6769:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_52_by_1", - "typeString": "int_const 52" - }, - "id": 390, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_30_by_1", - "typeString": "int_const 30" - }, - "id": 383, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "hexValue": "35", - "id": 378, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6801:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_5_by_1", - "typeString": "int_const 5" - }, - "value": "5" - }, - "nodeType": "BinaryOperation", - "operator": "*", - "rightExpression": { - "argumentTypes": null, - "components": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_6_by_1", - "typeString": "int_const 6" - }, - "id": 381, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "hexValue": "31", - "id": 379, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6804:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - }, - "value": "1" - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "hexValue": "35", - "id": 380, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6806:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_5_by_1", - "typeString": "int_const 5" - }, - "value": "5" - }, - "src": "6804:3:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_6_by_1", - "typeString": "int_const 6" - } - } - ], - "id": 382, - "isConstant": false, - "isInlineArray": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "TupleExpression", - "src": "6803:5:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_6_by_1", - "typeString": "int_const 6" - } - }, - "src": "6801:7:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_30_by_1", - "typeString": "int_const 30" - } - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_22_by_1", - "typeString": "int_const 22" - }, - "id": 389, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "hexValue": "32", - "id": 384, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6811:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_2_by_1", - "typeString": "int_const 2" - }, - "value": "2" - }, - "nodeType": "BinaryOperation", - "operator": "*", - "rightExpression": { - "argumentTypes": null, - "components": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_11_by_1", - "typeString": "int_const 11" - }, - "id": 387, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "hexValue": "31", - "id": 385, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6814:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - }, - "value": "1" - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "hexValue": "3130", - "id": 386, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6816:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_10_by_1", - "typeString": "int_const 10" - }, - "value": "10" - }, - "src": "6814:4:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_11_by_1", - "typeString": "int_const 11" - } - } - ], - "id": 388, - "isConstant": false, - "isInlineArray": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "TupleExpression", - "src": "6813:6:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_11_by_1", - "typeString": "int_const 11" - } - }, - "src": "6811:8:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_22_by_1", - "typeString": "int_const 22" - } - }, - "src": "6801:18:2", - "typeDescriptions": { - "typeIdentifier": "t_rational_52_by_1", - "typeString": "int_const 52" - } - }, - "src": "6769:50:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 392, - "nodeType": "ExpressionStatement", - "src": "6769:50:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 397, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 393, - "name": "dkgResultVerification", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 192, - "src": "6829:21:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$6983_storage", - "typeString": "struct DKGResultVerification.Storage storage ref" - } - }, - "id": 395, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "resultPublicationBlockStep", - "nodeType": "MemberAccess", - "referencedDeclaration": 6978, - "src": "6829:48:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "id": 396, - "name": "resultPublicationBlockStep", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 218, - "src": "6880:26:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "6829:77:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 398, - "nodeType": "ExpressionStatement", - "src": "6829:77:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 403, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 399, - "name": "dkgResultVerification", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 192, - "src": "6916:21:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$6983_storage", - "typeString": "struct DKGResultVerification.Storage storage ref" - } - }, - "id": 401, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "groupSize", - "nodeType": "MemberAccess", - "referencedDeclaration": 6980, - "src": "6916:31:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "id": 402, - "name": "groupSize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 212, - "src": "6950:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "6916:43:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 404, - "nodeType": "ExpressionStatement", - "src": "6916:43:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 409, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 405, - "name": "dkgResultVerification", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 192, - "src": "7172:21:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$6983_storage", - "typeString": "struct DKGResultVerification.Storage storage ref" - } - }, - "id": 407, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "signatureThreshold", - "nodeType": "MemberAccess", - "referencedDeclaration": 6982, - "src": "7172:40:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "id": 408, - "name": "groupThreshold", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 215, - "src": "7215:14:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "7172:57:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 410, - "nodeType": "ExpressionStatement", - "src": "7172:57:2" - } - ] - }, - "documentation": null, - "id": 412, - "implemented": true, - "kind": "constructor", - "modifiers": [], - "name": "", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 326, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 323, - "name": "_serviceContract", - "nodeType": "VariableDeclaration", - "scope": 412, - "src": "6311:24:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 322, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "6311:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 325, - "name": "_stakingContract", - "nodeType": "VariableDeclaration", - "scope": 412, - "src": "6337:24:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 324, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "6337:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "6310:52:2" - }, - "returnParameters": { - "id": 327, - "nodeType": "ParameterList", - "parameters": [], - "src": "6370:0:2" - }, - "scope": 1568, - "src": "6299:937:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 425, - "nodeType": "Block", - "src": "7425:55:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 422, - "name": "serviceContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 414, - "src": "7457:15:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "id": 419, - "name": "serviceContracts", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 197, - "src": "7435:16:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage", - "typeString": "address[] storage ref" - } - }, - "id": 421, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "push", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "7435:21:2", - "typeDescriptions": { - "typeIdentifier": "t_function_arraypush_nonpayable$_t_address_$returns$_t_uint256_$", - "typeString": "function (address) returns (uint256)" - } - }, - "id": 423, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "7435:38:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 424, - "nodeType": "ExpressionStatement", - "src": "7435:38:2" - } - ] - }, - "documentation": "@dev Adds service contract\n@param serviceContract Address of the service contract.", - "id": 426, - "implemented": true, - "kind": "function", - "modifiers": [ - { - "arguments": null, - "id": 417, - "modifierName": { - "argumentTypes": null, - "id": 416, - "name": "onlyOwner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 308, - "src": "7415:9:2", - "typeDescriptions": { - "typeIdentifier": "t_modifier$__$", - "typeString": "modifier ()" - } - }, - "nodeType": "ModifierInvocation", - "src": "7415:9:2" - } - ], - "name": "addServiceContract", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 415, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 414, - "name": "serviceContract", - "nodeType": "VariableDeclaration", - "scope": 426, - "src": "7383:23:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 413, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "7383:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "7382:25:2" - }, - "returnParameters": { - "id": 418, - "nodeType": "ParameterList", - "parameters": [], - "src": "7425:0:2" - }, - "scope": 1568, - "src": "7355:125:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 439, - "nodeType": "Block", - "src": "7675:64:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 436, - "name": "serviceContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 428, - "src": "7716:15:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "id": 433, - "name": "serviceContracts", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 197, - "src": "7685:16:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage", - "typeString": "address[] storage ref" - } - }, - "id": 435, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "removeAddress", - "nodeType": "MemberAccess", - "referencedDeclaration": 10464, - "src": "7685:30:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_array$_t_address_$dyn_storage_ptr_$_t_address_$returns$_t_array$_t_address_$dyn_storage_ptr_$bound_to$_t_array$_t_address_$dyn_storage_ptr_$", - "typeString": "function (address[] storage pointer,address) returns (address[] storage pointer)" - } - }, - "id": 437, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "7685:47:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[] storage pointer" - } - }, - "id": 438, - "nodeType": "ExpressionStatement", - "src": "7685:47:2" - } - ] - }, - "documentation": "@dev Removes service contract\n@param serviceContract Address of the service contract.", - "id": 440, - "implemented": true, - "kind": "function", - "modifiers": [ - { - "arguments": null, - "id": 431, - "modifierName": { - "argumentTypes": null, - "id": 430, - "name": "onlyOwner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 308, - "src": "7665:9:2", - "typeDescriptions": { - "typeIdentifier": "t_modifier$__$", - "typeString": "modifier ()" - } - }, - "nodeType": "ModifierInvocation", - "src": "7665:9:2" - } - ], - "name": "removeServiceContract", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 429, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 428, - "name": "serviceContract", - "nodeType": "VariableDeclaration", - "scope": 440, - "src": "7633:23:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 427, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "7633:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "7632:25:2" - }, - "returnParameters": { - "id": 432, - "nodeType": "ParameterList", - "parameters": [], - "src": "7675:0:2" - }, - "scope": 1568, - "src": "7602:137:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 490, - "nodeType": "Block", - "src": "8087:504:2", - "statements": [ - { - "assignments": [ - 450 - ], - "declarations": [ - { - "constant": false, - "id": 450, - "name": "groupSelectionStartFee", - "nodeType": "VariableDeclaration", - "scope": 490, - "src": "8097:30:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 449, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "8097:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 455, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 453, - "name": "gasPriceCeiling", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 209, - "src": "8160:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 451, - "name": "groupSelectionGasEstimate", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 242, - "src": "8130:25:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 452, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "8130:29:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 454, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8130:46:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "8097:79:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 461, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 456, - "name": "groupSelectionStarterContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 251, - "src": "8187:29:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 458, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "8235:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 459, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "8235:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - ], - "id": 457, - "name": "ServiceContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 135, - "src": "8219:15:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_ServiceContract_$135_$", - "typeString": "type(contract ServiceContract)" - } - }, - "id": 460, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8219:27:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - } - }, - "src": "8187:59:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - } - }, - "id": 462, - "nodeType": "ExpressionStatement", - "src": "8187:59:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 464, - "name": "_newEntry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 442, - "src": "8276:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 468, - "name": "groupSelectionStartFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 450, - "src": "8301:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 465, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "8287:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 466, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "8287:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 467, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "8287:13:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 469, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8287:37:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 463, - "name": "startGroupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 552, - "src": "8256:19:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_uint256_$returns$__$", - "typeString": "function (uint256,uint256)" - } - }, - "id": 470, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8256:69:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 471, - "nodeType": "ExpressionStatement", - "src": "8256:69:2" - }, - { - "assignments": [ - 473, - null - ], - "declarations": [ - { - "constant": false, - "id": 473, - "name": "success", - "nodeType": "VariableDeclaration", - "scope": 490, - "src": "8403:12:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 472, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "8403:4:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - }, - null - ], - "id": 484, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "", - "id": 482, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "8492:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - }, - "value": "" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - } - ], - "arguments": [ - { - "argumentTypes": null, - "id": 480, - "name": "groupSelectionStartFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 450, - "src": "8468:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 476, - "name": "submitter", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 444, - "src": "8446:9:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - ], - "expression": { - "argumentTypes": null, - "id": 474, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "8421:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 475, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "beneficiaryOf", - "nodeType": "MemberAccess", - "referencedDeclaration": 3394, - "src": "8421:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_address_payable_$", - "typeString": "function (address) view external returns (address payable)" - } - }, - "id": 477, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8421:35:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "id": 478, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "call", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "8421:40:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 479, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "8421:46:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value_$", - "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" - } - }, - "id": 481, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8421:70:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 483, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8421:74:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "tuple(bool,bytes memory)" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "8402:93:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 486, - "name": "success", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 473, - "src": "8513:7:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4661696c6564207265696d62757273696e67207375626d697474657220666f72207374617274696e6720612067726f75702073656c656374696f6e", - "id": 487, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "8522:61:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_de0664998b1e1c3284c50a4b9d4003aa650e28854fc84b775da409a7f7eb9746", - "typeString": "literal_string \"Failed reimbursing submitter for starting a group selection\"" - }, - "value": "Failed reimbursing submitter for starting a group selection" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_de0664998b1e1c3284c50a4b9d4003aa650e28854fc84b775da409a7f7eb9746", - "typeString": "literal_string \"Failed reimbursing submitter for starting a group selection\"" - } - ], - "id": 485, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "8505:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 488, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8505:79:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 489, - "nodeType": "ExpressionStatement", - "src": "8505:79:2" - } - ] - }, - "documentation": "@dev Triggers the selection process of a new candidate group.\n@param _newEntry New random beacon value that stakers will use to\ngenerate their tickets.\n@param submitter Operator of this contract.", - "id": 491, - "implemented": true, - "kind": "function", - "modifiers": [ - { - "arguments": null, - "id": 447, - "modifierName": { - "argumentTypes": null, - "id": 446, - "name": "onlyServiceContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 321, - "src": "8067:19:2", - "typeDescriptions": { - "typeIdentifier": "t_modifier$__$", - "typeString": "modifier ()" - } - }, - "nodeType": "ModifierInvocation", - "src": "8067:19:2" - } - ], - "name": "createGroup", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 445, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 442, - "name": "_newEntry", - "nodeType": "VariableDeclaration", - "scope": 491, - "src": "8006:17:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 441, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "8006:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 444, - "name": "submitter", - "nodeType": "VariableDeclaration", - "scope": 491, - "src": "8025:25:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - "typeName": { - "id": 443, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "8025:15:2", - "stateMutability": "payable", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "8005:46:2" - }, - "returnParameters": { - "id": 448, - "nodeType": "ParameterList", - "parameters": [], - "src": "8087:0:2" - }, - "scope": 1568, - "src": "7985:606:2", - "stateMutability": "payable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 551, - "nodeType": "Block", - "src": "8672:704:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 504, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 499, - "name": "_payment", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 495, - "src": "8703:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">=", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 502, - "name": "dkgGasEstimate", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 239, - "src": "8735:14:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 500, - "name": "gasPriceCeiling", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 209, - "src": "8715:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 501, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "8715:19:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 503, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8715:35:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "8703:47:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "496e73756666696369656e7420444b4720666565", - "id": 505, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "8764:22:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_1755164d4245fc7da9d20df1bcbc3b7e73c6c16b21ce54fe6af632e55665d42e", - "typeString": "literal_string \"Insufficient DKG fee\"" - }, - "value": "Insufficient DKG fee" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_1755164d4245fc7da9d20df1bcbc3b7e73c6c16b21ce54fe6af632e55665d42e", - "typeString": "literal_string \"Insufficient DKG fee\"" - } - ], - "id": 498, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "8682:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 506, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8682:114:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 507, - "nodeType": "ExpressionStatement", - "src": "8682:114:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 509, - "name": "isGroupSelectionPossible", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 585, - "src": "8815:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$", - "typeString": "function () view returns (bool)" - } - }, - "id": 510, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8815:26:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "47726f75702073656c656374696f6e20696e2070726f6772657373", - "id": 511, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "8843:29:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_430f53fb41bac762d470327dd7fd8fd9bbdc99966be3725b3cdbe88946a541eb", - "typeString": "literal_string \"Group selection in progress\"" - }, - "value": "Group selection in progress" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_430f53fb41bac762d470327dd7fd8fd9bbdc99966be3725b3cdbe88946a541eb", - "typeString": "literal_string \"Group selection in progress\"" - } - ], - "id": 508, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "8807:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 512, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8807:66:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 513, - "nodeType": "ExpressionStatement", - "src": "8807:66:2" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 516, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 514, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 244, - "src": "9008:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 515, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "9039:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "9008:32:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 536, - "nodeType": "IfStatement", - "src": "9004:228:2", - "trueBody": { - "id": 535, - "nodeType": "Block", - "src": "9042:190:2", - "statements": [ - { - "assignments": [ - 518 - ], - "declarations": [ - { - "constant": false, - "id": 518, - "name": "surplus", - "nodeType": "VariableDeclaration", - "scope": 535, - "src": "9056:15:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 517, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "9056:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 520, - "initialValue": { - "argumentTypes": null, - "id": 519, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 244, - "src": "9074:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "9056:46:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 523, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 521, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 244, - "src": "9116:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "hexValue": "30", - "id": 522, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "9147:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "9116:32:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 524, - "nodeType": "ExpressionStatement", - "src": "9116:32:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "arguments": [ - { - "argumentTypes": null, - "id": 531, - "name": "surplus", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 518, - "src": "9211:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 526, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "9178:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 527, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "9178:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - ], - "id": 525, - "name": "ServiceContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 135, - "src": "9162:15:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_ServiceContract_$135_$", - "typeString": "type(contract ServiceContract)" - } - }, - "id": 528, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9162:27:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - } - }, - "id": 529, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "fundDkgFeePool", - "nodeType": "MemberAccess", - "referencedDeclaration": 134, - "src": "9162:42:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_payable$__$returns$__$", - "typeString": "function () payable external" - } - }, - "id": 530, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "9162:48:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_external_payable$__$returns$__$value_$", - "typeString": "function (uint256) pure returns (function () payable external)" - } - }, - "id": 532, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9162:57:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_payable$__$returns$__$value", - "typeString": "function () payable external" - } - }, - "id": 533, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9162:59:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 534, - "nodeType": "ExpressionStatement", - "src": "9162:59:2" - } - ] - } - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 540, - "name": "_newEntry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 493, - "src": "9263:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 537, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "9242:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 539, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "start", - "nodeType": "MemberAccess", - "referencedDeclaration": 7233, - "src": "9242:20:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_nonpayable$_t_struct$_Storage_$7202_storage_ptr_$_t_uint256_$returns$__$bound_to$_t_struct$_Storage_$7202_storage_ptr_$", - "typeString": "function (struct GroupSelection.Storage storage pointer,uint256)" - } - }, - "id": 541, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9242:31:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 542, - "nodeType": "ExpressionStatement", - "src": "9242:31:2" - }, - { - "eventCall": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 544, - "name": "_newEntry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 493, - "src": "9310:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 543, - "name": "GroupSelectionStarted", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 176, - "src": "9288:21:2", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$", - "typeString": "function (uint256)" - } - }, - "id": 545, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9288:32:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 546, - "nodeType": "EmitStatement", - "src": "9283:37:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 549, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 547, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 244, - "src": "9330:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "id": 548, - "name": "_payment", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 495, - "src": "9361:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "9330:39:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 550, - "nodeType": "ExpressionStatement", - "src": "9330:39:2" - } - ] - }, - "documentation": null, - "id": 552, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "startGroupSelection", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 496, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 493, - "name": "_newEntry", - "nodeType": "VariableDeclaration", - "scope": 552, - "src": "8626:17:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 492, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "8626:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 495, - "name": "_payment", - "nodeType": "VariableDeclaration", - "scope": 552, - "src": "8645:16:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 494, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "8645:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "8625:37:2" - }, - "returnParameters": { - "id": 497, - "nodeType": "ParameterList", - "parameters": [], - "src": "8672:0:2" - }, - "scope": 1568, - "src": "8597:779:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 584, - "nodeType": "Block", - "src": "9445:485:2", - "statements": [ - { - "condition": { - "argumentTypes": null, - "id": 559, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "UnaryOperation", - "operator": "!", - "prefix": true, - "src": "9459:26:2", - "subExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 557, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "9460:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 558, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "inProgress", - "nodeType": "MemberAccess", - "referencedDeclaration": 7195, - "src": "9460:25:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 563, - "nodeType": "IfStatement", - "src": "9455:68:2", - "trueBody": { - "id": 562, - "nodeType": "Block", - "src": "9487:36:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "hexValue": "74727565", - "id": 560, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "bool", - "lValueRequested": false, - "nodeType": "Literal", - "src": "9508:4:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "value": "true" - }, - "functionReturnParameters": 556, - "id": 561, - "nodeType": "Return", - "src": "9501:11:2" - } - ] - } - }, - { - "assignments": [ - 565 - ], - "declarations": [ - { - "constant": false, - "id": 565, - "name": "dkgTimeout", - "nodeType": "VariableDeclaration", - "scope": 584, - "src": "9680:18:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 564, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "9680:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 578, - "initialValue": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 577, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 573, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 570, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 566, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "9701:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 567, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "ticketSubmissionStartBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 7193, - "src": "9701:41:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 568, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "9753:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 569, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "ticketSubmissionTimeout", - "nodeType": "MemberAccess", - "referencedDeclaration": 7191, - "src": "9753:38:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "9701:90:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 571, - "name": "dkgResultVerification", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 192, - "src": "9802:21:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$6983_storage", - "typeString": "struct DKGResultVerification.Storage storage ref" - } - }, - "id": 572, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "timeDKG", - "nodeType": "MemberAccess", - "referencedDeclaration": 6976, - "src": "9802:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "9701:130:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 576, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 574, - "name": "groupSize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 212, - "src": "9842:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "*", - "rightExpression": { - "argumentTypes": null, - "id": 575, - "name": "resultPublicationBlockStep", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 218, - "src": "9854:26:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "9842:38:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "9701:179:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "9680:200:2" - }, - { - "expression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 582, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 579, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "9898:5:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 580, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "9898:12:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "id": 581, - "name": "dkgTimeout", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 565, - "src": "9913:10:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "9898:25:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "functionReturnParameters": 556, - "id": 583, - "nodeType": "Return", - "src": "9891:32:2" - } - ] - }, - "documentation": null, - "id": 585, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "isGroupSelectionPossible", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 553, - "nodeType": "ParameterList", - "parameters": [], - "src": "9415:2:2" - }, - "returnParameters": { - "id": 556, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 555, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 585, - "src": "9439:4:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 554, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "9439:4:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "9438:6:2" - }, - "scope": 1568, - "src": "9382:548:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 617, - "nodeType": "Block", - "src": "10683:238:2", - "statements": [ - { - "assignments": [ - 591 - ], - "declarations": [ - { - "constant": false, - "id": 591, - "name": "minimumStake", - "nodeType": "VariableDeclaration", - "scope": 617, - "src": "10693:20:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 590, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "10693:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 595, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 592, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "10716:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 593, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "minimumStake", - "nodeType": "MemberAccess", - "referencedDeclaration": 4728, - "src": "10716:28:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$", - "typeString": "function () view external returns (uint256)" - } - }, - "id": 594, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10716:30:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "10693:53:2" - }, - { - "assignments": [ - 597 - ], - "declarations": [ - { - "constant": false, - "id": 597, - "name": "stakingWeight", - "nodeType": "VariableDeclaration", - "scope": 617, - "src": "10756:21:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 596, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "10756:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 609, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 607, - "name": "minimumStake", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 591, - "src": "10841:12:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 600, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "10810:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 601, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "10810:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 603, - "name": "this", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12868, - "src": "10830:4:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_KeepRandomBeaconOperator_$1568", - "typeString": "contract KeepRandomBeaconOperator" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_contract$_KeepRandomBeaconOperator_$1568", - "typeString": "contract KeepRandomBeaconOperator" - } - ], - "id": 602, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "10822:7:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": "address" - }, - "id": 604, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10822:13:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "id": 598, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "10780:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 599, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "eligibleStake", - "nodeType": "MemberAccess", - "referencedDeclaration": 5579, - "src": "10780:29:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$", - "typeString": "function (address,address) view external returns (uint256)" - } - }, - "id": 605, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10780:56:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 606, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "div", - "nodeType": "MemberAccess", - "referencedDeclaration": 11877, - "src": "10780:60:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 608, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10780:74:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "10756:98:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 613, - "name": "ticket", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 587, - "src": "10892:6:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - { - "argumentTypes": null, - "id": 614, - "name": "stakingWeight", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 597, - "src": "10900:13:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 610, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "10864:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 612, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "submitTicket", - "nodeType": "MemberAccess", - "referencedDeclaration": 7292, - "src": "10864:27:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_nonpayable$_t_struct$_Storage_$7202_storage_ptr_$_t_bytes32_$_t_uint256_$returns$__$bound_to$_t_struct$_Storage_$7202_storage_ptr_$", - "typeString": "function (struct GroupSelection.Storage storage pointer,bytes32,uint256)" - } - }, - "id": 615, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10864:50:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 616, - "nodeType": "ExpressionStatement", - "src": "10864:50:2" - } - ] - }, - "documentation": "@dev Submits ticket to request to participate in a new candidate group.\n@param ticket Bytes representation of a ticket that holds the following:\n- ticketValue: first 8 bytes of a result of keccak256 cryptography hash\n function on the combination of the group selection seed (previous\n beacon output), staker-specific value (address) and virtual staker index.\n- stakerValue: a staker-specific value which is the address of the staker.\n- virtualStakerIndex: 4-bytes number within a range of 1 to staker's weight;\n has to be unique for all tickets submitted by the given staker for the\n current candidate group selection.", - "id": 618, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "submitTicket", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 588, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 587, - "name": "ticket", - "nodeType": "VariableDeclaration", - "scope": 618, - "src": "10660:14:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 586, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "10660:7:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "10659:16:2" - }, - "returnParameters": { - "id": 589, - "nodeType": "ParameterList", - "parameters": [], - "src": "10683:0:2" - }, - "scope": 1568, - "src": "10638:283:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 626, - "nodeType": "Block", - "src": "11113:62:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 623, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "11130:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 624, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "ticketSubmissionTimeout", - "nodeType": "MemberAccess", - "referencedDeclaration": 7191, - "src": "11130:38:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 622, - "id": 625, - "nodeType": "Return", - "src": "11123:45:2" - } - ] - }, - "documentation": "@dev Gets the timeout in blocks after which group candidate ticket\nsubmission is finished.", - "id": 627, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "ticketSubmissionTimeout", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 619, - "nodeType": "ParameterList", - "parameters": [], - "src": "11080:2:2" - }, - "returnParameters": { - "id": 622, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 621, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 627, - "src": "11104:7:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 620, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "11104:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "11103:9:2" - }, - "scope": 1568, - "src": "11048:127:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 636, - "nodeType": "Block", - "src": "11333:53:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 632, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "11350:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 633, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "tickets", - "nodeType": "MemberAccess", - "referencedDeclaration": 7183, - "src": "11350:22:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint64_$dyn_storage", - "typeString": "uint64[] storage ref" - } - }, - "id": 634, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "length", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "11350:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 631, - "id": 635, - "nodeType": "Return", - "src": "11343:36:2" - } - ] - }, - "documentation": "@dev Gets the number of submitted group candidate tickets so far.", - "id": 637, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "submittedTicketsCount", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 628, - "nodeType": "ParameterList", - "parameters": [], - "src": "11300:2:2" - }, - "returnParameters": { - "id": 631, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 630, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 637, - "src": "11324:7:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 629, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "11324:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "11323:9:2" - }, - "scope": 1568, - "src": "11270:116:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 647, - "nodeType": "Block", - "src": "11555:61:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 643, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "11572:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 644, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "selectedParticipants", - "nodeType": "MemberAccess", - "referencedDeclaration": 8104, - "src": "11572:35:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_view$_t_struct$_Storage_$7202_storage_ptr_$returns$_t_array$_t_address_$dyn_memory_ptr_$bound_to$_t_struct$_Storage_$7202_storage_ptr_$", - "typeString": "function (struct GroupSelection.Storage storage pointer) view returns (address[] memory)" - } - }, - "id": 645, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11572:37:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - } - }, - "functionReturnParameters": 642, - "id": 646, - "nodeType": "Return", - "src": "11565:44:2" - } - ] - }, - "documentation": "@dev Gets selected participants in ascending order of their tickets.", - "id": 648, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "selectedParticipants", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 638, - "nodeType": "ParameterList", - "parameters": [], - "src": "11513:2:2" - }, - "returnParameters": { - "id": 642, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 641, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 648, - "src": "11537:16:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[]" - }, - "typeName": { - "baseType": { - "id": 639, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "11537:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 640, - "length": null, - "nodeType": "ArrayTypeName", - "src": "11537:9:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[]" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "11536:18:2" - }, - "scope": 1568, - "src": "11484:132:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 711, - "nodeType": "Block", - "src": "12532:594:2", - "statements": [ - { - "assignments": [ - 665 - ], - "declarations": [ - { - "constant": false, - "id": 665, - "name": "members", - "nodeType": "VariableDeclaration", - "scope": 711, - "src": "12542:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[]" - }, - "typeName": { - "baseType": { - "id": 663, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "12542:7:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 664, - "length": null, - "nodeType": "ArrayTypeName", - "src": "12542:9:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[]" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 668, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 666, - "name": "selectedParticipants", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 648, - "src": "12569:20:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_array$_t_address_$dyn_memory_ptr_$", - "typeString": "function () view returns (address[] memory)" - } - }, - "id": 667, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12569:22:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "12542:49:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 672, - "name": "submitterMemberIndex", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 650, - "src": "12644:20:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 673, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 652, - "src": "12678:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "id": 674, - "name": "misbehaved", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 654, - "src": "12703:10:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "id": 675, - "name": "signatures", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 656, - "src": "12727:10:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "id": 676, - "name": "signingMembersIndexes", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 659, - "src": "12751:21:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", - "typeString": "uint256[] memory" - } - }, - { - "argumentTypes": null, - "id": 677, - "name": "members", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 665, - "src": "12786:7:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - } - }, - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 682, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 678, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "12807:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 679, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "ticketSubmissionStartBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 7193, - "src": "12807:41:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 680, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "12851:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 681, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "ticketSubmissionTimeout", - "nodeType": "MemberAccess", - "referencedDeclaration": 7191, - "src": "12851:38:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "12807:82:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", - "typeString": "uint256[] memory" - }, - { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 669, - "name": "dkgResultVerification", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 192, - "src": "12602:21:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$6983_storage", - "typeString": "struct DKGResultVerification.Storage storage ref" - } - }, - "id": 671, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "verify", - "nodeType": "MemberAccess", - "referencedDeclaration": 7169, - "src": "12602:28:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_view$_t_struct$_Storage_$6983_storage_ptr_$_t_uint256_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_address_$dyn_memory_ptr_$_t_uint256_$returns$_t_bool_$bound_to$_t_struct$_Storage_$6983_storage_ptr_$", - "typeString": "function (struct DKGResultVerification.Storage storage pointer,uint256,bytes memory,bytes memory,bytes memory,uint256[] memory,address[] memory,uint256) view returns (bool)" - } - }, - "id": 683, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12602:297:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "id": 684, - "nodeType": "ExpressionStatement", - "src": "12602:297:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 688, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 652, - "src": "12933:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "id": 689, - "name": "members", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 665, - "src": "12946:7:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - } - }, - { - "argumentTypes": null, - "id": 690, - "name": "misbehaved", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 654, - "src": "12955:10:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "expression": { - "argumentTypes": null, - "id": 685, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "12910:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 687, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "setGroupMembers", - "nodeType": "MemberAccess", - "referencedDeclaration": 8286, - "src": "12910:22:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Storage_$8192_storage_ptr_$_t_bytes_memory_ptr_$_t_array$_t_address_$dyn_memory_ptr_$_t_bytes_memory_ptr_$returns$__$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,bytes memory,address[] memory,bytes memory)" - } - }, - "id": 691, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12910:56:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 692, - "nodeType": "ExpressionStatement", - "src": "12910:56:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 696, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 652, - "src": "12992:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "expression": { - "argumentTypes": null, - "id": 693, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "12976:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 695, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "addGroup", - "nodeType": "MemberAccess", - "referencedDeclaration": 8212, - "src": "12976:15:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Storage_$8192_storage_ptr_$_t_bytes_memory_ptr_$returns$__$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,bytes memory)" - } - }, - "id": 697, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12976:28:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 698, - "nodeType": "ExpressionStatement", - "src": "12976:28:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 699, - "name": "reimburseDkgSubmitter", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 805, - "src": "13014:21:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$", - "typeString": "function ()" - } - }, - "id": 700, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "13014:23:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 701, - "nodeType": "ExpressionStatement", - "src": "13014:23:2" - }, - { - "eventCall": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 703, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 652, - "src": "13076:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "id": 702, - "name": "DkgResultPublishedEvent", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 164, - "src": "13052:23:2", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$_t_bytes_memory_ptr_$returns$__$", - "typeString": "function (bytes memory)" - } - }, - "id": 704, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "13052:36:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 705, - "nodeType": "EmitStatement", - "src": "13047:41:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 706, - "name": "groupSelection", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 188, - "src": "13098:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$7202_storage", - "typeString": "struct GroupSelection.Storage storage ref" - } - }, - "id": 708, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "stop", - "nodeType": "MemberAccess", - "referencedDeclaration": 7253, - "src": "13098:19:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_nonpayable$_t_struct$_Storage_$7202_storage_ptr_$returns$__$bound_to$_t_struct$_Storage_$7202_storage_ptr_$", - "typeString": "function (struct GroupSelection.Storage storage pointer)" - } - }, - "id": 709, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "13098:21:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 710, - "nodeType": "ExpressionStatement", - "src": "13098:21:2" - } - ] - }, - "documentation": "@dev Submits result of DKG protocol. It is on-chain part of phase 14 of\nthe protocol.\n * @param submitterMemberIndex Claimed submitter candidate group member index\n@param groupPubKey Generated candidate group public key\n@param misbehaved Bytes array of misbehaved (disqualified or inactive)\ngroup members indexes in ascending order; Indexes reflect positions of\nmembers in the group as outputted by the group selection protocol.\n@param signatures Concatenation of signatures from members supporting the\nresult.\n@param signingMembersIndexes Indices of members corresponding to each\nsignature.", - "id": 712, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "submitDkgResult", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 660, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 650, - "name": "submitterMemberIndex", - "nodeType": "VariableDeclaration", - "scope": 712, - "src": "12345:28:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 649, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "12345:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 652, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 712, - "src": "12383:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 651, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "12383:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 654, - "name": "misbehaved", - "nodeType": "VariableDeclaration", - "scope": 712, - "src": "12417:23:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 653, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "12417:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 656, - "name": "signatures", - "nodeType": "VariableDeclaration", - "scope": 712, - "src": "12450:23:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 655, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "12450:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 659, - "name": "signingMembersIndexes", - "nodeType": "VariableDeclaration", - "scope": 712, - "src": "12483:35:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", - "typeString": "uint256[]" - }, - "typeName": { - "baseType": { - "id": 657, - "name": "uint", - "nodeType": "ElementaryTypeName", - "src": "12483:4:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 658, - "length": null, - "nodeType": "ArrayTypeName", - "src": "12483:6:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", - "typeString": "uint256[]" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "12335:189:2" - }, - "returnParameters": { - "id": 661, - "nodeType": "ParameterList", - "parameters": [], - "src": "12532:0:2" - }, - "scope": 1568, - "src": "12311:815:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 804, - "nodeType": "Block", - "src": "13550:1195:2", - "statements": [ - { - "assignments": [ - 716 - ], - "declarations": [ - { - "constant": false, - "id": 716, - "name": "gasPrice", - "nodeType": "VariableDeclaration", - "scope": 804, - "src": "13560:16:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 715, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "13560:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 718, - "initialValue": { - "argumentTypes": null, - "id": 717, - "name": "gasPriceCeiling", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 209, - "src": "13579:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "13560:34:2" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 727, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 722, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 719, - "name": "tx", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12806, - "src": "13777:2:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_transaction", - "typeString": "tx" - } - }, - "id": 720, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "gasprice", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "13777:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 721, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "13791:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "13777:15:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "&&", - "rightExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 726, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 723, - "name": "tx", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12806, - "src": "13796:2:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_transaction", - "typeString": "tx" - } - }, - "id": 724, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "gasprice", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "13796:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "<", - "rightExpression": { - "argumentTypes": null, - "id": 725, - "name": "gasPriceCeiling", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 209, - "src": "13810:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "13796:29:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "13777:48:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 734, - "nodeType": "IfStatement", - "src": "13773:101:2", - "trueBody": { - "id": 733, - "nodeType": "Block", - "src": "13827:47:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 731, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 728, - "name": "gasPrice", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 716, - "src": "13841:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 729, - "name": "tx", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12806, - "src": "13852:2:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_transaction", - "typeString": "tx" - } - }, - "id": 730, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "gasprice", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "13852:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "13841:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 732, - "nodeType": "ExpressionStatement", - "src": "13841:22:2" - } - ] - } - }, - { - "assignments": [ - 736 - ], - "declarations": [ - { - "constant": false, - "id": 736, - "name": "reimbursementFee", - "nodeType": "VariableDeclaration", - "scope": 804, - "src": "13884:24:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 735, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "13884:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 741, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 739, - "name": "gasPrice", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 716, - "src": "13930:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 737, - "name": "dkgGasEstimate", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 239, - "src": "13911:14:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 738, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "13911:18:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 740, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "13911:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "13884:55:2" - }, - { - "assignments": [ - 743 - ], - "declarations": [ - { - "constant": false, - "id": 743, - "name": "beneficiary", - "nodeType": "VariableDeclaration", - "scope": 804, - "src": "13949:22:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - "typeName": { - "id": 742, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "13949:15:2", - "stateMutability": "payable", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 749, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 746, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "13999:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 747, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "13999:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - ], - "expression": { - "argumentTypes": null, - "id": 744, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "13974:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 745, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "beneficiaryOf", - "nodeType": "MemberAccess", - "referencedDeclaration": 3394, - "src": "13974:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_address_payable_$", - "typeString": "function (address) view external returns (address payable)" - } - }, - "id": 748, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "13974:36:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "13949:61:2" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 752, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 750, - "name": "reimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 736, - "src": "14025:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "<", - "rightExpression": { - "argumentTypes": null, - "id": 751, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 244, - "src": "14044:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "14025:47:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": { - "id": 802, - "nodeType": "Block", - "src": "14469:270:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 786, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 784, - "name": "reimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 736, - "src": "14582:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "id": 785, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 244, - "src": "14601:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "14582:47:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 787, - "nodeType": "ExpressionStatement", - "src": "14582:47:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 790, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 788, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 244, - "src": "14643:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "hexValue": "30", - "id": 789, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "14674:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "14643:32:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 791, - "nodeType": "ExpressionStatement", - "src": "14643:32:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "", - "id": 799, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "14725:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - }, - "value": "" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - } - ], - "arguments": [ - { - "argumentTypes": null, - "id": 797, - "name": "reimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 736, - "src": "14707:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 792, - "name": "beneficiary", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 743, - "src": "14689:6:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "id": 795, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "call", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "14689:11:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 796, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "14689:17:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value_$", - "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" - } - }, - "id": 798, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14689:35:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 800, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14689:39:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "tuple(bool,bytes memory)" - } - }, - "id": 801, - "nodeType": "ExpressionStatement", - "src": "14689:39:2" - } - ] - }, - "id": 803, - "nodeType": "IfStatement", - "src": "14021:718:2", - "trueBody": { - "id": 783, - "nodeType": "Block", - "src": "14074:389:2", - "statements": [ - { - "assignments": [ - 754 - ], - "declarations": [ - { - "constant": false, - "id": 754, - "name": "surplus", - "nodeType": "VariableDeclaration", - "scope": 783, - "src": "14088:15:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 753, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "14088:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 759, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 757, - "name": "reimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 736, - "src": "14139:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 755, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 244, - "src": "14106:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 756, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "14106:32:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 758, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14106:50:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "14088:68:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 762, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 760, - "name": "dkgSubmitterReimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 244, - "src": "14170:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "hexValue": "30", - "id": 761, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "14201:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "14170:32:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 763, - "nodeType": "ExpressionStatement", - "src": "14170:32:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "", - "id": 771, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "14309:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - }, - "value": "" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - } - ], - "arguments": [ - { - "argumentTypes": null, - "id": 769, - "name": "reimbursementFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 736, - "src": "14291:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 764, - "name": "beneficiary", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 743, - "src": "14273:6:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "id": 767, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "call", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "14273:11:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 768, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "14273:17:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value_$", - "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" - } - }, - "id": 770, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14273:35:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 772, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14273:39:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "tuple(bool,bytes memory)" - } - }, - "id": 773, - "nodeType": "ExpressionStatement", - "src": "14273:39:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "arguments": [ - { - "argumentTypes": null, - "id": 779, - "name": "surplus", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 754, - "src": "14442:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 774, - "name": "groupSelectionStarterContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 251, - "src": "14391:29:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ServiceContract_$135", - "typeString": "contract ServiceContract" - } - }, - "id": 777, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "fundDkgFeePool", - "nodeType": "MemberAccess", - "referencedDeclaration": 134, - "src": "14391:44:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_payable$__$returns$__$", - "typeString": "function () payable external" - } - }, - "id": 778, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "14391:50:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_external_payable$__$returns$__$value_$", - "typeString": "function (uint256) pure returns (function () payable external)" - } - }, - "id": 780, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14391:59:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_payable$__$returns$__$value", - "typeString": "function () payable external" - } - }, - "id": 781, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14391:61:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 782, - "nodeType": "ExpressionStatement", - "src": "14391:61:2" - } - ] - } - } - ] - }, - "documentation": "@dev Compare the reimbursement fee calculated based on the current transaction gas\nprice and the current price feed estimate with the DKG reimbursement fee calculated\nand paid at the moment when the DKG was requested. If there is any surplus, it will\nbe returned to the DKG fee pool of the service contract which triggered the DKG.", - "id": 805, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "reimburseDkgSubmitter", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 713, - "nodeType": "ParameterList", - "parameters": [], - "src": "13538:2:2" - }, - "returnParameters": { - "id": 714, - "nodeType": "ParameterList", - "parameters": [], - "src": "13550:0:2" - }, - "scope": 1568, - "src": "13508:1237:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 848, - "nodeType": "Block", - "src": "15151:464:2", - "statements": [ - { - "assignments": [ - 815 - ], - "declarations": [ - { - "constant": false, - "id": 815, - "name": "entryVerificationAndProfitFee", - "nodeType": "VariableDeclaration", - "scope": 848, - "src": "15161:37:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 814, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "15161:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 822, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 819, - "name": "entryVerificationFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1517, - "src": "15235:20:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", - "typeString": "function () view returns (uint256)" - } - }, - "id": 820, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15235:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 816, - "name": "groupProfitFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1354, - "src": "15201:14:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", - "typeString": "function () view returns (uint256)" - } - }, - "id": 817, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15201:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 818, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "15201:20:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 821, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15201:66:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "15161:106:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 827, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 824, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "15298:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 825, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "15298:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">=", - "rightExpression": { - "argumentTypes": null, - "id": 826, - "name": "entryVerificationAndProfitFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 815, - "src": "15311:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "15298:42:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "496e73756666696369656e74206e657720656e74727920666565", - "id": 828, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "15354:28:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_3a2e6ba6db2483144e18f6a2e8cdf217fbe337d442230bd5edaf68f424e9dbc5", - "typeString": "literal_string \"Insufficient new entry fee\"" - }, - "value": "Insufficient new entry fee" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_3a2e6ba6db2483144e18f6a2e8cdf217fbe337d442230bd5edaf68f424e9dbc5", - "typeString": "literal_string \"Insufficient new entry fee\"" - } - ], - "id": 823, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "15277:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 829, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15277:115:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 830, - "nodeType": "ExpressionStatement", - "src": "15277:115:2" - }, - { - "assignments": [ - 832 - ], - "declarations": [ - { - "constant": false, - "id": 832, - "name": "callbackFee", - "nodeType": "VariableDeclaration", - "scope": 848, - "src": "15402:19:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 831, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "15402:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 838, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 836, - "name": "entryVerificationAndProfitFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 815, - "src": "15438:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 833, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "15424:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 834, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "15424:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 835, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "15424:13:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 837, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15424:44:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "15402:66:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 840, - "name": "requestId", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 807, - "src": "15506:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 841, - "name": "previousEntry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 809, - "src": "15517:13:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 842, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "15532:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 843, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "15532:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - { - "argumentTypes": null, - "id": 844, - "name": "entryVerificationAndProfitFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 815, - "src": "15556:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 845, - "name": "callbackFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 832, - "src": "15587:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 839, - "name": "signRelayEntry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 912, - "src": "15478:14:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_bytes_memory_ptr_$_t_address_$_t_uint256_$_t_uint256_$returns$__$", - "typeString": "function (uint256,bytes memory,address,uint256,uint256)" - } - }, - "id": 846, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15478:130:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 847, - "nodeType": "ExpressionStatement", - "src": "15478:130:2" - } - ] - }, - "documentation": "@dev Creates a request to generate a new relay entry, which will include a\nrandom number (by signing the previous entry's random number).\n@param requestId Request Id trackable by service contract\n@param previousEntry Previous relay entry", - "id": 849, - "implemented": true, - "kind": "function", - "modifiers": [ - { - "arguments": null, - "id": 812, - "modifierName": { - "argumentTypes": null, - "id": 811, - "name": "onlyServiceContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 321, - "src": "15131:19:2", - "typeDescriptions": { - "typeIdentifier": "t_modifier$__$", - "typeString": "modifier ()" - } - }, - "nodeType": "ModifierInvocation", - "src": "15131:19:2" - } - ], - "name": "sign", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 810, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 807, - "name": "requestId", - "nodeType": "VariableDeclaration", - "scope": 849, - "src": "15056:17:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 806, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "15056:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 809, - "name": "previousEntry", - "nodeType": "VariableDeclaration", - "scope": 849, - "src": "15083:26:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 808, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "15083:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "15046:69:2" - }, - "returnParameters": { - "id": 813, - "nodeType": "ParameterList", - "parameters": [], - "src": "15151:0:2" - }, - "scope": 1568, - "src": "15033:582:2", - "stateMutability": "payable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 911, - "nodeType": "Block", - "src": "15832:577:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 868, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 865, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "UnaryOperation", - "operator": "!", - "prefix": true, - "src": "15850:20:2", - "subExpression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 863, - "name": "isEntryInProgress", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1282, - "src": "15851:17:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$", - "typeString": "function () view returns (bool)" - } - }, - "id": 864, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15851:19:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "||", - "rightExpression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 866, - "name": "hasEntryTimedOut", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1299, - "src": "15874:16:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$", - "typeString": "function () view returns (bool)" - } - }, - "id": 867, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15874:18:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "15850:42:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "426561636f6e2069732062757379", - "id": 869, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "15894:16:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_b7c992ba21bf3b13f04a54cda27e6329581aa6aee9f0eaeda22bd23be2185cfb", - "typeString": "literal_string \"Beacon is busy\"" - }, - "value": "Beacon is busy" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_b7c992ba21bf3b13f04a54cda27e6329581aa6aee9f0eaeda22bd23be2185cfb", - "typeString": "literal_string \"Beacon is busy\"" - } - ], - "id": 862, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "15842:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 870, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15842:69:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 871, - "nodeType": "ExpressionStatement", - "src": "15842:69:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 875, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 872, - "name": "currentEntryStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 246, - "src": "15922:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 873, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "15947:5:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 874, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "15947:12:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "15922:37:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 876, - "nodeType": "ExpressionStatement", - "src": "15922:37:2" - }, - { - "assignments": [ - 878 - ], - "declarations": [ - { - "constant": false, - "id": 878, - "name": "groupIndex", - "nodeType": "VariableDeclaration", - "scope": 911, - "src": "15970:18:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 877, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "15970:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 887, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 883, - "name": "previousEntry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 853, - "src": "16028:13:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "id": 882, - "name": "keccak256", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12788, - "src": "16018:9:2", - "typeDescriptions": { - "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", - "typeString": "function (bytes memory) pure returns (bytes32)" - } - }, - "id": 884, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16018:24:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - ], - "id": 881, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "16010:7:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_uint256_$", - "typeString": "type(uint256)" - }, - "typeName": "uint256" - }, - "id": 885, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16010:33:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 879, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "15991:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 880, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "selectGroup", - "nodeType": "MemberAccess", - "referencedDeclaration": 8790, - "src": "15991:18:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_nonpayable$_t_struct$_Storage_$8192_storage_ptr_$_t_uint256_$returns$_t_uint256_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,uint256) returns (uint256)" - } - }, - "id": 886, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15991:53:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "15970:74:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 897, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 888, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "16054:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 890, - "name": "requestId", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 851, - "src": "16099:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 891, - "name": "entryVerificationAndProfitFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 857, - "src": "16122:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 892, - "name": "callbackFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 859, - "src": "16165:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 893, - "name": "groupIndex", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 878, - "src": "16190:10:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 894, - "name": "previousEntry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 853, - "src": "16214:13:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "id": 895, - "name": "serviceContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 855, - "src": "16241:15:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 889, - "name": "SigningRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 264, - "src": "16071:14:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_struct$_SigningRequest_$264_storage_ptr_$", - "typeString": "type(struct KeepRandomBeaconOperator.SigningRequest storage pointer)" - } - }, - "id": 896, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "structConstructorCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16071:195:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_memory", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest memory" - } - }, - "src": "16054:212:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 898, - "nodeType": "ExpressionStatement", - "src": "16054:212:2" - }, - { - "assignments": [ - 900 - ], - "declarations": [ - { - "constant": false, - "id": 900, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 911, - "src": "16277:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 899, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "16277:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 905, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 903, - "name": "groupIndex", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 878, - "src": "16329:10:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 901, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "16304:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 902, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "getGroupPublicKey", - "nodeType": "MemberAccess", - "referencedDeclaration": 8341, - "src": "16304:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$_t_struct$_Storage_$8192_storage_ptr_$_t_uint256_$returns$_t_bytes_memory_ptr_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,uint256) view returns (bytes memory)" - } - }, - "id": 904, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16304:36:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "16277:63:2" - }, - { - "eventCall": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 907, - "name": "previousEntry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 853, - "src": "16375:13:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "id": 908, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 900, - "src": "16390:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "id": 906, - "name": "RelayEntryRequested", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 170, - "src": "16355:19:2", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$returns$__$", - "typeString": "function (bytes memory,bytes memory)" - } - }, - "id": 909, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16355:47:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 910, - "nodeType": "EmitStatement", - "src": "16350:52:2" - } - ] - }, - "documentation": null, - "id": 912, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "signRelayEntry", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 860, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 851, - "name": "requestId", - "nodeType": "VariableDeclaration", - "scope": 912, - "src": "15654:17:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 850, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "15654:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 853, - "name": "previousEntry", - "nodeType": "VariableDeclaration", - "scope": 912, - "src": "15681:26:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 852, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "15681:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 855, - "name": "serviceContract", - "nodeType": "VariableDeclaration", - "scope": 912, - "src": "15717:23:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 854, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "15717:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 857, - "name": "entryVerificationAndProfitFee", - "nodeType": "VariableDeclaration", - "scope": 912, - "src": "15750:37:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 856, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "15750:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 859, - "name": "callbackFee", - "nodeType": "VariableDeclaration", - "scope": 912, - "src": "15797:19:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 858, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "15797:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "15644:178:2" - }, - "returnParameters": { - "id": 861, - "nodeType": "ParameterList", - "parameters": [], - "src": "15832:0:2" - }, - "scope": 1568, - "src": "15621:788:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 1048, - "nodeType": "Block", - "src": "16696:1536:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 920, - "name": "isEntryInProgress", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1282, - "src": "16714:17:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$", - "typeString": "function () view returns (bool)" - } - }, - "id": 921, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16714:19:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "456e74727920776173207375626d6974746564", - "id": 922, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "16735:21:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_36a535b38d6f04d64bf170e63c6235ebdac3c434f6c6dc8260e1ebb7aaadac24", - "typeString": "literal_string \"Entry was submitted\"" - }, - "value": "Entry was submitted" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_36a535b38d6f04d64bf170e63c6235ebdac3c434f6c6dc8260e1ebb7aaadac24", - "typeString": "literal_string \"Entry was submitted\"" - } - ], - "id": 919, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "16706:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 923, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16706:51:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 924, - "nodeType": "ExpressionStatement", - "src": "16706:51:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 928, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "UnaryOperation", - "operator": "!", - "prefix": true, - "src": "16775:19:2", - "subExpression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 926, - "name": "hasEntryTimedOut", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1299, - "src": "16776:16:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$", - "typeString": "function () view returns (bool)" - } - }, - "id": 927, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16776:18:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "456e7472792074696d6564206f7574", - "id": 929, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "16796:17:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_c3e16ed73c26f55709a33ed20aa40ebc8b92197201cb3929b3861d24d1fe397d", - "typeString": "literal_string \"Entry timed out\"" - }, - "value": "Entry timed out" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_c3e16ed73c26f55709a33ed20aa40ebc8b92197201cb3929b3861d24d1fe397d", - "typeString": "literal_string \"Entry timed out\"" - } - ], - "id": 925, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "16767:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 930, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16767:47:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 931, - "nodeType": "ExpressionStatement", - "src": "16767:47:2" - }, - { - "assignments": [ - 933 - ], - "declarations": [ - { - "constant": false, - "id": 933, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 1048, - "src": "16825:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 932, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "16825:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 939, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 936, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "16877:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 937, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "groupIndex", - "nodeType": "MemberAccess", - "referencedDeclaration": 259, - "src": "16877:25:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 934, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "16852:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 935, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "getGroupPublicKey", - "nodeType": "MemberAccess", - "referencedDeclaration": 8341, - "src": "16852:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$_t_struct$_Storage_$8192_storage_ptr_$_t_uint256_$returns$_t_bytes_memory_ptr_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,uint256) view returns (bytes memory)" - } - }, - "id": 938, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16852:51:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "16825:78:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 943, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 933, - "src": "16963:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 944, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "16992:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 945, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "previousEntry", - "nodeType": "MemberAccess", - "referencedDeclaration": 261, - "src": "16992:28:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage", - "typeString": "bytes storage ref" - } - }, - { - "argumentTypes": null, - "id": 946, - "name": "_groupSignature", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 914, - "src": "17038:15:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_bytes_storage", - "typeString": "bytes storage ref" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "expression": { - "argumentTypes": null, - "id": 941, - "name": "BLS", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 6860, - "src": "16935:3:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_BLS_$6860_$", - "typeString": "type(library BLS)" - } - }, - "id": 942, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "verify", - "nodeType": "MemberAccess", - "referencedDeclaration": 6825, - "src": "16935:10:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_view$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$returns$_t_bool_$", - "typeString": "function (bytes memory,bytes memory,bytes memory) view returns (bool)" - } - }, - "id": 947, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16935:132:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "496e76616c6964207369676e6174757265", - "id": 948, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "17081:19:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_4f2d7dfcb27c0aafa13ae8c400de482c7832204d194018b6e45bd2bf244c74e7", - "typeString": "literal_string \"Invalid signature\"" - }, - "value": "Invalid signature" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_4f2d7dfcb27c0aafa13ae8c400de482c7832204d194018b6e45bd2bf244c74e7", - "typeString": "literal_string \"Invalid signature\"" - } - ], - "id": 940, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "16914:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 949, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16914:196:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 950, - "nodeType": "ExpressionStatement", - "src": "16914:196:2" - }, - { - "eventCall": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 951, - "name": "RelayEntrySubmitted", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 172, - "src": "17126:19:2", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$__$returns$__$", - "typeString": "function ()" - } - }, - "id": 952, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17126:21:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 953, - "nodeType": "EmitStatement", - "src": "17121:26:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "656e747279437265617465642875696e743235362c62797465732c6164647265737329", - "id": 968, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "17454:37:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_ef7284e32d2af1094e722e11249b8e2647886883790ea1c7315b889a521ce534", - "typeString": "literal_string \"entryCreated(uint256,bytes,address)\"" - }, - "value": "entryCreated(uint256,bytes,address)" - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 969, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "17509:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 970, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "relayRequestId", - "nodeType": "MemberAccess", - "referencedDeclaration": 253, - "src": "17509:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 971, - "name": "_groupSignature", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 914, - "src": "17556:15:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 972, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "17589:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 973, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "17589:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_stringliteral_ef7284e32d2af1094e722e11249b8e2647886883790ea1c7315b889a521ce534", - "typeString": "literal_string \"entryCreated(uint256,bytes,address)\"" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - ], - "expression": { - "argumentTypes": null, - "id": 966, - "name": "abi", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12781, - "src": "17413:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_abi", - "typeString": "abi" - } - }, - "id": 967, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "memberName": "encodeWithSignature", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "17413:23:2", - "typeDescriptions": { - "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$", - "typeString": "function (string memory) pure returns (bytes memory)" - } - }, - "id": 974, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17413:200:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "3430303030", - "id": 963, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "17392:5:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_40000_by_1", - "typeString": "int_const 40000" - }, - "value": "40000" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_40000_by_1", - "typeString": "int_const 40000" - } - ], - "expression": { - "argumentTypes": null, - "id": 961, - "name": "groupSelectionGasEstimate", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 242, - "src": "17362:25:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 962, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "17362:29:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 964, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17362:36:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 954, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "17322:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 958, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "serviceContract", - "nodeType": "MemberAccess", - "referencedDeclaration": 263, - "src": "17322:30:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 959, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "call", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "17322:35:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 960, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "gas", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "17322:39:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setgas_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gas_$", - "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" - } - }, - "id": 965, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17322:77:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gas", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 975, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17322:301:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "tuple(bool,bytes memory)" - } - }, - "id": 976, - "nodeType": "ExpressionStatement", - "src": "17322:301:2" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 980, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 977, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "17638:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 978, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "callbackFee", - "nodeType": "MemberAccess", - "referencedDeclaration": 257, - "src": "17638:26:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 979, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "17667:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "17638:30:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 991, - "nodeType": "IfStatement", - "src": "17634:129:2", - "trueBody": { - "id": 990, - "nodeType": "Block", - "src": "17670:93:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 982, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "17700:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 985, - "name": "_groupSignature", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 914, - "src": "17734:15:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "id": 984, - "name": "keccak256", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12788, - "src": "17724:9:2", - "typeDescriptions": { - "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", - "typeString": "function (bytes memory) pure returns (bytes32)" - } - }, - "id": 986, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17724:26:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - ], - "id": 983, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "17716:7:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_uint256_$", - "typeString": "type(uint256)" - }, - "typeName": "uint256" - }, - "id": 987, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17716:35:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 981, - "name": "executeCallback", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1118, - "src": "17684:15:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_SigningRequest_$264_memory_ptr_$_t_uint256_$returns$__$", - "typeString": "function (struct KeepRandomBeaconOperator.SigningRequest memory,uint256)" - } - }, - "id": 988, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17684:68:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 989, - "nodeType": "ExpressionStatement", - "src": "17684:68:2" - } - ] - } - }, - { - "assignments": [ - 993, - 995, - 997 - ], - "declarations": [ - { - "constant": false, - "id": 993, - "name": "groupMemberReward", - "nodeType": "VariableDeclaration", - "scope": 1048, - "src": "17774:25:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 992, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "17774:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 995, - "name": "submitterReward", - "nodeType": "VariableDeclaration", - "scope": 1048, - "src": "17801:23:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 994, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "17801:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 997, - "name": "subsidy", - "nodeType": "VariableDeclaration", - "scope": 1048, - "src": "17826:15:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 996, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "17826:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1000, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 998, - "name": "newEntryRewardsBreakdown", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1200, - "src": "17845:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$_t_uint256_$_t_uint256_$", - "typeString": "function () view returns (uint256,uint256,uint256)" - } - }, - "id": 999, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17845:26:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_uint256_$", - "typeString": "tuple(uint256,uint256,uint256)" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "17773:98:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1004, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 933, - "src": "17909:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "id": 1005, - "name": "groupMemberReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 993, - "src": "17922:17:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1001, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "17881:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1003, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "addGroupMemberReward", - "nodeType": "MemberAccess", - "referencedDeclaration": 8310, - "src": "17881:27:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Storage_$8192_storage_ptr_$_t_bytes_memory_ptr_$_t_uint256_$returns$__$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,bytes memory,uint256)" - } - }, - "id": 1006, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17881:59:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 1007, - "nodeType": "ExpressionStatement", - "src": "17881:59:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "", - "id": 1018, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "18016:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - }, - "value": "" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - } - ], - "arguments": [ - { - "argumentTypes": null, - "id": 1016, - "name": "submitterReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 995, - "src": "17999:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1011, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "17976:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 1012, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "17976:10:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - ], - "expression": { - "argumentTypes": null, - "id": 1008, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "17951:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 1010, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "beneficiaryOf", - "nodeType": "MemberAccess", - "referencedDeclaration": 3394, - "src": "17951:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_address_payable_$", - "typeString": "function (address) view external returns (address payable)" - } - }, - "id": 1013, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17951:36:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "id": 1014, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "call", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "17951:41:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 1015, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "17951:47:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value_$", - "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" - } - }, - "id": 1017, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17951:64:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 1019, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17951:68:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "tuple(bool,bytes memory)" - } - }, - "id": 1020, - "nodeType": "ExpressionStatement", - "src": "17951:68:2" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 1023, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 1021, - "name": "subsidy", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 997, - "src": "18034:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 1022, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "18044:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "18034:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 1043, - "nodeType": "IfStatement", - "src": "18030:159:2", - "trueBody": { - "id": 1042, - "nodeType": "Block", - "src": "18047:142:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "66756e645265717565737453756273696479466565506f6f6c2829", - "id": 1038, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "18147:29:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_11e816ee49abf05395cb93811d93f4b9415d3142dd310ce623c19270022a9f12", - "typeString": "literal_string \"fundRequestSubsidyFeePool()\"" - }, - "value": "fundRequestSubsidyFeePool()" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_stringliteral_11e816ee49abf05395cb93811d93f4b9415d3142dd310ce623c19270022a9f12", - "typeString": "literal_string \"fundRequestSubsidyFeePool()\"" - } - ], - "expression": { - "argumentTypes": null, - "id": 1036, - "name": "abi", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12781, - "src": "18123:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_abi", - "typeString": "abi" - } - }, - "id": 1037, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "memberName": "encodeWithSignature", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "18123:23:2", - "typeDescriptions": { - "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$", - "typeString": "function (string memory) pure returns (bytes memory)" - } - }, - "id": 1039, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18123:54:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "arguments": [ - { - "argumentTypes": null, - "id": 1034, - "name": "subsidy", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 997, - "src": "18114:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "3335303030", - "id": 1031, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "18101:5:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_35000_by_1", - "typeString": "int_const 35000" - }, - "value": "35000" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_35000_by_1", - "typeString": "int_const 35000" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1024, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "18061:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 1028, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "serviceContract", - "nodeType": "MemberAccess", - "referencedDeclaration": 263, - "src": "18061:30:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 1029, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "call", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "18061:35:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 1030, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "gas", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "18061:39:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setgas_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gas_$", - "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" - } - }, - "id": 1032, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18061:46:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gas", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 1033, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "18061:52:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gasvalue_$gas", - "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" - } - }, - "id": 1035, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18061:61:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gasvalue", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 1040, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18061:117:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "tuple(bool,bytes memory)" - } - }, - "id": 1041, - "nodeType": "ExpressionStatement", - "src": "18061:117:2" - } - ] - } - }, - { - "expression": { - "argumentTypes": null, - "id": 1046, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 1044, - "name": "currentEntryStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 246, - "src": "18199:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "hexValue": "30", - "id": 1045, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "18224:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "18199:26:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1047, - "nodeType": "ExpressionStatement", - "src": "18199:26:2" - } - ] - }, - "documentation": "@dev Creates a new relay entry and stores the associated data on the chain.\n@param _groupSignature Group BLS signature over the concatenation of the\nprevious entry and seed.", - "id": 1049, - "implemented": true, - "kind": "function", - "modifiers": [ - { - "arguments": null, - "id": 917, - "modifierName": { - "argumentTypes": null, - "id": 916, - "name": "nonReentrant", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12778, - "src": "16683:12:2", - "typeDescriptions": { - "typeIdentifier": "t_modifier$__$", - "typeString": "modifier ()" - } - }, - "nodeType": "ModifierInvocation", - "src": "16683:12:2" - } - ], - "name": "relayEntry", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 915, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 914, - "name": "_groupSignature", - "nodeType": "VariableDeclaration", - "scope": 1049, - "src": "16646:28:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 913, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "16646:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "16645:30:2" - }, - "returnParameters": { - "id": 918, - "nodeType": "ParameterList", - "parameters": [], - "src": "16696:0:2" - }, - "scope": 1568, - "src": "16626:1606:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1117, - "nodeType": "Block", - "src": "18547:909:2", - "statements": [ - { - "assignments": [ - 1057 - ], - "declarations": [ - { - "constant": false, - "id": 1057, - "name": "callbackFee", - "nodeType": "VariableDeclaration", - "scope": 1117, - "src": "18557:19:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1056, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "18557:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1060, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1058, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1051, - "src": "18579:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_memory_ptr", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest memory" - } - }, - "id": 1059, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "callbackFee", - "nodeType": "MemberAccess", - "referencedDeclaration": 257, - "src": "18579:26:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "18557:48:2" - }, - { - "assignments": [ - 1062 - ], - "declarations": [ - { - "constant": false, - "id": 1062, - "name": "gasLimit", - "nodeType": "VariableDeclaration", - "scope": 1117, - "src": "18732:16:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1061, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "18732:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1067, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1065, - "name": "gasPriceCeiling", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 209, - "src": "18767:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1063, - "name": "callbackFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1057, - "src": "18751:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1064, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "div", - "nodeType": "MemberAccess", - "referencedDeclaration": 11877, - "src": "18751:15:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1066, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18751:32:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "18732:51:2" - }, - { - "assignments": [ - 1069 - ], - "declarations": [ - { - "constant": false, - "id": 1069, - "name": "callbackReturnData", - "nodeType": "VariableDeclaration", - "scope": 1117, - "src": "18794:31:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 1068, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "18794:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1070, - "initialValue": null, - "nodeType": "VariableDeclarationStatement", - "src": "18794:31:2" - }, - { - "assignments": [ - 1072 - ], - "declarations": [ - { - "constant": false, - "id": 1072, - "name": "gasBeforeCallback", - "nodeType": "VariableDeclaration", - "scope": 1117, - "src": "18835:25:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1071, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "18835:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1075, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 1073, - "name": "gasleft", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12787, - "src": "18863:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_gasleft_view$__$returns$_t_uint256_$", - "typeString": "function () view returns (uint256)" - } - }, - "id": 1074, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18863:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "18835:37:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 1092, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "components": [ - null, - { - "argumentTypes": null, - "id": 1076, - "name": "callbackReturnData", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1069, - "src": "18885:18:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "id": 1077, - "isConstant": false, - "isInlineArray": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "nodeType": "TupleExpression", - "src": "18882:22:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$_t_bytes_memory_ptr_$", - "typeString": "tuple(,bytes memory)" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "6578656375746543616c6c6261636b2875696e743235362c75696e7432353629", - "id": 1086, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "19016:34:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_fc3fcec71de523a2fc245507047ce41e9a9b586954a6f751d4404173a2c19e27", - "typeString": "literal_string \"executeCallback(uint256,uint256)\"" - }, - "value": "executeCallback(uint256,uint256)" - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1087, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1051, - "src": "19064:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_memory_ptr", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest memory" - } - }, - "id": 1088, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "relayRequestId", - "nodeType": "MemberAccess", - "referencedDeclaration": 253, - "src": "19064:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1089, - "name": "entry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1053, - "src": "19107:5:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_stringliteral_fc3fcec71de523a2fc245507047ce41e9a9b586954a6f751d4404173a2c19e27", - "typeString": "literal_string \"executeCallback(uint256,uint256)\"" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1084, - "name": "abi", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12781, - "src": "18979:3:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_abi", - "typeString": "abi" - } - }, - "id": 1085, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "memberName": "encodeWithSignature", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "18979:23:2", - "typeDescriptions": { - "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$", - "typeString": "function (string memory) pure returns (bytes memory)" - } - }, - "id": 1090, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18979:143:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "arguments": [ - { - "argumentTypes": null, - "id": 1082, - "name": "gasLimit", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1062, - "src": "18960:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1078, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1051, - "src": "18907:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_memory_ptr", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest memory" - } - }, - "id": 1079, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "serviceContract", - "nodeType": "MemberAccess", - "referencedDeclaration": 263, - "src": "18907:30:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 1080, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "call", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "18907:35:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 1081, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "gas", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "18907:39:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setgas_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gas_$", - "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" - } - }, - "id": 1083, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18907:71:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gas", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 1091, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18907:216:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "tuple(bool,bytes memory)" - } - }, - "src": "18882:241:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 1093, - "nodeType": "ExpressionStatement", - "src": "18882:241:2" - }, - { - "assignments": [ - 1095 - ], - "declarations": [ - { - "constant": false, - "id": 1095, - "name": "gasAfterCallback", - "nodeType": "VariableDeclaration", - "scope": 1117, - "src": "19133:24:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1094, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "19133:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1098, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 1096, - "name": "gasleft", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12787, - "src": "19160:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_gasleft_view$__$returns$_t_uint256_$", - "typeString": "function () view returns (uint256)" - } - }, - "id": 1097, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "19160:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "19133:36:2" - }, - { - "assignments": [ - 1100 - ], - "declarations": [ - { - "constant": false, - "id": 1100, - "name": "gasSpent", - "nodeType": "VariableDeclaration", - "scope": 1117, - "src": "19179:16:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1099, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "19179:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1105, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1103, - "name": "gasAfterCallback", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1095, - "src": "19220:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1101, - "name": "gasBeforeCallback", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1072, - "src": "19198:17:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1102, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "19198:21:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1104, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "19198:39:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "19179:58:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1109, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "19294:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - { - "argumentTypes": null, - "id": 1110, - "name": "gasPriceCeiling", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 209, - "src": "19323:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1111, - "name": "gasLimit", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1062, - "src": "19352:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1112, - "name": "gasSpent", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1100, - "src": "19374:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1113, - "name": "callbackFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1057, - "src": "19396:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1114, - "name": "callbackReturnData", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1069, - "src": "19421:18:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "expression": { - "argumentTypes": null, - "id": 1106, - "name": "Reimbursements", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 9245, - "src": "19248:14:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_Reimbursements_$9245_$", - "typeString": "type(library Reimbursements)" - } - }, - "id": 1108, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "reimburseCallback", - "nodeType": "MemberAccess", - "referencedDeclaration": 9244, - "src": "19248:32:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_nonpayable$_t_contract$_TokenStaking_$5649_$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$", - "typeString": "function (contract TokenStaking,uint256,uint256,uint256,uint256,bytes memory)" - } - }, - "id": 1115, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "19248:201:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 1116, - "nodeType": "ExpressionStatement", - "src": "19248:201:2" - } - ] - }, - "documentation": "@dev Executes customer specified callback for the relay entry request.\n@param signingRequest Request data tracked internally by this contract.\n@param entry The generated random number.", - "id": 1118, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "executeCallback", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1054, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1051, - "name": "signingRequest", - "nodeType": "VariableDeclaration", - "scope": 1118, - "src": "18485:36:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_memory_ptr", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest" - }, - "typeName": { - "contractScope": null, - "id": 1050, - "name": "SigningRequest", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 264, - "src": "18485:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage_ptr", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 1053, - "name": "entry", - "nodeType": "VariableDeclaration", - "scope": 1118, - "src": "18523:13:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1052, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "18523:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "18484:53:2" - }, - "returnParameters": { - "id": 1055, - "nodeType": "ParameterList", - "parameters": [], - "src": "18547:0:2" - }, - "scope": 1568, - "src": "18460:996:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 1199, - "nodeType": "Block", - "src": "19700:1208:2", - "statements": [ - { - "assignments": [ - 1128 - ], - "declarations": [ - { - "constant": false, - "id": 1128, - "name": "decimals", - "nodeType": "VariableDeclaration", - "scope": 1199, - "src": "19710:16:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1127, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "19710:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1130, - "initialValue": { - "argumentTypes": null, - "hexValue": "31653136", - "id": 1129, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "19729:4:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_10000000000000000_by_1", - "typeString": "int_const 10000000000000000" - }, - "value": "1e16" - }, - "nodeType": "VariableDeclarationStatement", - "src": "19710:23:2" - }, - { - "assignments": [ - 1132 - ], - "declarations": [ - { - "constant": false, - "id": 1132, - "name": "delayFactor", - "nodeType": "VariableDeclaration", - "scope": 1199, - "src": "19793:19:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1131, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "19793:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1135, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 1133, - "name": "getDelayFactor", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1272, - "src": "19815:14:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", - "typeString": "function () view returns (uint256)" - } - }, - "id": 1134, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "19815:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "19793:38:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 1144, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 1136, - "name": "groupMemberReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1121, - "src": "19841:17:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1142, - "name": "decimals", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1128, - "src": "19904:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1139, - "name": "delayFactor", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1132, - "src": "19887:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1137, - "name": "groupMemberBaseReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 204, - "src": "19861:21:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1138, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "19861:25:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1140, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "19861:38:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1141, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "div", - "nodeType": "MemberAccess", - "referencedDeclaration": 11877, - "src": "19861:42:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1143, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "19861:52:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "19841:72:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1145, - "nodeType": "ExpressionStatement", - "src": "19841:72:2" - }, - { - "assignments": [ - 1147 - ], - "declarations": [ - { - "constant": false, - "id": 1147, - "name": "groupMemberDelayPenalty", - "nodeType": "VariableDeclaration", - "scope": 1199, - "src": "19984:31:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1146, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "19984:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1155, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1152, - "name": "delayFactor", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1132, - "src": "20057:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1150, - "name": "decimals", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1128, - "src": "20044:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1151, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "20044:12:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1153, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20044:25:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1148, - "name": "groupMemberBaseReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 204, - "src": "20018:21:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1149, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "20018:25:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1154, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20018:52:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "19984:86:2" - }, - { - "assignments": [ - 1157 - ], - "declarations": [ - { - "constant": false, - "id": 1157, - "name": "submitterExtraReward", - "nodeType": "VariableDeclaration", - "scope": 1199, - "src": "20422:28:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1156, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "20422:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1168, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1166, - "name": "decimals", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1128, - "src": "20507:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "35", - "id": 1163, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "20500:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_5_by_1", - "typeString": "int_const 5" - }, - "value": "5" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_5_by_1", - "typeString": "int_const 5" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1160, - "name": "groupSize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 212, - "src": "20481:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1158, - "name": "groupMemberDelayPenalty", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1147, - "src": "20453:23:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1159, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "20453:27:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1161, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20453:38:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1162, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "percent", - "nodeType": "MemberAccess", - "referencedDeclaration": 11258, - "src": "20453:46:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1164, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20453:49:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1165, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "div", - "nodeType": "MemberAccess", - "referencedDeclaration": 11877, - "src": "20453:53:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1167, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20453:63:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "20422:94:2" - }, - { - "assignments": [ - 1170 - ], - "declarations": [ - { - "constant": false, - "id": 1170, - "name": "entryVerificationFee", - "nodeType": "VariableDeclaration", - "scope": 1199, - "src": "20526:28:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1169, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "20526:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1177, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 1174, - "name": "groupProfitFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1354, - "src": "20606:14:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", - "typeString": "function () view returns (uint256)" - } - }, - "id": 1175, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20606:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1171, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "20557:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 1172, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "entryVerificationAndProfitFee", - "nodeType": "MemberAccess", - "referencedDeclaration": 255, - "src": "20557:44:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1173, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "20557:48:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1176, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20557:66:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "20526:97:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 1183, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 1178, - "name": "submitterReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1123, - "src": "20633:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1181, - "name": "submitterExtraReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1157, - "src": "20676:20:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1179, - "name": "entryVerificationFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1170, - "src": "20651:20:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1180, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "20651:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1182, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20651:46:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "20633:64:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1184, - "nodeType": "ExpressionStatement", - "src": "20633:64:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 1197, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 1185, - "name": "subsidy", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1125, - "src": "20811:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1195, - "name": "submitterExtraReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1157, - "src": "20880:20:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1191, - "name": "groupSize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 212, - "src": "20864:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1189, - "name": "groupMemberReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1121, - "src": "20842:17:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1190, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "20842:21:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1192, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20842:32:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 1186, - "name": "groupProfitFee", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1354, - "src": "20821:14:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", - "typeString": "function () view returns (uint256)" - } - }, - "id": 1187, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20821:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1188, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "20821:20:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1193, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20821:54:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1194, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "20821:58:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1196, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20821:80:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "20811:90:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1198, - "nodeType": "ExpressionStatement", - "src": "20811:90:2" - } - ] - }, - "documentation": "@dev Get rewards breakdown in wei for successful entry for the current signing request.", - "id": 1200, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "newEntryRewardsBreakdown", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1119, - "nodeType": "ParameterList", - "parameters": [], - "src": "19606:2:2" - }, - "returnParameters": { - "id": 1126, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1121, - "name": "groupMemberReward", - "nodeType": "VariableDeclaration", - "scope": 1200, - "src": "19631:25:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1120, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "19631:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 1123, - "name": "submitterReward", - "nodeType": "VariableDeclaration", - "scope": 1200, - "src": "19658:23:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1122, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "19658:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 1125, - "name": "subsidy", - "nodeType": "VariableDeclaration", - "scope": 1200, - "src": "19683:15:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1124, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "19683:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "19630:69:2" - }, - "scope": 1568, - "src": "19573:1335:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 1271, - "nodeType": "Block", - "src": "21137:1710:2", - "statements": [ - { - "assignments": [ - 1206 - ], - "declarations": [ - { - "constant": false, - "id": 1206, - "name": "decimals", - "nodeType": "VariableDeclaration", - "scope": 1271, - "src": "21147:16:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1205, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "21147:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1208, - "initialValue": { - "argumentTypes": null, - "hexValue": "31653136", - "id": 1207, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "21166:4:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_10000000000000000_by_1", - "typeString": "int_const 10000000000000000" - }, - "value": "1e16" - }, - "nodeType": "VariableDeclarationStatement", - "src": "21147:23:2" - }, - { - "assignments": [ - 1210 - ], - "declarations": [ - { - "constant": false, - "id": 1210, - "name": "deadlineBlock", - "nodeType": "VariableDeclaration", - "scope": 1271, - "src": "21571:21:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1209, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "21571:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1218, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "31", - "id": 1216, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "21645:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - }, - "value": "1" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1213, - "name": "relayEntryTimeout", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 233, - "src": "21622:17:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1211, - "name": "currentEntryStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 246, - "src": "21595:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1212, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "21595:26:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1214, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "21595:45:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1215, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "21595:49:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1217, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "21595:52:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "21571:76:2" - }, - { - "assignments": [ - 1220 - ], - "declarations": [ - { - "constant": false, - "id": 1220, - "name": "submissionStartBlock", - "nodeType": "VariableDeclaration", - "scope": 1271, - "src": "21887:28:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1219, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "21887:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1228, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "31", - "id": 1226, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "21975:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - }, - "value": "1" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_1_by_1", - "typeString": "int_const 1" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1223, - "name": "relayEntryGenerationTime", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 224, - "src": "21945:24:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1221, - "name": "currentEntryStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 246, - "src": "21918:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1222, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "21918:26:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1224, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "21918:52:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1225, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "21918:56:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1227, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "21918:59:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "21887:90:2" - }, - { - "assignments": [ - 1230 - ], - "declarations": [ - { - "constant": false, - "id": 1230, - "name": "entryReceivedBlock", - "nodeType": "VariableDeclaration", - "scope": 1271, - "src": "22094:26:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1229, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "22094:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1239, - "initialValue": { - "argumentTypes": null, - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 1234, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1231, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "22123:5:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 1232, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "22123:12:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "<=", - "rightExpression": { - "argumentTypes": null, - "id": 1233, - "name": "submissionStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1220, - "src": "22139:20:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "22123:36:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1236, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "22183:5:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 1237, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "22183:12:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1238, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "Conditional", - "src": "22123:72:2", - "trueExpression": { - "argumentTypes": null, - "id": 1235, - "name": "submissionStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1220, - "src": "22162:20:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "22094:101:2" - }, - { - "assignments": [ - 1241 - ], - "declarations": [ - { - "constant": false, - "id": 1241, - "name": "remainingBlocks", - "nodeType": "VariableDeclaration", - "scope": 1271, - "src": "22255:23:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1240, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "22255:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1246, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1244, - "name": "entryReceivedBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1230, - "src": "22299:18:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1242, - "name": "deadlineBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1210, - "src": "22281:13:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1243, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "22281:17:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1245, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "22281:37:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "22255:63:2" - }, - { - "assignments": [ - 1248 - ], - "declarations": [ - { - "constant": false, - "id": 1248, - "name": "submissionWindow", - "nodeType": "VariableDeclaration", - "scope": 1271, - "src": "22361:24:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1247, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "22361:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1253, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1251, - "name": "submissionStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1220, - "src": "22406:20:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1249, - "name": "deadlineBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1210, - "src": "22388:13:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1250, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "22388:17:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1252, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "22388:39:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "22361:66:2" - }, - { - "expression": { - "argumentTypes": null, - "id": 1269, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 1254, - "name": "delayFactor", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1203, - "src": "22754:11:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1267, - "name": "decimals", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1206, - "src": "22831:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "components": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 1264, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "components": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1260, - "name": "submissionWindow", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1248, - "src": "22804:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1257, - "name": "decimals", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1206, - "src": "22790:8:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1255, - "name": "remainingBlocks", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1241, - "src": "22770:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1256, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "22770:19:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1258, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "22770:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1259, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "div", - "nodeType": "MemberAccess", - "referencedDeclaration": 11877, - "src": "22770:33:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1261, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "22770:51:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "id": 1262, - "isConstant": false, - "isInlineArray": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "TupleExpression", - "src": "22769:53:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "**", - "rightExpression": { - "argumentTypes": null, - "hexValue": "32", - "id": 1263, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "22824:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_2_by_1", - "typeString": "int_const 2" - }, - "value": "2" - }, - "src": "22769:56:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "id": 1265, - "isConstant": false, - "isInlineArray": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "TupleExpression", - "src": "22768:58:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1266, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "div", - "nodeType": "MemberAccess", - "referencedDeclaration": 11877, - "src": "22768:62:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1268, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "22768:72:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "22754:86:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1270, - "nodeType": "ExpressionStatement", - "src": "22754:86:2" - } - ] - }, - "documentation": "@dev Gets delay factor for rewards calculation.\n@return Integer representing floating-point number with 16 decimals places.", - "id": 1272, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "getDelayFactor", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1201, - "nodeType": "ParameterList", - "parameters": [], - "src": "21091:2:2" - }, - "returnParameters": { - "id": 1204, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1203, - "name": "delayFactor", - "nodeType": "VariableDeclaration", - "scope": 1272, - "src": "21116:19:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1202, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "21116:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "21115:21:2" - }, - "scope": 1568, - "src": "21068:1779:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 1281, - "nodeType": "Block", - "src": "23020:51:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 1279, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 1277, - "name": "currentEntryStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 246, - "src": "23037:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "!=", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 1278, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "23063:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "23037:27:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "functionReturnParameters": 1276, - "id": 1280, - "nodeType": "Return", - "src": "23030:34:2" - } - ] - }, - "documentation": "@dev Returns true if generation of a new relay entry is currently in\nprogress.", - "id": 1282, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "isEntryInProgress", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1273, - "nodeType": "ParameterList", - "parameters": [], - "src": "22988:2:2" - }, - "returnParameters": { - "id": 1276, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1275, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1282, - "src": "23014:4:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 1274, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "23014:4:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "23013:6:2" - }, - "scope": 1568, - "src": "22962:109:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 1298, - "nodeType": "Block", - "src": "23358:112:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 1296, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 1289, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 1287, - "name": "currentEntryStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 246, - "src": "23375:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "!=", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 1288, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "23401:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "23375:27:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "&&", - "rightExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 1295, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1290, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "23406:5:2", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 1291, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "23406:12:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 1294, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 1292, - "name": "currentEntryStartBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 246, - "src": "23421:22:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "id": 1293, - "name": "relayEntryTimeout", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 233, - "src": "23446:17:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "23421:42:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "23406:57:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "23375:88:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "functionReturnParameters": 1286, - "id": 1297, - "nodeType": "Return", - "src": "23368:95:2" - } - ] - }, - "documentation": "@dev Returns true if the currently ongoing new relay entry generation\noperation timed out. There is a certain timeout for a new relay entry\nto be produced, see `relayEntryTimeout` value.", - "id": 1299, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "hasEntryTimedOut", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1283, - "nodeType": "ParameterList", - "parameters": [], - "src": "23326:2:2" - }, - "returnParameters": { - "id": 1286, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1285, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1299, - "src": "23352:4:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 1284, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "23352:4:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "23351:6:2" - }, - "scope": 1568, - "src": "23301:169:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 1342, - "nodeType": "Block", - "src": "24087:740:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 1303, - "name": "hasEntryTimedOut", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1299, - "src": "24105:16:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$", - "typeString": "function () view returns (bool)" - } - }, - "id": 1304, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "24105:18:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "456e74727920646964206e6f742074696d65206f7574", - "id": 1305, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "24125:24:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_bd0ed65969b48fa50b3e9e120922e4e93ce5d15edd6c3296bfcd4e765a7c5307", - "typeString": "literal_string \"Entry did not time out\"" - }, - "value": "Entry did not time out" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_bd0ed65969b48fa50b3e9e120922e4e93ce5d15edd6c3296bfcd4e765a7c5307", - "typeString": "literal_string \"Entry did not time out\"" - } - ], - "id": 1302, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "24097:7:2", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 1306, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "24097:53:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 1307, - "nodeType": "ExpressionStatement", - "src": "24097:53:2" - }, - { - "assignments": [ - 1309 - ], - "declarations": [ - { - "constant": false, - "id": 1309, - "name": "minimumStake", - "nodeType": "VariableDeclaration", - "scope": 1342, - "src": "24161:20:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1308, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "24161:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1313, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 1310, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "24184:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 1311, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "minimumStake", - "nodeType": "MemberAccess", - "referencedDeclaration": 4728, - "src": "24184:28:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$", - "typeString": "function () view external returns (uint256)" - } - }, - "id": 1312, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "24184:30:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "24161:53:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1317, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "24255:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 1318, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "groupIndex", - "nodeType": "MemberAccess", - "referencedDeclaration": 259, - "src": "24255:25:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1319, - "name": "groupSize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 212, - "src": "24282:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1320, - "name": "minimumStake", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1309, - "src": "24293:12:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1314, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "24224:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1316, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "reportRelayEntryTimeout", - "nodeType": "MemberAccess", - "referencedDeclaration": 9097, - "src": "24224:30:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_nonpayable$_t_struct$_Storage_$8192_storage_ptr_$_t_uint256_$_t_uint256_$_t_uint256_$returns$__$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,uint256,uint256,uint256)" - } - }, - "id": 1321, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "24224:82:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 1322, - "nodeType": "ExpressionStatement", - "src": "24224:82:2" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 1326, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 1323, - "name": "numberOfGroups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1406, - "src": "24499:14:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", - "typeString": "function () view returns (uint256)" - } - }, - "id": 1324, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "24499:16:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 1325, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "24518:1:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "24499:20:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 1341, - "nodeType": "IfStatement", - "src": "24495:326:2", - "trueBody": { - "id": 1340, - "nodeType": "Block", - "src": "24521:300:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1328, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "24567:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 1329, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "relayRequestId", - "nodeType": "MemberAccess", - "referencedDeclaration": 253, - "src": "24567:29:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1330, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "24614:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 1331, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "previousEntry", - "nodeType": "MemberAccess", - "referencedDeclaration": 261, - "src": "24614:28:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage", - "typeString": "bytes storage ref" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1332, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "24660:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 1333, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "serviceContract", - "nodeType": "MemberAccess", - "referencedDeclaration": 263, - "src": "24660:30:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1334, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "24708:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 1335, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "entryVerificationAndProfitFee", - "nodeType": "MemberAccess", - "referencedDeclaration": 255, - "src": "24708:44:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1336, - "name": "signingRequest", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 266, - "src": "24770:14:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_SigningRequest_$264_storage", - "typeString": "struct KeepRandomBeaconOperator.SigningRequest storage ref" - } - }, - "id": 1337, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "callbackFee", - "nodeType": "MemberAccess", - "referencedDeclaration": 257, - "src": "24770:26:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_bytes_storage", - "typeString": "bytes storage ref" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 1327, - "name": "signRelayEntry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 912, - "src": "24535:14:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_bytes_memory_ptr_$_t_address_$_t_uint256_$_t_uint256_$returns$__$", - "typeString": "function (uint256,bytes memory,address,uint256,uint256)" - } - }, - "id": 1338, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "24535:275:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 1339, - "nodeType": "ExpressionStatement", - "src": "24535:275:2" - } - ] - } - } - ] - }, - "documentation": "@dev Function used to inform about the fact the currently ongoing\nnew relay entry generation operation timed out. As a result, the group\nwhich was supposed to produce a new relay entry is immediately\nterminated and a new group is selected to produce a new relay entry.\nAll members of the group are punished by seizing minimum stake of\ntheir tokens. The submitter of the transaction is rewarded with a\ntattletale reward which is limited to min(1, 20 / group_size) of the\nmaximum tattletale reward.", - "id": 1343, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "reportRelayEntryTimeout", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1300, - "nodeType": "ParameterList", - "parameters": [], - "src": "24077:2:2" - }, - "returnParameters": { - "id": 1301, - "nodeType": "ParameterList", - "parameters": [], - "src": "24087:0:2" - }, - "scope": 1568, - "src": "24045:782:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1353, - "nodeType": "Block", - "src": "24956:60:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1350, - "name": "groupSize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 212, - "src": "24999:9:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1348, - "name": "groupMemberBaseReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 204, - "src": "24973:21:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1349, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "24973:25:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1351, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "24973:36:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 1347, - "id": 1352, - "nodeType": "Return", - "src": "24966:43:2" - } - ] - }, - "documentation": "@dev Gets group profit fee expressed in wei.", - "id": 1354, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "groupProfitFee", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1344, - "nodeType": "ParameterList", - "parameters": [], - "src": "24924:2:2" - }, - "returnParameters": { - "id": 1347, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1346, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1354, - "src": "24947:7:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1345, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "24947:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "24946:9:2" - }, - "scope": 1568, - "src": "24901:115:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1369, - "nodeType": "Block", - "src": "25646:78:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1363, - "name": "staker", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1356, - "src": "25695:6:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1365, - "name": "this", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12868, - "src": "25711:4:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_KeepRandomBeaconOperator_$1568", - "typeString": "contract KeepRandomBeaconOperator" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_contract$_KeepRandomBeaconOperator_$1568", - "typeString": "contract KeepRandomBeaconOperator" - } - ], - "id": 1364, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "25703:7:2", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": "address" - }, - "id": 1366, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "25703:13:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "id": 1361, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "25663:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 1362, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "hasMinimumStake", - "nodeType": "MemberAccess", - "referencedDeclaration": 5648, - "src": "25663:31:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_bool_$", - "typeString": "function (address,address) view external returns (bool)" - } - }, - "id": 1367, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "25663:54:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "functionReturnParameters": 1360, - "id": 1368, - "nodeType": "Return", - "src": "25656:61:2" - } - ] - }, - "documentation": "@dev Checks if the specified account has enough active stake to become\nnetwork operator and that this contract has been authorized for potential\nslashing.\n * Having the required minimum of active stake makes the operator eligible\nto join the network. If the active stake is not currently undelegating,\noperator is also eligible for work selection.\n * @param staker Staker's address\n@return True if has enough active stake to participate in the network,\nfalse otherwise.", - "id": 1370, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "hasMinimumStake", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1357, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1356, - "name": "staker", - "nodeType": "VariableDeclaration", - "scope": 1370, - "src": "25604:14:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 1355, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "25604:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "25603:16:2" - }, - "returnParameters": { - "id": 1360, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1359, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1370, - "src": "25640:4:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 1358, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "25640:4:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "25639:6:2" - }, - "scope": 1568, - "src": "25579:145:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1382, - "nodeType": "Block", - "src": "25894:61:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1379, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1372, - "src": "25936:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "expression": { - "argumentTypes": null, - "id": 1377, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "25911:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1378, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "isGroupRegistered", - "nodeType": "MemberAccess", - "referencedDeclaration": 8542, - "src": "25911:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$_t_struct$_Storage_$8192_storage_ptr_$_t_bytes_memory_ptr_$returns$_t_bool_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,bytes memory) view returns (bool)" - } - }, - "id": 1380, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "25911:37:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "functionReturnParameters": 1376, - "id": 1381, - "nodeType": "Return", - "src": "25904:44:2" - } - ] - }, - "documentation": "@dev Checks if group with the given public key is registered.", - "id": 1383, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "isGroupRegistered", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1373, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1372, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 1383, - "src": "25842:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 1371, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "25842:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "25841:26:2" - }, - "returnParameters": { - "id": 1376, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1375, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1383, - "src": "25888:4:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 1374, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "25888:4:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "25887:6:2" - }, - "scope": 1568, - "src": "25815:140:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1395, - "nodeType": "Block", - "src": "26527:56:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1392, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1385, - "src": "26564:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "expression": { - "argumentTypes": null, - "id": 1390, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "26544:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1391, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "isStaleGroup", - "nodeType": "MemberAccess", - "referencedDeclaration": 8640, - "src": "26544:19:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_view$_t_struct$_Storage_$8192_storage_ptr_$_t_bytes_memory_ptr_$returns$_t_bool_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,bytes memory) view returns (bool)" - } - }, - "id": 1393, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "26544:32:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "functionReturnParameters": 1389, - "id": 1394, - "nodeType": "Return", - "src": "26537:39:2" - } - ] - }, - "documentation": "@dev Checks if a group with the given public key is a stale group.\nStale group is an expired group which is no longer performing any\noperations. It is important to understand that an expired group may\nstill perform some operations for which it was selected when it was still\nactive. We consider a group to be stale when it's expired and when its\nexpiration time and potentially executed operation timeout are both in\nthe past.", - "id": 1396, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "isStaleGroup", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1386, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1385, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 1396, - "src": "26475:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 1384, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "26475:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "26474:26:2" - }, - "returnParameters": { - "id": 1389, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1388, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1396, - "src": "26521:4:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 1387, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "26521:4:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "26520:6:2" - }, - "scope": 1568, - "src": "26453:130:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1405, - "nodeType": "Block", - "src": "26770:47:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 1401, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "26787:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1402, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "numberOfGroups", - "nodeType": "MemberAccess", - "referencedDeclaration": 8682, - "src": "26787:21:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$_t_struct$_Storage_$8192_storage_ptr_$returns$_t_uint256_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer) view returns (uint256)" - } - }, - "id": 1403, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "26787:23:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 1400, - "id": 1404, - "nodeType": "Return", - "src": "26780:30:2" - } - ] - }, - "documentation": "@dev Gets the number of active groups. Expired and terminated groups are\nnot counted as active.", - "id": 1406, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "numberOfGroups", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1397, - "nodeType": "ParameterList", - "parameters": [], - "src": "26738:2:2" - }, - "returnParameters": { - "id": 1400, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1399, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1406, - "src": "26761:7:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1398, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "26761:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "26760:9:2" - }, - "scope": 1568, - "src": "26715:102:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1418, - "nodeType": "Block", - "src": "26999:62:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1413, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "27016:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1414, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "groupMemberRewards", - "nodeType": "MemberAccess", - "referencedDeclaration": 8187, - "src": "27016:25:2", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_bytes_memory_$_t_uint256_$", - "typeString": "mapping(bytes memory => uint256)" - } - }, - "id": 1416, - "indexExpression": { - "argumentTypes": null, - "id": 1415, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1408, - "src": "27042:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "27016:38:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 1412, - "id": 1417, - "nodeType": "Return", - "src": "27009:45:2" - } - ] - }, - "documentation": "@dev Returns accumulated group member rewards for provided group.", - "id": 1419, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "getGroupMemberRewards", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1409, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1408, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 1419, - "src": "26943:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 1407, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "26943:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "26942:26:2" - }, - "returnParameters": { - "id": 1412, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1411, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1419, - "src": "26990:7:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1410, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "26990:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "26989:9:2" - }, - "scope": 1568, - "src": "26912:149:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1435, - "nodeType": "Block", - "src": "27268:73:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1431, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1421, - "src": "27314:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "id": 1432, - "name": "member", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1423, - "src": "27327:6:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "id": 1429, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "27285:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1430, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "getGroupMemberIndices", - "nodeType": "MemberAccess", - "referencedDeclaration": 8452, - "src": "27285:28:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_view$_t_struct$_Storage_$8192_storage_ptr_$_t_bytes_memory_ptr_$_t_address_$returns$_t_array$_t_uint256_$dyn_memory_ptr_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,bytes memory,address) view returns (uint256[] memory)" - } - }, - "id": 1433, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "27285:49:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", - "typeString": "uint256[] memory" - } - }, - "functionReturnParameters": 1428, - "id": 1434, - "nodeType": "Return", - "src": "27278:56:2" - } - ] - }, - "documentation": "@dev Gets all indices in the provided group for a member.", - "id": 1436, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "getGroupMemberIndices", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1424, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1421, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 1436, - "src": "27179:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 1420, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "27179:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 1423, - "name": "member", - "nodeType": "VariableDeclaration", - "scope": 1436, - "src": "27205:14:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 1422, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "27205:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "27178:42:2" - }, - "returnParameters": { - "id": 1428, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1427, - "name": "indices", - "nodeType": "VariableDeclaration", - "scope": 1436, - "src": "27242:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", - "typeString": "uint256[]" - }, - "typeName": { - "baseType": { - "id": 1425, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "27242:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1426, - "length": null, - "nodeType": "ArrayTypeName", - "src": "27242:9:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", - "typeString": "uint256[]" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "27241:26:2" - }, - "scope": 1568, - "src": "27148:193:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1483, - "nodeType": "Block", - "src": "27933:367:2", - "statements": [ - { - "assignments": [ - 1449 - ], - "declarations": [ - { - "constant": false, - "id": 1449, - "name": "accumulatedRewards", - "nodeType": "VariableDeclaration", - "scope": 1483, - "src": "27943:26:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1448, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "27943:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1456, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1452, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1438, - "src": "27997:8:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 1453, - "name": "groupIndex", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1440, - "src": "28007:10:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1454, - "name": "groupMemberIndices", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1443, - "src": "28019:18:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", - "typeString": "uint256[] memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", - "typeString": "uint256[] memory" - } - ], - "expression": { - "argumentTypes": null, - "id": 1450, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "27972:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1451, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "withdrawFromGroup", - "nodeType": "MemberAccess", - "referencedDeclaration": 8935, - "src": "27972:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_nonpayable$_t_struct$_Storage_$8192_storage_ptr_$_t_address_$_t_uint256_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$_t_uint256_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,address,uint256,uint256[] memory) returns (uint256)" - } - }, - "id": 1455, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "27972:66:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "27943:95:2" - }, - { - "assignments": [ - 1458, - null - ], - "declarations": [ - { - "constant": false, - "id": 1458, - "name": "success", - "nodeType": "VariableDeclaration", - "scope": 1483, - "src": "28049:12:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 1457, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "28049:4:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - }, - null - ], - "id": 1469, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "", - "id": 1467, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "28133:2:2", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - }, - "value": "" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - } - ], - "arguments": [ - { - "argumentTypes": null, - "id": 1465, - "name": "accumulatedRewards", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1449, - "src": "28113:18:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1461, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1438, - "src": "28092:8:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "id": 1459, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "28067:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 1460, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "beneficiaryOf", - "nodeType": "MemberAccess", - "referencedDeclaration": 3394, - "src": "28067:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_address_payable_$", - "typeString": "function (address) view external returns (address payable)" - } - }, - "id": 1462, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "28067:34:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "id": 1463, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "call", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "28067:39:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 1464, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "28067:45:2", - "typeDescriptions": { - "typeIdentifier": "t_function_setvalue_pure$_t_uint256_$returns$_t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value_$", - "typeString": "function (uint256) pure returns (function (bytes memory) payable returns (bool,bytes memory))" - } - }, - "id": 1466, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "28067:65:2", - "typeDescriptions": { - "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value", - "typeString": "function (bytes memory) payable returns (bool,bytes memory)" - } - }, - "id": 1468, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "28067:69:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", - "typeString": "tuple(bool,bytes memory)" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "28048:88:2" - }, - { - "condition": { - "argumentTypes": null, - "id": 1470, - "name": "success", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1458, - "src": "28150:7:2", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 1482, - "nodeType": "IfStatement", - "src": "28146:148:2", - "trueBody": { - "id": 1481, - "nodeType": "Block", - "src": "28159:135:2", - "statements": [ - { - "eventCall": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1474, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1438, - "src": "28231:8:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "id": 1472, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "28206:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 1473, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "beneficiaryOf", - "nodeType": "MemberAccess", - "referencedDeclaration": 3394, - "src": "28206:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_address_payable_$", - "typeString": "function (address) view external returns (address payable)" - } - }, - "id": 1475, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "28206:34:2", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - { - "argumentTypes": null, - "id": 1476, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1438, - "src": "28242:8:2", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 1477, - "name": "accumulatedRewards", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1449, - "src": "28252:18:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1478, - "name": "groupIndex", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1440, - "src": "28272:10:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 1471, - "name": "GroupMemberRewardsWithdrawn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 186, - "src": "28178:27:2", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$", - "typeString": "function (address,address,uint256,uint256)" - } - }, - "id": 1479, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "28178:105:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 1480, - "nodeType": "EmitStatement", - "src": "28173:110:2" - } - ] - } - } - ] - }, - "documentation": "@dev Withdraws accumulated group member rewards for operator\nusing the provided group index and member indices. Once the\naccumulated reward is withdrawn from the selected group, member is\nremoved from it. Rewards can be withdrawn only from stale group.\n@param operator Operator address.\n@param groupIndex Group index.\n@param groupMemberIndices Array of member indices for the group member.", - "id": 1484, - "implemented": true, - "kind": "function", - "modifiers": [ - { - "arguments": null, - "id": 1446, - "modifierName": { - "argumentTypes": null, - "id": 1445, - "name": "nonReentrant", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12778, - "src": "27920:12:2", - "typeDescriptions": { - "typeIdentifier": "t_modifier$__$", - "typeString": "modifier ()" - } - }, - "nodeType": "ModifierInvocation", - "src": "27920:12:2" - } - ], - "name": "withdrawGroupMemberRewards", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1444, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1438, - "name": "operator", - "nodeType": "VariableDeclaration", - "scope": 1484, - "src": "27838:16:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 1437, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "27838:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 1440, - "name": "groupIndex", - "nodeType": "VariableDeclaration", - "scope": 1484, - "src": "27856:18:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1439, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "27856:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 1443, - "name": "groupMemberIndices", - "nodeType": "VariableDeclaration", - "scope": 1484, - "src": "27876:35:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", - "typeString": "uint256[]" - }, - "typeName": { - "baseType": { - "id": 1441, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "27876:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1442, - "length": null, - "nodeType": "ArrayTypeName", - "src": "27876:9:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", - "typeString": "uint256[]" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "27837:75:2" - }, - "returnParameters": { - "id": 1447, - "nodeType": "ParameterList", - "parameters": [], - "src": "27933:0:2" - }, - "scope": 1568, - "src": "27802:498:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1492, - "nodeType": "Block", - "src": "28440:49:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 1489, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "28457:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1490, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "expiredGroupOffset", - "nodeType": "MemberAccess", - "referencedDeclaration": 8189, - "src": "28457:25:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 1488, - "id": 1491, - "nodeType": "Return", - "src": "28450:32:2" - } - ] - }, - "documentation": "@dev Gets the index of the first active group.", - "id": 1493, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "getFirstActiveGroupIndex", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1485, - "nodeType": "ParameterList", - "parameters": [], - "src": "28407:2:2" - }, - "returnParameters": { - "id": 1488, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1487, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1493, - "src": "28431:7:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1486, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "28431:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "28430:9:2" - }, - "scope": 1568, - "src": "28374:115:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1505, - "nodeType": "Block", - "src": "28626:60:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1502, - "name": "groupIndex", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1495, - "src": "28668:10:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1500, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "28643:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1501, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "getGroupPublicKey", - "nodeType": "MemberAccess", - "referencedDeclaration": 8341, - "src": "28643:24:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$_t_struct$_Storage_$8192_storage_ptr_$_t_uint256_$returns$_t_bytes_memory_ptr_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,uint256) view returns (bytes memory)" - } - }, - "id": 1503, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "28643:36:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - "functionReturnParameters": 1499, - "id": 1504, - "nodeType": "Return", - "src": "28636:43:2" - } - ] - }, - "documentation": "@dev Gets group public key.", - "id": 1506, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "getGroupPublicKey", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1496, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1495, - "name": "groupIndex", - "nodeType": "VariableDeclaration", - "scope": 1506, - "src": "28571:18:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1494, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "28571:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "28570:20:2" - }, - "returnParameters": { - "id": 1499, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1498, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1506, - "src": "28612:12:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 1497, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "28612:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "28611:14:2" - }, - "scope": 1568, - "src": "28544:142:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1516, - "nodeType": "Block", - "src": "28901:73:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1513, - "name": "gasPriceCeiling", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 209, - "src": "28951:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1511, - "name": "entryVerificationGasEstimate", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 236, - "src": "28918:28:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1512, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "28918:32:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1514, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "28918:49:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 1510, - "id": 1515, - "nodeType": "Return", - "src": "28911:56:2" - } - ] - }, - "documentation": "@dev Returns fee for entry verification in wei. Does not include group\nprofit fee, DKG contribution or callback fee.", - "id": 1517, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "entryVerificationFee", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1507, - "nodeType": "ParameterList", - "parameters": [], - "src": "28868:2:2" - }, - "returnParameters": { - "id": 1510, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1509, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1517, - "src": "28892:7:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1508, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "28892:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "28891:9:2" - }, - "scope": 1568, - "src": "28839:135:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1530, - "nodeType": "Block", - "src": "29181:90:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1527, - "name": "gasPriceCeiling", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 209, - "src": "29248:15:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1524, - "name": "groupSelectionGasEstimate", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 242, - "src": "29217:25:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1522, - "name": "dkgGasEstimate", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 239, - "src": "29198:14:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1523, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "29198:18:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1525, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "29198:45:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 1526, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "mul", - "nodeType": "MemberAccess", - "referencedDeclaration": 11861, - "src": "29198:49:2", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 1528, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "29198:66:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 1521, - "id": 1529, - "nodeType": "Return", - "src": "29191:73:2" - } - ] - }, - "documentation": "@dev Returns fee for group creation in wei. Includes the cost of DKG\nand the cost of triggering group selection.", - "id": 1531, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "groupCreationFee", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1518, - "nodeType": "ParameterList", - "parameters": [], - "src": "29148:2:2" - }, - "returnParameters": { - "id": 1521, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1520, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 1531, - "src": "29172:7:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1519, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "29172:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "29171:9:2" - }, - "scope": 1568, - "src": "29123:148:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1544, - "nodeType": "Block", - "src": "29459:59:2", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1541, - "name": "groupPubKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1533, - "src": "29499:11:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "expression": { - "argumentTypes": null, - "id": 1539, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "29476:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1540, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "getGroupMembers", - "nodeType": "MemberAccess", - "referencedDeclaration": 9113, - "src": "29476:22:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_view$_t_struct$_Storage_$8192_storage_ptr_$_t_bytes_memory_ptr_$returns$_t_array$_t_address_$dyn_memory_ptr_$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,bytes memory) view returns (address[] memory)" - } - }, - "id": 1542, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "29476:35:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - } - }, - "functionReturnParameters": 1538, - "id": 1543, - "nodeType": "Return", - "src": "29469:42:2" - } - ] - }, - "documentation": "@dev Returns members of the given group by group public key.", - "id": 1545, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "getGroupMembers", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1534, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1533, - "name": "groupPubKey", - "nodeType": "VariableDeclaration", - "scope": 1545, - "src": "29386:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 1532, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "29386:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "29385:26:2" - }, - "returnParameters": { - "id": 1538, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1537, - "name": "members", - "nodeType": "VariableDeclaration", - "scope": 1545, - "src": "29433:24:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[]" - }, - "typeName": { - "baseType": { - "id": 1535, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "29433:7:2", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 1536, - "length": null, - "nodeType": "ArrayTypeName", - "src": "29433:9:2", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[]" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "29432:26:2" - }, - "scope": 1568, - "src": "29361:157:2", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 1566, - "nodeType": "Block", - "src": "30109:155:2", - "statements": [ - { - "assignments": [ - 1553 - ], - "declarations": [ - { - "constant": false, - "id": 1553, - "name": "minimumStake", - "nodeType": "VariableDeclaration", - "scope": 1566, - "src": "30119:20:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1552, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "30119:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 1557, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 1554, - "name": "stakingContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 199, - "src": "30142:15:2", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - }, - "id": 1555, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "minimumStake", - "nodeType": "MemberAccess", - "referencedDeclaration": 4728, - "src": "30142:28:2", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$", - "typeString": "function () view external returns (uint256)" - } - }, - "id": 1556, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "30142:30:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "30119:53:2" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 1561, - "name": "groupIndex", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1547, - "src": "30215:10:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 1562, - "name": "signedMsgSender", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1549, - "src": "30227:15:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "argumentTypes": null, - "id": 1563, - "name": "minimumStake", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 1553, - "src": "30244:12:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 1558, - "name": "groups", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 190, - "src": "30182:6:2", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Storage_$8192_storage", - "typeString": "struct Groups.Storage storage ref" - } - }, - "id": 1560, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "reportUnauthorizedSigning", - "nodeType": "MemberAccess", - "referencedDeclaration": 9045, - "src": "30182:32:2", - "typeDescriptions": { - "typeIdentifier": "t_function_delegatecall_nonpayable$_t_struct$_Storage_$8192_storage_ptr_$_t_uint256_$_t_bytes_memory_ptr_$_t_uint256_$returns$__$bound_to$_t_struct$_Storage_$8192_storage_ptr_$", - "typeString": "function (struct Groups.Storage storage pointer,uint256,bytes memory,uint256)" - } - }, - "id": 1564, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "30182:75:2", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 1565, - "nodeType": "ExpressionStatement", - "src": "30182:75:2" - } - ] - }, - "documentation": "@dev Reports unauthorized signing for the provided group. Must provide\na valid signature of the tattletale address as a message. Successful signature\nverification means the private key has been leaked and all group members\nshould be punished by seizing their tokens. The submitter of this proof is\nrewarded with 5% of the total seized amount scaled by the reward adjustment\nparameter and the rest 95% is burned.", - "id": 1567, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "reportUnauthorizedSigning", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 1550, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 1547, - "name": "groupIndex", - "nodeType": "VariableDeclaration", - "scope": 1567, - "src": "30039:18:2", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 1546, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "30039:7:2", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 1549, - "name": "signedMsgSender", - "nodeType": "VariableDeclaration", - "scope": 1567, - "src": "30067:28:2", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 1548, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "30067:5:2", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "30029:72:2" - }, - "returnParameters": { - "id": 1551, - "nodeType": "ParameterList", - "parameters": [], - "src": "30109:0:2" - }, - "scope": 1568, - "src": "29995:269:2", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - } - ], - "scope": 1569, - "src": "1112:29154:2" - } - ], - "src": "0:30267:2" - }, - "compiler": { - "name": "solc", - "version": "0.5.14+commit.01f1aaa4.Emscripten.clang" - }, - "networks": { - "3": { - "events": { - "0x405e4a54e1d4488d62b38c147cb419b76ca730eadc4b2c7a594e729f03946c49": { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes", - "name": "groupPubKey", - "type": "bytes" - } - ], - "name": "DkgResultPublishedEvent", - "type": "event" - }, - "0xd2d1d8bb9db82c3480418ddcddf25a021102ad139edec2a62b274595d408a88d": { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "beneficiary", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "groupIndex", - "type": "uint256" - } - ], - "name": "GroupMemberRewardsWithdrawn", - "type": "event" - }, - "0x0769b89b6dbd96af3cdebccc7b68ce1e4ae748abc3e6b19a73b8b58460c57a94": { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "newEntry", - "type": "uint256" - } - ], - "name": "GroupSelectionStarted", - "type": "event" - }, - "0x3a32cfbcd60aee14d75b837115f97fc141e9f9fa0d1fcd310b6306abbf329c15": { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes", - "name": "groupPubKey", - "type": "bytes" - } - ], - "name": "OnGroupRegistered", - "type": "event" - }, - "0xf3a8bf09e4f9146a48f9b91226985ac8d83d971beb4fc9ffdc569790e85a97e4": { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes", - "name": "previousEntry", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "groupPublicKey", - "type": "bytes" - } - ], - "name": "RelayEntryRequested", - "type": "event" - }, - "0x8711cae111460cf9bde0d890f0dc09abcb8851e39bf020f406e53e86394cdbd7": { - "anonymous": false, - "inputs": [], - "name": "RelayEntrySubmitted", - "type": "event" - } - }, - "links": { - "GroupSelection": "0x49e75D5714fb92b061ED1863626BCBd458E2370f", - "Groups": "0xc75Df8B0aF13EFba5b44Fa2585998b208378c2E2", - "DKGResultVerification": "0x721EA02c31Ed7bc0E5e6F015F0F35cE6481355e4", - "Reimbursements": "0x02795737F7E00Ff921A11ec8874c64A3d685e6B9", - "BLS": "0xB7E3ab953891aaCE71Baf0690bB6CD3a2BafF4BA" - }, - "address": "0x8d804f0c36d2c3A40EE128B7a01fe5269D511206", - "transactionHash": "0x2055224ff0a1cb38f7c1f25692381eb5576adb14b98c42a83d32f07f50ee7e44" - } - }, - "schemaVersion": "3.0.23", - "updatedAt": "2020-03-20T18:49:57.890Z", - "networkType": "ethereum", - "devdoc": { - "details": "Keep client facing contract for random beacon security-critical operations. Handles group creation and expiration, BLS signature verification and incentives. The contract is not upgradeable. New functionality can be implemented by deploying new versions following Keep client update and re-authorization by the stakers.", - "methods": { - "addServiceContract(address)": { - "details": "Adds service contract", - "params": { - "serviceContract": "Address of the service contract." - } - }, - "createGroup(uint256,address)": { - "details": "Triggers the selection process of a new candidate group.", - "params": { - "_newEntry": "New random beacon value that stakers will use to generate their tickets.", - "submitter": "Operator of this contract." - } - }, - "entryVerificationFee()": { - "details": "Returns fee for entry verification in wei. Does not include group profit fee, DKG contribution or callback fee." - }, - "genesis()": { - "details": "Triggers the first group selection. Genesis can be called only when there are no groups on the operator contract." - }, - "getFirstActiveGroupIndex()": { - "details": "Gets the index of the first active group." - }, - "getGroupMemberIndices(bytes,address)": { - "details": "Gets all indices in the provided group for a member." - }, - "getGroupMemberRewards(bytes)": { - "details": "Returns accumulated group member rewards for provided group." - }, - "getGroupMembers(bytes)": { - "details": "Returns members of the given group by group public key." - }, - "getGroupPublicKey(uint256)": { - "details": "Gets group public key." - }, - "groupCreationFee()": { - "details": "Returns fee for group creation in wei. Includes the cost of DKG and the cost of triggering group selection." - }, - "groupProfitFee()": { - "details": "Gets group profit fee expressed in wei." - }, - "hasMinimumStake(address)": { - "details": "Checks if the specified account has enough active stake to become network operator and that this contract has been authorized for potential slashing. * Having the required minimum of active stake makes the operator eligible to join the network. If the active stake is not currently undelegating, operator is also eligible for work selection.", - "params": { - "staker": "Staker's address" - }, - "return": "True if has enough active stake to participate in the network, false otherwise." - }, - "isGroupRegistered(bytes)": { - "details": "Checks if group with the given public key is registered." - }, - "isStaleGroup(bytes)": { - "details": "Checks if a group with the given public key is a stale group. Stale group is an expired group which is no longer performing any operations. It is important to understand that an expired group may still perform some operations for which it was selected when it was still active. We consider a group to be stale when it's expired and when its expiration time and potentially executed operation timeout are both in the past." - }, - "numberOfGroups()": { - "details": "Gets the number of active groups. Expired and terminated groups are not counted as active." - }, - "relayEntry(bytes)": { - "details": "Creates a new relay entry and stores the associated data on the chain.", - "params": { - "_groupSignature": "Group BLS signature over the concatenation of the previous entry and seed." - } - }, - "removeServiceContract(address)": { - "details": "Removes service contract", - "params": { - "serviceContract": "Address of the service contract." - } - }, - "reportRelayEntryTimeout()": { - "details": "Function used to inform about the fact the currently ongoing new relay entry generation operation timed out. As a result, the group which was supposed to produce a new relay entry is immediately terminated and a new group is selected to produce a new relay entry. All members of the group are punished by seizing minimum stake of their tokens. The submitter of the transaction is rewarded with a tattletale reward which is limited to min(1, 20 / group_size) of the maximum tattletale reward." - }, - "reportUnauthorizedSigning(uint256,bytes)": { - "details": "Reports unauthorized signing for the provided group. Must provide a valid signature of the tattletale address as a message. Successful signature verification means the private key has been leaked and all group members should be punished by seizing their tokens. The submitter of this proof is rewarded with 5% of the total seized amount scaled by the reward adjustment parameter and the rest 95% is burned." - }, - "selectedParticipants()": { - "details": "Gets selected participants in ascending order of their tickets." - }, - "sign(uint256,bytes)": { - "details": "Creates a request to generate a new relay entry, which will include a random number (by signing the previous entry's random number).", - "params": { - "previousEntry": "Previous relay entry", - "requestId": "Request Id trackable by service contract" - } - }, - "submitDkgResult(uint256,bytes,bytes,bytes,uint256[])": { - "details": "Submits result of DKG protocol. It is on-chain part of phase 14 of the protocol.", - "params": { - "groupPubKey": "Generated candidate group public key", - "misbehaved": "Bytes array of misbehaved (disqualified or inactive) group members indexes in ascending order; Indexes reflect positions of members in the group as outputted by the group selection protocol.", - "signatures": "Concatenation of signatures from members supporting the result.", - "signingMembersIndexes": "Indices of members corresponding to each signature.", - "submitterMemberIndex": "Claimed submitter candidate group member index" - } - }, - "submitTicket(bytes32)": { - "details": "Submits ticket to request to participate in a new candidate group.", - "params": { - "ticket": "Bytes representation of a ticket that holds the following: - ticketValue: first 8 bytes of a result of keccak256 cryptography hash function on the combination of the group selection seed (previous beacon output), staker-specific value (address) and virtual staker index. - stakerValue: a staker-specific value which is the address of the staker. - virtualStakerIndex: 4-bytes number within a range of 1 to staker's weight; has to be unique for all tickets submitted by the given staker for the current candidate group selection." - } - }, - "submittedTicketsCount()": { - "details": "Gets the number of submitted group candidate tickets so far." - }, - "ticketSubmissionTimeout()": { - "details": "Gets the timeout in blocks after which group candidate ticket submission is finished." - }, - "withdrawGroupMemberRewards(address,uint256,uint256[])": { - "details": "Withdraws accumulated group member rewards for operator using the provided group index and member indices. Once the accumulated reward is withdrawn from the selected group, member is removed from it. Rewards can be withdrawn only from stale group.", - "params": { - "groupIndex": "Group index.", - "groupMemberIndices": "Array of member indices for the group member.", - "operator": "Operator address." - } - } - }, - "title": "KeepRandomBeaconOperator" - }, - "userdoc": { - "methods": {} - } -} diff --git a/infrastructure/eth-networks/keep-test/ropsten/KeepToken.json b/infrastructure/eth-networks/keep-test/ropsten/KeepToken.json deleted file mode 100644 index cdd99fe94d..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/KeepToken.json +++ /dev/null @@ -1,2646 +0,0 @@ -{ - "contractName": "KeepToken", - "abi": [ - { - "inputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "constant": true, - "inputs": [], - "name": "DECIMALS", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "INITIAL_SUPPLY", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "NAME", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "SYMBOL", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "burn", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "burnFrom", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_extraData", - "type": "bytes" - } - ], - "name": "approveAndCall", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } - ], - "metadata": "{\"compiler\":{\"version\":\"0.5.14+commit.01f1aaa4\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"constant\":true,\"inputs\":[],\"name\":\"DECIMALS\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"INITIAL_SUPPLY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"NAME\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"SYMBOL\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"approveAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Standard ERC20Burnable token\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. * Requirements: * - `spender` cannot be the zero address.\"},\"approveAndCall(address,uint256,bytes)\":{\"params\":{\"_extraData\":\"Extra information to send to the approved contract.\",\"_spender\":\"The address authorized to spend.\",\"_value\":\"The max amount they can spend.\"}},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"burn(uint256)\":{\"details\":\"Destroys `amount` tokens from the caller. * See {ERC20-_burn}.\"},\"burnFrom(address,uint256)\":{\"details\":\"See {ERC20-_burnFrom}.\"},\"constructor\":{\"details\":\"Gives msg.sender all of existing tokens.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. * Emits an {Approval} event indicating the updated allowance. * Requirements: * - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. * Emits an {Approval} event indicating the updated allowance. * Requirements: * - `spender` cannot be the zero address.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. * Requirements: * - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. * Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}; * Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for `sender`'s tokens of at least `amount`.\"}},\"title\":\"KEEP Token\"},\"userdoc\":{\"methods\":{\"approveAndCall(address,uint256,bytes)\":{\"notice\":\"Set allowance for other address and notify. Allows `_spender` to spend no more than `_value` tokens on your behalf and then ping the contract about it.\"}}}},\"settings\":{\"compilationTarget\":{\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/KeepToken.sol\":\"KeepToken\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/KeepToken.sol\":{\"keccak256\":\"0xf7fbdcddaba9e342e897671b76a88014de365932ee6c15062819aaf9e7e569cf\",\"urls\":[\"bzz-raw://377627122a00218d0b8ea2e060cb4fefaa3d9c7c723bd711b4d3259c724bc683\",\"dweb:/ipfs/QmV6CYcSCW5Q7mtFpk3tVEJwLtzjxUugowHgdbi6aLAwQP\"]},\"openzeppelin-solidity/contracts/GSN/Context.sol\":{\"keccak256\":\"0x90a3995645af7562d84b9d69363ffa5ae7217714ab61e951bf7bc450f40e4061\",\"urls\":[\"bzz-raw://216ef9d6b614db4eb46970b4e84903f2534a45572dd30a79f0041f1a5830f436\",\"dweb:/ipfs/QmNPrJ4MWKUAWzKXpUqeyKRUfosaoANZAqXgvepdrCwZAG\"]},\"openzeppelin-solidity/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x640b6dee7a4b830bdfd52b5031a07fc2b12209f5b2e29e5d364a7d37f69d8076\",\"urls\":[\"bzz-raw://31113152e1ddb78fe7a4197f247591ca894e93f916867beb708d8e747b6cc74f\",\"dweb:/ipfs/QmbZaJyXdpsYGykVhHH9qpVGQg9DGCxE2QufbCUy3daTgq\"]},\"openzeppelin-solidity/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x65a4078c03875c25413a068ce9cfdd7e68a90f8786612d1189c89341e6e3b802\",\"urls\":[\"bzz-raw://45c0d95495b944fbb1aa09d900b0ab530903a432125ab8fddfa05064a7988991\",\"dweb:/ipfs/Qma2VeknkKA1THeubGzshWFk44BktXkXP1UKp9Un2uDSsu\"]},\"openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol\":{\"keccak256\":\"0x9b94356691f3cbf90a5d83ae3fdf6a5a662bb004d2bd8b034160d60221807e64\",\"urls\":[\"bzz-raw://14a9d33db455302b8bb9fdb28998efefbe5a1cb41b29e31391609f646b2ab351\",\"dweb:/ipfs/Qmd4wFr6GEMZnnxgXeq3gmp7cs8tqDuHp3TVNhCbjnux2V\"]},\"openzeppelin-solidity/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe5bb0f57cff3e299f360052ba50f1ea0fff046df2be070b6943e0e3c3fdad8a9\",\"urls\":[\"bzz-raw://59fd025151435da35faa8093a5c7a17de02de9d08ad27275c5cdf05050820d91\",\"dweb:/ipfs/QmQMvwEcPhoRXzbXyrdoeRtvLoifUW9Qh7Luho7bmUPRkc\"]}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b5062000030336b033b2e3c9fd0803ce80000006200003660201b60201c565b62000289565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620000da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b620000f6816002546200020060201b620011bb1790919060201c565b60028190555062000154816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200020060201b620011bb1790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000808284019050838110156200027f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6116b180620002996000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610469578063cae9ca51146104cf578063dd62ed3e146105cc578063f76f8d7814610644576100f5565b806370a08231146102da57806379cc679014610332578063a3f4df7e14610380578063a457c2d714610403576100f5565b80632e0f2625116100d35780632e0f2625146102045780632ff2e9dc14610228578063395093511461024657806342966c68146102ac576100f5565b8063095ea7b3146100fa57806318160ddd1461016057806323b872dd1461017e575b600080fd5b6101466004803603604081101561011057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106c7565b604051808215151515815260200191505060405180910390f35b6101686106e5565b6040518082815260200191505060405180910390f35b6101ea6004803603606081101561019457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106ef565b604051808215151515815260200191505060405180910390f35b61020c6107c8565b604051808260ff1660ff16815260200191505060405180910390f35b6102306107cd565b6040518082815260200191505060405180910390f35b6102926004803603604081101561025c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506107dd565b604051808215151515815260200191505060405180910390f35b6102d8600480360360208110156102c257600080fd5b8101908080359060200190929190505050610890565b005b61031c600480360360208110156102f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108a4565b6040518082815260200191505060405180910390f35b61037e6004803603604081101561034857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506108ec565b005b6103886108fa565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103c85780820151818401526020810190506103ad565b50505050905090810190601f1680156103f55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61044f6004803603604081101561041957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610933565b604051808215151515815260200191505060405180910390f35b6104b56004803603604081101561047f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a00565b604051808215151515815260200191505060405180910390f35b6105b2600480360360608110156104e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561052c57600080fd5b82018360208201111561053e57600080fd5b8035906020019184600183028401116401000000008311171561056057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610a1e565b604051808215151515815260200191505060405180910390f35b61062e600480360360408110156105e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b86565b6040518082815260200191505060405180910390f35b61064c610c0d565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561068c578082015181840152602081019050610671565b50505050905090810190601f1680156106b95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60006106db6106d4610c46565b8484610c4e565b6001905092915050565b6000600254905090565b60006106fc848484610e45565b6107bd84610708610c46565b6107b8856040518060600160405280602881526020016115a260289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061076e610c46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110fb9092919063ffffffff16565b610c4e565b600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60006108866107ea610c46565b8461088185600160006107fb610c46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111bb90919063ffffffff16565b610c4e565b6001905092915050565b6108a161089b610c46565b82611243565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108f682826113fb565b5050565b6040518060400160405280600a81526020017f4b45455020546f6b656e0000000000000000000000000000000000000000000081525081565b60006109f6610940610c46565b846109f185604051806060016040528060258152602001611658602591396001600061096a610c46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110fb9092919063ffffffff16565b610c4e565b6001905092915050565b6000610a14610a0d610c46565b8484610e45565b6001905092915050565b600080849050610a2e85856106c7565b15610b7d578073ffffffffffffffffffffffffffffffffffffffff16638f4ffcb1338630876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610b0c578082015181840152602081019050610af1565b50505050905090810190601f168015610b395780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015610b5b57600080fd5b505af1158015610b6f573d6000803e3d6000fd5b505050506001915050610b7f565b505b9392505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6040518060400160405280600481526020017f4b4545500000000000000000000000000000000000000000000000000000000081525081565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806116346024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061155a6022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ecb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061160f6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f51576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806115156023913960400191505060405180910390fd5b610fbc8160405180606001604052806026815260200161157c602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110fb9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061104f816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111bb90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60008383111582906111a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561116d578082015181840152602081019050611152565b50505050905090810190601f16801561119a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015611239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806115ee6021913960400191505060405180910390fd5b61133481604051806060016040528060228152602001611538602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110fb9092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061138b816002546114ca90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6114058282611243565b6114c682611411610c46565b6114c1846040518060600160405280602481526020016115ca60249139600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611477610c46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110fb9092919063ffffffff16565b610c4e565b5050565b600061150c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506110fb565b90509291505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723158201ba4a5fa995fe31e2d9beff9aaa988c1d15c964adee2c12bf524d93a62dc86dd64736f6c634300050e0032", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100f55760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610469578063cae9ca51146104cf578063dd62ed3e146105cc578063f76f8d7814610644576100f5565b806370a08231146102da57806379cc679014610332578063a3f4df7e14610380578063a457c2d714610403576100f5565b80632e0f2625116100d35780632e0f2625146102045780632ff2e9dc14610228578063395093511461024657806342966c68146102ac576100f5565b8063095ea7b3146100fa57806318160ddd1461016057806323b872dd1461017e575b600080fd5b6101466004803603604081101561011057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106c7565b604051808215151515815260200191505060405180910390f35b6101686106e5565b6040518082815260200191505060405180910390f35b6101ea6004803603606081101561019457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106ef565b604051808215151515815260200191505060405180910390f35b61020c6107c8565b604051808260ff1660ff16815260200191505060405180910390f35b6102306107cd565b6040518082815260200191505060405180910390f35b6102926004803603604081101561025c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506107dd565b604051808215151515815260200191505060405180910390f35b6102d8600480360360208110156102c257600080fd5b8101908080359060200190929190505050610890565b005b61031c600480360360208110156102f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108a4565b6040518082815260200191505060405180910390f35b61037e6004803603604081101561034857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506108ec565b005b6103886108fa565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103c85780820151818401526020810190506103ad565b50505050905090810190601f1680156103f55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61044f6004803603604081101561041957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610933565b604051808215151515815260200191505060405180910390f35b6104b56004803603604081101561047f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a00565b604051808215151515815260200191505060405180910390f35b6105b2600480360360608110156104e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561052c57600080fd5b82018360208201111561053e57600080fd5b8035906020019184600183028401116401000000008311171561056057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610a1e565b604051808215151515815260200191505060405180910390f35b61062e600480360360408110156105e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b86565b6040518082815260200191505060405180910390f35b61064c610c0d565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561068c578082015181840152602081019050610671565b50505050905090810190601f1680156106b95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60006106db6106d4610c46565b8484610c4e565b6001905092915050565b6000600254905090565b60006106fc848484610e45565b6107bd84610708610c46565b6107b8856040518060600160405280602881526020016115a260289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061076e610c46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110fb9092919063ffffffff16565b610c4e565b600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60006108866107ea610c46565b8461088185600160006107fb610c46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111bb90919063ffffffff16565b610c4e565b6001905092915050565b6108a161089b610c46565b82611243565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108f682826113fb565b5050565b6040518060400160405280600a81526020017f4b45455020546f6b656e0000000000000000000000000000000000000000000081525081565b60006109f6610940610c46565b846109f185604051806060016040528060258152602001611658602591396001600061096a610c46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110fb9092919063ffffffff16565b610c4e565b6001905092915050565b6000610a14610a0d610c46565b8484610e45565b6001905092915050565b600080849050610a2e85856106c7565b15610b7d578073ffffffffffffffffffffffffffffffffffffffff16638f4ffcb1338630876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610b0c578082015181840152602081019050610af1565b50505050905090810190601f168015610b395780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015610b5b57600080fd5b505af1158015610b6f573d6000803e3d6000fd5b505050506001915050610b7f565b505b9392505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6040518060400160405280600481526020017f4b4545500000000000000000000000000000000000000000000000000000000081525081565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806116346024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061155a6022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ecb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061160f6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f51576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806115156023913960400191505060405180910390fd5b610fbc8160405180606001604052806026815260200161157c602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110fb9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061104f816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111bb90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60008383111582906111a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561116d578082015181840152602081019050611152565b50505050905090810190601f16801561119a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015611239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806115ee6021913960400191505060405180910390fd5b61133481604051806060016040528060228152602001611538602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110fb9092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061138b816002546114ca90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6114058282611243565b6114c682611411610c46565b6114c1846040518060600160405280602481526020016115ca60249139600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611477610c46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110fb9092919063ffffffff16565b610c4e565b5050565b600061150c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506110fb565b90509291505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723158201ba4a5fa995fe31e2d9beff9aaa988c1d15c964adee2c12bf524d93a62dc86dd64736f6c634300050e0032", - "sourceMap": "377:1227:5:-;;;803:71;8:9:-1;5:2;;;30:1;27;20:12;5:2;803:71:5;834:33;840:10;681:6;834:5;;;:33;;:::i;:::-;377:1227;;5962:302:46;6056:1;6037:21;;:7;:21;;;;6029:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6120:24;6137:6;6120:12;;:16;;;;;;:24;;;;:::i;:::-;6105:12;:39;;;;6175:30;6198:6;6175:9;:18;6185:7;6175:18;;;;;;;;;;;;;;;;:22;;;;;;:30;;;;:::i;:::-;6154:9;:18;6164:7;6154:18;;;;;;;;;;;;;;;:51;;;;6241:7;6220:37;;6237:1;6220:37;;;6250:6;6220:37;;;;;;;;;;;;;;;;;;5962:302;;:::o;834:176:45:-;892:7;911:9;927:1;923;:5;911:17;;951:1;946;:6;;938:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1002:1;995:8;;;834:176;;;;:::o;377:1227:5:-;;;;;;;", - "deployedSourceMap": "377:1227:5:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;377:1227:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2500:149:46;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2500:149:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1559:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3107:300;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3107:300:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;511:35:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;640:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3802:207:46;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3802:207:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;439:81:47;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;439:81:47;;;;;;;;;;;;;;;;;:::i;:::-;;1706:108:46;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1706:108:46;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;577:101:47;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;577:101:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;419:42:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;419:42:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4496:258:46;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4496:258:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2017:155;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2017:155:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1262:339:5;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1262:339:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;1262:339:5;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;1262:339:5;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;1262:339:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;1262:339:5;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2230:132:46;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2230:132:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;467:38:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;467:38:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2500:149:46;2566:4;2582:39;2591:12;:10;:12::i;:::-;2605:7;2614:6;2582:8;:39::i;:::-;2638:4;2631:11;;2500:149;;;;:::o;1559:89::-;1603:7;1629:12;;1622:19;;1559:89;:::o;3107:300::-;3196:4;3212:36;3222:6;3230:9;3241:6;3212:9;:36::i;:::-;3258:121;3267:6;3275:12;:10;:12::i;:::-;3289:89;3327:6;3289:89;;;;;;;;;;;;;;;;;:11;:19;3301:6;3289:19;;;;;;;;;;;;;;;:33;3309:12;:10;:12::i;:::-;3289:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;3258:8;:121::i;:::-;3396:4;3389:11;;3107:300;;;;;:::o;511:35:5:-;544:2;511:35;:::o;640:47::-;681:6;640:47;:::o;3802:207:46:-;3882:4;3898:83;3907:12;:10;:12::i;:::-;3921:7;3930:50;3969:10;3930:11;:25;3942:12;:10;:12::i;:::-;3930:25;;;;;;;;;;;;;;;:34;3956:7;3930:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;3898:8;:83::i;:::-;3998:4;3991:11;;3802:207;;;;:::o;439:81:47:-;486:27;492:12;:10;:12::i;:::-;506:6;486:5;:27::i;:::-;439:81;:::o;1706:108:46:-;1763:7;1789:9;:18;1799:7;1789:18;;;;;;;;;;;;;;;;1782:25;;1706:108;;;:::o;577:101:47:-;645:26;655:7;664:6;645:9;:26::i;:::-;577:101;;:::o;419:42:5:-;;;;;;;;;;;;;;;;;;;:::o;4496:258:46:-;4581:4;4597:129;4606:12;:10;:12::i;:::-;4620:7;4629:96;4668:15;4629:96;;;;;;;;;;;;;;;;;:11;:25;4641:12;:10;:12::i;:::-;4629:25;;;;;;;;;;;;;;;:34;4655:7;4629:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;4597:8;:129::i;:::-;4743:4;4736:11;;4496:258;;;;:::o;2017:155::-;2086:4;2102:42;2112:12;:10;:12::i;:::-;2126:9;2137:6;2102:9;:42::i;:::-;2161:4;2154:11;;2017:155;;;;:::o;1262:339:5:-;1361:12;1385:22;1425:8;1385:49;;1448:25;1456:8;1466:6;1448:7;:25::i;:::-;1444:151;;;1489:7;:23;;;1513:10;1525:6;1541:4;1548:10;1489:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1489:70:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1489:70:5;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1489:70:5;;;;1580:4;1573:11;;;;;1444:151;1262:339;;;;;;;:::o;2230:132:46:-;2302:7;2328:11;:18;2340:5;2328:18;;;;;;;;;;;;;;;:27;2347:7;2328:27;;;;;;;;;;;;;;;;2321:34;;2230:132;;;;:::o;467:38:5:-;;;;;;;;;;;;;;;;;;;:::o;788:96:43:-;833:15;867:10;860:17;;788:96;:::o;7351:332:46:-;7461:1;7444:19;;:5;:19;;;;7436:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7541:1;7522:21;;:7;:21;;;;7514:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7623:6;7593:11;:18;7605:5;7593:18;;;;;;;;;;;;;;;:27;7612:7;7593:27;;;;;;;;;;;;;;;:36;;;;7660:7;7644:32;;7653:5;7644:32;;;7669:6;7644:32;;;;;;;;;;;;;;;;;;7351:332;;;:::o;5228:464::-;5343:1;5325:20;;:6;:20;;;;5317:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5426:1;5405:23;;:9;:23;;;;5397:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5499;5521:6;5499:71;;;;;;;;;;;;;;;;;:9;:17;5509:6;5499:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;5479:9;:17;5489:6;5479:17;;;;;;;;;;;;;;;:91;;;;5603:32;5628:6;5603:9;:20;5613:9;5603:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;5580:9;:20;5590:9;5580:20;;;;;;;;;;;;;;;:55;;;;5667:9;5650:35;;5659:6;5650:35;;;5678:6;5650:35;;;;;;;;;;;;;;;;;;5228:464;;;:::o;1732:187:45:-;1818:7;1850:1;1845;:6;;1853:12;1837:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1837:29:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1876:9;1892:1;1888;:5;1876:17;;1911:1;1904:8;;;1732:187;;;;;:::o;834:176::-;892:7;911:9;927:1;923;:5;911:17;;951:1;946;:6;;938:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1002:1;995:8;;;834:176;;;;:::o;6584:342:46:-;6678:1;6659:21;;:7;:21;;;;6651:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6750:68;6773:6;6750:68;;;;;;;;;;;;;;;;;:9;:18;6760:7;6750:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;6729:9;:18;6739:7;6729:18;;;;;;;;;;;;;;;:89;;;;6843:24;6860:6;6843:12;;:16;;:24;;;;:::i;:::-;6828:12;:39;;;;6908:1;6882:37;;6891:7;6882:37;;;6912:6;6882:37;;;;;;;;;;;;;;;;;;6584:342;;:::o;7861:229::-;7932:22;7938:7;7947:6;7932:5;:22::i;:::-;7964:119;7973:7;7982:12;:10;:12::i;:::-;7996:86;8035:6;7996:86;;;;;;;;;;;;;;;;;:11;:20;8008:7;7996:20;;;;;;;;;;;;;;;:34;8017:12;:10;:12::i;:::-;7996:34;;;;;;;;;;;;;;;;:38;;:86;;;;;:::i;:::-;7964:8;:119::i;:::-;7861:229;;:::o;1274:134:45:-;1332:7;1358:43;1362:1;1365;1358:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1351:50;;1274:134;;;;:::o", - "source": "pragma solidity ^0.5.4;\n\nimport \"openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol\";\n\n/**\n @dev Interface of recipient contract for approveAndCall pattern.\n*/\ninterface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes calldata _extraData) external; }\n\n\n/**\n * @title KEEP Token\n * @dev Standard ERC20Burnable token\n */\ncontract KeepToken is ERC20Burnable {\n string public constant NAME = \"KEEP Token\";\n string public constant SYMBOL = \"KEEP\";\n uint8 public constant DECIMALS = 18; // The number of digits after the decimal place when displaying token values on-screen.\n uint256 public constant INITIAL_SUPPLY = 10**27; // 1 billion tokens, 18 decimal places.\n\n /**\n * @dev Gives msg.sender all of existing tokens.\n */\n constructor() public {\n _mint(msg.sender, INITIAL_SUPPLY);\n }\n\n /**\n * @notice Set allowance for other address and notify.\n * Allows `_spender` to spend no more than `_value` tokens\n * on your behalf and then ping the contract about it.\n * @param _spender The address authorized to spend.\n * @param _value The max amount they can spend.\n * @param _extraData Extra information to send to the approved contract.\n */\n function approveAndCall(address _spender, uint256 _value, bytes memory _extraData) public returns (bool success) {\n tokenRecipient spender = tokenRecipient(_spender);\n if (approve(_spender, _value)) {\n spender.receiveApproval(msg.sender, _value, address(this), _extraData);\n return true;\n }\n }\n\n}\n", - "sourcePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/KeepToken.sol", - "ast": { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/KeepToken.sol", - "exportedSymbols": { - "KeepToken": [ - 2962 - ], - "tokenRecipient": [ - 2897 - ] - }, - "id": 2963, - "nodeType": "SourceUnit", - "nodes": [ - { - "id": 2884, - "literals": [ - "solidity", - "^", - "0.5", - ".4" - ], - "nodeType": "PragmaDirective", - "src": "0:23:5" - }, - { - "absolutePath": "openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol", - "file": "openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol", - "id": 2885, - "nodeType": "ImportDirective", - "scope": 2963, - "sourceUnit": 12384, - "src": "25:71:5", - "symbolAliases": [], - "unitAlias": "" - }, - { - "baseContracts": [], - "contractDependencies": [], - "contractKind": "interface", - "documentation": "@dev Interface of recipient contract for approveAndCall pattern.", - "fullyImplemented": false, - "id": 2897, - "linearizedBaseContracts": [ - 2897 - ], - "name": "tokenRecipient", - "nodeType": "ContractDefinition", - "nodes": [ - { - "body": null, - "documentation": null, - "id": 2896, - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "receiveApproval", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2894, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2887, - "name": "_from", - "nodeType": "VariableDeclaration", - "scope": 2896, - "src": "223:13:5", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 2886, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "223:7:5", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 2889, - "name": "_value", - "nodeType": "VariableDeclaration", - "scope": 2896, - "src": "238:14:5", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2888, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "238:7:5", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 2891, - "name": "_token", - "nodeType": "VariableDeclaration", - "scope": 2896, - "src": "254:14:5", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 2890, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "254:7:5", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 2893, - "name": "_extraData", - "nodeType": "VariableDeclaration", - "scope": 2896, - "src": "270:25:5", - "stateVariable": false, - "storageLocation": "calldata", - "typeDescriptions": { - "typeIdentifier": "t_bytes_calldata_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 2892, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "270:5:5", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "222:74:5" - }, - "returnParameters": { - "id": 2895, - "nodeType": "ParameterList", - "parameters": [], - "src": "305:0:5" - }, - "scope": 2897, - "src": "198:108:5", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "external" - } - ], - "scope": 2963, - "src": "171:137:5" - }, - { - "baseContracts": [ - { - "arguments": null, - "baseName": { - "contractScope": null, - "id": 2898, - "name": "ERC20Burnable", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 12383, - "src": "399:13:5", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "id": 2899, - "nodeType": "InheritanceSpecifier", - "src": "399:13:5" - } - ], - "contractDependencies": [ - 11676, - 12349, - 12383, - 12452 - ], - "contractKind": "contract", - "documentation": "@title KEEP Token\n@dev Standard ERC20Burnable token", - "fullyImplemented": true, - "id": 2962, - "linearizedBaseContracts": [ - 2962, - 12383, - 12349, - 12452, - 11676 - ], - "name": "KeepToken", - "nodeType": "ContractDefinition", - "nodes": [ - { - "constant": true, - "id": 2902, - "name": "NAME", - "nodeType": "VariableDeclaration", - "scope": 2962, - "src": "419:42:5", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_string_memory", - "typeString": "string" - }, - "typeName": { - "id": 2900, - "name": "string", - "nodeType": "ElementaryTypeName", - "src": "419:6:5", - "typeDescriptions": { - "typeIdentifier": "t_string_storage_ptr", - "typeString": "string" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "4b45455020546f6b656e", - "id": 2901, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "449:12:5", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_5bd5b25213f8ed00c4212a1ed70b62617987e94979746b839bc5d419491f2cd2", - "typeString": "literal_string \"KEEP Token\"" - }, - "value": "KEEP Token" - }, - "visibility": "public" - }, - { - "constant": true, - "id": 2905, - "name": "SYMBOL", - "nodeType": "VariableDeclaration", - "scope": 2962, - "src": "467:38:5", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_string_memory", - "typeString": "string" - }, - "typeName": { - "id": 2903, - "name": "string", - "nodeType": "ElementaryTypeName", - "src": "467:6:5", - "typeDescriptions": { - "typeIdentifier": "t_string_storage_ptr", - "typeString": "string" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "4b454550", - "id": 2904, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "499:6:5", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_cc1c7d1875340db4414c4b13e888160517f4e3358e62546848352d867e16bb21", - "typeString": "literal_string \"KEEP\"" - }, - "value": "KEEP" - }, - "visibility": "public" - }, - { - "constant": true, - "id": 2908, - "name": "DECIMALS", - "nodeType": "VariableDeclaration", - "scope": 2962, - "src": "511:35:5", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint8", - "typeString": "uint8" - }, - "typeName": { - "id": 2906, - "name": "uint8", - "nodeType": "ElementaryTypeName", - "src": "511:5:5", - "typeDescriptions": { - "typeIdentifier": "t_uint8", - "typeString": "uint8" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "3138", - "id": 2907, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "544:2:5", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_18_by_1", - "typeString": "int_const 18" - }, - "value": "18" - }, - "visibility": "public" - }, - { - "constant": true, - "id": 2913, - "name": "INITIAL_SUPPLY", - "nodeType": "VariableDeclaration", - "scope": 2962, - "src": "640:47:5", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2909, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "640:7:5", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_1000000000000000000000000000_by_1", - "typeString": "int_const 1000000000000000000000000000" - }, - "id": 2912, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "hexValue": "3130", - "id": 2910, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "681:2:5", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_10_by_1", - "typeString": "int_const 10" - }, - "value": "10" - }, - "nodeType": "BinaryOperation", - "operator": "**", - "rightExpression": { - "argumentTypes": null, - "hexValue": "3237", - "id": 2911, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "685:2:5", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_27_by_1", - "typeString": "int_const 27" - }, - "value": "27" - }, - "src": "681:6:5", - "typeDescriptions": { - "typeIdentifier": "t_rational_1000000000000000000000000000_by_1", - "typeString": "int_const 1000000000000000000000000000" - } - }, - "visibility": "public" - }, - { - "body": { - "id": 2922, - "nodeType": "Block", - "src": "824:50:5", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 2917, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "840:3:5", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 2918, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "840:10:5", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - { - "argumentTypes": null, - "id": 2919, - "name": "INITIAL_SUPPLY", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2913, - "src": "852:14:5", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 2916, - "name": "_mint", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12233, - "src": "834:5:5", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$", - "typeString": "function (address,uint256)" - } - }, - "id": 2920, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "834:33:5", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 2921, - "nodeType": "ExpressionStatement", - "src": "834:33:5" - } - ] - }, - "documentation": "@dev Gives msg.sender all of existing tokens.", - "id": 2923, - "implemented": true, - "kind": "constructor", - "modifiers": [], - "name": "", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2914, - "nodeType": "ParameterList", - "parameters": [], - "src": "814:2:5" - }, - "returnParameters": { - "id": 2915, - "nodeType": "ParameterList", - "parameters": [], - "src": "824:0:5" - }, - "scope": 2962, - "src": "803:71:5", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 2960, - "nodeType": "Block", - "src": "1375:226:5", - "statements": [ - { - "assignments": [ - 2935 - ], - "declarations": [ - { - "constant": false, - "id": 2935, - "name": "spender", - "nodeType": "VariableDeclaration", - "scope": 2960, - "src": "1385:22:5", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_contract$_tokenRecipient_$2897", - "typeString": "contract tokenRecipient" - }, - "typeName": { - "contractScope": null, - "id": 2934, - "name": "tokenRecipient", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 2897, - "src": "1385:14:5", - "typeDescriptions": { - "typeIdentifier": "t_contract$_tokenRecipient_$2897", - "typeString": "contract tokenRecipient" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 2939, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 2937, - "name": "_spender", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2925, - "src": "1425:8:5", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 2936, - "name": "tokenRecipient", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2897, - "src": "1410:14:5", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_tokenRecipient_$2897_$", - "typeString": "type(contract tokenRecipient)" - } - }, - "id": 2938, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1410:24:5", - "typeDescriptions": { - "typeIdentifier": "t_contract$_tokenRecipient_$2897", - "typeString": "contract tokenRecipient" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "1385:49:5" - }, - { - "condition": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 2941, - "name": "_spender", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2925, - "src": "1456:8:5", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 2942, - "name": "_value", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2927, - "src": "1466:6:5", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 2940, - "name": "approve", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12042, - "src": "1448:7:5", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$", - "typeString": "function (address,uint256) returns (bool)" - } - }, - "id": 2943, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1448:25:5", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 2959, - "nodeType": "IfStatement", - "src": "1444:151:5", - "trueBody": { - "id": 2958, - "nodeType": "Block", - "src": "1475:120:5", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 2947, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "1513:3:5", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 2948, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "1513:10:5", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - { - "argumentTypes": null, - "id": 2949, - "name": "_value", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2927, - "src": "1525:6:5", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 2951, - "name": "this", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12880, - "src": "1541:4:5", - "typeDescriptions": { - "typeIdentifier": "t_contract$_KeepToken_$2962", - "typeString": "contract KeepToken" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_contract$_KeepToken_$2962", - "typeString": "contract KeepToken" - } - ], - "id": 2950, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "1533:7:5", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": "address" - }, - "id": 2952, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1533:13:5", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 2953, - "name": "_extraData", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2929, - "src": "1548:10:5", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "expression": { - "argumentTypes": null, - "id": 2944, - "name": "spender", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2935, - "src": "1489:7:5", - "typeDescriptions": { - "typeIdentifier": "t_contract$_tokenRecipient_$2897", - "typeString": "contract tokenRecipient" - } - }, - "id": 2946, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "receiveApproval", - "nodeType": "MemberAccess", - "referencedDeclaration": 2896, - "src": "1489:23:5", - "typeDescriptions": { - "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$_t_address_$_t_bytes_memory_ptr_$returns$__$", - "typeString": "function (address,uint256,address,bytes memory) external" - } - }, - "id": 2954, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1489:70:5", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 2955, - "nodeType": "ExpressionStatement", - "src": "1489:70:5" - }, - { - "expression": { - "argumentTypes": null, - "hexValue": "74727565", - "id": 2956, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "bool", - "lValueRequested": false, - "nodeType": "Literal", - "src": "1580:4:5", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "value": "true" - }, - "functionReturnParameters": 2933, - "id": 2957, - "nodeType": "Return", - "src": "1573:11:5" - } - ] - } - } - ] - }, - "documentation": "@notice Set allowance for other address and notify.\nAllows `_spender` to spend no more than `_value` tokens\non your behalf and then ping the contract about it.\n@param _spender The address authorized to spend.\n@param _value The max amount they can spend.\n@param _extraData Extra information to send to the approved contract.", - "id": 2961, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "approveAndCall", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2930, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2925, - "name": "_spender", - "nodeType": "VariableDeclaration", - "scope": 2961, - "src": "1286:16:5", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 2924, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1286:7:5", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 2927, - "name": "_value", - "nodeType": "VariableDeclaration", - "scope": 2961, - "src": "1304:14:5", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2926, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1304:7:5", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 2929, - "name": "_extraData", - "nodeType": "VariableDeclaration", - "scope": 2961, - "src": "1320:23:5", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 2928, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "1320:5:5", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1285:59:5" - }, - "returnParameters": { - "id": 2933, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2932, - "name": "success", - "nodeType": "VariableDeclaration", - "scope": 2961, - "src": "1361:12:5", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 2931, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "1361:4:5", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1360:14:5" - }, - "scope": 2962, - "src": "1262:339:5", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - } - ], - "scope": 2963, - "src": "377:1227:5" - } - ], - "src": "0:1605:5" - }, - "legacyAST": { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/KeepToken.sol", - "exportedSymbols": { - "KeepToken": [ - 2962 - ], - "tokenRecipient": [ - 2897 - ] - }, - "id": 2963, - "nodeType": "SourceUnit", - "nodes": [ - { - "id": 2884, - "literals": [ - "solidity", - "^", - "0.5", - ".4" - ], - "nodeType": "PragmaDirective", - "src": "0:23:5" - }, - { - "absolutePath": "openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol", - "file": "openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol", - "id": 2885, - "nodeType": "ImportDirective", - "scope": 2963, - "sourceUnit": 12384, - "src": "25:71:5", - "symbolAliases": [], - "unitAlias": "" - }, - { - "baseContracts": [], - "contractDependencies": [], - "contractKind": "interface", - "documentation": "@dev Interface of recipient contract for approveAndCall pattern.", - "fullyImplemented": false, - "id": 2897, - "linearizedBaseContracts": [ - 2897 - ], - "name": "tokenRecipient", - "nodeType": "ContractDefinition", - "nodes": [ - { - "body": null, - "documentation": null, - "id": 2896, - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "receiveApproval", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2894, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2887, - "name": "_from", - "nodeType": "VariableDeclaration", - "scope": 2896, - "src": "223:13:5", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 2886, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "223:7:5", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 2889, - "name": "_value", - "nodeType": "VariableDeclaration", - "scope": 2896, - "src": "238:14:5", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2888, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "238:7:5", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 2891, - "name": "_token", - "nodeType": "VariableDeclaration", - "scope": 2896, - "src": "254:14:5", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 2890, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "254:7:5", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 2893, - "name": "_extraData", - "nodeType": "VariableDeclaration", - "scope": 2896, - "src": "270:25:5", - "stateVariable": false, - "storageLocation": "calldata", - "typeDescriptions": { - "typeIdentifier": "t_bytes_calldata_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 2892, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "270:5:5", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "222:74:5" - }, - "returnParameters": { - "id": 2895, - "nodeType": "ParameterList", - "parameters": [], - "src": "305:0:5" - }, - "scope": 2897, - "src": "198:108:5", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "external" - } - ], - "scope": 2963, - "src": "171:137:5" - }, - { - "baseContracts": [ - { - "arguments": null, - "baseName": { - "contractScope": null, - "id": 2898, - "name": "ERC20Burnable", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 12383, - "src": "399:13:5", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "id": 2899, - "nodeType": "InheritanceSpecifier", - "src": "399:13:5" - } - ], - "contractDependencies": [ - 11676, - 12349, - 12383, - 12452 - ], - "contractKind": "contract", - "documentation": "@title KEEP Token\n@dev Standard ERC20Burnable token", - "fullyImplemented": true, - "id": 2962, - "linearizedBaseContracts": [ - 2962, - 12383, - 12349, - 12452, - 11676 - ], - "name": "KeepToken", - "nodeType": "ContractDefinition", - "nodes": [ - { - "constant": true, - "id": 2902, - "name": "NAME", - "nodeType": "VariableDeclaration", - "scope": 2962, - "src": "419:42:5", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_string_memory", - "typeString": "string" - }, - "typeName": { - "id": 2900, - "name": "string", - "nodeType": "ElementaryTypeName", - "src": "419:6:5", - "typeDescriptions": { - "typeIdentifier": "t_string_storage_ptr", - "typeString": "string" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "4b45455020546f6b656e", - "id": 2901, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "449:12:5", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_5bd5b25213f8ed00c4212a1ed70b62617987e94979746b839bc5d419491f2cd2", - "typeString": "literal_string \"KEEP Token\"" - }, - "value": "KEEP Token" - }, - "visibility": "public" - }, - { - "constant": true, - "id": 2905, - "name": "SYMBOL", - "nodeType": "VariableDeclaration", - "scope": 2962, - "src": "467:38:5", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_string_memory", - "typeString": "string" - }, - "typeName": { - "id": 2903, - "name": "string", - "nodeType": "ElementaryTypeName", - "src": "467:6:5", - "typeDescriptions": { - "typeIdentifier": "t_string_storage_ptr", - "typeString": "string" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "4b454550", - "id": 2904, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "499:6:5", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_cc1c7d1875340db4414c4b13e888160517f4e3358e62546848352d867e16bb21", - "typeString": "literal_string \"KEEP\"" - }, - "value": "KEEP" - }, - "visibility": "public" - }, - { - "constant": true, - "id": 2908, - "name": "DECIMALS", - "nodeType": "VariableDeclaration", - "scope": 2962, - "src": "511:35:5", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint8", - "typeString": "uint8" - }, - "typeName": { - "id": 2906, - "name": "uint8", - "nodeType": "ElementaryTypeName", - "src": "511:5:5", - "typeDescriptions": { - "typeIdentifier": "t_uint8", - "typeString": "uint8" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "3138", - "id": 2907, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "544:2:5", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_18_by_1", - "typeString": "int_const 18" - }, - "value": "18" - }, - "visibility": "public" - }, - { - "constant": true, - "id": 2913, - "name": "INITIAL_SUPPLY", - "nodeType": "VariableDeclaration", - "scope": 2962, - "src": "640:47:5", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2909, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "640:7:5", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_1000000000000000000000000000_by_1", - "typeString": "int_const 1000000000000000000000000000" - }, - "id": 2912, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "hexValue": "3130", - "id": 2910, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "681:2:5", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_10_by_1", - "typeString": "int_const 10" - }, - "value": "10" - }, - "nodeType": "BinaryOperation", - "operator": "**", - "rightExpression": { - "argumentTypes": null, - "hexValue": "3237", - "id": 2911, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "685:2:5", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_27_by_1", - "typeString": "int_const 27" - }, - "value": "27" - }, - "src": "681:6:5", - "typeDescriptions": { - "typeIdentifier": "t_rational_1000000000000000000000000000_by_1", - "typeString": "int_const 1000000000000000000000000000" - } - }, - "visibility": "public" - }, - { - "body": { - "id": 2922, - "nodeType": "Block", - "src": "824:50:5", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 2917, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "840:3:5", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 2918, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "840:10:5", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - { - "argumentTypes": null, - "id": 2919, - "name": "INITIAL_SUPPLY", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2913, - "src": "852:14:5", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 2916, - "name": "_mint", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12233, - "src": "834:5:5", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$", - "typeString": "function (address,uint256)" - } - }, - "id": 2920, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "834:33:5", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 2921, - "nodeType": "ExpressionStatement", - "src": "834:33:5" - } - ] - }, - "documentation": "@dev Gives msg.sender all of existing tokens.", - "id": 2923, - "implemented": true, - "kind": "constructor", - "modifiers": [], - "name": "", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2914, - "nodeType": "ParameterList", - "parameters": [], - "src": "814:2:5" - }, - "returnParameters": { - "id": 2915, - "nodeType": "ParameterList", - "parameters": [], - "src": "824:0:5" - }, - "scope": 2962, - "src": "803:71:5", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 2960, - "nodeType": "Block", - "src": "1375:226:5", - "statements": [ - { - "assignments": [ - 2935 - ], - "declarations": [ - { - "constant": false, - "id": 2935, - "name": "spender", - "nodeType": "VariableDeclaration", - "scope": 2960, - "src": "1385:22:5", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_contract$_tokenRecipient_$2897", - "typeString": "contract tokenRecipient" - }, - "typeName": { - "contractScope": null, - "id": 2934, - "name": "tokenRecipient", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 2897, - "src": "1385:14:5", - "typeDescriptions": { - "typeIdentifier": "t_contract$_tokenRecipient_$2897", - "typeString": "contract tokenRecipient" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 2939, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 2937, - "name": "_spender", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2925, - "src": "1425:8:5", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 2936, - "name": "tokenRecipient", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2897, - "src": "1410:14:5", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_tokenRecipient_$2897_$", - "typeString": "type(contract tokenRecipient)" - } - }, - "id": 2938, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1410:24:5", - "typeDescriptions": { - "typeIdentifier": "t_contract$_tokenRecipient_$2897", - "typeString": "contract tokenRecipient" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "1385:49:5" - }, - { - "condition": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 2941, - "name": "_spender", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2925, - "src": "1456:8:5", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 2942, - "name": "_value", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2927, - "src": "1466:6:5", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 2940, - "name": "approve", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12042, - "src": "1448:7:5", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$", - "typeString": "function (address,uint256) returns (bool)" - } - }, - "id": 2943, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1448:25:5", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 2959, - "nodeType": "IfStatement", - "src": "1444:151:5", - "trueBody": { - "id": 2958, - "nodeType": "Block", - "src": "1475:120:5", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 2947, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "1513:3:5", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 2948, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "1513:10:5", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - { - "argumentTypes": null, - "id": 2949, - "name": "_value", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2927, - "src": "1525:6:5", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 2951, - "name": "this", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12880, - "src": "1541:4:5", - "typeDescriptions": { - "typeIdentifier": "t_contract$_KeepToken_$2962", - "typeString": "contract KeepToken" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_contract$_KeepToken_$2962", - "typeString": "contract KeepToken" - } - ], - "id": 2950, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "1533:7:5", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": "address" - }, - "id": 2952, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1533:13:5", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 2953, - "name": "_extraData", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2929, - "src": "1548:10:5", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "expression": { - "argumentTypes": null, - "id": 2944, - "name": "spender", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2935, - "src": "1489:7:5", - "typeDescriptions": { - "typeIdentifier": "t_contract$_tokenRecipient_$2897", - "typeString": "contract tokenRecipient" - } - }, - "id": 2946, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "receiveApproval", - "nodeType": "MemberAccess", - "referencedDeclaration": 2896, - "src": "1489:23:5", - "typeDescriptions": { - "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$_t_address_$_t_bytes_memory_ptr_$returns$__$", - "typeString": "function (address,uint256,address,bytes memory) external" - } - }, - "id": 2954, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1489:70:5", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 2955, - "nodeType": "ExpressionStatement", - "src": "1489:70:5" - }, - { - "expression": { - "argumentTypes": null, - "hexValue": "74727565", - "id": 2956, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "bool", - "lValueRequested": false, - "nodeType": "Literal", - "src": "1580:4:5", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "value": "true" - }, - "functionReturnParameters": 2933, - "id": 2957, - "nodeType": "Return", - "src": "1573:11:5" - } - ] - } - } - ] - }, - "documentation": "@notice Set allowance for other address and notify.\nAllows `_spender` to spend no more than `_value` tokens\non your behalf and then ping the contract about it.\n@param _spender The address authorized to spend.\n@param _value The max amount they can spend.\n@param _extraData Extra information to send to the approved contract.", - "id": 2961, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "approveAndCall", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2930, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2925, - "name": "_spender", - "nodeType": "VariableDeclaration", - "scope": 2961, - "src": "1286:16:5", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 2924, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1286:7:5", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 2927, - "name": "_value", - "nodeType": "VariableDeclaration", - "scope": 2961, - "src": "1304:14:5", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2926, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1304:7:5", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 2929, - "name": "_extraData", - "nodeType": "VariableDeclaration", - "scope": 2961, - "src": "1320:23:5", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 2928, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "1320:5:5", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1285:59:5" - }, - "returnParameters": { - "id": 2933, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2932, - "name": "success", - "nodeType": "VariableDeclaration", - "scope": 2961, - "src": "1361:12:5", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 2931, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "1361:4:5", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1360:14:5" - }, - "scope": 2962, - "src": "1262:339:5", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - } - ], - "scope": 2963, - "src": "377:1227:5" - } - ], - "src": "0:1605:5" - }, - "compiler": { - "name": "solc", - "version": "0.5.14+commit.01f1aaa4.Emscripten.clang" - }, - "networks": { - "3": { - "events": { - "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925": { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef": { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - } - }, - "links": {}, - "address": "0xEF26cE3a729d4420558B10b8d9475CB84DA832c1", - "transactionHash": "0x10ae5df907ed71347d4e3c26ce598f8e5b2fdb4356958243d31ca6a46cb6da0f" - } - }, - "schemaVersion": "3.0.23", - "updatedAt": "2020-03-20T18:48:47.305Z", - "networkType": "ethereum", - "devdoc": { - "details": "Standard ERC20Burnable token", - "methods": { - "allowance(address,address)": { - "details": "See {IERC20-allowance}." - }, - "approve(address,uint256)": { - "details": "See {IERC20-approve}. * Requirements: * - `spender` cannot be the zero address." - }, - "approveAndCall(address,uint256,bytes)": { - "params": { - "_extraData": "Extra information to send to the approved contract.", - "_spender": "The address authorized to spend.", - "_value": "The max amount they can spend." - } - }, - "balanceOf(address)": { - "details": "See {IERC20-balanceOf}." - }, - "burn(uint256)": { - "details": "Destroys `amount` tokens from the caller. * See {ERC20-_burn}." - }, - "burnFrom(address,uint256)": { - "details": "See {ERC20-_burnFrom}." - }, - "constructor": { - "details": "Gives msg.sender all of existing tokens." - }, - "decreaseAllowance(address,uint256)": { - "details": "Atomically decreases the allowance granted to `spender` by the caller. * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. * Emits an {Approval} event indicating the updated allowance. * Requirements: * - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`." - }, - "increaseAllowance(address,uint256)": { - "details": "Atomically increases the allowance granted to `spender` by the caller. * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. * Emits an {Approval} event indicating the updated allowance. * Requirements: * - `spender` cannot be the zero address." - }, - "totalSupply()": { - "details": "See {IERC20-totalSupply}." - }, - "transfer(address,uint256)": { - "details": "See {IERC20-transfer}. * Requirements: * - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`." - }, - "transferFrom(address,address,uint256)": { - "details": "See {IERC20-transferFrom}. * Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}; * Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for `sender`'s tokens of at least `amount`." - } - }, - "title": "KEEP Token" - }, - "userdoc": { - "methods": { - "approveAndCall(address,uint256,bytes)": { - "notice": "Set allowance for other address and notify. Allows `_spender` to spend no more than `_value` tokens on your behalf and then ping the contract about it." - } - } - } -} \ No newline at end of file diff --git a/infrastructure/eth-networks/keep-test/ropsten/TokenStaking.json b/infrastructure/eth-networks/keep-test/ropsten/TokenStaking.json deleted file mode 100644 index 9f8e1703be..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/TokenStaking.json +++ /dev/null @@ -1,26677 +0,0 @@ -{ - "contractName": "TokenStaking", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_tokenAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_registry", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_initializationPeriod", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_undelegationPeriod", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "recoveredAt", - "type": "uint256" - } - ], - "name": "RecoveredStake", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Staked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "undelegatedAt", - "type": "uint256" - } - ], - "name": "Undelegated", - "type": "event" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_operator", - "type": "address" - } - ], - "name": "authorizerOf", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_address", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "balance", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "initializationPeriod", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_operator", - "type": "address" - } - ], - "name": "beneficiaryOf", - "outputs": [ - { - "internalType": "address payable", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "minimumStake", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "operators", - "outputs": [ - { - "internalType": "uint256", - "name": "packedParams", - "type": "uint256" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address payable", - "name": "beneficiary", - "type": "address" - }, - { - "internalType": "address", - "name": "authorizer", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_address", - "type": "address" - } - ], - "name": "operatorsOf", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_operator", - "type": "address" - } - ], - "name": "ownerOf", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "ownerOperators", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "registry", - "outputs": [ - { - "internalType": "contract Registry", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "token", - "outputs": [ - { - "internalType": "contract ERC20Burnable", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "undelegationPeriod", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_value", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_token", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_extraData", - "type": "bytes" - } - ], - "name": "receiveApproval", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_operator", - "type": "address" - } - ], - "name": "cancelStake", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_operator", - "type": "address" - } - ], - "name": "undelegate", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_operator", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_undelegationBlock", - "type": "uint256" - } - ], - "name": "undelegateAt", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_operator", - "type": "address" - } - ], - "name": "recoverStake", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_operator", - "type": "address" - } - ], - "name": "getDelegationInfo", - "outputs": [ - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "createdAt", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "undelegatedAt", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "amountToSlash", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "misbehavedOperators", - "type": "address[]" - } - ], - "name": "slash", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "amountToSeize", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "rewardMultiplier", - "type": "uint256" - }, - { - "internalType": "address", - "name": "tattletale", - "type": "address" - }, - { - "internalType": "address[]", - "name": "misbehavedOperators", - "type": "address[]" - } - ], - "name": "seize", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_operator", - "type": "address" - }, - { - "internalType": "address", - "name": "_operatorContract", - "type": "address" - } - ], - "name": "authorizeOperatorContract", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_operator", - "type": "address" - }, - { - "internalType": "address", - "name": "_operatorContract", - "type": "address" - } - ], - "name": "isAuthorizedForOperator", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_operator", - "type": "address" - }, - { - "internalType": "address", - "name": "_operatorContract", - "type": "address" - } - ], - "name": "eligibleStake", - "outputs": [ - { - "internalType": "uint256", - "name": "balance", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_operator", - "type": "address" - }, - { - "internalType": "address", - "name": "_operatorContract", - "type": "address" - } - ], - "name": "activeStake", - "outputs": [ - { - "internalType": "uint256", - "name": "balance", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "staker", - "type": "address" - }, - { - "internalType": "address", - "name": "operatorContract", - "type": "address" - } - ], - "name": "hasMinimumStake", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - } - ], - "metadata": "{\"compiler\":{\"version\":\"0.5.14+commit.01f1aaa4\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_tokenAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_registry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_initializationPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_undelegationPeriod\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"recoveredAt\",\"type\":\"uint256\"}],\"name\":\"RecoveredStake\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"undelegatedAt\",\"type\":\"uint256\"}],\"name\":\"Undelegated\",\"type\":\"event\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_operatorContract\",\"type\":\"address\"}],\"name\":\"activeStake\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_operatorContract\",\"type\":\"address\"}],\"name\":\"authorizeOperatorContract\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_operator\",\"type\":\"address\"}],\"name\":\"authorizerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_operator\",\"type\":\"address\"}],\"name\":\"cancelStake\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_operatorContract\",\"type\":\"address\"}],\"name\":\"eligibleStake\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_operator\",\"type\":\"address\"}],\"name\":\"getDelegationInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"undelegatedAt\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operatorContract\",\"type\":\"address\"}],\"name\":\"hasMinimumStake\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"initializationPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_operatorContract\",\"type\":\"address\"}],\"name\":\"isAuthorizedForOperator\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_operator\",\"type\":\"address\"}],\"name\":\"beneficiaryOf\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minimumStake\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"operators\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"packedParams\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"authorizer\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"operatorsOf\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_operator\",\"type\":\"address\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ownerOperators\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"receiveApproval\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_operator\",\"type\":\"address\"}],\"name\":\"recoverStake\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"registry\",\"outputs\":[{\"internalType\":\"contract Registry\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountToSeize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardMultiplier\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tattletale\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"misbehavedOperators\",\"type\":\"address[]\"}],\"name\":\"seize\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountToSlash\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"misbehavedOperators\",\"type\":\"address[]\"}],\"name\":\"slash\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract ERC20Burnable\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_operator\",\"type\":\"address\"}],\"name\":\"undelegate\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_undelegationBlock\",\"type\":\"uint256\"}],\"name\":\"undelegateAt\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"undelegationPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"A token staking contract for a specified standard ERC20Burnable token. A holder of the specified token can stake delegate its tokens to this contract and recover the stake after undelegation period is over.\",\"methods\":{\"activeStake(address,address)\":{\"details\":\"Gets the active stake balance of the specified address. An active stake is a stake that passed the initialization period. Also, the operator had to approve the specified operator contract. * The difference between eligible stake is that active stake does not make the operator eligible for work selection but it may be still finishing earlier work during undelegation period. Operator with a minimum required amount of active stake can join the network but cannot be selected to any new work.\",\"params\":{\"_operator\":\"address of stake operator.\",\"_operatorContract\":\"address of operator contract.\"},\"return\":\"an uint256 representing the eligible stake balance.\"},\"authorizeOperatorContract(address,address)\":{\"details\":\"Authorizes operator contract to access staked token balance of the provided operator. Can only be executed by stake operator authorizer.\",\"params\":{\"_operator\":\"address of stake operator.\",\"_operatorContract\":\"address of operator contract.\"}},\"authorizerOf(address)\":{\"details\":\"Gets the authorizer for the specified operator address.\",\"return\":\"Authorizer address.\"},\"balanceOf(address)\":{\"details\":\"Gets the stake balance of the specified address.\",\"params\":{\"_address\":\"The address to query the balance of.\"},\"return\":\"An uint256 representing the amount staked by the passed address.\"},\"cancelStake(address)\":{\"params\":{\"_operator\":\"Address of the stake operator.\"}},\"constructor\":{\"details\":\"Creates a token staking contract for a provided Standard ERC20Burnable token.\",\"params\":{\"_initializationPeriod\":\"To avoid certain attacks on work selection, recently created operators must wait for a specific period of time before being eligible for work selection.\",\"_registry\":\"Address of a keep registry that will be linked to this contract.\",\"_tokenAddress\":\"Address of a token that will be linked to this contract.\",\"_undelegationPeriod\":\"The staking contract guarantees that an undelegated operator\\u2019s stakes will stay locked for a number of blocks after undelegation, and thus available as collateral for any work the operator is engaged in.\"}},\"eligibleStake(address,address)\":{\"details\":\"Gets the eligible stake balance of the specified address. An eligible stake is a stake that passed the initialization period and is not currently undelegating. Also, the operator had to approve the specified operator contract. * Operator with a minimum required amount of eligible stake can join the network and participate in new work selection.\",\"params\":{\"_operator\":\"address of stake operator.\",\"_operatorContract\":\"address of operator contract.\"},\"return\":\"an uint256 representing the eligible stake balance.\"},\"getDelegationInfo(address)\":{\"details\":\"Gets stake delegation info for the given operator.\",\"params\":{\"_operator\":\"Operator address.\"},\"return\":\"amount The amount of tokens the given operator delegated.createdAt The time when the stake has been delegated.undelegatedAt The time when undelegation has been requested. If undelegation has not been requested, 0 is returned.\"},\"hasMinimumStake(address,address)\":{\"details\":\"Checks if the specified account has enough active stake to become network operator and that the specified operator contract has been authorized for potential slashing. * Having the required minimum of active stake makes the operator eligible to join the network. If the active stake is not currently undelegating, operator is also eligible for work selection.\",\"params\":{\"operatorContract\":\"Operator contract's address\",\"staker\":\"Staker's address\"},\"return\":\"True if has enough active stake to participate in the network, false otherwise.\"},\"isAuthorizedForOperator(address,address)\":{\"details\":\"Checks if operator contract has access to the staked token balance of the provided operator.\",\"params\":{\"_operator\":\"address of stake operator.\",\"_operatorContract\":\"address of operator contract.\"}},\"beneficiaryOf(address)\":{\"details\":\"Gets the beneficiary for the specified operator address.\",\"return\":\"Beneficiary address.\"},\"operatorsOf(address)\":{\"details\":\"Gets the list of operators of the specified address.\",\"return\":\"An array of addresses.\"},\"ownerOf(address)\":{\"details\":\"Gets the stake owner for the specified operator address.\",\"return\":\"Stake owner address.\"},\"receiveApproval(address,uint256,address,bytes)\":{\"details\":\"Makes sure provided token contract is the same one linked to this contract.\",\"params\":{\"_extraData\":\"Data for stake delegation. This byte array must have the following values concatenated: Beneficiary address (20 bytes) where the rewards for participation are sent, operator's (20 bytes) address, authorizer (20 bytes) address.\",\"_from\":\"The owner of the tokens who approved them to transfer.\",\"_token\":\"Token contract address.\",\"_value\":\"Approved amount for the transfer and stake.\"}},\"recoverStake(address)\":{\"params\":{\"_operator\":\"Operator address.\"}},\"seize(uint256,uint256,address,address[])\":{\"details\":\"Seize provided token amount from every member in the misbehaved operators array. The tattletale is rewarded with 5% of the total seized amount scaled by the reward adjustment parameter and the rest 95% is burned.\",\"params\":{\"amountToSeize\":\"Token amount to seize from every misbehaved operator.\",\"misbehavedOperators\":\"Array of addresses to seize the tokens from.\",\"rewardMultiplier\":\"Reward adjustment in percentage. Min 1% and 100% max.\",\"tattletale\":\"Address to receive the 5% reward.\"}},\"slash(uint256,address[])\":{\"details\":\"Slash provided token amount from every member in the misbehaved operators array and burn 100% of all the tokens.\",\"params\":{\"amountToSlash\":\"Token amount to slash from every misbehaved operator.\",\"misbehavedOperators\":\"Array of addresses to seize the tokens from.\"}},\"undelegate(address)\":{\"params\":{\"_operator\":\"Address of the stake operator.\"}},\"undelegateAt(address,uint256)\":{\"params\":{\"_operator\":\"Address of the stake operator.\",\"_undelegationBlock\":\"The block undelegation is to start at.\"}}},\"title\":\"TokenStaking\"},\"userdoc\":{\"methods\":{\"cancelStake(address)\":{\"notice\":\"Cancels stake of tokens within the operator initialization period without being subjected to the token lockup for the undelegation period. This can be used to undo mistaken delegation to the wrong operator address.\"},\"receiveApproval(address,uint256,address,bytes)\":{\"notice\":\"Receives approval of token transfer and stakes the approved amount.\"},\"recoverStake(address)\":{\"notice\":\"Recovers staked tokens and transfers them back to the owner. Recovering tokens can only be performed when the operator is finished undelegating.\"},\"undelegate(address)\":{\"notice\":\"Undelegates staked tokens. You will be able to recover your stake by calling `recoverStake()` with operator address once undelegation period is over.\"},\"undelegateAt(address,uint256)\":{\"notice\":\"Set an undelegation time for staked tokens. Undelegation will begin at the specified block. You will be able to recover your stake by calling `recoverStake()` with operator address once undelegation period is over.\"}}}},\"settings\":{\"compilationTarget\":{\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/TokenStaking.sol\":\"TokenStaking\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/Registry.sol\":{\"keccak256\":\"0x4f6fef443c1336786eedeb6ecf4e4ec4be9d3045fea1992f27319877f5d4edd5\",\"urls\":[\"bzz-raw://e989329d2aa565402c0fa74f9140d2b31321286a37a3fde42dad3d5242751896\",\"dweb:/ipfs/QmRTZMGzxaspq3nRNpwHhJkQQTBp8eoEW16rW5RdWeammT\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/StakeDelegatable.sol\":{\"keccak256\":\"0x0c03cada5ad67b0e5630d6d69eacabc4f3302b5cb9fd23169baa326a5899faba\",\"urls\":[\"bzz-raw://46a02efef4d155ab89898f36a603f268b0e4f28603d32edca78a2f3cff90ff08\",\"dweb:/ipfs/QmNwNC2vyQVWaK8mXu6XPhPxBBupvHf83RiTUKswM7PfMH\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/TokenStaking.sol\":{\"keccak256\":\"0xa2b8532e48f4fd810e99af2067512879e5b082a473e2cdbb66da66a6909a3860\",\"urls\":[\"bzz-raw://6f2d521a35d49aeeb0b0357ed39202c0cee6776ac5f380ea210a01f61d1f7df2\",\"dweb:/ipfs/Qmbkb7frkLjWGa5Firkug3mEARHyvW3aVX2PcWsh7dZKhN\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/utils/AddressArrayUtils.sol\":{\"keccak256\":\"0x1e2fa13708e5e5132828166429e0448f7896ac800d4cd1b8f3fee7cc86fd0fe2\",\"urls\":[\"bzz-raw://e6d846f394fb993e0ed817dc6bb073479cf27be2d79c9645de29c75053f46679\",\"dweb:/ipfs/QmXfP33iWfvHkmgKkePfPZcz8tuu3qqqA6tELzYgD61QGY\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/utils/BytesLib.sol\":{\"keccak256\":\"0xd5cf94f3e0b64669bf3dc5327e9f4e3a2f27cbf866682a13cfeef87e7a3c02f7\",\"urls\":[\"bzz-raw://3d556b1560fe4b273f2ccfed1c38a4399c08467bd6b66070396f47b545c8e725\",\"dweb:/ipfs/QmZdJooqvwL5GhGx9pJZ8CHsbp3Ggj7Bh5WFXx77KMbcY1\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/utils/OperatorParams.sol\":{\"keccak256\":\"0xfba3dc1f5de166a89c3c3287c089795cc7a78072566b0fc610838d37aee2c98e\",\"urls\":[\"bzz-raw://876df6f572120a8c743c5d8e888732d61af3131db108e72e7c8f7b70544884e3\",\"dweb:/ipfs/QmTP1Co2U7Ea8KTzGSCvgwYff2ziF2fBS6vmrG4Yx8Pm6d\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/utils/PercentUtils.sol\":{\"keccak256\":\"0x2be7ede4269e27df4533bef3146017e61d3bfbdc73347b5e00045ce3f05828b5\",\"urls\":[\"bzz-raw://df953b0720ddc61473854471664fb0ef5ea6dcf353c24b9135bfecc4849396b0\",\"dweb:/ipfs/QmVDySNAqxwRvzVxs4BoeBpmzZ1V5evXy9SdraVhfxc1e3\"]},\"/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/utils/UintArrayUtils.sol\":{\"keccak256\":\"0x058717e1c0d234de225dc6efe59c37da8647d19499ee9e53f6203ad6097940ab\",\"urls\":[\"bzz-raw://423ccb1e227840fe503f594424192b846f9e77b153be1613b2f91f3a69fd3461\",\"dweb:/ipfs/QmetdgvmXsJD62VugQ5fdyXqhwULMGuRsDL49eHdFrzh2a\"]},\"openzeppelin-solidity/contracts/GSN/Context.sol\":{\"keccak256\":\"0x90a3995645af7562d84b9d69363ffa5ae7217714ab61e951bf7bc450f40e4061\",\"urls\":[\"bzz-raw://216ef9d6b614db4eb46970b4e84903f2534a45572dd30a79f0041f1a5830f436\",\"dweb:/ipfs/QmNPrJ4MWKUAWzKXpUqeyKRUfosaoANZAqXgvepdrCwZAG\"]},\"openzeppelin-solidity/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x640b6dee7a4b830bdfd52b5031a07fc2b12209f5b2e29e5d364a7d37f69d8076\",\"urls\":[\"bzz-raw://31113152e1ddb78fe7a4197f247591ca894e93f916867beb708d8e747b6cc74f\",\"dweb:/ipfs/QmbZaJyXdpsYGykVhHH9qpVGQg9DGCxE2QufbCUy3daTgq\"]},\"openzeppelin-solidity/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x65a4078c03875c25413a068ce9cfdd7e68a90f8786612d1189c89341e6e3b802\",\"urls\":[\"bzz-raw://45c0d95495b944fbb1aa09d900b0ab530903a432125ab8fddfa05064a7988991\",\"dweb:/ipfs/Qma2VeknkKA1THeubGzshWFk44BktXkXP1UKp9Un2uDSsu\"]},\"openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol\":{\"keccak256\":\"0x9b94356691f3cbf90a5d83ae3fdf6a5a662bb004d2bd8b034160d60221807e64\",\"urls\":[\"bzz-raw://14a9d33db455302b8bb9fdb28998efefbe5a1cb41b29e31391609f646b2ab351\",\"dweb:/ipfs/Qmd4wFr6GEMZnnxgXeq3gmp7cs8tqDuHp3TVNhCbjnux2V\"]},\"openzeppelin-solidity/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe5bb0f57cff3e299f360052ba50f1ea0fff046df2be070b6943e0e3c3fdad8a9\",\"urls\":[\"bzz-raw://59fd025151435da35faa8093a5c7a17de02de9d08ad27275c5cdf05050820d91\",\"dweb:/ipfs/QmQMvwEcPhoRXzbXyrdoeRtvLoifUW9Qh7Luho7bmUPRkc\"]},\"openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol\":{\"keccak256\":\"0x6f2c9955d65c522b80f4b8792f076512d2df947d2112cbc4d98a4781ed42ede2\",\"urls\":[\"bzz-raw://7d8ec81683520c06baeef3f7e06cd82bd6fd5fa611f26857f475f6c829540aff\",\"dweb:/ipfs/QmTDkFzKnrpiV1UKnSoiZAHPuguWzokrr4pFbSPvyaSo56\"]},\"openzeppelin-solidity/contracts/utils/Address.sol\":{\"keccak256\":\"0x70df50e240407aa50915ad14f61b1a901fa335b37de20955b99ed647be756af0\",\"urls\":[\"bzz-raw://9404711f3206610c08ea97fa52c7b6b4d2e9d536e96fc4b7210aa7e24f796c36\",\"dweb:/ipfs/QmZDzpVzjoap13SuPEq5pVCrmdjoKVZnTsQPLKXAbynTTW\"]}},\"version\":1}", - "bytecode": "0x6080604052692a5a058fc295ed00000060055534801561001e57600080fd5b5060405162003dbd38038062003dbd8339818101604052608081101561004357600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190505050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546f6b656e20616464726573732063616e2774206265207a65726f2e0000000081525060200191505060405180910390fd5b836000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816001819055508060028190555050505050613c0580620001b86000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80639557e0bb116100de578063ec5ffac211610097578063fab46d6611610071578063fab46d6614610b8f578063fb1677b114610bf5578063fc0c546a14610c79578063fdd1f98614610cc357610173565b8063ec5ffac214610a91578063ef1f966114610aaf578063f165478314610b2b57610173565b80639557e0bb14610862578063aed1ec72146108da578063afff33ef146108f8578063b534fbb614610970578063da8be86414610a09578063e064172e14610a4d57610173565b80635139a6c5116101305780635139a6c514610567578063525835f9146105b557806370a08231146105f95780637b103999146106515780638e49aa7a1461069b5780638f4ffcb11461075d57610173565b806309055e901461017857806310a63ec01461026457806313e7c9d8146102e057806314afd79e146103d15780631cdac873146104555780634239dd8d146104d9575b600080fd5b6102626004803603608081101561018e57600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156101df57600080fd5b8201836020820111156101f157600080fd5b8035906020019184602083028401116401000000008311171561021357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050610ce1565b005b6102c66004803603604081101561027a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611254565b604051808215151515815260200191505060405180910390f35b610322600480360360208110156102f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061126d565b604051808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390f35b610413600480360360208110156103e757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112fd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104976004803603602081101561046b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611369565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610525600480360360408110156104ef57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113d5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105b36004803603604081101561057d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611420565b005b6105f7600480360360208110156105cb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061178d565b005b61063b6004803603602081101561060f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119d3565b6040518082815260200191505060405180910390f35b610659611a27565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61075b600480360360408110156106b157600080fd5b8101908080359060200190929190803590602001906401000000008111156106d857600080fd5b8201836020820111156106ea57600080fd5b8035906020019184602083028401116401000000008311171561070c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611a4d565b005b6108606004803603608081101561077357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156107da57600080fd5b8201836020820111156107ec57600080fd5b8035906020019184600183028401116401000000008311171561080e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611f35565b005b6108c46004803603604081101561087857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612495565b6040518082815260200191505060405180910390f35b6108e26125b8565b6040518082815260200191505060405180910390f35b61095a6004803603604081101561090e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125be565b6040518082815260200191505060405180910390f35b6109b26004803603602081101561098657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061270d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109f55780820151818401526020810190506109da565b505050509050019250505060405180910390f35b610a4b60048036036020811015610a1f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127da565b005b610a8f60048036036020811015610a6357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127e7565b005b610a99612a9a565b6040518082815260200191505060405180910390f35b610b1160048036036040811015610ac557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612aa0565b604051808215151515815260200191505060405180910390f35b610b8d60048036036040811015610b4157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b34565b005b610bd160048036036020811015610ba557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e03565b60405180848152602001838152602001828152602001935050505060405180910390f35b610c3760048036036020811015610c0b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e60565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610c81612ecc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ccb612ef1565b6040518082815260200191505060405180910390f35b33600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166384d57689826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610d8157600080fd5b505afa158015610d95573d6000803e3d6000fd5b505050506040513d6020811015610dab57600080fd5b8101908080519060200190929190505050610e11576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806139ce6021913960400191505060405180910390fd5b600080905060008090505b8351811015611136576000848281518110610e3357fe5b60200260200101519050600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610f39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f72697a656400000000000000000000000000000000000081525060200191505060405180910390fd5b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050610f9d600154610f8f83612ef7565b612f0e90919063ffffffff16565b4311611011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f70657261746f72207374616b65206d7573742062652061637469766500000081525060200191505060405180910390fd5b600061101c82612f96565b90508981101561109f576110398186612f0e90919063ffffffff16565b945060008090506110538184612fb090919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555050611126565b6110b28a86612f0e90919063ffffffff16565b945060006110c98b83612fd590919063ffffffff16565b90506110de8184612fb090919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550505b5050508080600101915050610e1c565b50600061115f8661115160058561301f90919063ffffffff16565b61301f90919063ffffffff16565b90506111ad85826000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661304f9092919063ffffffff16565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c686111fd8385612fd590919063ffffffff16565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561123357600080fd5b505af1158015611247573d6000803e3d6000fd5b5050505050505050505050565b60006005546112638484612495565b1015905092915050565b60046020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905084565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600360205281600052604060002081815481106113ee57fe5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161490508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806114f15750805b611546576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806139346037913960400191505060405180910390fd5b4383101561159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613b7d602a913960400191505060405180910390fd5b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060006115f182612ef7565b905060006115fe83613120565b905061161560015483612f0e90919063ffffffff16565b861161166c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526043815260200180613a5c6043913960600191505060405180910390fd5b600081148061167a57508581115b806116825750835b6116d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180613b466037913960400191505060405180910390fd5b60006116ec878561313390919063ffffffff16565b905080600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055508773ffffffffffffffffffffffffffffffffffffffff167f4ae68879209bc4b489a38251122202a3653305e3d95a27baf7a5681410c90b38886040518082815260200191505060405180910390a25050505050505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506117f16002546117e383613120565b612f0e90919063ffffffff16565b4311611848576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180613a236039913960400191505060405180910390fd5b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006118ba83612f96565b90506118d0600084612fb090919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555061196282826000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661304f9092919063ffffffff16565b7f564f402e70218efee257fcbf84954e2e95e3ecc52cebe7b06c79955463752d5a8443604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a150505050565b6000611a20600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154612f96565b9050919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b33600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166384d57689826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611aed57600080fd5b505afa158015611b01573d6000803e3d6000fd5b505050506040513d6020811015611b1757600080fd5b8101908080519060200190929190505050611b7d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806139ce6021913960400191505060405180910390fd5b600080905060008090505b8351811015611ea2576000848281518110611b9f57fe5b60200260200101519050600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611ca5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f72697a656400000000000000000000000000000000000081525060200191505060405180910390fd5b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050611d09600154611cfb83612ef7565b612f0e90919063ffffffff16565b4311611d7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f70657261746f72207374616b65206d7573742062652061637469766500000081525060200191505060405180910390fd5b6000611d8882612f96565b905087811015611e0b57611da58186612f0e90919063ffffffff16565b94506000809050611dbf8184612fb090919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555050611e92565b611e1e8886612f0e90919063ffffffff16565b94506000611e358983612fd590919063ffffffff16565b9050611e4a8184612fb090919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550505b5050508080600101915050611b88565b506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611f1757600080fd5b505af1158015611f2b573d6000803e3d6000fd5b5050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611fda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613ac6603c913960400191505060405180910390fd5b600554831015612035576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806139ef6034913960400191505060405180910390fd5b603c81511461208f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180613a9f6027913960400191505060405180910390fd5b60006120a560008361315890919063ffffffff16565b905060006120bd60148461315890919063ffffffff16565b9050600073ffffffffffffffffffffffffffffffffffffffff16600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121a6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613b026023913960400191505060405180910390fd5b60006121bc60288561315890919063ffffffff16565b905061220c8730886000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166131eb909392919063ffffffff16565b6040518060800160405280612223884360006132f1565b81526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815250600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208290806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508173ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d876040518082815260200191505060405180910390a250505050505050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600061257682612ef7565b9050600061258f60015483612f0e90919063ffffffff16565b4311905083801561259d5750805b156125ae576125ab83612f96565b94505b5050505092915050565b60015481565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600061269f82612ef7565b905060006126ac83613120565b905060006126c560015484612f0e90919063ffffffff16565b4311905060008083141580156126da57508243115b90508580156126e65750815b80156126f0575080155b15612701576126fe85612f96565b96505b50505050505092915050565b6060600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156127ce57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612784575b50505050509050919050565b6127e48143611420565b50565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806128b357508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612908576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604281526020018061396b6042913960600191505060405180910390fd5b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905061296c60015461295e83612ef7565b612f0e90919063ffffffff16565b4311156129e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f496e697469616c697a6174696f6e20706572696f64206973206f76657200000081525060200191505060405180910390fd5b60006129ec82612f96565b9050612a02600083612fb090919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550612a9483826000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661304f9092919063ffffffff16565b50505050565b60055481565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b813373ffffffffffffffffffffffffffffffffffffffff16600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612c38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e6f74206f70657261746f7220617574686f72697a657200000000000000000081525060200191505060405180910390fd5b81600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166384d57689826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612cd857600080fd5b505afa158015612cec573d6000803e3d6000fd5b505050506040513d6020811015612d0257600080fd5b8101908080519060200190929190505050612d68576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806139ce6021913960400191505060405180910390fd5b6001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050505050565b6000806000612e53600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461341a565b9250925092509193909250565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025481565b60006001604060020a03604083901c169050919050565b600080828401905083811015612f8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006001608060020a03604060020283901c169050919050565b6000612fcd82612fbf85612ef7565b612fc886613120565b6132f1565b905092915050565b600061301783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613447565b905092915050565b60006130476064613039848661350790919063ffffffff16565b61358d90919063ffffffff16565b905092915050565b61311b838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb905060e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506135d7565b505050565b60006001604060020a0382169050919050565b600061315061314184612f96565b61314a85612ef7565b846132f1565b905092915050565b6000806014830190508281118015613171575080845110155b6131c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806139ad6021913960400191505060405180910390fd5b60006c0100000000000000000000000084602087010151049050809250505092915050565b6132eb848573ffffffffffffffffffffffffffffffffffffffff166323b872dd905060e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506135d7565b50505050565b60006001608060020a03841115613370576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f616d6f756e742075696e74313238206f766572666c6f7700000000000000000081525060200191505060405180910390fd5b6001604060020a0382841711156133ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f626c6f636b6865696768742075696e743634206f766572666c6f77000000000081525060200191505060405180910390fd5b6000604060020285901b90506000604085901b90506000849050808284171793505050509392505050565b600080600061342884612f96565b925061343384612ef7565b915061343e84613120565b90509193909250565b60008383111582906134f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156134b957808201518184015260208101905061349e565b50505050905090810190601f1680156134e65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083141561351a5760009050613587565b600082840290508284828161352b57fe5b0414613582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613b256021913960400191505060405180910390fd5b809150505b92915050565b60006135cf83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613822565b905092915050565b6135f68273ffffffffffffffffffffffffffffffffffffffff166138e8565b613668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b602083106136b75780518252602082019150602081019050602083039250613694565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613719576040519150601f19603f3d011682016040523d82523d6000602084013e61371e565b606091505b509150915081613796576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b60008151111561381c578080602001905160208110156137b557600080fd5b810190808051906020019092919050505061381b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613ba7602a913960400191505060405180910390fd5b5b50505050565b600080831182906138ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613893578082015181840152602081019050613878565b50505050905090810190601f1680156138c05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816138da57fe5b049050809150509392505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b821415801561392a5750808214155b9250505091905056fe4f6e6c79206f70657261746f72206f7220746865206f776e6572206f6620746865207374616b652063616e20756e64656c65676174652e4f6e6c79206f70657261746f72206f7220746865206f776e6572206f6620746865207374616b652063616e2063616e63656c207468652064656c65676174696f6e2e4164647265737320636f6e76657273696f6e206f7574206f6620626f756e64732e4f70657261746f7220636f6e7472616374206973206e6f7420617070726f766564546f6b656e7320616d6f756e74206d7573742062652067726561746572207468616e20746865206d696e696d756d207374616b6543616e206e6f74207265636f766572207374616b65206265666f726520756e64656c65676174696f6e20706572696f64206973206f7665722e43616e6e6f7420756e64656c656761746520696e20696e697469616c697a6174696f6e20706572696f642c207573652063616e63656c5374616b6520696e73746561645374616b652064656c65676174696f6e2064617461206d7573742062652070726f76696465642e546f6b656e20636f6e7472616374206d757374206265207468652073616d65206f6e65206c696e6b656420746f207468697320636f6e74726163742e4f70657261746f72206164647265737320697320616c726561647920696e207573652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f6e6c7920746865206f776e6572206d617920706f7374706f6e652070726576696f75736c792073657420756e64656c65676174696f6e4d6179206e6f742073657420756e64656c65676174696f6e20626c6f636b20696e2074686520706173745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a723158204272136381913dc283a18951a1c90f62081a161a54e0ac5c3cd1fd19c20b8a8064736f6c634300050e0032", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101735760003560e01c80639557e0bb116100de578063ec5ffac211610097578063fab46d6611610071578063fab46d6614610b8f578063fb1677b114610bf5578063fc0c546a14610c79578063fdd1f98614610cc357610173565b8063ec5ffac214610a91578063ef1f966114610aaf578063f165478314610b2b57610173565b80639557e0bb14610862578063aed1ec72146108da578063afff33ef146108f8578063b534fbb614610970578063da8be86414610a09578063e064172e14610a4d57610173565b80635139a6c5116101305780635139a6c514610567578063525835f9146105b557806370a08231146105f95780637b103999146106515780638e49aa7a1461069b5780638f4ffcb11461075d57610173565b806309055e901461017857806310a63ec01461026457806313e7c9d8146102e057806314afd79e146103d15780631cdac873146104555780634239dd8d146104d9575b600080fd5b6102626004803603608081101561018e57600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156101df57600080fd5b8201836020820111156101f157600080fd5b8035906020019184602083028401116401000000008311171561021357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050610ce1565b005b6102c66004803603604081101561027a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611254565b604051808215151515815260200191505060405180910390f35b610322600480360360208110156102f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061126d565b604051808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390f35b610413600480360360208110156103e757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112fd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104976004803603602081101561046b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611369565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610525600480360360408110156104ef57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113d5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105b36004803603604081101561057d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611420565b005b6105f7600480360360208110156105cb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061178d565b005b61063b6004803603602081101561060f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119d3565b6040518082815260200191505060405180910390f35b610659611a27565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61075b600480360360408110156106b157600080fd5b8101908080359060200190929190803590602001906401000000008111156106d857600080fd5b8201836020820111156106ea57600080fd5b8035906020019184602083028401116401000000008311171561070c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611a4d565b005b6108606004803603608081101561077357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156107da57600080fd5b8201836020820111156107ec57600080fd5b8035906020019184600183028401116401000000008311171561080e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611f35565b005b6108c46004803603604081101561087857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612495565b6040518082815260200191505060405180910390f35b6108e26125b8565b6040518082815260200191505060405180910390f35b61095a6004803603604081101561090e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125be565b6040518082815260200191505060405180910390f35b6109b26004803603602081101561098657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061270d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109f55780820151818401526020810190506109da565b505050509050019250505060405180910390f35b610a4b60048036036020811015610a1f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127da565b005b610a8f60048036036020811015610a6357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127e7565b005b610a99612a9a565b6040518082815260200191505060405180910390f35b610b1160048036036040811015610ac557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612aa0565b604051808215151515815260200191505060405180910390f35b610b8d60048036036040811015610b4157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b34565b005b610bd160048036036020811015610ba557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e03565b60405180848152602001838152602001828152602001935050505060405180910390f35b610c3760048036036020811015610c0b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e60565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610c81612ecc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ccb612ef1565b6040518082815260200191505060405180910390f35b33600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166384d57689826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610d8157600080fd5b505afa158015610d95573d6000803e3d6000fd5b505050506040513d6020811015610dab57600080fd5b8101908080519060200190929190505050610e11576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806139ce6021913960400191505060405180910390fd5b600080905060008090505b8351811015611136576000848281518110610e3357fe5b60200260200101519050600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610f39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f72697a656400000000000000000000000000000000000081525060200191505060405180910390fd5b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050610f9d600154610f8f83612ef7565b612f0e90919063ffffffff16565b4311611011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f70657261746f72207374616b65206d7573742062652061637469766500000081525060200191505060405180910390fd5b600061101c82612f96565b90508981101561109f576110398186612f0e90919063ffffffff16565b945060008090506110538184612fb090919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555050611126565b6110b28a86612f0e90919063ffffffff16565b945060006110c98b83612fd590919063ffffffff16565b90506110de8184612fb090919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550505b5050508080600101915050610e1c565b50600061115f8661115160058561301f90919063ffffffff16565b61301f90919063ffffffff16565b90506111ad85826000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661304f9092919063ffffffff16565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c686111fd8385612fd590919063ffffffff16565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561123357600080fd5b505af1158015611247573d6000803e3d6000fd5b5050505050505050505050565b60006005546112638484612495565b1015905092915050565b60046020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905084565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600360205281600052604060002081815481106113ee57fe5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161490508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806114f15750805b611546576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806139346037913960400191505060405180910390fd5b4383101561159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613b7d602a913960400191505060405180910390fd5b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060006115f182612ef7565b905060006115fe83613120565b905061161560015483612f0e90919063ffffffff16565b861161166c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526043815260200180613a5c6043913960600191505060405180910390fd5b600081148061167a57508581115b806116825750835b6116d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180613b466037913960400191505060405180910390fd5b60006116ec878561313390919063ffffffff16565b905080600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055508773ffffffffffffffffffffffffffffffffffffffff167f4ae68879209bc4b489a38251122202a3653305e3d95a27baf7a5681410c90b38886040518082815260200191505060405180910390a25050505050505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506117f16002546117e383613120565b612f0e90919063ffffffff16565b4311611848576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180613a236039913960400191505060405180910390fd5b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006118ba83612f96565b90506118d0600084612fb090919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555061196282826000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661304f9092919063ffffffff16565b7f564f402e70218efee257fcbf84954e2e95e3ecc52cebe7b06c79955463752d5a8443604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a150505050565b6000611a20600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154612f96565b9050919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b33600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166384d57689826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611aed57600080fd5b505afa158015611b01573d6000803e3d6000fd5b505050506040513d6020811015611b1757600080fd5b8101908080519060200190929190505050611b7d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806139ce6021913960400191505060405180910390fd5b600080905060008090505b8351811015611ea2576000848281518110611b9f57fe5b60200260200101519050600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611ca5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e6f7420617574686f72697a656400000000000000000000000000000000000081525060200191505060405180910390fd5b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050611d09600154611cfb83612ef7565b612f0e90919063ffffffff16565b4311611d7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f70657261746f72207374616b65206d7573742062652061637469766500000081525060200191505060405180910390fd5b6000611d8882612f96565b905087811015611e0b57611da58186612f0e90919063ffffffff16565b94506000809050611dbf8184612fb090919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555050611e92565b611e1e8886612f0e90919063ffffffff16565b94506000611e358983612fd590919063ffffffff16565b9050611e4a8184612fb090919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550505b5050508080600101915050611b88565b506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611f1757600080fd5b505af1158015611f2b573d6000803e3d6000fd5b5050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611fda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613ac6603c913960400191505060405180910390fd5b600554831015612035576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806139ef6034913960400191505060405180910390fd5b603c81511461208f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180613a9f6027913960400191505060405180910390fd5b60006120a560008361315890919063ffffffff16565b905060006120bd60148461315890919063ffffffff16565b9050600073ffffffffffffffffffffffffffffffffffffffff16600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121a6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613b026023913960400191505060405180910390fd5b60006121bc60288561315890919063ffffffff16565b905061220c8730886000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166131eb909392919063ffffffff16565b6040518060800160405280612223884360006132f1565b81526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815250600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208290806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508173ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d876040518082815260200191505060405180910390a250505050505050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600061257682612ef7565b9050600061258f60015483612f0e90919063ffffffff16565b4311905083801561259d5750805b156125ae576125ab83612f96565b94505b5050505092915050565b60015481565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600061269f82612ef7565b905060006126ac83613120565b905060006126c560015484612f0e90919063ffffffff16565b4311905060008083141580156126da57508243115b90508580156126e65750815b80156126f0575080155b15612701576126fe85612f96565b96505b50505050505092915050565b6060600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156127ce57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612784575b50505050509050919050565b6127e48143611420565b50565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806128b357508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612908576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604281526020018061396b6042913960600191505060405180910390fd5b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905061296c60015461295e83612ef7565b612f0e90919063ffffffff16565b4311156129e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f496e697469616c697a6174696f6e20706572696f64206973206f76657200000081525060200191505060405180910390fd5b60006129ec82612f96565b9050612a02600083612fb090919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550612a9483826000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661304f9092919063ffffffff16565b50505050565b60055481565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b813373ffffffffffffffffffffffffffffffffffffffff16600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612c38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e6f74206f70657261746f7220617574686f72697a657200000000000000000081525060200191505060405180910390fd5b81600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166384d57689826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612cd857600080fd5b505afa158015612cec573d6000803e3d6000fd5b505050506040513d6020811015612d0257600080fd5b8101908080519060200190929190505050612d68576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806139ce6021913960400191505060405180910390fd5b6001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050505050565b6000806000612e53600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461341a565b9250925092509193909250565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025481565b60006001604060020a03604083901c169050919050565b600080828401905083811015612f8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006001608060020a03604060020283901c169050919050565b6000612fcd82612fbf85612ef7565b612fc886613120565b6132f1565b905092915050565b600061301783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613447565b905092915050565b60006130476064613039848661350790919063ffffffff16565b61358d90919063ffffffff16565b905092915050565b61311b838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb905060e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506135d7565b505050565b60006001604060020a0382169050919050565b600061315061314184612f96565b61314a85612ef7565b846132f1565b905092915050565b6000806014830190508281118015613171575080845110155b6131c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806139ad6021913960400191505060405180910390fd5b60006c0100000000000000000000000084602087010151049050809250505092915050565b6132eb848573ffffffffffffffffffffffffffffffffffffffff166323b872dd905060e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506135d7565b50505050565b60006001608060020a03841115613370576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f616d6f756e742075696e74313238206f766572666c6f7700000000000000000081525060200191505060405180910390fd5b6001604060020a0382841711156133ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f626c6f636b6865696768742075696e743634206f766572666c6f77000000000081525060200191505060405180910390fd5b6000604060020285901b90506000604085901b90506000849050808284171793505050509392505050565b600080600061342884612f96565b925061343384612ef7565b915061343e84613120565b90509193909250565b60008383111582906134f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156134b957808201518184015260208101905061349e565b50505050905090810190601f1680156134e65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083141561351a5760009050613587565b600082840290508284828161352b57fe5b0414613582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613b256021913960400191505060405180910390fd5b809150505b92915050565b60006135cf83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613822565b905092915050565b6135f68273ffffffffffffffffffffffffffffffffffffffff166138e8565b613668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b602083106136b75780518252602082019150602081019050602083039250613694565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613719576040519150601f19603f3d011682016040523d82523d6000602084013e61371e565b606091505b509150915081613796576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b60008151111561381c578080602001905160208110156137b557600080fd5b810190808051906020019092919050505061381b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613ba7602a913960400191505060405180910390fd5b5b50505050565b600080831182906138ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613893578082015181840152602081019050613878565b50505050905090810190601f1680156138c05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816138da57fe5b049050809150509392505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b821415801561392a5750808214155b9250505091905056fe4f6e6c79206f70657261746f72206f7220746865206f776e6572206f6620746865207374616b652063616e20756e64656c65676174652e4f6e6c79206f70657261746f72206f7220746865206f776e6572206f6620746865207374616b652063616e2063616e63656c207468652064656c65676174696f6e2e4164647265737320636f6e76657273696f6e206f7574206f6620626f756e64732e4f70657261746f7220636f6e7472616374206973206e6f7420617070726f766564546f6b656e7320616d6f756e74206d7573742062652067726561746572207468616e20746865206d696e696d756d207374616b6543616e206e6f74207265636f766572207374616b65206265666f726520756e64656c65676174696f6e20706572696f64206973206f7665722e43616e6e6f7420756e64656c656761746520696e20696e697469616c697a6174696f6e20706572696f642c207573652063616e63656c5374616b6520696e73746561645374616b652064656c65676174696f6e2064617461206d7573742062652070726f76696465642e546f6b656e20636f6e7472616374206d757374206265207468652073616d65206f6e65206c696e6b656420746f207468697320636f6e74726163742e4f70657261746f72206164647265737320697320616c726561647920696e207573652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f6e6c7920746865206f776e6572206d617920706f7374706f6e652070726576696f75736c792073657420756e64656c65676174696f6e4d6179206e6f742073657420756e64656c65676174696f6e20626c6f636b20696e2074686520706173745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a723158204272136381913dc283a18951a1c90f62081a161a54e0ac5c3cd1fd19c20b8a8064736f6c634300050e0032", - "sourceMap": "477:16764:11:-;;;820:13;790:43;;2222:436;8:9:-1;5:2;;;30:1;27;20:12;5:2;2222:436:11;;;;;;;;;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;2222:436:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2424:3;2399:29;;:13;:29;;;;2391:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2493:13;2471:5;;:36;;;;;;;;;;;;;;;;;;2537:9;2517:8;;:30;;;;;;;;;;;;;;;;;;2580:21;2557:20;:44;;;;2632:19;2611:18;:40;;;;2222:436;;;;477:16764;;;;;;", - "deployedSourceMap": "477:16764:11:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;477:16764:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11125:1507;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;11125:1507:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;11125:1507:11;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;11125:1507:11;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;11125:1507:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;11125:1507:11;;;;;;;;;;;;;;;:::i;:::-;;17047:192;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17047:192:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;831:45:8;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;831:45:8;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1968:116;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1968:116:8;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2201:131;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2201:131:8;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;773:51;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;773:51:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;6097:1458:11;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6097:1458:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;7786:590;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7786:590:11;;;;;;;;;;;;;;;;;;;:::i;:::-;;1698:143:8;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1698:143:8;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1116:24:11;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;9293:1266;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9293:1266:11;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;9293:1266:11;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;9293:1266:11;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;9293:1266:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;9293:1266:11;;;;;;;;;;;;;;;:::i;:::-;;3297:1054;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;3297:1054:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;3297:1054:11;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3297:1054:11;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;3297:1054:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;3297:1054:11;;;;;;;;;;;;;;;:::i;:::-;;15889:518;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15889:518:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;692:35:8;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14214:907:11;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14214:907:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1349:126:8;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1349:126:8;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1349:126:8;;;;;;;;;;;;;;;;;5597:100:11;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5597:100:11;;;;;;;;;;;;;;;;;;;:::i;:::-;;4672:676;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4672:676:11;;;;;;;;;;;;;;;;;;;:::i;:::-;;790:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13432:174;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13432:174:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12923:262;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12923:262:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8783:195;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8783:195:11;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2457:126:8;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2457:126:8;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;659:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;733:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11125:1507:11;11321:10;1356:8;;;;;;;;;;;:35;;;1392:16;1356:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1356:53:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1356:53:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1356:53:11;;;;;;;;;;;;;;;;1335:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11343:25;11371:1;11343:29;;11387:6;11396:1;11387:10;;11382:1030;11403:19;:26;11399:1;:30;11382:1030;;;11450:16;11469:19;11489:1;11469:22;;;;;;;;;;;;;;11450:41;;11513:14;:26;11528:10;11513:26;;;;;;;;;;;;;;;:36;11540:8;11513:36;;;;;;;;;;;;;;;;;;;;;;;;;11505:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11583:22;11608:9;:19;11618:8;11608:19;;;;;;;;;;;;;;;:32;;;11583:57;;11694:59;11732:20;;11694:33;:14;:31;:33::i;:::-;:37;;:59;;;;:::i;:::-;11679:12;:74;11654:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11831:21;11855:26;:14;:24;:26::i;:::-;11831:50;;11916:13;11900;:29;11896:506;;;11969:36;11991:13;11969:17;:21;;:36;;;;:::i;:::-;11949:56;;12024:17;12044:1;12024:21;;12098:35;12123:9;12098:14;:24;;:35;;;;:::i;:::-;12063:9;:19;12073:8;12063:19;;;;;;;;;;;;;;;:32;;:70;;;;11896:506;;;;12192:36;12214:13;12192:17;:21;;:36;;;;:::i;:::-;12172:56;;12247:17;12267:32;12285:13;12267;:17;;:32;;;;:::i;:::-;12247:52;;12352:35;12377:9;12352:14;:24;;:35;;;;:::i;:::-;12317:9;:19;12327:8;12317:19;;;;;;;;;;;;;;;:32;;:70;;;;11896:506;;11382:1030;;;11431:3;;;;;;;11382:1030;;;;12422:24;12449:56;12488:16;12450:28;12476:1;12450:17;:25;;:28;;;;:::i;:::-;12449:38;;:56;;;;:::i;:::-;12422:83;;12516:48;12535:10;12547:16;12516:5;;;;;;;;;;;:18;;;;:48;;;;;:::i;:::-;12574:5;;;;;;;;;;;:10;;;12585:39;12607:16;12585:17;:21;;:39;;;;:::i;:::-;12574:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12574:51:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12574:51:11;;;;1478:1;;11125:1507;;;;;:::o;17047:192::-;17156:4;17220:12;;17179:37;17191:6;17199:16;17179:11;:37::i;:::-;:53;;17172:60;;17047:192;;;;:::o;831:45:8:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1968:116::-;2025:7;2051:9;:20;2061:9;2051:20;;;;;;;;;;;;;;;:26;;;;;;;;;;;;2044:33;;1968:116;;;:::o;2201:131::-;2259:15;2293:9;:20;2303:9;2293:20;;;;;;;;;;;;;;;:32;;;;;;;;;;;;2286:39;;2201:131;;;:::o;773:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6097:1458:11:-;6205:13;6221:9;:20;6231:9;6221:20;;;;;;;;;;;;;;;:26;;;;;;;;;;;;6205:42;;6257:16;6290:5;6276:19;;:10;:19;;;6257:38;;6340:9;6326:23;;:10;:23;;;:50;;;;6365:11;6326:50;6305:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6498:12;6476:18;:34;;6455:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6588:17;6608:9;:20;6618:9;6608:20;;;;;;;;;;;;;;;:33;;;6588:53;;6651:29;6683:28;:9;:26;:28::i;:::-;6651:60;;6721:33;6757:32;:9;:30;:32::i;:::-;6721:68;;6841:47;6867:20;;6841:21;:25;;:47;;;;:::i;:::-;6820:18;:68;6799:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7088:1;7059:25;:30;:155;;;;7196:18;7168:25;:46;7059:155;:216;;;;7264:11;7059:216;6991:365;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7366:17;7386:50;7417:18;7386:9;:30;;:50;;;;:::i;:::-;7366:70;;7482:9;7446;:20;7456:9;7446:20;;;;;;;;;;;;;;;:33;;:45;;;;7518:9;7506:42;;;7529:18;7506:42;;;;;;;;;;;;;;;;;;6097:1458;;;;;;;;:::o;7786:590::-;7844:22;7869:9;:20;7879:9;7869:20;;;;;;;;;;;;;;;:33;;;7844:58;;7948:61;7990:18;;7948:37;:14;:35;:37::i;:::-;:41;;:61;;;;:::i;:::-;7933:12;:76;7912:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8102:13;8118:9;:20;8128:9;8118:20;;;;;;;;;;;;;;;:26;;;;;;;;;;;;8102:42;;8154:14;8171:26;:14;:24;:26::i;:::-;8154:43;;8244:27;8269:1;8244:14;:24;;:27;;;;:::i;:::-;8208:9;:20;8218:9;8208:20;;;;;;;;;;;;;;;:33;;:63;;;;8282:33;8301:5;8308:6;8282:5;;;;;;;;;;;:18;;;;:33;;;;;:::i;:::-;8330:39;8345:9;8356:12;8330:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;7786:590;;;;:::o;1698:143:8:-;1756:15;1790:44;:9;:19;1800:8;1790:19;;;;;;;;;;;;;;;:32;;;:42;:44::i;:::-;1783:51;;1698:143;;;:::o;1116:24:11:-;;;;;;;;;;;;;:::o;9293:1266::-;9421:10;1356:8;;;;;;;;;;;:35;;;1392:16;1356:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1356:53:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1356:53:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1356:53:11;;;;;;;;;;;;;;;;1335:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9444:25;9472:1;9444:29;;9488:6;9497:1;9488:10;;9483:1030;9504:19;:26;9500:1;:30;9483:1030;;;9551:16;9570:19;9590:1;9570:22;;;;;;;;;;;;;;9551:41;;9614:14;:26;9629:10;9614:26;;;;;;;;;;;;;;;:36;9641:8;9614:36;;;;;;;;;;;;;;;;;;;;;;;;;9606:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9684:22;9709:9;:19;9719:8;9709:19;;;;;;;;;;;;;;;:32;;;9684:57;;9795:59;9833:20;;9795:33;:14;:31;:33::i;:::-;:37;;:59;;;;:::i;:::-;9780:12;:74;9755:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9932:21;9956:26;:14;:24;:26::i;:::-;9932:50;;10017:13;10001;:29;9997:506;;;10070:36;10092:13;10070:17;:21;;:36;;;;:::i;:::-;10050:56;;10125:17;10145:1;10125:21;;10199:35;10224:9;10199:14;:24;;:35;;;;:::i;:::-;10164:9;:19;10174:8;10164:19;;;;;;;;;;;;;;;:32;;:70;;;;9997:506;;;;10293:36;10315:13;10293:17;:21;;:36;;;;:::i;:::-;10273:56;;10348:17;10368:32;10386:13;10368;:17;;:32;;;;:::i;:::-;10348:52;;10453:35;10478:9;10453:14;:24;;:35;;;;:::i;:::-;10418:9;:19;10428:8;10418:19;;;;;;;;;;;;;;;:32;;:70;;;;9997:506;;9483:1030;;;9532:3;;;;;;;9483:1030;;;;10523:5;;;;;;;;;;;:10;;;10534:17;10523:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10523:29:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10523:29:11;;;;1478:1;9293:1266;;;:::o;3297:1054::-;3444:5;;;;;;;;;;;3419:30;;3433:6;3419:30;;;3411:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3542:12;;3532:6;:22;;3524:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3650:2;3629:10;:17;:23;3621:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3707:22;3748:23;3769:1;3748:10;:20;;:23;;;;:::i;:::-;3707:66;;3783:16;3802:24;3823:2;3802:10;:20;;:24;;;;:::i;:::-;3783:43;;3881:1;3844:39;;:9;:19;3854:8;3844:19;;;;;;;;;;;;;;;:25;;;;;;;;;;;;:39;;;3836:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3933:18;3954:24;3975:2;3954:10;:20;;:24;;;;:::i;:::-;3933:45;;4034:52;4057:5;4072:4;4079:6;4034:5;;;;;;;;;;;:22;;;;:52;;;;;;:::i;:::-;4119:139;;;;;;;;4141:44;4161:6;4169:12;4183:1;4141:19;:44::i;:::-;4119:139;;;;4199:5;4119:139;;;;;;4218:6;4119:139;;;;;;4238:10;4119:139;;;;;4097:9;:19;4107:8;4097:19;;;;;;;;;;;;;;;:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4268:14;:21;4283:5;4268:21;;;;;;;;;;;;;;;4295:8;4268:36;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;4268:36:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4327:8;4320:24;;;4337:6;4320:24;;;;;;;;;;;;;;;;;;3297:1054;;;;;;;:::o;15889:518::-;15999:15;16026:17;16046:14;:33;16061:17;16046:33;;;;;;;;;;;;;;;:44;16080:9;16046:44;;;;;;;;;;;;;;;;;;;;;;;;;16026:64;;16101:22;16126:9;:20;16136:9;16126:20;;;;;;;;;;;;;;;:33;;;16101:58;;16169:17;16189:33;:14;:31;:33::i;:::-;16169:53;;16233:13;16264:35;16278:20;;16264:9;:13;;:35;;;;:::i;:::-;16249:12;:50;16233:66;;16314:12;:24;;;;;16330:8;16314:24;16310:91;;;16364:26;:14;:24;:26::i;:::-;16354:36;;16310:91;15889:518;;;;;;;;:::o;692:35:8:-;;;;:::o;14214:907:11:-;14326:15;14353:17;14373:14;:33;14388:17;14373:33;;;;;;;;;;;;;;;:44;14407:9;14373:44;;;;;;;;;;;;;;;;;;;;;;;;;14353:64;;14428:22;14453:9;:20;14463:9;14453:20;;;;;;;;;;;;;;;:33;;;14428:58;;14496:17;14516:33;:14;:31;:33::i;:::-;14496:53;;14559:21;14583:37;:14;:35;:37::i;:::-;14559:61;;14631:13;14662:35;14676:20;;14662:9;:13;;:35;;;;:::i;:::-;14647:12;:50;14631:66;;14918:19;14958:1;14941:13;:18;;14940:54;;;;;14980:13;14965:12;:28;14940:54;14918:76;;15009:12;:24;;;;;15025:8;15009:24;:43;;;;;15038:14;15037:15;15009:43;15005:110;;;15078:26;:14;:24;:26::i;:::-;15068:36;;15005:110;14214:907;;;;;;;;;;:::o;1349:126:8:-;1409:16;1444:14;:24;1459:8;1444:24;;;;;;;;;;;;;;;1437:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1349:126;;;:::o;5597:100:11:-;5653:37;5666:9;5677:12;5653;:37::i;:::-;5597:100;:::o;4672:676::-;4729:13;4745:9;:20;4755:9;4745:20;;;;;;;;;;;;;;;:26;;;;;;;;;;;;4729:42;;4816:9;4802:23;;:10;:23;;;:58;;;;4855:5;4841:19;;:10;:19;;;4802:58;4781:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4950:22;4975:9;:20;4985:9;4975:20;;;;;;;;;;;;;;;:33;;;4950:58;;5056:59;5094:20;;5056:33;:14;:31;:33::i;:::-;:37;;:59;;;;:::i;:::-;5040:12;:75;;5019:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5181:14;5198:26;:14;:24;:26::i;:::-;5181:43;;5270:27;5295:1;5270:14;:24;;:27;;;;:::i;:::-;5234:9;:20;5244:9;5234:20;;;;;;;;;;;;;;;:33;;:63;;;;5308:33;5327:5;5334:6;5308:5;;;;;;;;;;;:18;;;;:33;;;;;:::i;:::-;4672:676;;;;:::o;790:43::-;;;;:::o;13432:174::-;13532:4;13555:14;:33;13570:17;13555:33;;;;;;;;;;;;;;;:44;13589:9;13555:44;;;;;;;;;;;;;;;;;;;;;;;;;13548:51;;13432:174;;;;:::o;12923:262::-;13050:9;1147:10:8;1112:45;;:9;:20;1122:9;1112:20;;;;;;;;;;;;;;;:31;;;;;;;;;;;;:45;;;1091:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13098:17:11;1356:8;;;;;;;;;;;:35;;;1392:16;1356:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1356:53:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1356:53:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1356:53:11;;;;;;;;;;;;;;;;1335:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13174:4;13127:14;:33;13142:17;13127:33;;;;;;;;;;;;;;;:44;13161:9;13127:44;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;1216:1:8;12923:262:11;;;:::o;8783:195::-;8854:14;8870:17;8889:21;8929:42;:9;:20;8939:9;8929:20;;;;;;;;;;;;;;;:33;;;:40;:42::i;:::-;8922:49;;;;;;8783:195;;;;;:::o;2457:126:8:-;2519:7;2545:9;:20;2555:9;2545:20;;;;;;;;;;;;;;;:31;;;;;;;;;;;;2538:38;;2457:126;;;:::o;659:26::-;;;;;;;;;;;;;:::o;733:33::-;;;;:::o;2811:162:35:-;2890:7;1078:1;968:2;1054:1;:20;1053:26;968:2;2917:12;:30;;2916:50;2909:57;;2811:162;;;:::o;834:176:45:-;892:7;911:9;927:1;923;:5;911:17;;951:1;946;:6;;938:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1002:1;995:8;;;834:176;;;;:::o;2390:148:35:-;2462:7;1135:1;1008:3;1116:1;:15;1115:21;968:2;1232:1;:21;2489:12;:28;;2488:43;2481:50;;2390:148;;;:::o;2544:261::-;2646:7;2672:126;2690:6;2710:30;2727:12;2710:16;:30::i;:::-;2754:34;2775:12;2754:20;:34::i;:::-;2672:4;:126::i;:::-;2665:133;;2544:261;;;;:::o;1274:134:45:-;1332:7;1358:43;1362:1;1365;1358:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1351:50;;1274:134;;;;:::o;237:112:36:-;299:7;325:17;338:3;325:8;331:1;325;:5;;:8;;;;:::i;:::-;:12;;:17;;;;:::i;:::-;318:24;;237:112;;;;:::o;662:174:49:-;744:85;763:5;793;:14;;;:23;;;;818:2;822:5;770:58;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;770:58:49;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;770:58:49;744:18;:85::i;:::-;662:174;;;:::o;3272:146:35:-;3355:7;1078:1;968:2;1054:1;:20;1053:26;3381:12;:30;3374:37;;3272:146;;;:::o;3424:295::-;3554:7;3580:132;3598:23;3608:12;3598:9;:23::i;:::-;3635:30;3652:12;3635:16;:30::i;:::-;3679:23;3580:4;:132::i;:::-;3573:139;;3424:295;;;;:::o;11350:422:33:-;11427:7;11446:14;11472:2;11463:6;:11;11446:28;;11504:6;11492:9;:18;:48;;;;;11531:9;11514:6;:13;:26;;11492:48;11484:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11588:19;11699:27;11689:6;11682:4;11674:6;11670:17;11666:30;11660:37;11656:71;11641:86;;11754:11;11747:18;;;;11350:422;;;;:::o;842:202:49:-;942:95;961:5;991;:18;;;:27;;;;1020:4;1026:2;1030:5;968:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;968:68:49;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;968:68:49;942:18;:95::i;:::-;842:202;;;;:::o;1260:808:35:-;1385:7;1135:1;1008:3;1116:1;:15;1115:21;1519:6;:20;;1498:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1078:1;968:2;1054:1;:20;1053:26;1819:13;1807:9;:25;1806:46;;1785:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1915:9;968:2;1232:1;:21;1927:6;:22;;1915:34;;1959:9;968:2;1971:9;:27;;1959:39;;2008:9;2020:13;2008:25;;2059:1;2055;2051;:5;:9;2043:18;;;;;1260:808;;;;;:::o;2074:310::-;2144:14;2168:17;2195:21;2242:23;2252:12;2242:9;:23::i;:::-;2233:32;;2287:30;2304:12;2287:16;:30::i;:::-;2275:42;;2343:34;2364:12;2343:20;:34::i;:::-;2327:50;;2074:310;;;;;:::o;1732:187:45:-;1818:7;1850:1;1845;:6;;1853:12;1837:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1837:29:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1876:9;1892:1;1888;:5;1876:17;;1911:1;1904:8;;;1732:187;;;;;:::o;2159:459::-;2217:7;2463:1;2458;:6;2454:45;;;2487:1;2480:8;;;;2454:45;2509:9;2525:1;2521;:5;2509:17;;2553:1;2548;2544;:5;;;;;;:10;2536:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2610:1;2603:8;;;2159:459;;;;;:::o;3073:130::-;3131:7;3157:39;3161:1;3164;3157:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3150:46;;3073:130;;;;:::o;2666:1095:49:-;3261:27;3269:5;3261:25;;;:27::i;:::-;3253:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3395:12;3409:23;3444:5;3436:19;;3456:4;3436:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3436:25:49;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;3394:67:49;;;;3479:7;3471:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3558:1;3538:10;:17;:21;3534:221;;;3678:10;3667:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3667:30:49;;;;;;;;;;;;;;;;3659:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3534:221;2666:1095;;;;:::o;3718:338:45:-;3804:7;3901:1;3897;:5;3904:12;3889:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3889:28:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3927:9;3943:1;3939;:5;;;;;;3927:17;;4048:1;4041:8;;;3718:338;;;;;:::o;557:797:50:-;617:4;1062:16;1088:19;1110:66;1088:88;;;;1277:7;1265:20;1253:32;;1316:3;1304:15;;:8;:15;;:42;;;;;1335:11;1323:8;:23;;1304:42;1296:51;;;;557:797;;;:::o", - "source": "pragma solidity ^0.5.4;\n\nimport \"./StakeDelegatable.sol\";\nimport \"./utils/UintArrayUtils.sol\";\nimport \"./utils/PercentUtils.sol\";\nimport \"./Registry.sol\";\nimport \"openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol\";\n\n\n/**\n * @title TokenStaking\n * @dev A token staking contract for a specified standard ERC20Burnable token.\n * A holder of the specified token can stake delegate its tokens to this contract\n * and recover the stake after undelegation period is over.\n */\ncontract TokenStaking is StakeDelegatable {\n using UintArrayUtils for uint256[];\n using PercentUtils for uint256;\n using SafeERC20 for ERC20Burnable;\n\n // Minimum amount of KEEP that allows sMPC cluster client to participate in\n // the Keep network. Expressed as number with 18-decimal places.\n uint256 public minimumStake = 200000 * 1e18;\n\n event Staked(address indexed from, uint256 value);\n event Undelegated(address indexed operator, uint256 undelegatedAt);\n event RecoveredStake(address operator, uint256 recoveredAt);\n\n // Registry contract with a list of approved operator contracts and upgraders.\n Registry public registry;\n\n // Authorized operator contracts.\n mapping(address => mapping (address => bool)) internal authorizations;\n\n modifier onlyApprovedOperatorContract(address operatorContract) {\n require(\n registry.isApprovedOperatorContract(operatorContract),\n \"Operator contract is not approved\"\n );\n _;\n }\n\n /**\n * @dev Creates a token staking contract for a provided Standard ERC20Burnable token.\n * @param _tokenAddress Address of a token that will be linked to this contract.\n * @param _registry Address of a keep registry that will be linked to this contract.\n * @param _initializationPeriod To avoid certain attacks on work selection, recently created\n * operators must wait for a specific period of time before being eligible for work selection.\n * @param _undelegationPeriod The staking contract guarantees that an undelegated operator’s\n * stakes will stay locked for a number of blocks after undelegation, and thus available as\n * collateral for any work the operator is engaged in.\n */\n constructor(\n address _tokenAddress,\n address _registry,\n uint256 _initializationPeriod,\n uint256 _undelegationPeriod\n ) public {\n require(_tokenAddress != address(0x0), \"Token address can't be zero.\");\n token = ERC20Burnable(_tokenAddress);\n registry = Registry(_registry);\n initializationPeriod = _initializationPeriod;\n undelegationPeriod = _undelegationPeriod;\n }\n\n /**\n * @notice Receives approval of token transfer and stakes the approved amount.\n * @dev Makes sure provided token contract is the same one linked to this contract.\n * @param _from The owner of the tokens who approved them to transfer.\n * @param _value Approved amount for the transfer and stake.\n * @param _token Token contract address.\n * @param _extraData Data for stake delegation. This byte array must have the\n * following values concatenated: Beneficiary address (20 bytes) where the rewards for participation\n * are sent, operator's (20 bytes) address, authorizer (20 bytes) address.\n */\n function receiveApproval(address _from, uint256 _value, address _token, bytes memory _extraData) public {\n require(ERC20Burnable(_token) == token, \"Token contract must be the same one linked to this contract.\");\n require(_value >= minimumStake, \"Tokens amount must be greater than the minimum stake\");\n require(_extraData.length == 60, \"Stake delegation data must be provided.\");\n\n address payable beneficiary = address(uint160(_extraData.toAddress(0)));\n address operator = _extraData.toAddress(20);\n require(operators[operator].owner == address(0), \"Operator address is already in use.\");\n address authorizer = _extraData.toAddress(40);\n\n // Transfer tokens to this contract.\n token.safeTransferFrom(_from, address(this), _value);\n\n operators[operator] = Operator(\n OperatorParams.pack(_value, block.number, 0),\n _from,\n beneficiary,\n authorizer\n );\n ownerOperators[_from].push(operator);\n\n emit Staked(operator, _value);\n }\n\n /**\n * @notice Cancels stake of tokens within the operator initialization period\n * without being subjected to the token lockup for the undelegation period.\n * This can be used to undo mistaken delegation to the wrong operator address.\n * @param _operator Address of the stake operator.\n */\n function cancelStake(address _operator) public {\n address owner = operators[_operator].owner;\n require(\n msg.sender == _operator ||\n msg.sender == owner, \"Only operator or the owner of the stake can cancel the delegation.\"\n );\n uint256 operatorParams = operators[_operator].packedParams;\n\n require(\n block.number <= operatorParams.getCreationBlock().add(initializationPeriod),\n \"Initialization period is over\"\n );\n\n uint256 amount = operatorParams.getAmount();\n operators[_operator].packedParams = operatorParams.setAmount(0);\n\n token.safeTransfer(owner, amount);\n }\n\n /**\n * @notice Undelegates staked tokens. You will be able to recover your stake by calling\n * `recoverStake()` with operator address once undelegation period is over.\n * @param _operator Address of the stake operator.\n */\n function undelegate(address _operator) public {\n undelegateAt(_operator, block.number);\n }\n\n /**\n * @notice Set an undelegation time for staked tokens.\n * Undelegation will begin at the specified block.\n * You will be able to recover your stake by calling\n * `recoverStake()` with operator address once undelegation period is over.\n * @param _operator Address of the stake operator.\n * @param _undelegationBlock The block undelegation is to start at.\n */\n function undelegateAt(\n address _operator,\n uint256 _undelegationBlock\n ) public {\n address owner = operators[_operator].owner;\n bool sentByOwner = msg.sender == owner;\n require(\n msg.sender == _operator ||\n sentByOwner, \"Only operator or the owner of the stake can undelegate.\"\n );\n require(\n _undelegationBlock >= block.number,\n \"May not set undelegation block in the past\"\n );\n uint256 oldParams = operators[_operator].packedParams;\n uint256 existingCreationBlock = oldParams.getCreationBlock();\n uint256 existingUndelegationBlock = oldParams.getUndelegationBlock();\n require(\n _undelegationBlock > existingCreationBlock.add(initializationPeriod),\n \"Cannot undelegate in initialization period, use cancelStake instead\"\n );\n require(\n // Undelegation not in progress OR\n existingUndelegationBlock == 0 ||\n // Undelegating sooner than previously set time OR\n existingUndelegationBlock > _undelegationBlock ||\n // Owner may override\n sentByOwner,\n \"Only the owner may postpone previously set undelegation\"\n );\n uint256 newParams = oldParams.setUndelegationBlock(_undelegationBlock);\n operators[_operator].packedParams = newParams;\n emit Undelegated(_operator, _undelegationBlock);\n }\n\n /**\n * @notice Recovers staked tokens and transfers them back to the owner. Recovering\n * tokens can only be performed when the operator is finished undelegating.\n * @param _operator Operator address.\n */\n function recoverStake(address _operator) public {\n uint256 operatorParams = operators[_operator].packedParams;\n require(\n block.number > operatorParams.getUndelegationBlock().add(undelegationPeriod),\n \"Can not recover stake before undelegation period is over.\"\n );\n address owner = operators[_operator].owner;\n uint256 amount = operatorParams.getAmount();\n\n operators[_operator].packedParams = operatorParams.setAmount(0);\n\n token.safeTransfer(owner, amount);\n emit RecoveredStake(_operator, block.number);\n }\n\n /**\n * @dev Gets stake delegation info for the given operator.\n * @param _operator Operator address.\n * @return amount The amount of tokens the given operator delegated.\n * @return createdAt The time when the stake has been delegated.\n * @return undelegatedAt The time when undelegation has been requested.\n * If undelegation has not been requested, 0 is returned.\n */\n function getDelegationInfo(address _operator)\n public view returns (uint256 amount, uint256 createdAt, uint256 undelegatedAt) {\n return operators[_operator].packedParams.unpack();\n }\n\n /**\n * @dev Slash provided token amount from every member in the misbehaved\n * operators array and burn 100% of all the tokens.\n * @param amountToSlash Token amount to slash from every misbehaved operator.\n * @param misbehavedOperators Array of addresses to seize the tokens from.\n */\n function slash(uint256 amountToSlash, address[] memory misbehavedOperators)\n public\n onlyApprovedOperatorContract(msg.sender) {\n\n uint256 totalAmountToBurn = 0;\n for (uint i = 0; i < misbehavedOperators.length; i++) {\n address operator = misbehavedOperators[i];\n require(authorizations[msg.sender][operator], \"Not authorized\");\n\n uint256 operatorParams = operators[operator].packedParams;\n require(\n block.number > operatorParams.getCreationBlock().add(initializationPeriod),\n \"Operator stake must be active\"\n );\n\n uint256 currentAmount = operatorParams.getAmount();\n\n if (currentAmount < amountToSlash) {\n totalAmountToBurn = totalAmountToBurn.add(currentAmount);\n\n uint256 newAmount = 0;\n operators[operator].packedParams = operatorParams.setAmount(newAmount);\n } else {\n totalAmountToBurn = totalAmountToBurn.add(amountToSlash);\n\n uint256 newAmount = currentAmount.sub(amountToSlash);\n operators[operator].packedParams = operatorParams.setAmount(newAmount);\n }\n }\n\n token.burn(totalAmountToBurn);\n }\n\n /**\n * @dev Seize provided token amount from every member in the misbehaved\n * operators array. The tattletale is rewarded with 5% of the total seized\n * amount scaled by the reward adjustment parameter and the rest 95% is burned.\n * @param amountToSeize Token amount to seize from every misbehaved operator.\n * @param rewardMultiplier Reward adjustment in percentage. Min 1% and 100% max.\n * @param tattletale Address to receive the 5% reward.\n * @param misbehavedOperators Array of addresses to seize the tokens from.\n */\n function seize(\n uint256 amountToSeize,\n uint256 rewardMultiplier,\n address tattletale,\n address[] memory misbehavedOperators\n ) public onlyApprovedOperatorContract(msg.sender) {\n uint256 totalAmountToBurn = 0;\n for (uint i = 0; i < misbehavedOperators.length; i++) {\n address operator = misbehavedOperators[i];\n require(authorizations[msg.sender][operator], \"Not authorized\");\n\n uint256 operatorParams = operators[operator].packedParams;\n require(\n block.number > operatorParams.getCreationBlock().add(initializationPeriod),\n \"Operator stake must be active\"\n );\n\n uint256 currentAmount = operatorParams.getAmount();\n\n if (currentAmount < amountToSeize) {\n totalAmountToBurn = totalAmountToBurn.add(currentAmount);\n\n uint256 newAmount = 0;\n operators[operator].packedParams = operatorParams.setAmount(newAmount);\n } else {\n totalAmountToBurn = totalAmountToBurn.add(amountToSeize);\n\n uint256 newAmount = currentAmount.sub(amountToSeize);\n operators[operator].packedParams = operatorParams.setAmount(newAmount);\n }\n }\n\n uint256 tattletaleReward = (totalAmountToBurn.percent(5)).percent(rewardMultiplier);\n\n token.safeTransfer(tattletale, tattletaleReward);\n token.burn(totalAmountToBurn.sub(tattletaleReward));\n }\n\n /**\n * @dev Authorizes operator contract to access staked token balance of\n * the provided operator. Can only be executed by stake operator authorizer.\n * @param _operator address of stake operator.\n * @param _operatorContract address of operator contract.\n */\n function authorizeOperatorContract(address _operator, address _operatorContract)\n public\n onlyOperatorAuthorizer(_operator)\n onlyApprovedOperatorContract(_operatorContract) {\n authorizations[_operatorContract][_operator] = true;\n }\n\n /**\n * @dev Checks if operator contract has access to the staked token balance of\n * the provided operator.\n * @param _operator address of stake operator.\n * @param _operatorContract address of operator contract.\n */\n function isAuthorizedForOperator(address _operator, address _operatorContract) public view returns (bool) {\n return authorizations[_operatorContract][_operator];\n }\n\n /**\n * @dev Gets the eligible stake balance of the specified address.\n * An eligible stake is a stake that passed the initialization period\n * and is not currently undelegating. Also, the operator had to approve\n * the specified operator contract.\n *\n * Operator with a minimum required amount of eligible stake can join the\n * network and participate in new work selection.\n *\n * @param _operator address of stake operator.\n * @param _operatorContract address of operator contract.\n * @return an uint256 representing the eligible stake balance.\n */\n function eligibleStake(\n address _operator,\n address _operatorContract\n ) public view returns (uint256 balance) {\n bool isAuthorized = authorizations[_operatorContract][_operator];\n\n uint256 operatorParams = operators[_operator].packedParams;\n uint256 createdAt = operatorParams.getCreationBlock();\n uint256 undelegatedAt = operatorParams.getUndelegationBlock();\n\n bool isActive = block.number > createdAt.add(initializationPeriod);\n // `undelegatedAt` may be set to a block in the future,\n // to schedule undelegation in advance.\n // In this case the operator is still eligible\n // until the block `undelegatedAt`.\n bool isUndelegating = (undelegatedAt != 0) && (block.number > undelegatedAt);\n\n if (isAuthorized && isActive && !isUndelegating) {\n balance = operatorParams.getAmount();\n }\n }\n\n /**\n * @dev Gets the active stake balance of the specified address.\n * An active stake is a stake that passed the initialization period.\n * Also, the operator had to approve the specified operator contract.\n *\n * The difference between eligible stake is that active stake does not make\n * the operator eligible for work selection but it may be still finishing\n * earlier work during undelegation period. Operator with a minimum required\n * amount of active stake can join the network but cannot be selected to any\n * new work.\n *\n * @param _operator address of stake operator.\n * @param _operatorContract address of operator contract.\n * @return an uint256 representing the eligible stake balance.\n */\n function activeStake(\n address _operator,\n address _operatorContract\n ) public view returns (uint256 balance) {\n bool isAuthorized = authorizations[_operatorContract][_operator];\n\n uint256 operatorParams = operators[_operator].packedParams;\n uint256 createdAt = operatorParams.getCreationBlock();\n\n bool isActive = block.number > createdAt.add(initializationPeriod);\n\n if (isAuthorized && isActive) {\n balance = operatorParams.getAmount();\n }\n }\n\n /**\n * @dev Checks if the specified account has enough active stake to become\n * network operator and that the specified operator contract has been\n * authorized for potential slashing.\n *\n * Having the required minimum of active stake makes the operator eligible\n * to join the network. If the active stake is not currently undelegating,\n * operator is also eligible for work selection.\n *\n * @param staker Staker's address\n * @param operatorContract Operator contract's address\n * @return True if has enough active stake to participate in the network,\n * false otherwise.\n */\n function hasMinimumStake(\n address staker,\n address operatorContract\n ) public view returns(bool) {\n return activeStake(staker, operatorContract) >= minimumStake;\n }\n}\n", - "sourcePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/TokenStaking.sol", - "ast": { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/TokenStaking.sol", - "exportedSymbols": { - "TokenStaking": [ - 5649 - ] - }, - "id": 5650, - "nodeType": "SourceUnit", - "nodes": [ - { - "id": 4706, - "literals": [ - "solidity", - "^", - "0.5", - ".4" - ], - "nodeType": "PragmaDirective", - "src": "0:23:11" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/StakeDelegatable.sol", - "file": "./StakeDelegatable.sol", - "id": 4707, - "nodeType": "ImportDirective", - "scope": 5650, - "sourceUnit": 3409, - "src": "25:32:11", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/utils/UintArrayUtils.sol", - "file": "./utils/UintArrayUtils.sol", - "id": 4708, - "nodeType": "ImportDirective", - "scope": 5650, - "sourceUnit": 11389, - "src": "58:36:11", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/utils/PercentUtils.sol", - "file": "./utils/PercentUtils.sol", - "id": 4709, - "nodeType": "ImportDirective", - "scope": 5650, - "sourceUnit": 11278, - "src": "95:34:11", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/Registry.sol", - "file": "./Registry.sol", - "id": 4710, - "nodeType": "ImportDirective", - "scope": 5650, - "sourceUnit": 3276, - "src": "130:24:11", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol", - "file": "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol", - "id": 4711, - "nodeType": "ImportDirective", - "scope": 5650, - "sourceUnit": 12673, - "src": "155:67:11", - "symbolAliases": [], - "unitAlias": "" - }, - { - "baseContracts": [ - { - "arguments": null, - "baseName": { - "contractScope": null, - "id": 4712, - "name": "StakeDelegatable", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 3408, - "src": "502:16:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_StakeDelegatable_$3408", - "typeString": "contract StakeDelegatable" - } - }, - "id": 4713, - "nodeType": "InheritanceSpecifier", - "src": "502:16:11" - } - ], - "contractDependencies": [ - 3408 - ], - "contractKind": "contract", - "documentation": "@title TokenStaking\n@dev A token staking contract for a specified standard ERC20Burnable token.\nA holder of the specified token can stake delegate its tokens to this contract\nand recover the stake after undelegation period is over.", - "fullyImplemented": true, - "id": 5649, - "linearizedBaseContracts": [ - 5649, - 3408 - ], - "name": "TokenStaking", - "nodeType": "ContractDefinition", - "nodes": [ - { - "id": 4717, - "libraryName": { - "contractScope": null, - "id": 4714, - "name": "UintArrayUtils", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 11388, - "src": "531:14:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_UintArrayUtils_$11388", - "typeString": "library UintArrayUtils" - } - }, - "nodeType": "UsingForDirective", - "src": "525:35:11", - "typeName": { - "baseType": { - "id": 4715, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "550:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 4716, - "length": null, - "nodeType": "ArrayTypeName", - "src": "550:9:11", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", - "typeString": "uint256[]" - } - } - }, - { - "id": 4720, - "libraryName": { - "contractScope": null, - "id": 4718, - "name": "PercentUtils", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 11277, - "src": "571:12:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_PercentUtils_$11277", - "typeString": "library PercentUtils" - } - }, - "nodeType": "UsingForDirective", - "src": "565:31:11", - "typeName": { - "id": 4719, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "588:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - }, - { - "id": 4723, - "libraryName": { - "contractScope": null, - "id": 4721, - "name": "SafeERC20", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 12672, - "src": "607:9:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_SafeERC20_$12672", - "typeString": "library SafeERC20" - } - }, - "nodeType": "UsingForDirective", - "src": "601:34:11", - "typeName": { - "contractScope": null, - "id": 4722, - "name": "ERC20Burnable", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 12383, - "src": "621:13:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - } - }, - { - "constant": false, - "id": 4728, - "name": "minimumStake", - "nodeType": "VariableDeclaration", - "scope": 5649, - "src": "790:43:11", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 4724, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "790:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_200000000000000000000000_by_1", - "typeString": "int_const 200000000000000000000000" - }, - "id": 4727, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "hexValue": "323030303030", - "id": 4725, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "820:6:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_200000_by_1", - "typeString": "int_const 200000" - }, - "value": "200000" - }, - "nodeType": "BinaryOperation", - "operator": "*", - "rightExpression": { - "argumentTypes": null, - "hexValue": "31653138", - "id": 4726, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "829:4:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1000000000000000000_by_1", - "typeString": "int_const 1000000000000000000" - }, - "value": "1e18" - }, - "src": "820:13:11", - "typeDescriptions": { - "typeIdentifier": "t_rational_200000000000000000000000_by_1", - "typeString": "int_const 200000000000000000000000" - } - }, - "visibility": "public" - }, - { - "anonymous": false, - "documentation": null, - "id": 4734, - "name": "Staked", - "nodeType": "EventDefinition", - "parameters": { - "id": 4733, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 4730, - "indexed": true, - "name": "from", - "nodeType": "VariableDeclaration", - "scope": 4734, - "src": "853:20:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4729, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "853:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 4732, - "indexed": false, - "name": "value", - "nodeType": "VariableDeclaration", - "scope": 4734, - "src": "875:13:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 4731, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "875:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "852:37:11" - }, - "src": "840:50:11" - }, - { - "anonymous": false, - "documentation": null, - "id": 4740, - "name": "Undelegated", - "nodeType": "EventDefinition", - "parameters": { - "id": 4739, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 4736, - "indexed": true, - "name": "operator", - "nodeType": "VariableDeclaration", - "scope": 4740, - "src": "913:24:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4735, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "913:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 4738, - "indexed": false, - "name": "undelegatedAt", - "nodeType": "VariableDeclaration", - "scope": 4740, - "src": "939:21:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 4737, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "939:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "912:49:11" - }, - "src": "895:67:11" - }, - { - "anonymous": false, - "documentation": null, - "id": 4746, - "name": "RecoveredStake", - "nodeType": "EventDefinition", - "parameters": { - "id": 4745, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 4742, - "indexed": false, - "name": "operator", - "nodeType": "VariableDeclaration", - "scope": 4746, - "src": "988:16:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4741, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "988:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 4744, - "indexed": false, - "name": "recoveredAt", - "nodeType": "VariableDeclaration", - "scope": 4746, - "src": "1006:19:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 4743, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1006:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "987:39:11" - }, - "src": "967:60:11" - }, - { - "constant": false, - "id": 4748, - "name": "registry", - "nodeType": "VariableDeclaration", - "scope": 5649, - "src": "1116:24:11", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_contract$_Registry_$3275", - "typeString": "contract Registry" - }, - "typeName": { - "contractScope": null, - "id": 4747, - "name": "Registry", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 3275, - "src": "1116:8:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_Registry_$3275", - "typeString": "contract Registry" - } - }, - "value": null, - "visibility": "public" - }, - { - "constant": false, - "id": 4754, - "name": "authorizations", - "nodeType": "VariableDeclaration", - "scope": 5649, - "src": "1185:69:11", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$", - "typeString": "mapping(address => mapping(address => bool))" - }, - "typeName": { - "id": 4753, - "keyType": { - "id": 4749, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1193:7:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "Mapping", - "src": "1185:45:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$", - "typeString": "mapping(address => mapping(address => bool))" - }, - "valueType": { - "id": 4752, - "keyType": { - "id": 4750, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1213:7:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "Mapping", - "src": "1204:25:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", - "typeString": "mapping(address => bool)" - }, - "valueType": { - "id": 4751, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "1224:4:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - } - } - }, - "value": null, - "visibility": "internal" - }, - { - "body": { - "id": 4767, - "nodeType": "Block", - "src": "1325:161:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4761, - "name": "operatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4756, - "src": "1392:16:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "id": 4759, - "name": "registry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4748, - "src": "1356:8:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_Registry_$3275", - "typeString": "contract Registry" - } - }, - "id": 4760, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "isApprovedOperatorContract", - "nodeType": "MemberAccess", - "referencedDeclaration": 3262, - "src": "1356:35:11", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_bool_$", - "typeString": "function (address) view external returns (bool)" - } - }, - "id": 4762, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1356:53:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4f70657261746f7220636f6e7472616374206973206e6f7420617070726f766564", - "id": 4763, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "1423:35:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_513bea0687d0274464f0ce4b950b7e6635502a3e0d1fbd1935b2195e3102d772", - "typeString": "literal_string \"Operator contract is not approved\"" - }, - "value": "Operator contract is not approved" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_513bea0687d0274464f0ce4b950b7e6635502a3e0d1fbd1935b2195e3102d772", - "typeString": "literal_string \"Operator contract is not approved\"" - } - ], - "id": 4758, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "1335:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 4764, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1335:133:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4765, - "nodeType": "ExpressionStatement", - "src": "1335:133:11" - }, - { - "id": 4766, - "nodeType": "PlaceholderStatement", - "src": "1478:1:11" - } - ] - }, - "documentation": null, - "id": 4768, - "name": "onlyApprovedOperatorContract", - "nodeType": "ModifierDefinition", - "parameters": { - "id": 4757, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 4756, - "name": "operatorContract", - "nodeType": "VariableDeclaration", - "scope": 4768, - "src": "1299:24:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4755, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1299:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1298:26:11" - }, - "src": "1261:225:11", - "visibility": "internal" - }, - { - "body": { - "id": 4808, - "nodeType": "Block", - "src": "2381:277:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 4784, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 4780, - "name": "_tokenAddress", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4770, - "src": "2399:13:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "BinaryOperation", - "operator": "!=", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "307830", - "id": 4782, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "2424:3:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0x0" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - } - ], - "id": 4781, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "2416:7:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": "address" - }, - "id": 4783, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "2416:12:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "src": "2399:29:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "546f6b656e20616464726573732063616e2774206265207a65726f2e", - "id": 4785, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "2430:30:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_99e77652455f4cd492494c65f6438e8324489c2561ea1530d4f80aab25602df7", - "typeString": "literal_string \"Token address can't be zero.\"" - }, - "value": "Token address can't be zero." - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_99e77652455f4cd492494c65f6438e8324489c2561ea1530d4f80aab25602df7", - "typeString": "literal_string \"Token address can't be zero.\"" - } - ], - "id": 4779, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "2391:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 4786, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "2391:70:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4787, - "nodeType": "ExpressionStatement", - "src": "2391:70:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 4792, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 4788, - "name": "token", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3301, - "src": "2471:5:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4790, - "name": "_tokenAddress", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4770, - "src": "2493:13:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 4789, - "name": "ERC20Burnable", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12383, - "src": "2479:13:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_ERC20Burnable_$12383_$", - "typeString": "type(contract ERC20Burnable)" - } - }, - "id": 4791, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "2479:28:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "src": "2471:36:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "id": 4793, - "nodeType": "ExpressionStatement", - "src": "2471:36:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 4798, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 4794, - "name": "registry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4748, - "src": "2517:8:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_Registry_$3275", - "typeString": "contract Registry" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4796, - "name": "_registry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4772, - "src": "2537:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 4795, - "name": "Registry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3275, - "src": "2528:8:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_Registry_$3275_$", - "typeString": "type(contract Registry)" - } - }, - "id": 4797, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "2528:19:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_Registry_$3275", - "typeString": "contract Registry" - } - }, - "src": "2517:30:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_Registry_$3275", - "typeString": "contract Registry" - } - }, - "id": 4799, - "nodeType": "ExpressionStatement", - "src": "2517:30:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 4802, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 4800, - "name": "initializationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3303, - "src": "2557:20:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "id": 4801, - "name": "_initializationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4774, - "src": "2580:21:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "2557:44:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 4803, - "nodeType": "ExpressionStatement", - "src": "2557:44:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 4806, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 4804, - "name": "undelegationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3305, - "src": "2611:18:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "id": 4805, - "name": "_undelegationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4776, - "src": "2632:19:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "2611:40:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 4807, - "nodeType": "ExpressionStatement", - "src": "2611:40:11" - } - ] - }, - "documentation": "@dev Creates a token staking contract for a provided Standard ERC20Burnable token.\n@param _tokenAddress Address of a token that will be linked to this contract.\n@param _registry Address of a keep registry that will be linked to this contract.\n@param _initializationPeriod To avoid certain attacks on work selection, recently created\noperators must wait for a specific period of time before being eligible for work selection.\n@param _undelegationPeriod The staking contract guarantees that an undelegated operator’s\nstakes will stay locked for a number of blocks after undelegation, and thus available as\ncollateral for any work the operator is engaged in.", - "id": 4809, - "implemented": true, - "kind": "constructor", - "modifiers": [], - "name": "", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 4777, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 4770, - "name": "_tokenAddress", - "nodeType": "VariableDeclaration", - "scope": 4809, - "src": "2243:21:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4769, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "2243:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 4772, - "name": "_registry", - "nodeType": "VariableDeclaration", - "scope": 4809, - "src": "2274:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4771, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "2274:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 4774, - "name": "_initializationPeriod", - "nodeType": "VariableDeclaration", - "scope": 4809, - "src": "2301:29:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 4773, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2301:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 4776, - "name": "_undelegationPeriod", - "nodeType": "VariableDeclaration", - "scope": 4809, - "src": "2340:27:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 4775, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2340:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "2233:140:11" - }, - "returnParameters": { - "id": 4778, - "nodeType": "ParameterList", - "parameters": [], - "src": "2381:0:11" - }, - "scope": 5649, - "src": "2222:436:11", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 4920, - "nodeType": "Block", - "src": "3401:950:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - }, - "id": 4825, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4822, - "name": "_token", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4815, - "src": "3433:6:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 4821, - "name": "ERC20Burnable", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12383, - "src": "3419:13:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_ERC20Burnable_$12383_$", - "typeString": "type(contract ERC20Burnable)" - } - }, - "id": 4823, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3419:21:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "id": 4824, - "name": "token", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3301, - "src": "3444:5:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "src": "3419:30:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "546f6b656e20636f6e7472616374206d757374206265207468652073616d65206f6e65206c696e6b656420746f207468697320636f6e74726163742e", - "id": 4826, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3451:62:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_780df10fbff997ea44ac0e5a19d545f5b93f5fecb394d0587140440835163c1a", - "typeString": "literal_string \"Token contract must be the same one linked to this contract.\"" - }, - "value": "Token contract must be the same one linked to this contract." - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_780df10fbff997ea44ac0e5a19d545f5b93f5fecb394d0587140440835163c1a", - "typeString": "literal_string \"Token contract must be the same one linked to this contract.\"" - } - ], - "id": 4820, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "3411:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 4827, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3411:103:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4828, - "nodeType": "ExpressionStatement", - "src": "3411:103:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 4832, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 4830, - "name": "_value", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4813, - "src": "3532:6:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">=", - "rightExpression": { - "argumentTypes": null, - "id": 4831, - "name": "minimumStake", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4728, - "src": "3542:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "3532:22:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "546f6b656e7320616d6f756e74206d7573742062652067726561746572207468616e20746865206d696e696d756d207374616b65", - "id": 4833, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3556:54:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_5431b176fa244f3fcca50d47aa0924869a0112e06885dc76f73bf94c66a3be6c", - "typeString": "literal_string \"Tokens amount must be greater than the minimum stake\"" - }, - "value": "Tokens amount must be greater than the minimum stake" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_5431b176fa244f3fcca50d47aa0924869a0112e06885dc76f73bf94c66a3be6c", - "typeString": "literal_string \"Tokens amount must be greater than the minimum stake\"" - } - ], - "id": 4829, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "3524:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 4834, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3524:87:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4835, - "nodeType": "ExpressionStatement", - "src": "3524:87:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 4840, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 4837, - "name": "_extraData", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4817, - "src": "3629:10:11", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - "id": 4838, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "length", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "3629:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "hexValue": "3630", - "id": 4839, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3650:2:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_60_by_1", - "typeString": "int_const 60" - }, - "value": "60" - }, - "src": "3629:23:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "5374616b652064656c65676174696f6e2064617461206d7573742062652070726f76696465642e", - "id": 4841, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3654:41:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_751f2c5fc7e28e8229d9be777eaac69494071996529bb16514164774fa2358fa", - "typeString": "literal_string \"Stake delegation data must be provided.\"" - }, - "value": "Stake delegation data must be provided." - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_751f2c5fc7e28e8229d9be777eaac69494071996529bb16514164774fa2358fa", - "typeString": "literal_string \"Stake delegation data must be provided.\"" - } - ], - "id": 4836, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "3621:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 4842, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3621:75:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4843, - "nodeType": "ExpressionStatement", - "src": "3621:75:11" - }, - { - "assignments": [ - 4845 - ], - "declarations": [ - { - "constant": false, - "id": 4845, - "name": "beneficiary", - "nodeType": "VariableDeclaration", - "scope": 4920, - "src": "3707:22:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - "typeName": { - "id": 4844, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3707:15:11", - "stateMutability": "payable", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 4854, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "30", - "id": 4850, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3769:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - } - ], - "expression": { - "argumentTypes": null, - "id": 4848, - "name": "_extraData", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4817, - "src": "3748:10:11", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - "id": 4849, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "toAddress", - "nodeType": "MemberAccess", - "referencedDeclaration": 10557, - "src": "3748:20:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_address_$bound_to$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory,uint256) pure returns (address)" - } - }, - "id": 4851, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3748:23:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 4847, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "3740:7:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_uint160_$", - "typeString": "type(uint160)" - }, - "typeName": "uint160" - }, - "id": 4852, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3740:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint160", - "typeString": "uint160" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint160", - "typeString": "uint160" - } - ], - "id": 4846, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "3732:7:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": "address" - }, - "id": 4853, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3732:41:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "3707:66:11" - }, - { - "assignments": [ - 4856 - ], - "declarations": [ - { - "constant": false, - "id": 4856, - "name": "operator", - "nodeType": "VariableDeclaration", - "scope": 4920, - "src": "3783:16:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4855, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3783:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 4861, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "3230", - "id": 4859, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3823:2:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_20_by_1", - "typeString": "int_const 20" - }, - "value": "20" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_20_by_1", - "typeString": "int_const 20" - } - ], - "expression": { - "argumentTypes": null, - "id": 4857, - "name": "_extraData", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4817, - "src": "3802:10:11", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - "id": 4858, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "toAddress", - "nodeType": "MemberAccess", - "referencedDeclaration": 10557, - "src": "3802:20:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_address_$bound_to$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory,uint256) pure returns (address)" - } - }, - "id": 4860, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3802:24:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "3783:43:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 4870, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 4863, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "3844:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 4865, - "indexExpression": { - "argumentTypes": null, - "id": 4864, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4856, - "src": "3854:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "3844:19:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 4866, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "owner", - "nodeType": "MemberAccess", - "referencedDeclaration": 3318, - "src": "3844:25:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "30", - "id": 4868, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3881:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - } - ], - "id": 4867, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "3873:7:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": "address" - }, - "id": 4869, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3873:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "src": "3844:39:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4f70657261746f72206164647265737320697320616c726561647920696e207573652e", - "id": 4871, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3885:37:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_85928339e21f4125349480459e1a44d232e8eaef0e0741d1af24ef5e93f0c7d1", - "typeString": "literal_string \"Operator address is already in use.\"" - }, - "value": "Operator address is already in use." - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_85928339e21f4125349480459e1a44d232e8eaef0e0741d1af24ef5e93f0c7d1", - "typeString": "literal_string \"Operator address is already in use.\"" - } - ], - "id": 4862, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "3836:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 4872, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3836:87:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4873, - "nodeType": "ExpressionStatement", - "src": "3836:87:11" - }, - { - "assignments": [ - 4875 - ], - "declarations": [ - { - "constant": false, - "id": 4875, - "name": "authorizer", - "nodeType": "VariableDeclaration", - "scope": 4920, - "src": "3933:18:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4874, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3933:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 4880, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "3430", - "id": 4878, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3975:2:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_40_by_1", - "typeString": "int_const 40" - }, - "value": "40" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_40_by_1", - "typeString": "int_const 40" - } - ], - "expression": { - "argumentTypes": null, - "id": 4876, - "name": "_extraData", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4817, - "src": "3954:10:11", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - "id": 4877, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "toAddress", - "nodeType": "MemberAccess", - "referencedDeclaration": 10557, - "src": "3954:20:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_address_$bound_to$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory,uint256) pure returns (address)" - } - }, - "id": 4879, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3954:24:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "3933:45:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4884, - "name": "_from", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4811, - "src": "4057:5:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4886, - "name": "this", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12848, - "src": "4072:4:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - ], - "id": 4885, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "4064:7:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": "address" - }, - "id": 4887, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "4064:13:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 4888, - "name": "_value", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4813, - "src": "4079:6:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 4881, - "name": "token", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3301, - "src": "4034:5:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "id": 4883, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "safeTransferFrom", - "nodeType": "MemberAccess", - "referencedDeclaration": 12510, - "src": "4034:22:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$12452_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$12452_$", - "typeString": "function (contract IERC20,address,address,uint256)" - } - }, - "id": 4889, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "4034:52:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4890, - "nodeType": "ExpressionStatement", - "src": "4034:52:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 4906, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 4891, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "4097:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 4893, - "indexExpression": { - "argumentTypes": null, - "id": 4892, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4856, - "src": "4107:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "nodeType": "IndexAccess", - "src": "4097:19:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4897, - "name": "_value", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4813, - "src": "4161:6:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 4898, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "4169:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 4899, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "4169:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "hexValue": "30", - "id": 4900, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "4183:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - } - ], - "expression": { - "argumentTypes": null, - "id": 4895, - "name": "OperatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 11234, - "src": "4141:14:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_OperatorParams_$11234_$", - "typeString": "type(library OperatorParams)" - } - }, - "id": 4896, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "pack", - "nodeType": "MemberAccess", - "referencedDeclaration": 11101, - "src": "4141:19:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$", - "typeString": "function (uint256,uint256,uint256) pure returns (uint256)" - } - }, - "id": 4901, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "4141:44:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 4902, - "name": "_from", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4811, - "src": "4199:5:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 4903, - "name": "beneficiary", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4845, - "src": "4218:6:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - { - "argumentTypes": null, - "id": 4904, - "name": "authorizer", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4875, - "src": "4238:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 4894, - "name": "Operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3323, - "src": "4119:8:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_struct$_Operator_$3323_storage_ptr_$", - "typeString": "type(struct StakeDelegatable.Operator storage pointer)" - } - }, - "id": 4905, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "structConstructorCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "4119:139:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_memory", - "typeString": "struct StakeDelegatable.Operator memory" - } - }, - "src": "4097:161:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 4907, - "nodeType": "ExpressionStatement", - "src": "4097:161:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4912, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4856, - "src": "4295:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 4908, - "name": "ownerOperators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3310, - "src": "4268:14:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_array$_t_address_$dyn_storage_$", - "typeString": "mapping(address => address[] storage ref)" - } - }, - "id": 4910, - "indexExpression": { - "argumentTypes": null, - "id": 4909, - "name": "_from", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4811, - "src": "4283:5:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "4268:21:11", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage", - "typeString": "address[] storage ref" - } - }, - "id": 4911, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "push", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "4268:26:11", - "typeDescriptions": { - "typeIdentifier": "t_function_arraypush_nonpayable$_t_address_$returns$_t_uint256_$", - "typeString": "function (address) returns (uint256)" - } - }, - "id": 4913, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "4268:36:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 4914, - "nodeType": "ExpressionStatement", - "src": "4268:36:11" - }, - { - "eventCall": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4916, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4856, - "src": "4327:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 4917, - "name": "_value", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4813, - "src": "4337:6:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 4915, - "name": "Staked", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4734, - "src": "4320:6:11", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", - "typeString": "function (address,uint256)" - } - }, - "id": 4918, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "4320:24:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4919, - "nodeType": "EmitStatement", - "src": "4315:29:11" - } - ] - }, - "documentation": "@notice Receives approval of token transfer and stakes the approved amount.\n@dev Makes sure provided token contract is the same one linked to this contract.\n@param _from The owner of the tokens who approved them to transfer.\n@param _value Approved amount for the transfer and stake.\n@param _token Token contract address.\n@param _extraData Data for stake delegation. This byte array must have the\nfollowing values concatenated: Beneficiary address (20 bytes) where the rewards for participation\nare sent, operator's (20 bytes) address, authorizer (20 bytes) address.", - "id": 4921, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "receiveApproval", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 4818, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 4811, - "name": "_from", - "nodeType": "VariableDeclaration", - "scope": 4921, - "src": "3322:13:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4810, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3322:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 4813, - "name": "_value", - "nodeType": "VariableDeclaration", - "scope": 4921, - "src": "3337:14:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 4812, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3337:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 4815, - "name": "_token", - "nodeType": "VariableDeclaration", - "scope": 4921, - "src": "3353:14:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4814, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3353:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 4817, - "name": "_extraData", - "nodeType": "VariableDeclaration", - "scope": 4921, - "src": "3369:23:11", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 4816, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "3369:5:11", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "3321:72:11" - }, - "returnParameters": { - "id": 4819, - "nodeType": "ParameterList", - "parameters": [], - "src": "3401:0:11" - }, - "scope": 5649, - "src": "3297:1054:11", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 4989, - "nodeType": "Block", - "src": "4719:629:11", - "statements": [ - { - "assignments": [ - 4927 - ], - "declarations": [ - { - "constant": false, - "id": 4927, - "name": "owner", - "nodeType": "VariableDeclaration", - "scope": 4989, - "src": "4729:13:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4926, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4729:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 4932, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 4928, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "4745:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 4930, - "indexExpression": { - "argumentTypes": null, - "id": 4929, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4923, - "src": "4755:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "4745:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 4931, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "owner", - "nodeType": "MemberAccess", - "referencedDeclaration": 3318, - "src": "4745:26:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "4729:42:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 4942, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 4937, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 4934, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "4802:3:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 4935, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "4802:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "id": 4936, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4923, - "src": "4816:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "4802:23:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "||", - "rightExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 4941, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 4938, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "4841:3:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 4939, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "4841:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "id": 4940, - "name": "owner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4927, - "src": "4855:5:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "4841:19:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "4802:58:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4f6e6c79206f70657261746f72206f7220746865206f776e6572206f6620746865207374616b652063616e2063616e63656c207468652064656c65676174696f6e2e", - "id": 4943, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "4862:68:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_105540b8212cb34e4b0c9764b4b79f9fd7924488528229e1817d57c69110fe7b", - "typeString": "literal_string \"Only operator or the owner of the stake can cancel the delegation.\"" - }, - "value": "Only operator or the owner of the stake can cancel the delegation." - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_105540b8212cb34e4b0c9764b4b79f9fd7924488528229e1817d57c69110fe7b", - "typeString": "literal_string \"Only operator or the owner of the stake can cancel the delegation.\"" - } - ], - "id": 4933, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "4781:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 4944, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "4781:159:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4945, - "nodeType": "ExpressionStatement", - "src": "4781:159:11" - }, - { - "assignments": [ - 4947 - ], - "declarations": [ - { - "constant": false, - "id": 4947, - "name": "operatorParams", - "nodeType": "VariableDeclaration", - "scope": 4989, - "src": "4950:22:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 4946, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "4950:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 4952, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 4948, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "4975:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 4950, - "indexExpression": { - "argumentTypes": null, - "id": 4949, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4923, - "src": "4985:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "4975:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 4951, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "4975:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "4950:58:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 4962, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 4954, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "5040:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 4955, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "5040:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "<=", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4960, - "name": "initializationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3303, - "src": "5094:20:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 4956, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4947, - "src": "5056:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 4957, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getCreationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11181, - "src": "5056:31:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 4958, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5056:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 4959, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "5056:37:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 4961, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5056:59:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "5040:75:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "496e697469616c697a6174696f6e20706572696f64206973206f766572", - "id": 4963, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "5129:31:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_d51ac8f9273ce58047cd31a453a45cc22d3bded30f8c0c05438c331c05fa1560", - "typeString": "literal_string \"Initialization period is over\"" - }, - "value": "Initialization period is over" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_d51ac8f9273ce58047cd31a453a45cc22d3bded30f8c0c05438c331c05fa1560", - "typeString": "literal_string \"Initialization period is over\"" - } - ], - "id": 4953, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "5019:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 4964, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5019:151:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4965, - "nodeType": "ExpressionStatement", - "src": "5019:151:11" - }, - { - "assignments": [ - 4967 - ], - "declarations": [ - { - "constant": false, - "id": 4967, - "name": "amount", - "nodeType": "VariableDeclaration", - "scope": 4989, - "src": "5181:14:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 4966, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "5181:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 4971, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 4968, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4947, - "src": "5198:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 4969, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11146, - "src": "5198:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 4970, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5198:26:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "5181:43:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 4980, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 4972, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "5234:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 4974, - "indexExpression": { - "argumentTypes": null, - "id": 4973, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4923, - "src": "5244:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "5234:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 4975, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "5234:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "30", - "id": 4978, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "5295:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - } - ], - "expression": { - "argumentTypes": null, - "id": 4976, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4947, - "src": "5270:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 4977, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "setAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11166, - "src": "5270:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 4979, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5270:27:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "5234:63:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 4981, - "nodeType": "ExpressionStatement", - "src": "5234:63:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4985, - "name": "owner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4927, - "src": "5327:5:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 4986, - "name": "amount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4967, - "src": "5334:6:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 4982, - "name": "token", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3301, - "src": "5308:5:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "id": 4984, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "safeTransfer", - "nodeType": "MemberAccess", - "referencedDeclaration": 12485, - "src": "5308:18:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$12452_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$12452_$", - "typeString": "function (contract IERC20,address,uint256)" - } - }, - "id": 4987, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5308:33:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4988, - "nodeType": "ExpressionStatement", - "src": "5308:33:11" - } - ] - }, - "documentation": "@notice Cancels stake of tokens within the operator initialization period\nwithout being subjected to the token lockup for the undelegation period.\nThis can be used to undo mistaken delegation to the wrong operator address.\n@param _operator Address of the stake operator.", - "id": 4990, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "cancelStake", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 4924, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 4923, - "name": "_operator", - "nodeType": "VariableDeclaration", - "scope": 4990, - "src": "4693:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4922, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4693:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "4692:19:11" - }, - "returnParameters": { - "id": 4925, - "nodeType": "ParameterList", - "parameters": [], - "src": "4719:0:11" - }, - "scope": 5649, - "src": "4672:676:11", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5001, - "nodeType": "Block", - "src": "5643:54:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4996, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4992, - "src": "5666:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 4997, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "5677:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 4998, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "5677:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 4995, - "name": "undelegateAt", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5103, - "src": "5653:12:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$", - "typeString": "function (address,uint256)" - } - }, - "id": 4999, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5653:37:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5000, - "nodeType": "ExpressionStatement", - "src": "5653:37:11" - } - ] - }, - "documentation": "@notice Undelegates staked tokens. You will be able to recover your stake by calling\n`recoverStake()` with operator address once undelegation period is over.\n@param _operator Address of the stake operator.", - "id": 5002, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "undelegate", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 4993, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 4992, - "name": "_operator", - "nodeType": "VariableDeclaration", - "scope": 5002, - "src": "5617:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4991, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "5617:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "5616:19:11" - }, - "returnParameters": { - "id": 4994, - "nodeType": "ParameterList", - "parameters": [], - "src": "5643:0:11" - }, - "scope": 5649, - "src": "5597:100:11", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5102, - "nodeType": "Block", - "src": "6195:1360:11", - "statements": [ - { - "assignments": [ - 5010 - ], - "declarations": [ - { - "constant": false, - "id": 5010, - "name": "owner", - "nodeType": "VariableDeclaration", - "scope": 5102, - "src": "6205:13:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5009, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "6205:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5015, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5011, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "6221:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5013, - "indexExpression": { - "argumentTypes": null, - "id": 5012, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5004, - "src": "6231:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "6221:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5014, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "owner", - "nodeType": "MemberAccess", - "referencedDeclaration": 3318, - "src": "6221:26:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "6205:42:11" - }, - { - "assignments": [ - 5017 - ], - "declarations": [ - { - "constant": false, - "id": 5017, - "name": "sentByOwner", - "nodeType": "VariableDeclaration", - "scope": 5102, - "src": "6257:16:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 5016, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "6257:4:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5022, - "initialValue": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 5021, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5018, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "6276:3:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 5019, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "6276:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "id": 5020, - "name": "owner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5010, - "src": "6290:5:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "6276:19:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "6257:38:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 5029, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 5027, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5024, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "6326:3:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 5025, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "6326:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "id": 5026, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5004, - "src": "6340:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "6326:23:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "||", - "rightExpression": { - "argumentTypes": null, - "id": 5028, - "name": "sentByOwner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5017, - "src": "6365:11:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "6326:50:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4f6e6c79206f70657261746f72206f7220746865206f776e6572206f6620746865207374616b652063616e20756e64656c65676174652e", - "id": 5030, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6378:57:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_04d9b4a33339f2eb3ff69fb9434da8d221a651d43681880e8a08dfb0d733dc71", - "typeString": "literal_string \"Only operator or the owner of the stake can undelegate.\"" - }, - "value": "Only operator or the owner of the stake can undelegate." - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_04d9b4a33339f2eb3ff69fb9434da8d221a651d43681880e8a08dfb0d733dc71", - "typeString": "literal_string \"Only operator or the owner of the stake can undelegate.\"" - } - ], - "id": 5023, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "6305:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 5031, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6305:140:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5032, - "nodeType": "ExpressionStatement", - "src": "6305:140:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5037, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5034, - "name": "_undelegationBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5006, - "src": "6476:18:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">=", - "rightExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5035, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "6498:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 5036, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "6498:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "6476:34:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4d6179206e6f742073657420756e64656c65676174696f6e20626c6f636b20696e207468652070617374", - "id": 5038, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6524:44:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_e111163058b47053dd5c97af99047d23387e090db74e58811c6e918d24561957", - "typeString": "literal_string \"May not set undelegation block in the past\"" - }, - "value": "May not set undelegation block in the past" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_e111163058b47053dd5c97af99047d23387e090db74e58811c6e918d24561957", - "typeString": "literal_string \"May not set undelegation block in the past\"" - } - ], - "id": 5033, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "6455:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 5039, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6455:123:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5040, - "nodeType": "ExpressionStatement", - "src": "6455:123:11" - }, - { - "assignments": [ - 5042 - ], - "declarations": [ - { - "constant": false, - "id": 5042, - "name": "oldParams", - "nodeType": "VariableDeclaration", - "scope": 5102, - "src": "6588:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5041, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "6588:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5047, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5043, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "6608:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5045, - "indexExpression": { - "argumentTypes": null, - "id": 5044, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5004, - "src": "6618:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "6608:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5046, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "6608:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "6588:53:11" - }, - { - "assignments": [ - 5049 - ], - "declarations": [ - { - "constant": false, - "id": 5049, - "name": "existingCreationBlock", - "nodeType": "VariableDeclaration", - "scope": 5102, - "src": "6651:29:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5048, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "6651:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5053, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5050, - "name": "oldParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5042, - "src": "6683:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5051, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getCreationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11181, - "src": "6683:26:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5052, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6683:28:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "6651:60:11" - }, - { - "assignments": [ - 5055 - ], - "declarations": [ - { - "constant": false, - "id": 5055, - "name": "existingUndelegationBlock", - "nodeType": "VariableDeclaration", - "scope": 5102, - "src": "6721:33:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5054, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "6721:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5059, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5056, - "name": "oldParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5042, - "src": "6757:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5057, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getUndelegationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11213, - "src": "6757:30:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5058, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6757:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "6721:68:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5066, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5061, - "name": "_undelegationBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5006, - "src": "6820:18:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5064, - "name": "initializationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3303, - "src": "6867:20:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5062, - "name": "existingCreationBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5049, - "src": "6841:21:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5063, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "6841:25:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5065, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6841:47:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "6820:68:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "43616e6e6f7420756e64656c656761746520696e20696e697469616c697a6174696f6e20706572696f642c207573652063616e63656c5374616b6520696e7374656164", - "id": 5067, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6902:69:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_6f313c946ca09de66dbda57de6de1a41c65d978875fac41651f56df1a3e5717e", - "typeString": "literal_string \"Cannot undelegate in initialization period, use cancelStake instead\"" - }, - "value": "Cannot undelegate in initialization period, use cancelStake instead" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_6f313c946ca09de66dbda57de6de1a41c65d978875fac41651f56df1a3e5717e", - "typeString": "literal_string \"Cannot undelegate in initialization period, use cancelStake instead\"" - } - ], - "id": 5060, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "6799:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 5068, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6799:182:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5069, - "nodeType": "ExpressionStatement", - "src": "6799:182:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 5079, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 5077, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5073, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5071, - "name": "existingUndelegationBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5055, - "src": "7059:25:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 5072, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "7088:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "7059:30:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "||", - "rightExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5076, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5074, - "name": "existingUndelegationBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5055, - "src": "7168:25:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "id": 5075, - "name": "_undelegationBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5006, - "src": "7196:18:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "7168:46:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "7059:155:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "||", - "rightExpression": { - "argumentTypes": null, - "id": 5078, - "name": "sentByOwner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5017, - "src": "7264:11:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "7059:216:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4f6e6c7920746865206f776e6572206d617920706f7374706f6e652070726576696f75736c792073657420756e64656c65676174696f6e", - "id": 5080, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "7289:57:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_c1b24ca0926cc7dd4c8bef0d92771c005cdb59b00731cfdc5f8f16df63345ced", - "typeString": "literal_string \"Only the owner may postpone previously set undelegation\"" - }, - "value": "Only the owner may postpone previously set undelegation" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_c1b24ca0926cc7dd4c8bef0d92771c005cdb59b00731cfdc5f8f16df63345ced", - "typeString": "literal_string \"Only the owner may postpone previously set undelegation\"" - } - ], - "id": 5070, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "6991:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 5081, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6991:365:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5082, - "nodeType": "ExpressionStatement", - "src": "6991:365:11" - }, - { - "assignments": [ - 5084 - ], - "declarations": [ - { - "constant": false, - "id": 5084, - "name": "newParams", - "nodeType": "VariableDeclaration", - "scope": 5102, - "src": "7366:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5083, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "7366:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5089, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5087, - "name": "_undelegationBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5006, - "src": "7417:18:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5085, - "name": "oldParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5042, - "src": "7386:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5086, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "setUndelegationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11233, - "src": "7386:30:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5088, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "7386:50:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "7366:70:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 5095, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5090, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "7446:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5092, - "indexExpression": { - "argumentTypes": null, - "id": 5091, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5004, - "src": "7456:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "7446:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5093, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "7446:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "id": 5094, - "name": "newParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5084, - "src": "7482:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "7446:45:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5096, - "nodeType": "ExpressionStatement", - "src": "7446:45:11" - }, - { - "eventCall": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5098, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5004, - "src": "7518:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 5099, - "name": "_undelegationBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5006, - "src": "7529:18:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 5097, - "name": "Undelegated", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4740, - "src": "7506:11:11", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", - "typeString": "function (address,uint256)" - } - }, - "id": 5100, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "7506:42:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5101, - "nodeType": "EmitStatement", - "src": "7501:47:11" - } - ] - }, - "documentation": "@notice Set an undelegation time for staked tokens.\nUndelegation will begin at the specified block.\nYou will be able to recover your stake by calling\n`recoverStake()` with operator address once undelegation period is over.\n@param _operator Address of the stake operator.\n@param _undelegationBlock The block undelegation is to start at.", - "id": 5103, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "undelegateAt", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5007, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5004, - "name": "_operator", - "nodeType": "VariableDeclaration", - "scope": 5103, - "src": "6128:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5003, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "6128:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5006, - "name": "_undelegationBlock", - "nodeType": "VariableDeclaration", - "scope": 5103, - "src": "6155:26:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5005, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "6155:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "6118:69:11" - }, - "returnParameters": { - "id": 5008, - "nodeType": "ParameterList", - "parameters": [], - "src": "6195:0:11" - }, - "scope": 5649, - "src": "6097:1458:11", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5164, - "nodeType": "Block", - "src": "7834:542:11", - "statements": [ - { - "assignments": [ - 5109 - ], - "declarations": [ - { - "constant": false, - "id": 5109, - "name": "operatorParams", - "nodeType": "VariableDeclaration", - "scope": 5164, - "src": "7844:22:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5108, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "7844:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5114, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5110, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "7869:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5112, - "indexExpression": { - "argumentTypes": null, - "id": 5111, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5105, - "src": "7879:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "7869:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5113, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "7869:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "7844:58:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5124, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5116, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "7933:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 5117, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "7933:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5122, - "name": "undelegationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3305, - "src": "7990:18:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5118, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5109, - "src": "7948:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5119, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getUndelegationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11213, - "src": "7948:35:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5120, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "7948:37:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5121, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "7948:41:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5123, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "7948:61:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "7933:76:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "43616e206e6f74207265636f766572207374616b65206265666f726520756e64656c65676174696f6e20706572696f64206973206f7665722e", - "id": 5125, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "8023:59:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_6df697a16f3241614ac4f21b12ff4528545357d1e03a8586ea7f613e3a5e493b", - "typeString": "literal_string \"Can not recover stake before undelegation period is over.\"" - }, - "value": "Can not recover stake before undelegation period is over." - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_6df697a16f3241614ac4f21b12ff4528545357d1e03a8586ea7f613e3a5e493b", - "typeString": "literal_string \"Can not recover stake before undelegation period is over.\"" - } - ], - "id": 5115, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "7912:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 5126, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "7912:180:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5127, - "nodeType": "ExpressionStatement", - "src": "7912:180:11" - }, - { - "assignments": [ - 5129 - ], - "declarations": [ - { - "constant": false, - "id": 5129, - "name": "owner", - "nodeType": "VariableDeclaration", - "scope": 5164, - "src": "8102:13:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5128, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "8102:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5134, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5130, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "8118:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5132, - "indexExpression": { - "argumentTypes": null, - "id": 5131, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5105, - "src": "8128:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "8118:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5133, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "owner", - "nodeType": "MemberAccess", - "referencedDeclaration": 3318, - "src": "8118:26:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "8102:42:11" - }, - { - "assignments": [ - 5136 - ], - "declarations": [ - { - "constant": false, - "id": 5136, - "name": "amount", - "nodeType": "VariableDeclaration", - "scope": 5164, - "src": "8154:14:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5135, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "8154:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5140, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5137, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5109, - "src": "8171:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5138, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11146, - "src": "8171:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5139, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8171:26:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "8154:43:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 5149, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5141, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "8208:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5143, - "indexExpression": { - "argumentTypes": null, - "id": 5142, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5105, - "src": "8218:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "8208:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5144, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "8208:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "30", - "id": 5147, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "8269:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - } - ], - "expression": { - "argumentTypes": null, - "id": 5145, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5109, - "src": "8244:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5146, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "setAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11166, - "src": "8244:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5148, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8244:27:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "8208:63:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5150, - "nodeType": "ExpressionStatement", - "src": "8208:63:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5154, - "name": "owner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5129, - "src": "8301:5:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 5155, - "name": "amount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5136, - "src": "8308:6:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5151, - "name": "token", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3301, - "src": "8282:5:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "id": 5153, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "safeTransfer", - "nodeType": "MemberAccess", - "referencedDeclaration": 12485, - "src": "8282:18:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$12452_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$12452_$", - "typeString": "function (contract IERC20,address,uint256)" - } - }, - "id": 5156, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8282:33:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5157, - "nodeType": "ExpressionStatement", - "src": "8282:33:11" - }, - { - "eventCall": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5159, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5105, - "src": "8345:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5160, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "8356:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 5161, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "8356:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 5158, - "name": "RecoveredStake", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4746, - "src": "8330:14:11", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", - "typeString": "function (address,uint256)" - } - }, - "id": 5162, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8330:39:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5163, - "nodeType": "EmitStatement", - "src": "8325:44:11" - } - ] - }, - "documentation": "@notice Recovers staked tokens and transfers them back to the owner. Recovering\ntokens can only be performed when the operator is finished undelegating.\n@param _operator Operator address.", - "id": 5165, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "recoverStake", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5106, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5105, - "name": "_operator", - "nodeType": "VariableDeclaration", - "scope": 5165, - "src": "7808:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5104, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "7808:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "7807:19:11" - }, - "returnParameters": { - "id": 5107, - "nodeType": "ParameterList", - "parameters": [], - "src": "7834:0:11" - }, - "scope": 5649, - "src": "7786:590:11", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5183, - "nodeType": "Block", - "src": "8912:66:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5176, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "8929:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5178, - "indexExpression": { - "argumentTypes": null, - "id": 5177, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5167, - "src": "8939:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "8929:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5179, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "8929:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5180, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "unpack", - "nodeType": "MemberAccess", - "referencedDeclaration": 11131, - "src": "8929:40:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$_t_uint256_$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256,uint256,uint256)" - } - }, - "id": 5181, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8929:42:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_uint256_$", - "typeString": "tuple(uint256,uint256,uint256)" - } - }, - "functionReturnParameters": 5175, - "id": 5182, - "nodeType": "Return", - "src": "8922:49:11" - } - ] - }, - "documentation": "@dev Gets stake delegation info for the given operator.\n@param _operator Operator address.\n@return amount The amount of tokens the given operator delegated.\n@return createdAt The time when the stake has been delegated.\n@return undelegatedAt The time when undelegation has been requested.\nIf undelegation has not been requested, 0 is returned.", - "id": 5184, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "getDelegationInfo", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5168, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5167, - "name": "_operator", - "nodeType": "VariableDeclaration", - "scope": 5184, - "src": "8810:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5166, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "8810:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "8809:19:11" - }, - "returnParameters": { - "id": 5175, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5170, - "name": "amount", - "nodeType": "VariableDeclaration", - "scope": 5184, - "src": "8854:14:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5169, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "8854:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5172, - "name": "createdAt", - "nodeType": "VariableDeclaration", - "scope": 5184, - "src": "8870:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5171, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "8870:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5174, - "name": "undelegatedAt", - "nodeType": "VariableDeclaration", - "scope": 5184, - "src": "8889:21:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5173, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "8889:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "8853:58:11" - }, - "scope": 5649, - "src": "8783:195:11", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5312, - "nodeType": "Block", - "src": "9433:1126:11", - "statements": [ - { - "assignments": [ - 5197 - ], - "declarations": [ - { - "constant": false, - "id": 5197, - "name": "totalAmountToBurn", - "nodeType": "VariableDeclaration", - "scope": 5312, - "src": "9444:25:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5196, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "9444:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5199, - "initialValue": { - "argumentTypes": null, - "hexValue": "30", - "id": 5198, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "9472:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "nodeType": "VariableDeclarationStatement", - "src": "9444:29:11" - }, - { - "body": { - "id": 5304, - "nodeType": "Block", - "src": "9537:976:11", - "statements": [ - { - "assignments": [ - 5212 - ], - "declarations": [ - { - "constant": false, - "id": 5212, - "name": "operator", - "nodeType": "VariableDeclaration", - "scope": 5304, - "src": "9551:16:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5211, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "9551:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5216, - "initialValue": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5213, - "name": "misbehavedOperators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5189, - "src": "9570:19:11", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - } - }, - "id": 5215, - "indexExpression": { - "argumentTypes": null, - "id": 5214, - "name": "i", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5201, - "src": "9590:1:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "9570:22:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "9551:41:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5218, - "name": "authorizations", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4754, - "src": "9614:14:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$", - "typeString": "mapping(address => mapping(address => bool))" - } - }, - "id": 5221, - "indexExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5219, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "9629:3:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 5220, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "9629:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "9614:26:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", - "typeString": "mapping(address => bool)" - } - }, - "id": 5223, - "indexExpression": { - "argumentTypes": null, - "id": 5222, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5212, - "src": "9641:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "9614:36:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4e6f7420617574686f72697a6564", - "id": 5224, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "9652:16:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_fac3bac318c0d00994f57b0f2f4c643c313072b71db2302bf4b900309cc50b36", - "typeString": "literal_string \"Not authorized\"" - }, - "value": "Not authorized" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_fac3bac318c0d00994f57b0f2f4c643c313072b71db2302bf4b900309cc50b36", - "typeString": "literal_string \"Not authorized\"" - } - ], - "id": 5217, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "9606:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 5225, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9606:63:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5226, - "nodeType": "ExpressionStatement", - "src": "9606:63:11" - }, - { - "assignments": [ - 5228 - ], - "declarations": [ - { - "constant": false, - "id": 5228, - "name": "operatorParams", - "nodeType": "VariableDeclaration", - "scope": 5304, - "src": "9684:22:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5227, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "9684:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5233, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5229, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "9709:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5231, - "indexExpression": { - "argumentTypes": null, - "id": 5230, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5212, - "src": "9719:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "9709:19:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5232, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "9709:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "9684:57:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5243, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5235, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "9780:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 5236, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "9780:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5241, - "name": "initializationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3303, - "src": "9833:20:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5237, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5228, - "src": "9795:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5238, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getCreationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11181, - "src": "9795:31:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5239, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9795:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5240, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "9795:37:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5242, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9795:59:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "9780:74:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4f70657261746f72207374616b65206d75737420626520616374697665", - "id": 5244, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "9872:31:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_bf33512933a250e8918ce1359edeceb0f21a83f69e895857e329ea8b58fb0931", - "typeString": "literal_string \"Operator stake must be active\"" - }, - "value": "Operator stake must be active" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_bf33512933a250e8918ce1359edeceb0f21a83f69e895857e329ea8b58fb0931", - "typeString": "literal_string \"Operator stake must be active\"" - } - ], - "id": 5234, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "9755:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 5245, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9755:162:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5246, - "nodeType": "ExpressionStatement", - "src": "9755:162:11" - }, - { - "assignments": [ - 5248 - ], - "declarations": [ - { - "constant": false, - "id": 5248, - "name": "currentAmount", - "nodeType": "VariableDeclaration", - "scope": 5304, - "src": "9932:21:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5247, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "9932:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5252, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5249, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5228, - "src": "9956:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5250, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11146, - "src": "9956:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5251, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9956:26:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "9932:50:11" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5255, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5253, - "name": "currentAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5248, - "src": "10001:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "<", - "rightExpression": { - "argumentTypes": null, - "id": 5254, - "name": "amountToSlash", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5186, - "src": "10017:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "10001:29:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": { - "id": 5302, - "nodeType": "Block", - "src": "10255:248:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 5283, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 5278, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5197, - "src": "10273:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5281, - "name": "amountToSlash", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5186, - "src": "10315:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5279, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5197, - "src": "10293:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5280, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "10293:21:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5282, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10293:36:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "10273:56:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5284, - "nodeType": "ExpressionStatement", - "src": "10273:56:11" - }, - { - "assignments": [ - 5286 - ], - "declarations": [ - { - "constant": false, - "id": 5286, - "name": "newAmount", - "nodeType": "VariableDeclaration", - "scope": 5302, - "src": "10348:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5285, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "10348:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5291, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5289, - "name": "amountToSlash", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5186, - "src": "10386:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5287, - "name": "currentAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5248, - "src": "10368:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5288, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "10368:17:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5290, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10368:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "10348:52:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 5300, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5292, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "10418:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5294, - "indexExpression": { - "argumentTypes": null, - "id": 5293, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5212, - "src": "10428:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "10418:19:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5295, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "10418:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5298, - "name": "newAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5286, - "src": "10478:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5296, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5228, - "src": "10453:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5297, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "setAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11166, - "src": "10453:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5299, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10453:35:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "10418:70:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5301, - "nodeType": "ExpressionStatement", - "src": "10418:70:11" - } - ] - }, - "id": 5303, - "nodeType": "IfStatement", - "src": "9997:506:11", - "trueBody": { - "id": 5277, - "nodeType": "Block", - "src": "10032:217:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 5261, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 5256, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5197, - "src": "10050:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5259, - "name": "currentAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5248, - "src": "10092:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5257, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5197, - "src": "10070:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5258, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "10070:21:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5260, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10070:36:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "10050:56:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5262, - "nodeType": "ExpressionStatement", - "src": "10050:56:11" - }, - { - "assignments": [ - 5264 - ], - "declarations": [ - { - "constant": false, - "id": 5264, - "name": "newAmount", - "nodeType": "VariableDeclaration", - "scope": 5277, - "src": "10125:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5263, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "10125:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5266, - "initialValue": { - "argumentTypes": null, - "hexValue": "30", - "id": 5265, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "10145:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "nodeType": "VariableDeclarationStatement", - "src": "10125:21:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 5275, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5267, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "10164:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5269, - "indexExpression": { - "argumentTypes": null, - "id": 5268, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5212, - "src": "10174:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "10164:19:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5270, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "10164:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5273, - "name": "newAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5264, - "src": "10224:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5271, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5228, - "src": "10199:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5272, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "setAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11166, - "src": "10199:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5274, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10199:35:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "10164:70:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5276, - "nodeType": "ExpressionStatement", - "src": "10164:70:11" - } - ] - } - } - ] - }, - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5207, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5204, - "name": "i", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5201, - "src": "9500:1:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "<", - "rightExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5205, - "name": "misbehavedOperators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5189, - "src": "9504:19:11", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - } - }, - "id": 5206, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "length", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "9504:26:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "9500:30:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "id": 5305, - "initializationExpression": { - "assignments": [ - 5201 - ], - "declarations": [ - { - "constant": false, - "id": 5201, - "name": "i", - "nodeType": "VariableDeclaration", - "scope": 5305, - "src": "9488:6:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5200, - "name": "uint", - "nodeType": "ElementaryTypeName", - "src": "9488:4:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5203, - "initialValue": { - "argumentTypes": null, - "hexValue": "30", - "id": 5202, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "9497:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "nodeType": "VariableDeclarationStatement", - "src": "9488:10:11" - }, - "loopExpression": { - "expression": { - "argumentTypes": null, - "id": 5209, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "UnaryOperation", - "operator": "++", - "prefix": false, - "src": "9532:3:11", - "subExpression": { - "argumentTypes": null, - "id": 5208, - "name": "i", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5201, - "src": "9532:1:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5210, - "nodeType": "ExpressionStatement", - "src": "9532:3:11" - }, - "nodeType": "ForStatement", - "src": "9483:1030:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5309, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5197, - "src": "10534:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5306, - "name": "token", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3301, - "src": "10523:5:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "id": 5308, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "burn", - "nodeType": "MemberAccess", - "referencedDeclaration": 12369, - "src": "10523:10:11", - "typeDescriptions": { - "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$__$", - "typeString": "function (uint256) external" - } - }, - "id": 5310, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10523:29:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5311, - "nodeType": "ExpressionStatement", - "src": "10523:29:11" - } - ] - }, - "documentation": "@dev Slash provided token amount from every member in the misbehaved\noperators array and burn 100% of all the tokens.\n@param amountToSlash Token amount to slash from every misbehaved operator.\n@param misbehavedOperators Array of addresses to seize the tokens from.", - "id": 5313, - "implemented": true, - "kind": "function", - "modifiers": [ - { - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5192, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "9421:3:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 5193, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "9421:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - } - ], - "id": 5194, - "modifierName": { - "argumentTypes": null, - "id": 5191, - "name": "onlyApprovedOperatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4768, - "src": "9392:28:11", - "typeDescriptions": { - "typeIdentifier": "t_modifier$_t_address_$", - "typeString": "modifier (address)" - } - }, - "nodeType": "ModifierInvocation", - "src": "9392:40:11" - } - ], - "name": "slash", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5190, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5186, - "name": "amountToSlash", - "nodeType": "VariableDeclaration", - "scope": 5313, - "src": "9308:21:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5185, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "9308:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5189, - "name": "misbehavedOperators", - "nodeType": "VariableDeclaration", - "scope": 5313, - "src": "9331:36:11", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[]" - }, - "typeName": { - "baseType": { - "id": 5187, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "9331:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 5188, - "length": null, - "nodeType": "ArrayTypeName", - "src": "9331:9:11", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[]" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "9307:61:11" - }, - "returnParameters": { - "id": 5195, - "nodeType": "ParameterList", - "parameters": [], - "src": "9433:0:11" - }, - "scope": 5649, - "src": "9293:1266:11", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5466, - "nodeType": "Block", - "src": "11333:1299:11", - "statements": [ - { - "assignments": [ - 5330 - ], - "declarations": [ - { - "constant": false, - "id": 5330, - "name": "totalAmountToBurn", - "nodeType": "VariableDeclaration", - "scope": 5466, - "src": "11343:25:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5329, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "11343:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5332, - "initialValue": { - "argumentTypes": null, - "hexValue": "30", - "id": 5331, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "11371:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "nodeType": "VariableDeclarationStatement", - "src": "11343:29:11" - }, - { - "body": { - "id": 5437, - "nodeType": "Block", - "src": "11436:976:11", - "statements": [ - { - "assignments": [ - 5345 - ], - "declarations": [ - { - "constant": false, - "id": 5345, - "name": "operator", - "nodeType": "VariableDeclaration", - "scope": 5437, - "src": "11450:16:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5344, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "11450:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5349, - "initialValue": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5346, - "name": "misbehavedOperators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5322, - "src": "11469:19:11", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - } - }, - "id": 5348, - "indexExpression": { - "argumentTypes": null, - "id": 5347, - "name": "i", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5334, - "src": "11489:1:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "11469:22:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "11450:41:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5351, - "name": "authorizations", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4754, - "src": "11513:14:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$", - "typeString": "mapping(address => mapping(address => bool))" - } - }, - "id": 5354, - "indexExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5352, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "11528:3:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 5353, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "11528:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "11513:26:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", - "typeString": "mapping(address => bool)" - } - }, - "id": 5356, - "indexExpression": { - "argumentTypes": null, - "id": 5355, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5345, - "src": "11540:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "11513:36:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4e6f7420617574686f72697a6564", - "id": 5357, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "11551:16:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_fac3bac318c0d00994f57b0f2f4c643c313072b71db2302bf4b900309cc50b36", - "typeString": "literal_string \"Not authorized\"" - }, - "value": "Not authorized" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_fac3bac318c0d00994f57b0f2f4c643c313072b71db2302bf4b900309cc50b36", - "typeString": "literal_string \"Not authorized\"" - } - ], - "id": 5350, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "11505:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 5358, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11505:63:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5359, - "nodeType": "ExpressionStatement", - "src": "11505:63:11" - }, - { - "assignments": [ - 5361 - ], - "declarations": [ - { - "constant": false, - "id": 5361, - "name": "operatorParams", - "nodeType": "VariableDeclaration", - "scope": 5437, - "src": "11583:22:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5360, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "11583:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5366, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5362, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "11608:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5364, - "indexExpression": { - "argumentTypes": null, - "id": 5363, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5345, - "src": "11618:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "11608:19:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5365, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "11608:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "11583:57:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5376, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5368, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "11679:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 5369, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "11679:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5374, - "name": "initializationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3303, - "src": "11732:20:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5370, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5361, - "src": "11694:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5371, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getCreationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11181, - "src": "11694:31:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5372, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11694:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5373, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "11694:37:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5375, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11694:59:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "11679:74:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4f70657261746f72207374616b65206d75737420626520616374697665", - "id": 5377, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "11771:31:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_bf33512933a250e8918ce1359edeceb0f21a83f69e895857e329ea8b58fb0931", - "typeString": "literal_string \"Operator stake must be active\"" - }, - "value": "Operator stake must be active" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_bf33512933a250e8918ce1359edeceb0f21a83f69e895857e329ea8b58fb0931", - "typeString": "literal_string \"Operator stake must be active\"" - } - ], - "id": 5367, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "11654:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 5378, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11654:162:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5379, - "nodeType": "ExpressionStatement", - "src": "11654:162:11" - }, - { - "assignments": [ - 5381 - ], - "declarations": [ - { - "constant": false, - "id": 5381, - "name": "currentAmount", - "nodeType": "VariableDeclaration", - "scope": 5437, - "src": "11831:21:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5380, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "11831:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5385, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5382, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5361, - "src": "11855:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5383, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11146, - "src": "11855:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5384, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11855:26:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "11831:50:11" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5388, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5386, - "name": "currentAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5381, - "src": "11900:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "<", - "rightExpression": { - "argumentTypes": null, - "id": 5387, - "name": "amountToSeize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5315, - "src": "11916:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "11900:29:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": { - "id": 5435, - "nodeType": "Block", - "src": "12154:248:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 5416, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 5411, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5330, - "src": "12172:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5414, - "name": "amountToSeize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5315, - "src": "12214:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5412, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5330, - "src": "12192:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5413, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "12192:21:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5415, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12192:36:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "12172:56:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5417, - "nodeType": "ExpressionStatement", - "src": "12172:56:11" - }, - { - "assignments": [ - 5419 - ], - "declarations": [ - { - "constant": false, - "id": 5419, - "name": "newAmount", - "nodeType": "VariableDeclaration", - "scope": 5435, - "src": "12247:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5418, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "12247:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5424, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5422, - "name": "amountToSeize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5315, - "src": "12285:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5420, - "name": "currentAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5381, - "src": "12267:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5421, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "12267:17:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5423, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12267:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "12247:52:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 5433, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5425, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "12317:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5427, - "indexExpression": { - "argumentTypes": null, - "id": 5426, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5345, - "src": "12327:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "12317:19:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5428, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "12317:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5431, - "name": "newAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5419, - "src": "12377:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5429, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5361, - "src": "12352:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5430, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "setAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11166, - "src": "12352:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5432, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12352:35:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "12317:70:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5434, - "nodeType": "ExpressionStatement", - "src": "12317:70:11" - } - ] - }, - "id": 5436, - "nodeType": "IfStatement", - "src": "11896:506:11", - "trueBody": { - "id": 5410, - "nodeType": "Block", - "src": "11931:217:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 5394, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 5389, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5330, - "src": "11949:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5392, - "name": "currentAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5381, - "src": "11991:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5390, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5330, - "src": "11969:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5391, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "11969:21:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5393, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11969:36:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "11949:56:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5395, - "nodeType": "ExpressionStatement", - "src": "11949:56:11" - }, - { - "assignments": [ - 5397 - ], - "declarations": [ - { - "constant": false, - "id": 5397, - "name": "newAmount", - "nodeType": "VariableDeclaration", - "scope": 5410, - "src": "12024:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5396, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "12024:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5399, - "initialValue": { - "argumentTypes": null, - "hexValue": "30", - "id": 5398, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "12044:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "nodeType": "VariableDeclarationStatement", - "src": "12024:21:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 5408, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5400, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "12063:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5402, - "indexExpression": { - "argumentTypes": null, - "id": 5401, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5345, - "src": "12073:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "12063:19:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5403, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "12063:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5406, - "name": "newAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5397, - "src": "12123:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5404, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5361, - "src": "12098:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5405, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "setAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11166, - "src": "12098:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5407, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12098:35:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "12063:70:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5409, - "nodeType": "ExpressionStatement", - "src": "12063:70:11" - } - ] - } - } - ] - }, - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5340, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5337, - "name": "i", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5334, - "src": "11399:1:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "<", - "rightExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5338, - "name": "misbehavedOperators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5322, - "src": "11403:19:11", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - } - }, - "id": 5339, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "length", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "11403:26:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "11399:30:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "id": 5438, - "initializationExpression": { - "assignments": [ - 5334 - ], - "declarations": [ - { - "constant": false, - "id": 5334, - "name": "i", - "nodeType": "VariableDeclaration", - "scope": 5438, - "src": "11387:6:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5333, - "name": "uint", - "nodeType": "ElementaryTypeName", - "src": "11387:4:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5336, - "initialValue": { - "argumentTypes": null, - "hexValue": "30", - "id": 5335, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "11396:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "nodeType": "VariableDeclarationStatement", - "src": "11387:10:11" - }, - "loopExpression": { - "expression": { - "argumentTypes": null, - "id": 5342, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "UnaryOperation", - "operator": "++", - "prefix": false, - "src": "11431:3:11", - "subExpression": { - "argumentTypes": null, - "id": 5341, - "name": "i", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5334, - "src": "11431:1:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5343, - "nodeType": "ExpressionStatement", - "src": "11431:3:11" - }, - "nodeType": "ForStatement", - "src": "11382:1030:11" - }, - { - "assignments": [ - 5440 - ], - "declarations": [ - { - "constant": false, - "id": 5440, - "name": "tattletaleReward", - "nodeType": "VariableDeclaration", - "scope": 5466, - "src": "12422:24:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5439, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "12422:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5449, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5447, - "name": "rewardMultiplier", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5317, - "src": "12488:16:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "components": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "35", - "id": 5443, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "12476:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_5_by_1", - "typeString": "int_const 5" - }, - "value": "5" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_5_by_1", - "typeString": "int_const 5" - } - ], - "expression": { - "argumentTypes": null, - "id": 5441, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5330, - "src": "12450:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5442, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "percent", - "nodeType": "MemberAccess", - "referencedDeclaration": 11258, - "src": "12450:25:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5444, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12450:28:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "id": 5445, - "isConstant": false, - "isInlineArray": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "TupleExpression", - "src": "12449:30:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5446, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "percent", - "nodeType": "MemberAccess", - "referencedDeclaration": 11258, - "src": "12449:38:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5448, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12449:56:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "12422:83:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5453, - "name": "tattletale", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5319, - "src": "12535:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 5454, - "name": "tattletaleReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5440, - "src": "12547:16:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5450, - "name": "token", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3301, - "src": "12516:5:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "id": 5452, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "safeTransfer", - "nodeType": "MemberAccess", - "referencedDeclaration": 12485, - "src": "12516:18:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$12452_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$12452_$", - "typeString": "function (contract IERC20,address,uint256)" - } - }, - "id": 5455, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12516:48:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5456, - "nodeType": "ExpressionStatement", - "src": "12516:48:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5462, - "name": "tattletaleReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5440, - "src": "12607:16:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5460, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5330, - "src": "12585:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5461, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "12585:21:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5463, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12585:39:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5457, - "name": "token", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3301, - "src": "12574:5:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "id": 5459, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "burn", - "nodeType": "MemberAccess", - "referencedDeclaration": 12369, - "src": "12574:10:11", - "typeDescriptions": { - "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$__$", - "typeString": "function (uint256) external" - } - }, - "id": 5464, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12574:51:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5465, - "nodeType": "ExpressionStatement", - "src": "12574:51:11" - } - ] - }, - "documentation": "@dev Seize provided token amount from every member in the misbehaved\noperators array. The tattletale is rewarded with 5% of the total seized\namount scaled by the reward adjustment parameter and the rest 95% is burned.\n@param amountToSeize Token amount to seize from every misbehaved operator.\n@param rewardMultiplier Reward adjustment in percentage. Min 1% and 100% max.\n@param tattletale Address to receive the 5% reward.\n@param misbehavedOperators Array of addresses to seize the tokens from.", - "id": 5467, - "implemented": true, - "kind": "function", - "modifiers": [ - { - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5325, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "11321:3:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 5326, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "11321:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - } - ], - "id": 5327, - "modifierName": { - "argumentTypes": null, - "id": 5324, - "name": "onlyApprovedOperatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4768, - "src": "11292:28:11", - "typeDescriptions": { - "typeIdentifier": "t_modifier$_t_address_$", - "typeString": "modifier (address)" - } - }, - "nodeType": "ModifierInvocation", - "src": "11292:40:11" - } - ], - "name": "seize", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5323, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5315, - "name": "amountToSeize", - "nodeType": "VariableDeclaration", - "scope": 5467, - "src": "11149:21:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5314, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "11149:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5317, - "name": "rewardMultiplier", - "nodeType": "VariableDeclaration", - "scope": 5467, - "src": "11180:24:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5316, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "11180:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5319, - "name": "tattletale", - "nodeType": "VariableDeclaration", - "scope": 5467, - "src": "11214:18:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5318, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "11214:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5322, - "name": "misbehavedOperators", - "nodeType": "VariableDeclaration", - "scope": 5467, - "src": "11242:36:11", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[]" - }, - "typeName": { - "baseType": { - "id": 5320, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "11242:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 5321, - "length": null, - "nodeType": "ArrayTypeName", - "src": "11242:9:11", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[]" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "11139:145:11" - }, - "returnParameters": { - "id": 5328, - "nodeType": "ParameterList", - "parameters": [], - "src": "11333:0:11" - }, - "scope": 5649, - "src": "11125:1507:11", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5488, - "nodeType": "Block", - "src": "13117:68:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 5486, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5480, - "name": "authorizations", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4754, - "src": "13127:14:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$", - "typeString": "mapping(address => mapping(address => bool))" - } - }, - "id": 5483, - "indexExpression": { - "argumentTypes": null, - "id": 5481, - "name": "_operatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5471, - "src": "13142:17:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "13127:33:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", - "typeString": "mapping(address => bool)" - } - }, - "id": 5484, - "indexExpression": { - "argumentTypes": null, - "id": 5482, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5469, - "src": "13161:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "nodeType": "IndexAccess", - "src": "13127:44:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "hexValue": "74727565", - "id": 5485, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "bool", - "lValueRequested": false, - "nodeType": "Literal", - "src": "13174:4:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "value": "true" - }, - "src": "13127:51:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "id": 5487, - "nodeType": "ExpressionStatement", - "src": "13127:51:11" - } - ] - }, - "documentation": "@dev Authorizes operator contract to access staked token balance of\nthe provided operator. Can only be executed by stake operator authorizer.\n@param _operator address of stake operator.\n@param _operatorContract address of operator contract.", - "id": 5489, - "implemented": true, - "kind": "function", - "modifiers": [ - { - "arguments": [ - { - "argumentTypes": null, - "id": 5474, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5469, - "src": "13050:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "id": 5475, - "modifierName": { - "argumentTypes": null, - "id": 5473, - "name": "onlyOperatorAuthorizer", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3340, - "src": "13027:22:11", - "typeDescriptions": { - "typeIdentifier": "t_modifier$_t_address_$", - "typeString": "modifier (address)" - } - }, - "nodeType": "ModifierInvocation", - "src": "13027:33:11" - }, - { - "arguments": [ - { - "argumentTypes": null, - "id": 5477, - "name": "_operatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5471, - "src": "13098:17:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "id": 5478, - "modifierName": { - "argumentTypes": null, - "id": 5476, - "name": "onlyApprovedOperatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4768, - "src": "13069:28:11", - "typeDescriptions": { - "typeIdentifier": "t_modifier$_t_address_$", - "typeString": "modifier (address)" - } - }, - "nodeType": "ModifierInvocation", - "src": "13069:47:11" - } - ], - "name": "authorizeOperatorContract", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5472, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5469, - "name": "_operator", - "nodeType": "VariableDeclaration", - "scope": 5489, - "src": "12958:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5468, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "12958:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5471, - "name": "_operatorContract", - "nodeType": "VariableDeclaration", - "scope": 5489, - "src": "12977:25:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5470, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "12977:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "12957:46:11" - }, - "returnParameters": { - "id": 5479, - "nodeType": "ParameterList", - "parameters": [], - "src": "13117:0:11" - }, - "scope": 5649, - "src": "12923:262:11", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5504, - "nodeType": "Block", - "src": "13538:68:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5498, - "name": "authorizations", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4754, - "src": "13555:14:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$", - "typeString": "mapping(address => mapping(address => bool))" - } - }, - "id": 5500, - "indexExpression": { - "argumentTypes": null, - "id": 5499, - "name": "_operatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5493, - "src": "13570:17:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "13555:33:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", - "typeString": "mapping(address => bool)" - } - }, - "id": 5502, - "indexExpression": { - "argumentTypes": null, - "id": 5501, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5491, - "src": "13589:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "13555:44:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "functionReturnParameters": 5497, - "id": 5503, - "nodeType": "Return", - "src": "13548:51:11" - } - ] - }, - "documentation": "@dev Checks if operator contract has access to the staked token balance of\nthe provided operator.\n@param _operator address of stake operator.\n@param _operatorContract address of operator contract.", - "id": 5505, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "isAuthorizedForOperator", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5494, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5491, - "name": "_operator", - "nodeType": "VariableDeclaration", - "scope": 5505, - "src": "13465:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5490, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "13465:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5493, - "name": "_operatorContract", - "nodeType": "VariableDeclaration", - "scope": 5505, - "src": "13484:25:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5492, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "13484:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "13464:46:11" - }, - "returnParameters": { - "id": 5497, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5496, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 5505, - "src": "13532:4:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 5495, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "13532:4:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "13531:6:11" - }, - "scope": 5649, - "src": "13432:174:11", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5578, - "nodeType": "Block", - "src": "14343:778:11", - "statements": [ - { - "assignments": [ - 5515 - ], - "declarations": [ - { - "constant": false, - "id": 5515, - "name": "isAuthorized", - "nodeType": "VariableDeclaration", - "scope": 5578, - "src": "14353:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 5514, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "14353:4:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5521, - "initialValue": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5516, - "name": "authorizations", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4754, - "src": "14373:14:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$", - "typeString": "mapping(address => mapping(address => bool))" - } - }, - "id": 5518, - "indexExpression": { - "argumentTypes": null, - "id": 5517, - "name": "_operatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5509, - "src": "14388:17:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "14373:33:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", - "typeString": "mapping(address => bool)" - } - }, - "id": 5520, - "indexExpression": { - "argumentTypes": null, - "id": 5519, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5507, - "src": "14407:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "14373:44:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "14353:64:11" - }, - { - "assignments": [ - 5523 - ], - "declarations": [ - { - "constant": false, - "id": 5523, - "name": "operatorParams", - "nodeType": "VariableDeclaration", - "scope": 5578, - "src": "14428:22:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5522, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "14428:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5528, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5524, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "14453:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5526, - "indexExpression": { - "argumentTypes": null, - "id": 5525, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5507, - "src": "14463:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "14453:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5527, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "14453:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "14428:58:11" - }, - { - "assignments": [ - 5530 - ], - "declarations": [ - { - "constant": false, - "id": 5530, - "name": "createdAt", - "nodeType": "VariableDeclaration", - "scope": 5578, - "src": "14496:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5529, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "14496:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5534, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5531, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5523, - "src": "14516:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5532, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getCreationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11181, - "src": "14516:31:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5533, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14516:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "14496:53:11" - }, - { - "assignments": [ - 5536 - ], - "declarations": [ - { - "constant": false, - "id": 5536, - "name": "undelegatedAt", - "nodeType": "VariableDeclaration", - "scope": 5578, - "src": "14559:21:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5535, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "14559:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5540, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5537, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5523, - "src": "14583:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5538, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getUndelegationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11213, - "src": "14583:35:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5539, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14583:37:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "14559:61:11" - }, - { - "assignments": [ - 5542 - ], - "declarations": [ - { - "constant": false, - "id": 5542, - "name": "isActive", - "nodeType": "VariableDeclaration", - "scope": 5578, - "src": "14631:13:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 5541, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "14631:4:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5550, - "initialValue": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5549, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5543, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "14647:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 5544, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "14647:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5547, - "name": "initializationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3303, - "src": "14676:20:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5545, - "name": "createdAt", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5530, - "src": "14662:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5546, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "14662:13:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5548, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14662:35:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "14647:50:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "14631:66:11" - }, - { - "assignments": [ - 5552 - ], - "declarations": [ - { - "constant": false, - "id": 5552, - "name": "isUndelegating", - "nodeType": "VariableDeclaration", - "scope": 5578, - "src": "14918:19:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 5551, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "14918:4:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5563, - "initialValue": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 5562, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "components": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5555, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5553, - "name": "undelegatedAt", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5536, - "src": "14941:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "!=", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 5554, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "14958:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "14941:18:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - } - ], - "id": 5556, - "isConstant": false, - "isInlineArray": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "TupleExpression", - "src": "14940:20:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "&&", - "rightExpression": { - "argumentTypes": null, - "components": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5560, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5557, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "14965:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 5558, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "14965:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "id": 5559, - "name": "undelegatedAt", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5536, - "src": "14980:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "14965:28:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - } - ], - "id": 5561, - "isConstant": false, - "isInlineArray": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "TupleExpression", - "src": "14964:30:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "14940:54:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "14918:76:11" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 5569, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 5566, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5564, - "name": "isAuthorized", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5515, - "src": "15009:12:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "&&", - "rightExpression": { - "argumentTypes": null, - "id": 5565, - "name": "isActive", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5542, - "src": "15025:8:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "15009:24:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "&&", - "rightExpression": { - "argumentTypes": null, - "id": 5568, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "UnaryOperation", - "operator": "!", - "prefix": true, - "src": "15037:15:11", - "subExpression": { - "argumentTypes": null, - "id": 5567, - "name": "isUndelegating", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5552, - "src": "15038:14:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "15009:43:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 5577, - "nodeType": "IfStatement", - "src": "15005:110:11", - "trueBody": { - "id": 5576, - "nodeType": "Block", - "src": "15054:61:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 5574, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 5570, - "name": "balance", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5512, - "src": "15068:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5571, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5523, - "src": "15078:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5572, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11146, - "src": "15078:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5573, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15078:26:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "15068:36:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5575, - "nodeType": "ExpressionStatement", - "src": "15068:36:11" - } - ] - } - } - ] - }, - "documentation": "@dev Gets the eligible stake balance of the specified address.\nAn eligible stake is a stake that passed the initialization period\nand is not currently undelegating. Also, the operator had to approve\nthe specified operator contract.\n * Operator with a minimum required amount of eligible stake can join the\nnetwork and participate in new work selection.\n * @param _operator address of stake operator.\n@param _operatorContract address of operator contract.\n@return an uint256 representing the eligible stake balance.", - "id": 5579, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "eligibleStake", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5510, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5507, - "name": "_operator", - "nodeType": "VariableDeclaration", - "scope": 5579, - "src": "14246:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5506, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "14246:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5509, - "name": "_operatorContract", - "nodeType": "VariableDeclaration", - "scope": 5579, - "src": "14273:25:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5508, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "14273:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "14236:68:11" - }, - "returnParameters": { - "id": 5513, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5512, - "name": "balance", - "nodeType": "VariableDeclaration", - "scope": 5579, - "src": "14326:15:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5511, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "14326:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "14325:17:11" - }, - "scope": 5649, - "src": "14214:907:11", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5630, - "nodeType": "Block", - "src": "16016:391:11", - "statements": [ - { - "assignments": [ - 5589 - ], - "declarations": [ - { - "constant": false, - "id": 5589, - "name": "isAuthorized", - "nodeType": "VariableDeclaration", - "scope": 5630, - "src": "16026:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 5588, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "16026:4:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5595, - "initialValue": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5590, - "name": "authorizations", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4754, - "src": "16046:14:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$", - "typeString": "mapping(address => mapping(address => bool))" - } - }, - "id": 5592, - "indexExpression": { - "argumentTypes": null, - "id": 5591, - "name": "_operatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5583, - "src": "16061:17:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "16046:33:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", - "typeString": "mapping(address => bool)" - } - }, - "id": 5594, - "indexExpression": { - "argumentTypes": null, - "id": 5593, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5581, - "src": "16080:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "16046:44:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "16026:64:11" - }, - { - "assignments": [ - 5597 - ], - "declarations": [ - { - "constant": false, - "id": 5597, - "name": "operatorParams", - "nodeType": "VariableDeclaration", - "scope": 5630, - "src": "16101:22:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5596, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "16101:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5602, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5598, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "16126:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5600, - "indexExpression": { - "argumentTypes": null, - "id": 5599, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5581, - "src": "16136:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "16126:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5601, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "16126:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "16101:58:11" - }, - { - "assignments": [ - 5604 - ], - "declarations": [ - { - "constant": false, - "id": 5604, - "name": "createdAt", - "nodeType": "VariableDeclaration", - "scope": 5630, - "src": "16169:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5603, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "16169:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5608, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5605, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5597, - "src": "16189:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5606, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getCreationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11181, - "src": "16189:31:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5607, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16189:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "16169:53:11" - }, - { - "assignments": [ - 5610 - ], - "declarations": [ - { - "constant": false, - "id": 5610, - "name": "isActive", - "nodeType": "VariableDeclaration", - "scope": 5630, - "src": "16233:13:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 5609, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "16233:4:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5618, - "initialValue": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5617, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5611, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "16249:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 5612, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "16249:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5615, - "name": "initializationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3303, - "src": "16278:20:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5613, - "name": "createdAt", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5604, - "src": "16264:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5614, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "16264:13:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5616, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16264:35:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "16249:50:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "16233:66:11" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 5621, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5619, - "name": "isAuthorized", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5589, - "src": "16314:12:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "&&", - "rightExpression": { - "argumentTypes": null, - "id": 5620, - "name": "isActive", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5610, - "src": "16330:8:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "16314:24:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 5629, - "nodeType": "IfStatement", - "src": "16310:91:11", - "trueBody": { - "id": 5628, - "nodeType": "Block", - "src": "16340:61:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 5626, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 5622, - "name": "balance", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5586, - "src": "16354:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5623, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5597, - "src": "16364:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5624, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11146, - "src": "16364:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5625, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16364:26:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "16354:36:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5627, - "nodeType": "ExpressionStatement", - "src": "16354:36:11" - } - ] - } - } - ] - }, - "documentation": "@dev Gets the active stake balance of the specified address.\nAn active stake is a stake that passed the initialization period.\nAlso, the operator had to approve the specified operator contract.\n * The difference between eligible stake is that active stake does not make\nthe operator eligible for work selection but it may be still finishing\nearlier work during undelegation period. Operator with a minimum required\namount of active stake can join the network but cannot be selected to any\nnew work.\n * @param _operator address of stake operator.\n@param _operatorContract address of operator contract.\n@return an uint256 representing the eligible stake balance.", - "id": 5631, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "activeStake", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5584, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5581, - "name": "_operator", - "nodeType": "VariableDeclaration", - "scope": 5631, - "src": "15919:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5580, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "15919:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5583, - "name": "_operatorContract", - "nodeType": "VariableDeclaration", - "scope": 5631, - "src": "15946:25:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5582, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "15946:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "15909:68:11" - }, - "returnParameters": { - "id": 5587, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5586, - "name": "balance", - "nodeType": "VariableDeclaration", - "scope": 5631, - "src": "15999:15:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5585, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "15999:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "15998:17:11" - }, - "scope": 5649, - "src": "15889:518:11", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5647, - "nodeType": "Block", - "src": "17162:77:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5645, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5641, - "name": "staker", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5633, - "src": "17191:6:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 5642, - "name": "operatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5635, - "src": "17199:16:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 5640, - "name": "activeStake", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5631, - "src": "17179:11:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_uint256_$", - "typeString": "function (address,address) view returns (uint256)" - } - }, - "id": 5643, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17179:37:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">=", - "rightExpression": { - "argumentTypes": null, - "id": 5644, - "name": "minimumStake", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4728, - "src": "17220:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "17179:53:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "functionReturnParameters": 5639, - "id": 5646, - "nodeType": "Return", - "src": "17172:60:11" - } - ] - }, - "documentation": "@dev Checks if the specified account has enough active stake to become\nnetwork operator and that the specified operator contract has been\nauthorized for potential slashing.\n * Having the required minimum of active stake makes the operator eligible\nto join the network. If the active stake is not currently undelegating,\noperator is also eligible for work selection.\n * @param staker Staker's address\n@param operatorContract Operator contract's address\n@return True if has enough active stake to participate in the network,\nfalse otherwise.", - "id": 5648, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "hasMinimumStake", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5636, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5633, - "name": "staker", - "nodeType": "VariableDeclaration", - "scope": 5648, - "src": "17081:14:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5632, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "17081:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5635, - "name": "operatorContract", - "nodeType": "VariableDeclaration", - "scope": 5648, - "src": "17105:24:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5634, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "17105:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "17071:64:11" - }, - "returnParameters": { - "id": 5639, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5638, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 5648, - "src": "17156:4:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 5637, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "17156:4:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "17155:6:11" - }, - "scope": 5649, - "src": "17047:192:11", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - } - ], - "scope": 5650, - "src": "477:16764:11" - } - ], - "src": "0:17242:11" - }, - "legacyAST": { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/TokenStaking.sol", - "exportedSymbols": { - "TokenStaking": [ - 5649 - ] - }, - "id": 5650, - "nodeType": "SourceUnit", - "nodes": [ - { - "id": 4706, - "literals": [ - "solidity", - "^", - "0.5", - ".4" - ], - "nodeType": "PragmaDirective", - "src": "0:23:11" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/StakeDelegatable.sol", - "file": "./StakeDelegatable.sol", - "id": 4707, - "nodeType": "ImportDirective", - "scope": 5650, - "sourceUnit": 3409, - "src": "25:32:11", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/utils/UintArrayUtils.sol", - "file": "./utils/UintArrayUtils.sol", - "id": 4708, - "nodeType": "ImportDirective", - "scope": 5650, - "sourceUnit": 11389, - "src": "58:36:11", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/utils/PercentUtils.sol", - "file": "./utils/PercentUtils.sol", - "id": 4709, - "nodeType": "ImportDirective", - "scope": 5650, - "sourceUnit": 11278, - "src": "95:34:11", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "/tmp/1ba00d2cf27e1d7acc10cf2eeefc6c290e2046f8/solidity/contracts/Registry.sol", - "file": "./Registry.sol", - "id": 4710, - "nodeType": "ImportDirective", - "scope": 5650, - "sourceUnit": 3276, - "src": "130:24:11", - "symbolAliases": [], - "unitAlias": "" - }, - { - "absolutePath": "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol", - "file": "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol", - "id": 4711, - "nodeType": "ImportDirective", - "scope": 5650, - "sourceUnit": 12673, - "src": "155:67:11", - "symbolAliases": [], - "unitAlias": "" - }, - { - "baseContracts": [ - { - "arguments": null, - "baseName": { - "contractScope": null, - "id": 4712, - "name": "StakeDelegatable", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 3408, - "src": "502:16:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_StakeDelegatable_$3408", - "typeString": "contract StakeDelegatable" - } - }, - "id": 4713, - "nodeType": "InheritanceSpecifier", - "src": "502:16:11" - } - ], - "contractDependencies": [ - 3408 - ], - "contractKind": "contract", - "documentation": "@title TokenStaking\n@dev A token staking contract for a specified standard ERC20Burnable token.\nA holder of the specified token can stake delegate its tokens to this contract\nand recover the stake after undelegation period is over.", - "fullyImplemented": true, - "id": 5649, - "linearizedBaseContracts": [ - 5649, - 3408 - ], - "name": "TokenStaking", - "nodeType": "ContractDefinition", - "nodes": [ - { - "id": 4717, - "libraryName": { - "contractScope": null, - "id": 4714, - "name": "UintArrayUtils", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 11388, - "src": "531:14:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_UintArrayUtils_$11388", - "typeString": "library UintArrayUtils" - } - }, - "nodeType": "UsingForDirective", - "src": "525:35:11", - "typeName": { - "baseType": { - "id": 4715, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "550:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 4716, - "length": null, - "nodeType": "ArrayTypeName", - "src": "550:9:11", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", - "typeString": "uint256[]" - } - } - }, - { - "id": 4720, - "libraryName": { - "contractScope": null, - "id": 4718, - "name": "PercentUtils", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 11277, - "src": "571:12:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_PercentUtils_$11277", - "typeString": "library PercentUtils" - } - }, - "nodeType": "UsingForDirective", - "src": "565:31:11", - "typeName": { - "id": 4719, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "588:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - }, - { - "id": 4723, - "libraryName": { - "contractScope": null, - "id": 4721, - "name": "SafeERC20", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 12672, - "src": "607:9:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_SafeERC20_$12672", - "typeString": "library SafeERC20" - } - }, - "nodeType": "UsingForDirective", - "src": "601:34:11", - "typeName": { - "contractScope": null, - "id": 4722, - "name": "ERC20Burnable", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 12383, - "src": "621:13:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - } - }, - { - "constant": false, - "id": 4728, - "name": "minimumStake", - "nodeType": "VariableDeclaration", - "scope": 5649, - "src": "790:43:11", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 4724, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "790:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_rational_200000000000000000000000_by_1", - "typeString": "int_const 200000000000000000000000" - }, - "id": 4727, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "hexValue": "323030303030", - "id": 4725, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "820:6:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_200000_by_1", - "typeString": "int_const 200000" - }, - "value": "200000" - }, - "nodeType": "BinaryOperation", - "operator": "*", - "rightExpression": { - "argumentTypes": null, - "hexValue": "31653138", - "id": 4726, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "829:4:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_1000000000000000000_by_1", - "typeString": "int_const 1000000000000000000" - }, - "value": "1e18" - }, - "src": "820:13:11", - "typeDescriptions": { - "typeIdentifier": "t_rational_200000000000000000000000_by_1", - "typeString": "int_const 200000000000000000000000" - } - }, - "visibility": "public" - }, - { - "anonymous": false, - "documentation": null, - "id": 4734, - "name": "Staked", - "nodeType": "EventDefinition", - "parameters": { - "id": 4733, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 4730, - "indexed": true, - "name": "from", - "nodeType": "VariableDeclaration", - "scope": 4734, - "src": "853:20:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4729, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "853:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 4732, - "indexed": false, - "name": "value", - "nodeType": "VariableDeclaration", - "scope": 4734, - "src": "875:13:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 4731, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "875:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "852:37:11" - }, - "src": "840:50:11" - }, - { - "anonymous": false, - "documentation": null, - "id": 4740, - "name": "Undelegated", - "nodeType": "EventDefinition", - "parameters": { - "id": 4739, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 4736, - "indexed": true, - "name": "operator", - "nodeType": "VariableDeclaration", - "scope": 4740, - "src": "913:24:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4735, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "913:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 4738, - "indexed": false, - "name": "undelegatedAt", - "nodeType": "VariableDeclaration", - "scope": 4740, - "src": "939:21:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 4737, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "939:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "912:49:11" - }, - "src": "895:67:11" - }, - { - "anonymous": false, - "documentation": null, - "id": 4746, - "name": "RecoveredStake", - "nodeType": "EventDefinition", - "parameters": { - "id": 4745, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 4742, - "indexed": false, - "name": "operator", - "nodeType": "VariableDeclaration", - "scope": 4746, - "src": "988:16:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4741, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "988:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 4744, - "indexed": false, - "name": "recoveredAt", - "nodeType": "VariableDeclaration", - "scope": 4746, - "src": "1006:19:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 4743, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1006:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "987:39:11" - }, - "src": "967:60:11" - }, - { - "constant": false, - "id": 4748, - "name": "registry", - "nodeType": "VariableDeclaration", - "scope": 5649, - "src": "1116:24:11", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_contract$_Registry_$3275", - "typeString": "contract Registry" - }, - "typeName": { - "contractScope": null, - "id": 4747, - "name": "Registry", - "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 3275, - "src": "1116:8:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_Registry_$3275", - "typeString": "contract Registry" - } - }, - "value": null, - "visibility": "public" - }, - { - "constant": false, - "id": 4754, - "name": "authorizations", - "nodeType": "VariableDeclaration", - "scope": 5649, - "src": "1185:69:11", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$", - "typeString": "mapping(address => mapping(address => bool))" - }, - "typeName": { - "id": 4753, - "keyType": { - "id": 4749, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1193:7:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "Mapping", - "src": "1185:45:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$", - "typeString": "mapping(address => mapping(address => bool))" - }, - "valueType": { - "id": 4752, - "keyType": { - "id": 4750, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1213:7:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "Mapping", - "src": "1204:25:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", - "typeString": "mapping(address => bool)" - }, - "valueType": { - "id": 4751, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "1224:4:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - } - } - }, - "value": null, - "visibility": "internal" - }, - { - "body": { - "id": 4767, - "nodeType": "Block", - "src": "1325:161:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4761, - "name": "operatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4756, - "src": "1392:16:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "id": 4759, - "name": "registry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4748, - "src": "1356:8:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_Registry_$3275", - "typeString": "contract Registry" - } - }, - "id": 4760, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "isApprovedOperatorContract", - "nodeType": "MemberAccess", - "referencedDeclaration": 3262, - "src": "1356:35:11", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_bool_$", - "typeString": "function (address) view external returns (bool)" - } - }, - "id": 4762, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1356:53:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4f70657261746f7220636f6e7472616374206973206e6f7420617070726f766564", - "id": 4763, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "1423:35:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_513bea0687d0274464f0ce4b950b7e6635502a3e0d1fbd1935b2195e3102d772", - "typeString": "literal_string \"Operator contract is not approved\"" - }, - "value": "Operator contract is not approved" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_513bea0687d0274464f0ce4b950b7e6635502a3e0d1fbd1935b2195e3102d772", - "typeString": "literal_string \"Operator contract is not approved\"" - } - ], - "id": 4758, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "1335:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 4764, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "1335:133:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4765, - "nodeType": "ExpressionStatement", - "src": "1335:133:11" - }, - { - "id": 4766, - "nodeType": "PlaceholderStatement", - "src": "1478:1:11" - } - ] - }, - "documentation": null, - "id": 4768, - "name": "onlyApprovedOperatorContract", - "nodeType": "ModifierDefinition", - "parameters": { - "id": 4757, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 4756, - "name": "operatorContract", - "nodeType": "VariableDeclaration", - "scope": 4768, - "src": "1299:24:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4755, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1299:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1298:26:11" - }, - "src": "1261:225:11", - "visibility": "internal" - }, - { - "body": { - "id": 4808, - "nodeType": "Block", - "src": "2381:277:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 4784, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 4780, - "name": "_tokenAddress", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4770, - "src": "2399:13:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "BinaryOperation", - "operator": "!=", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "307830", - "id": 4782, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "2424:3:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0x0" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - } - ], - "id": 4781, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "2416:7:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": "address" - }, - "id": 4783, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "2416:12:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "src": "2399:29:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "546f6b656e20616464726573732063616e2774206265207a65726f2e", - "id": 4785, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "2430:30:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_99e77652455f4cd492494c65f6438e8324489c2561ea1530d4f80aab25602df7", - "typeString": "literal_string \"Token address can't be zero.\"" - }, - "value": "Token address can't be zero." - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_99e77652455f4cd492494c65f6438e8324489c2561ea1530d4f80aab25602df7", - "typeString": "literal_string \"Token address can't be zero.\"" - } - ], - "id": 4779, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "2391:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 4786, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "2391:70:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4787, - "nodeType": "ExpressionStatement", - "src": "2391:70:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 4792, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 4788, - "name": "token", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3301, - "src": "2471:5:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4790, - "name": "_tokenAddress", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4770, - "src": "2493:13:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 4789, - "name": "ERC20Burnable", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12383, - "src": "2479:13:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_ERC20Burnable_$12383_$", - "typeString": "type(contract ERC20Burnable)" - } - }, - "id": 4791, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "2479:28:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "src": "2471:36:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "id": 4793, - "nodeType": "ExpressionStatement", - "src": "2471:36:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 4798, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 4794, - "name": "registry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4748, - "src": "2517:8:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_Registry_$3275", - "typeString": "contract Registry" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4796, - "name": "_registry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4772, - "src": "2537:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 4795, - "name": "Registry", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3275, - "src": "2528:8:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_Registry_$3275_$", - "typeString": "type(contract Registry)" - } - }, - "id": 4797, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "2528:19:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_Registry_$3275", - "typeString": "contract Registry" - } - }, - "src": "2517:30:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_Registry_$3275", - "typeString": "contract Registry" - } - }, - "id": 4799, - "nodeType": "ExpressionStatement", - "src": "2517:30:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 4802, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 4800, - "name": "initializationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3303, - "src": "2557:20:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "id": 4801, - "name": "_initializationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4774, - "src": "2580:21:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "2557:44:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 4803, - "nodeType": "ExpressionStatement", - "src": "2557:44:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 4806, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 4804, - "name": "undelegationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3305, - "src": "2611:18:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "id": 4805, - "name": "_undelegationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4776, - "src": "2632:19:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "2611:40:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 4807, - "nodeType": "ExpressionStatement", - "src": "2611:40:11" - } - ] - }, - "documentation": "@dev Creates a token staking contract for a provided Standard ERC20Burnable token.\n@param _tokenAddress Address of a token that will be linked to this contract.\n@param _registry Address of a keep registry that will be linked to this contract.\n@param _initializationPeriod To avoid certain attacks on work selection, recently created\noperators must wait for a specific period of time before being eligible for work selection.\n@param _undelegationPeriod The staking contract guarantees that an undelegated operator’s\nstakes will stay locked for a number of blocks after undelegation, and thus available as\ncollateral for any work the operator is engaged in.", - "id": 4809, - "implemented": true, - "kind": "constructor", - "modifiers": [], - "name": "", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 4777, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 4770, - "name": "_tokenAddress", - "nodeType": "VariableDeclaration", - "scope": 4809, - "src": "2243:21:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4769, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "2243:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 4772, - "name": "_registry", - "nodeType": "VariableDeclaration", - "scope": 4809, - "src": "2274:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4771, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "2274:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 4774, - "name": "_initializationPeriod", - "nodeType": "VariableDeclaration", - "scope": 4809, - "src": "2301:29:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 4773, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2301:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 4776, - "name": "_undelegationPeriod", - "nodeType": "VariableDeclaration", - "scope": 4809, - "src": "2340:27:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 4775, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2340:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "2233:140:11" - }, - "returnParameters": { - "id": 4778, - "nodeType": "ParameterList", - "parameters": [], - "src": "2381:0:11" - }, - "scope": 5649, - "src": "2222:436:11", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 4920, - "nodeType": "Block", - "src": "3401:950:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - }, - "id": 4825, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4822, - "name": "_token", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4815, - "src": "3433:6:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 4821, - "name": "ERC20Burnable", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12383, - "src": "3419:13:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_ERC20Burnable_$12383_$", - "typeString": "type(contract ERC20Burnable)" - } - }, - "id": 4823, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3419:21:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "id": 4824, - "name": "token", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3301, - "src": "3444:5:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "src": "3419:30:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "546f6b656e20636f6e7472616374206d757374206265207468652073616d65206f6e65206c696e6b656420746f207468697320636f6e74726163742e", - "id": 4826, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3451:62:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_780df10fbff997ea44ac0e5a19d545f5b93f5fecb394d0587140440835163c1a", - "typeString": "literal_string \"Token contract must be the same one linked to this contract.\"" - }, - "value": "Token contract must be the same one linked to this contract." - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_780df10fbff997ea44ac0e5a19d545f5b93f5fecb394d0587140440835163c1a", - "typeString": "literal_string \"Token contract must be the same one linked to this contract.\"" - } - ], - "id": 4820, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "3411:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 4827, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3411:103:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4828, - "nodeType": "ExpressionStatement", - "src": "3411:103:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 4832, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 4830, - "name": "_value", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4813, - "src": "3532:6:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">=", - "rightExpression": { - "argumentTypes": null, - "id": 4831, - "name": "minimumStake", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4728, - "src": "3542:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "3532:22:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "546f6b656e7320616d6f756e74206d7573742062652067726561746572207468616e20746865206d696e696d756d207374616b65", - "id": 4833, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3556:54:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_5431b176fa244f3fcca50d47aa0924869a0112e06885dc76f73bf94c66a3be6c", - "typeString": "literal_string \"Tokens amount must be greater than the minimum stake\"" - }, - "value": "Tokens amount must be greater than the minimum stake" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_5431b176fa244f3fcca50d47aa0924869a0112e06885dc76f73bf94c66a3be6c", - "typeString": "literal_string \"Tokens amount must be greater than the minimum stake\"" - } - ], - "id": 4829, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "3524:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 4834, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3524:87:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4835, - "nodeType": "ExpressionStatement", - "src": "3524:87:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 4840, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 4837, - "name": "_extraData", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4817, - "src": "3629:10:11", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - "id": 4838, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "length", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "3629:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "hexValue": "3630", - "id": 4839, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3650:2:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_60_by_1", - "typeString": "int_const 60" - }, - "value": "60" - }, - "src": "3629:23:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "5374616b652064656c65676174696f6e2064617461206d7573742062652070726f76696465642e", - "id": 4841, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3654:41:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_751f2c5fc7e28e8229d9be777eaac69494071996529bb16514164774fa2358fa", - "typeString": "literal_string \"Stake delegation data must be provided.\"" - }, - "value": "Stake delegation data must be provided." - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_751f2c5fc7e28e8229d9be777eaac69494071996529bb16514164774fa2358fa", - "typeString": "literal_string \"Stake delegation data must be provided.\"" - } - ], - "id": 4836, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "3621:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 4842, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3621:75:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4843, - "nodeType": "ExpressionStatement", - "src": "3621:75:11" - }, - { - "assignments": [ - 4845 - ], - "declarations": [ - { - "constant": false, - "id": 4845, - "name": "beneficiary", - "nodeType": "VariableDeclaration", - "scope": 4920, - "src": "3707:22:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - "typeName": { - "id": 4844, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3707:15:11", - "stateMutability": "payable", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 4854, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "30", - "id": 4850, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3769:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - } - ], - "expression": { - "argumentTypes": null, - "id": 4848, - "name": "_extraData", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4817, - "src": "3748:10:11", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - "id": 4849, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "toAddress", - "nodeType": "MemberAccess", - "referencedDeclaration": 10557, - "src": "3748:20:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_address_$bound_to$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory,uint256) pure returns (address)" - } - }, - "id": 4851, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3748:23:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 4847, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "3740:7:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_uint160_$", - "typeString": "type(uint160)" - }, - "typeName": "uint160" - }, - "id": 4852, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3740:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint160", - "typeString": "uint160" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint160", - "typeString": "uint160" - } - ], - "id": 4846, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "3732:7:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": "address" - }, - "id": 4853, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3732:41:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "3707:66:11" - }, - { - "assignments": [ - 4856 - ], - "declarations": [ - { - "constant": false, - "id": 4856, - "name": "operator", - "nodeType": "VariableDeclaration", - "scope": 4920, - "src": "3783:16:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4855, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3783:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 4861, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "3230", - "id": 4859, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3823:2:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_20_by_1", - "typeString": "int_const 20" - }, - "value": "20" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_20_by_1", - "typeString": "int_const 20" - } - ], - "expression": { - "argumentTypes": null, - "id": 4857, - "name": "_extraData", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4817, - "src": "3802:10:11", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - "id": 4858, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "toAddress", - "nodeType": "MemberAccess", - "referencedDeclaration": 10557, - "src": "3802:20:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_address_$bound_to$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory,uint256) pure returns (address)" - } - }, - "id": 4860, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3802:24:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "3783:43:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 4870, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 4863, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "3844:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 4865, - "indexExpression": { - "argumentTypes": null, - "id": 4864, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4856, - "src": "3854:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "3844:19:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 4866, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "owner", - "nodeType": "MemberAccess", - "referencedDeclaration": 3318, - "src": "3844:25:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "30", - "id": 4868, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3881:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - } - ], - "id": 4867, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "3873:7:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": "address" - }, - "id": 4869, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3873:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "src": "3844:39:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4f70657261746f72206164647265737320697320616c726561647920696e207573652e", - "id": 4871, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3885:37:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_85928339e21f4125349480459e1a44d232e8eaef0e0741d1af24ef5e93f0c7d1", - "typeString": "literal_string \"Operator address is already in use.\"" - }, - "value": "Operator address is already in use." - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_85928339e21f4125349480459e1a44d232e8eaef0e0741d1af24ef5e93f0c7d1", - "typeString": "literal_string \"Operator address is already in use.\"" - } - ], - "id": 4862, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "3836:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 4872, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3836:87:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4873, - "nodeType": "ExpressionStatement", - "src": "3836:87:11" - }, - { - "assignments": [ - 4875 - ], - "declarations": [ - { - "constant": false, - "id": 4875, - "name": "authorizer", - "nodeType": "VariableDeclaration", - "scope": 4920, - "src": "3933:18:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4874, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3933:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 4880, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "3430", - "id": 4878, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "3975:2:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_40_by_1", - "typeString": "int_const 40" - }, - "value": "40" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_40_by_1", - "typeString": "int_const 40" - } - ], - "expression": { - "argumentTypes": null, - "id": 4876, - "name": "_extraData", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4817, - "src": "3954:10:11", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - "id": 4877, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "toAddress", - "nodeType": "MemberAccess", - "referencedDeclaration": 10557, - "src": "3954:20:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$_t_address_$bound_to$_t_bytes_memory_ptr_$", - "typeString": "function (bytes memory,uint256) pure returns (address)" - } - }, - "id": 4879, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "3954:24:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "3933:45:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4884, - "name": "_from", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4811, - "src": "4057:5:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4886, - "name": "this", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12848, - "src": "4072:4:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_contract$_TokenStaking_$5649", - "typeString": "contract TokenStaking" - } - ], - "id": 4885, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "4064:7:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": "address" - }, - "id": 4887, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "4064:13:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 4888, - "name": "_value", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4813, - "src": "4079:6:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 4881, - "name": "token", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3301, - "src": "4034:5:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "id": 4883, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "safeTransferFrom", - "nodeType": "MemberAccess", - "referencedDeclaration": 12510, - "src": "4034:22:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$12452_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$12452_$", - "typeString": "function (contract IERC20,address,address,uint256)" - } - }, - "id": 4889, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "4034:52:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4890, - "nodeType": "ExpressionStatement", - "src": "4034:52:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 4906, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 4891, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "4097:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 4893, - "indexExpression": { - "argumentTypes": null, - "id": 4892, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4856, - "src": "4107:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "nodeType": "IndexAccess", - "src": "4097:19:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4897, - "name": "_value", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4813, - "src": "4161:6:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 4898, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "4169:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 4899, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "4169:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "hexValue": "30", - "id": 4900, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "4183:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - } - ], - "expression": { - "argumentTypes": null, - "id": 4895, - "name": "OperatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 11234, - "src": "4141:14:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_OperatorParams_$11234_$", - "typeString": "type(library OperatorParams)" - } - }, - "id": 4896, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "pack", - "nodeType": "MemberAccess", - "referencedDeclaration": 11101, - "src": "4141:19:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$", - "typeString": "function (uint256,uint256,uint256) pure returns (uint256)" - } - }, - "id": 4901, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "4141:44:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 4902, - "name": "_from", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4811, - "src": "4199:5:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 4903, - "name": "beneficiary", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4845, - "src": "4218:6:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - { - "argumentTypes": null, - "id": 4904, - "name": "authorizer", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4875, - "src": "4238:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 4894, - "name": "Operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3323, - "src": "4119:8:11", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_struct$_Operator_$3323_storage_ptr_$", - "typeString": "type(struct StakeDelegatable.Operator storage pointer)" - } - }, - "id": 4905, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "structConstructorCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "4119:139:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_memory", - "typeString": "struct StakeDelegatable.Operator memory" - } - }, - "src": "4097:161:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 4907, - "nodeType": "ExpressionStatement", - "src": "4097:161:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4912, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4856, - "src": "4295:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 4908, - "name": "ownerOperators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3310, - "src": "4268:14:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_array$_t_address_$dyn_storage_$", - "typeString": "mapping(address => address[] storage ref)" - } - }, - "id": 4910, - "indexExpression": { - "argumentTypes": null, - "id": 4909, - "name": "_from", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4811, - "src": "4283:5:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "4268:21:11", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage", - "typeString": "address[] storage ref" - } - }, - "id": 4911, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "push", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "4268:26:11", - "typeDescriptions": { - "typeIdentifier": "t_function_arraypush_nonpayable$_t_address_$returns$_t_uint256_$", - "typeString": "function (address) returns (uint256)" - } - }, - "id": 4913, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "4268:36:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 4914, - "nodeType": "ExpressionStatement", - "src": "4268:36:11" - }, - { - "eventCall": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4916, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4856, - "src": "4327:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 4917, - "name": "_value", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4813, - "src": "4337:6:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 4915, - "name": "Staked", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4734, - "src": "4320:6:11", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", - "typeString": "function (address,uint256)" - } - }, - "id": 4918, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "4320:24:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4919, - "nodeType": "EmitStatement", - "src": "4315:29:11" - } - ] - }, - "documentation": "@notice Receives approval of token transfer and stakes the approved amount.\n@dev Makes sure provided token contract is the same one linked to this contract.\n@param _from The owner of the tokens who approved them to transfer.\n@param _value Approved amount for the transfer and stake.\n@param _token Token contract address.\n@param _extraData Data for stake delegation. This byte array must have the\nfollowing values concatenated: Beneficiary address (20 bytes) where the rewards for participation\nare sent, operator's (20 bytes) address, authorizer (20 bytes) address.", - "id": 4921, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "receiveApproval", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 4818, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 4811, - "name": "_from", - "nodeType": "VariableDeclaration", - "scope": 4921, - "src": "3322:13:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4810, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3322:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 4813, - "name": "_value", - "nodeType": "VariableDeclaration", - "scope": 4921, - "src": "3337:14:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 4812, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3337:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 4815, - "name": "_token", - "nodeType": "VariableDeclaration", - "scope": 4921, - "src": "3353:14:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4814, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3353:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 4817, - "name": "_extraData", - "nodeType": "VariableDeclaration", - "scope": 4921, - "src": "3369:23:11", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 4816, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "3369:5:11", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "3321:72:11" - }, - "returnParameters": { - "id": 4819, - "nodeType": "ParameterList", - "parameters": [], - "src": "3401:0:11" - }, - "scope": 5649, - "src": "3297:1054:11", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 4989, - "nodeType": "Block", - "src": "4719:629:11", - "statements": [ - { - "assignments": [ - 4927 - ], - "declarations": [ - { - "constant": false, - "id": 4927, - "name": "owner", - "nodeType": "VariableDeclaration", - "scope": 4989, - "src": "4729:13:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4926, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4729:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 4932, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 4928, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "4745:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 4930, - "indexExpression": { - "argumentTypes": null, - "id": 4929, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4923, - "src": "4755:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "4745:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 4931, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "owner", - "nodeType": "MemberAccess", - "referencedDeclaration": 3318, - "src": "4745:26:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "4729:42:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 4942, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 4937, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 4934, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "4802:3:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 4935, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "4802:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "id": 4936, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4923, - "src": "4816:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "4802:23:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "||", - "rightExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 4941, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 4938, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "4841:3:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 4939, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "4841:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "id": 4940, - "name": "owner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4927, - "src": "4855:5:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "4841:19:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "4802:58:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4f6e6c79206f70657261746f72206f7220746865206f776e6572206f6620746865207374616b652063616e2063616e63656c207468652064656c65676174696f6e2e", - "id": 4943, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "4862:68:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_105540b8212cb34e4b0c9764b4b79f9fd7924488528229e1817d57c69110fe7b", - "typeString": "literal_string \"Only operator or the owner of the stake can cancel the delegation.\"" - }, - "value": "Only operator or the owner of the stake can cancel the delegation." - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_105540b8212cb34e4b0c9764b4b79f9fd7924488528229e1817d57c69110fe7b", - "typeString": "literal_string \"Only operator or the owner of the stake can cancel the delegation.\"" - } - ], - "id": 4933, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "4781:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 4944, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "4781:159:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4945, - "nodeType": "ExpressionStatement", - "src": "4781:159:11" - }, - { - "assignments": [ - 4947 - ], - "declarations": [ - { - "constant": false, - "id": 4947, - "name": "operatorParams", - "nodeType": "VariableDeclaration", - "scope": 4989, - "src": "4950:22:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 4946, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "4950:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 4952, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 4948, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "4975:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 4950, - "indexExpression": { - "argumentTypes": null, - "id": 4949, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4923, - "src": "4985:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "4975:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 4951, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "4975:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "4950:58:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 4962, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 4954, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "5040:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 4955, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "5040:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "<=", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4960, - "name": "initializationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3303, - "src": "5094:20:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 4956, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4947, - "src": "5056:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 4957, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getCreationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11181, - "src": "5056:31:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 4958, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5056:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 4959, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "5056:37:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 4961, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5056:59:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "5040:75:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "496e697469616c697a6174696f6e20706572696f64206973206f766572", - "id": 4963, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "5129:31:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_d51ac8f9273ce58047cd31a453a45cc22d3bded30f8c0c05438c331c05fa1560", - "typeString": "literal_string \"Initialization period is over\"" - }, - "value": "Initialization period is over" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_d51ac8f9273ce58047cd31a453a45cc22d3bded30f8c0c05438c331c05fa1560", - "typeString": "literal_string \"Initialization period is over\"" - } - ], - "id": 4953, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "5019:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 4964, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5019:151:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4965, - "nodeType": "ExpressionStatement", - "src": "5019:151:11" - }, - { - "assignments": [ - 4967 - ], - "declarations": [ - { - "constant": false, - "id": 4967, - "name": "amount", - "nodeType": "VariableDeclaration", - "scope": 4989, - "src": "5181:14:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 4966, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "5181:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 4971, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 4968, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4947, - "src": "5198:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 4969, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11146, - "src": "5198:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 4970, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5198:26:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "5181:43:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 4980, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 4972, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "5234:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 4974, - "indexExpression": { - "argumentTypes": null, - "id": 4973, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4923, - "src": "5244:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "5234:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 4975, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "5234:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "30", - "id": 4978, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "5295:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - } - ], - "expression": { - "argumentTypes": null, - "id": 4976, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4947, - "src": "5270:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 4977, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "setAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11166, - "src": "5270:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 4979, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5270:27:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "5234:63:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 4981, - "nodeType": "ExpressionStatement", - "src": "5234:63:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4985, - "name": "owner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4927, - "src": "5327:5:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 4986, - "name": "amount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4967, - "src": "5334:6:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 4982, - "name": "token", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3301, - "src": "5308:5:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "id": 4984, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "safeTransfer", - "nodeType": "MemberAccess", - "referencedDeclaration": 12485, - "src": "5308:18:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$12452_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$12452_$", - "typeString": "function (contract IERC20,address,uint256)" - } - }, - "id": 4987, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5308:33:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 4988, - "nodeType": "ExpressionStatement", - "src": "5308:33:11" - } - ] - }, - "documentation": "@notice Cancels stake of tokens within the operator initialization period\nwithout being subjected to the token lockup for the undelegation period.\nThis can be used to undo mistaken delegation to the wrong operator address.\n@param _operator Address of the stake operator.", - "id": 4990, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "cancelStake", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 4924, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 4923, - "name": "_operator", - "nodeType": "VariableDeclaration", - "scope": 4990, - "src": "4693:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4922, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4693:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "4692:19:11" - }, - "returnParameters": { - "id": 4925, - "nodeType": "ParameterList", - "parameters": [], - "src": "4719:0:11" - }, - "scope": 5649, - "src": "4672:676:11", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5001, - "nodeType": "Block", - "src": "5643:54:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 4996, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4992, - "src": "5666:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 4997, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "5677:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 4998, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "5677:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 4995, - "name": "undelegateAt", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5103, - "src": "5653:12:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$", - "typeString": "function (address,uint256)" - } - }, - "id": 4999, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5653:37:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5000, - "nodeType": "ExpressionStatement", - "src": "5653:37:11" - } - ] - }, - "documentation": "@notice Undelegates staked tokens. You will be able to recover your stake by calling\n`recoverStake()` with operator address once undelegation period is over.\n@param _operator Address of the stake operator.", - "id": 5002, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "undelegate", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 4993, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 4992, - "name": "_operator", - "nodeType": "VariableDeclaration", - "scope": 5002, - "src": "5617:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 4991, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "5617:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "5616:19:11" - }, - "returnParameters": { - "id": 4994, - "nodeType": "ParameterList", - "parameters": [], - "src": "5643:0:11" - }, - "scope": 5649, - "src": "5597:100:11", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5102, - "nodeType": "Block", - "src": "6195:1360:11", - "statements": [ - { - "assignments": [ - 5010 - ], - "declarations": [ - { - "constant": false, - "id": 5010, - "name": "owner", - "nodeType": "VariableDeclaration", - "scope": 5102, - "src": "6205:13:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5009, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "6205:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5015, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5011, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "6221:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5013, - "indexExpression": { - "argumentTypes": null, - "id": 5012, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5004, - "src": "6231:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "6221:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5014, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "owner", - "nodeType": "MemberAccess", - "referencedDeclaration": 3318, - "src": "6221:26:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "6205:42:11" - }, - { - "assignments": [ - 5017 - ], - "declarations": [ - { - "constant": false, - "id": 5017, - "name": "sentByOwner", - "nodeType": "VariableDeclaration", - "scope": 5102, - "src": "6257:16:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 5016, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "6257:4:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5022, - "initialValue": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 5021, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5018, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "6276:3:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 5019, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "6276:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "id": 5020, - "name": "owner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5010, - "src": "6290:5:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "6276:19:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "6257:38:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 5029, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 5027, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5024, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "6326:3:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 5025, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "6326:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "id": 5026, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5004, - "src": "6340:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "6326:23:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "||", - "rightExpression": { - "argumentTypes": null, - "id": 5028, - "name": "sentByOwner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5017, - "src": "6365:11:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "6326:50:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4f6e6c79206f70657261746f72206f7220746865206f776e6572206f6620746865207374616b652063616e20756e64656c65676174652e", - "id": 5030, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6378:57:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_04d9b4a33339f2eb3ff69fb9434da8d221a651d43681880e8a08dfb0d733dc71", - "typeString": "literal_string \"Only operator or the owner of the stake can undelegate.\"" - }, - "value": "Only operator or the owner of the stake can undelegate." - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_04d9b4a33339f2eb3ff69fb9434da8d221a651d43681880e8a08dfb0d733dc71", - "typeString": "literal_string \"Only operator or the owner of the stake can undelegate.\"" - } - ], - "id": 5023, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "6305:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 5031, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6305:140:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5032, - "nodeType": "ExpressionStatement", - "src": "6305:140:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5037, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5034, - "name": "_undelegationBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5006, - "src": "6476:18:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">=", - "rightExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5035, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "6498:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 5036, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "6498:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "6476:34:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4d6179206e6f742073657420756e64656c65676174696f6e20626c6f636b20696e207468652070617374", - "id": 5038, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6524:44:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_e111163058b47053dd5c97af99047d23387e090db74e58811c6e918d24561957", - "typeString": "literal_string \"May not set undelegation block in the past\"" - }, - "value": "May not set undelegation block in the past" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_e111163058b47053dd5c97af99047d23387e090db74e58811c6e918d24561957", - "typeString": "literal_string \"May not set undelegation block in the past\"" - } - ], - "id": 5033, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "6455:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 5039, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6455:123:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5040, - "nodeType": "ExpressionStatement", - "src": "6455:123:11" - }, - { - "assignments": [ - 5042 - ], - "declarations": [ - { - "constant": false, - "id": 5042, - "name": "oldParams", - "nodeType": "VariableDeclaration", - "scope": 5102, - "src": "6588:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5041, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "6588:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5047, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5043, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "6608:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5045, - "indexExpression": { - "argumentTypes": null, - "id": 5044, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5004, - "src": "6618:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "6608:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5046, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "6608:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "6588:53:11" - }, - { - "assignments": [ - 5049 - ], - "declarations": [ - { - "constant": false, - "id": 5049, - "name": "existingCreationBlock", - "nodeType": "VariableDeclaration", - "scope": 5102, - "src": "6651:29:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5048, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "6651:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5053, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5050, - "name": "oldParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5042, - "src": "6683:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5051, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getCreationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11181, - "src": "6683:26:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5052, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6683:28:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "6651:60:11" - }, - { - "assignments": [ - 5055 - ], - "declarations": [ - { - "constant": false, - "id": 5055, - "name": "existingUndelegationBlock", - "nodeType": "VariableDeclaration", - "scope": 5102, - "src": "6721:33:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5054, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "6721:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5059, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5056, - "name": "oldParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5042, - "src": "6757:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5057, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getUndelegationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11213, - "src": "6757:30:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5058, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6757:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "6721:68:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5066, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5061, - "name": "_undelegationBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5006, - "src": "6820:18:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5064, - "name": "initializationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3303, - "src": "6867:20:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5062, - "name": "existingCreationBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5049, - "src": "6841:21:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5063, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "6841:25:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5065, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6841:47:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "6820:68:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "43616e6e6f7420756e64656c656761746520696e20696e697469616c697a6174696f6e20706572696f642c207573652063616e63656c5374616b6520696e7374656164", - "id": 5067, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6902:69:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_6f313c946ca09de66dbda57de6de1a41c65d978875fac41651f56df1a3e5717e", - "typeString": "literal_string \"Cannot undelegate in initialization period, use cancelStake instead\"" - }, - "value": "Cannot undelegate in initialization period, use cancelStake instead" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_6f313c946ca09de66dbda57de6de1a41c65d978875fac41651f56df1a3e5717e", - "typeString": "literal_string \"Cannot undelegate in initialization period, use cancelStake instead\"" - } - ], - "id": 5060, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "6799:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 5068, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6799:182:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5069, - "nodeType": "ExpressionStatement", - "src": "6799:182:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 5079, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 5077, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5073, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5071, - "name": "existingUndelegationBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5055, - "src": "7059:25:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 5072, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "7088:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "7059:30:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "||", - "rightExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5076, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5074, - "name": "existingUndelegationBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5055, - "src": "7168:25:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "id": 5075, - "name": "_undelegationBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5006, - "src": "7196:18:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "7168:46:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "7059:155:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "||", - "rightExpression": { - "argumentTypes": null, - "id": 5078, - "name": "sentByOwner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5017, - "src": "7264:11:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "7059:216:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4f6e6c7920746865206f776e6572206d617920706f7374706f6e652070726576696f75736c792073657420756e64656c65676174696f6e", - "id": 5080, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "7289:57:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_c1b24ca0926cc7dd4c8bef0d92771c005cdb59b00731cfdc5f8f16df63345ced", - "typeString": "literal_string \"Only the owner may postpone previously set undelegation\"" - }, - "value": "Only the owner may postpone previously set undelegation" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_c1b24ca0926cc7dd4c8bef0d92771c005cdb59b00731cfdc5f8f16df63345ced", - "typeString": "literal_string \"Only the owner may postpone previously set undelegation\"" - } - ], - "id": 5070, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "6991:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 5081, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6991:365:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5082, - "nodeType": "ExpressionStatement", - "src": "6991:365:11" - }, - { - "assignments": [ - 5084 - ], - "declarations": [ - { - "constant": false, - "id": 5084, - "name": "newParams", - "nodeType": "VariableDeclaration", - "scope": 5102, - "src": "7366:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5083, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "7366:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5089, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5087, - "name": "_undelegationBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5006, - "src": "7417:18:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5085, - "name": "oldParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5042, - "src": "7386:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5086, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "setUndelegationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11233, - "src": "7386:30:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5088, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "7386:50:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "7366:70:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 5095, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5090, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "7446:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5092, - "indexExpression": { - "argumentTypes": null, - "id": 5091, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5004, - "src": "7456:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "7446:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5093, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "7446:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "id": 5094, - "name": "newParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5084, - "src": "7482:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "7446:45:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5096, - "nodeType": "ExpressionStatement", - "src": "7446:45:11" - }, - { - "eventCall": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5098, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5004, - "src": "7518:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 5099, - "name": "_undelegationBlock", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5006, - "src": "7529:18:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 5097, - "name": "Undelegated", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4740, - "src": "7506:11:11", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", - "typeString": "function (address,uint256)" - } - }, - "id": 5100, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "7506:42:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5101, - "nodeType": "EmitStatement", - "src": "7501:47:11" - } - ] - }, - "documentation": "@notice Set an undelegation time for staked tokens.\nUndelegation will begin at the specified block.\nYou will be able to recover your stake by calling\n`recoverStake()` with operator address once undelegation period is over.\n@param _operator Address of the stake operator.\n@param _undelegationBlock The block undelegation is to start at.", - "id": 5103, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "undelegateAt", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5007, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5004, - "name": "_operator", - "nodeType": "VariableDeclaration", - "scope": 5103, - "src": "6128:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5003, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "6128:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5006, - "name": "_undelegationBlock", - "nodeType": "VariableDeclaration", - "scope": 5103, - "src": "6155:26:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5005, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "6155:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "6118:69:11" - }, - "returnParameters": { - "id": 5008, - "nodeType": "ParameterList", - "parameters": [], - "src": "6195:0:11" - }, - "scope": 5649, - "src": "6097:1458:11", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5164, - "nodeType": "Block", - "src": "7834:542:11", - "statements": [ - { - "assignments": [ - 5109 - ], - "declarations": [ - { - "constant": false, - "id": 5109, - "name": "operatorParams", - "nodeType": "VariableDeclaration", - "scope": 5164, - "src": "7844:22:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5108, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "7844:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5114, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5110, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "7869:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5112, - "indexExpression": { - "argumentTypes": null, - "id": 5111, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5105, - "src": "7879:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "7869:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5113, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "7869:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "7844:58:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5124, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5116, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "7933:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 5117, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "7933:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5122, - "name": "undelegationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3305, - "src": "7990:18:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5118, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5109, - "src": "7948:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5119, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getUndelegationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11213, - "src": "7948:35:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5120, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "7948:37:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5121, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "7948:41:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5123, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "7948:61:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "7933:76:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "43616e206e6f74207265636f766572207374616b65206265666f726520756e64656c65676174696f6e20706572696f64206973206f7665722e", - "id": 5125, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "8023:59:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_6df697a16f3241614ac4f21b12ff4528545357d1e03a8586ea7f613e3a5e493b", - "typeString": "literal_string \"Can not recover stake before undelegation period is over.\"" - }, - "value": "Can not recover stake before undelegation period is over." - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_6df697a16f3241614ac4f21b12ff4528545357d1e03a8586ea7f613e3a5e493b", - "typeString": "literal_string \"Can not recover stake before undelegation period is over.\"" - } - ], - "id": 5115, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "7912:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 5126, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "7912:180:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5127, - "nodeType": "ExpressionStatement", - "src": "7912:180:11" - }, - { - "assignments": [ - 5129 - ], - "declarations": [ - { - "constant": false, - "id": 5129, - "name": "owner", - "nodeType": "VariableDeclaration", - "scope": 5164, - "src": "8102:13:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5128, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "8102:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5134, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5130, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "8118:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5132, - "indexExpression": { - "argumentTypes": null, - "id": 5131, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5105, - "src": "8128:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "8118:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5133, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "owner", - "nodeType": "MemberAccess", - "referencedDeclaration": 3318, - "src": "8118:26:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "8102:42:11" - }, - { - "assignments": [ - 5136 - ], - "declarations": [ - { - "constant": false, - "id": 5136, - "name": "amount", - "nodeType": "VariableDeclaration", - "scope": 5164, - "src": "8154:14:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5135, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "8154:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5140, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5137, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5109, - "src": "8171:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5138, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11146, - "src": "8171:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5139, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8171:26:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "8154:43:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 5149, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5141, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "8208:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5143, - "indexExpression": { - "argumentTypes": null, - "id": 5142, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5105, - "src": "8218:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "8208:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5144, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "8208:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "30", - "id": 5147, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "8269:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - } - ], - "expression": { - "argumentTypes": null, - "id": 5145, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5109, - "src": "8244:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5146, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "setAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11166, - "src": "8244:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5148, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8244:27:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "8208:63:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5150, - "nodeType": "ExpressionStatement", - "src": "8208:63:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5154, - "name": "owner", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5129, - "src": "8301:5:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 5155, - "name": "amount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5136, - "src": "8308:6:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5151, - "name": "token", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3301, - "src": "8282:5:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "id": 5153, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "safeTransfer", - "nodeType": "MemberAccess", - "referencedDeclaration": 12485, - "src": "8282:18:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$12452_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$12452_$", - "typeString": "function (contract IERC20,address,uint256)" - } - }, - "id": 5156, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8282:33:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5157, - "nodeType": "ExpressionStatement", - "src": "8282:33:11" - }, - { - "eventCall": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5159, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5105, - "src": "8345:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5160, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "8356:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 5161, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "8356:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 5158, - "name": "RecoveredStake", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4746, - "src": "8330:14:11", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", - "typeString": "function (address,uint256)" - } - }, - "id": 5162, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8330:39:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5163, - "nodeType": "EmitStatement", - "src": "8325:44:11" - } - ] - }, - "documentation": "@notice Recovers staked tokens and transfers them back to the owner. Recovering\ntokens can only be performed when the operator is finished undelegating.\n@param _operator Operator address.", - "id": 5165, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "recoverStake", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5106, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5105, - "name": "_operator", - "nodeType": "VariableDeclaration", - "scope": 5165, - "src": "7808:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5104, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "7808:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "7807:19:11" - }, - "returnParameters": { - "id": 5107, - "nodeType": "ParameterList", - "parameters": [], - "src": "7834:0:11" - }, - "scope": 5649, - "src": "7786:590:11", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5183, - "nodeType": "Block", - "src": "8912:66:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5176, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "8929:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5178, - "indexExpression": { - "argumentTypes": null, - "id": 5177, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5167, - "src": "8939:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "8929:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5179, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "8929:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5180, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "unpack", - "nodeType": "MemberAccess", - "referencedDeclaration": 11131, - "src": "8929:40:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$_t_uint256_$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256,uint256,uint256)" - } - }, - "id": 5181, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8929:42:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_uint256_$", - "typeString": "tuple(uint256,uint256,uint256)" - } - }, - "functionReturnParameters": 5175, - "id": 5182, - "nodeType": "Return", - "src": "8922:49:11" - } - ] - }, - "documentation": "@dev Gets stake delegation info for the given operator.\n@param _operator Operator address.\n@return amount The amount of tokens the given operator delegated.\n@return createdAt The time when the stake has been delegated.\n@return undelegatedAt The time when undelegation has been requested.\nIf undelegation has not been requested, 0 is returned.", - "id": 5184, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "getDelegationInfo", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5168, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5167, - "name": "_operator", - "nodeType": "VariableDeclaration", - "scope": 5184, - "src": "8810:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5166, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "8810:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "8809:19:11" - }, - "returnParameters": { - "id": 5175, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5170, - "name": "amount", - "nodeType": "VariableDeclaration", - "scope": 5184, - "src": "8854:14:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5169, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "8854:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5172, - "name": "createdAt", - "nodeType": "VariableDeclaration", - "scope": 5184, - "src": "8870:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5171, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "8870:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5174, - "name": "undelegatedAt", - "nodeType": "VariableDeclaration", - "scope": 5184, - "src": "8889:21:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5173, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "8889:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "8853:58:11" - }, - "scope": 5649, - "src": "8783:195:11", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5312, - "nodeType": "Block", - "src": "9433:1126:11", - "statements": [ - { - "assignments": [ - 5197 - ], - "declarations": [ - { - "constant": false, - "id": 5197, - "name": "totalAmountToBurn", - "nodeType": "VariableDeclaration", - "scope": 5312, - "src": "9444:25:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5196, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "9444:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5199, - "initialValue": { - "argumentTypes": null, - "hexValue": "30", - "id": 5198, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "9472:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "nodeType": "VariableDeclarationStatement", - "src": "9444:29:11" - }, - { - "body": { - "id": 5304, - "nodeType": "Block", - "src": "9537:976:11", - "statements": [ - { - "assignments": [ - 5212 - ], - "declarations": [ - { - "constant": false, - "id": 5212, - "name": "operator", - "nodeType": "VariableDeclaration", - "scope": 5304, - "src": "9551:16:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5211, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "9551:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5216, - "initialValue": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5213, - "name": "misbehavedOperators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5189, - "src": "9570:19:11", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - } - }, - "id": 5215, - "indexExpression": { - "argumentTypes": null, - "id": 5214, - "name": "i", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5201, - "src": "9590:1:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "9570:22:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "9551:41:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5218, - "name": "authorizations", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4754, - "src": "9614:14:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$", - "typeString": "mapping(address => mapping(address => bool))" - } - }, - "id": 5221, - "indexExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5219, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "9629:3:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 5220, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "9629:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "9614:26:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", - "typeString": "mapping(address => bool)" - } - }, - "id": 5223, - "indexExpression": { - "argumentTypes": null, - "id": 5222, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5212, - "src": "9641:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "9614:36:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4e6f7420617574686f72697a6564", - "id": 5224, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "9652:16:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_fac3bac318c0d00994f57b0f2f4c643c313072b71db2302bf4b900309cc50b36", - "typeString": "literal_string \"Not authorized\"" - }, - "value": "Not authorized" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_fac3bac318c0d00994f57b0f2f4c643c313072b71db2302bf4b900309cc50b36", - "typeString": "literal_string \"Not authorized\"" - } - ], - "id": 5217, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "9606:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 5225, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9606:63:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5226, - "nodeType": "ExpressionStatement", - "src": "9606:63:11" - }, - { - "assignments": [ - 5228 - ], - "declarations": [ - { - "constant": false, - "id": 5228, - "name": "operatorParams", - "nodeType": "VariableDeclaration", - "scope": 5304, - "src": "9684:22:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5227, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "9684:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5233, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5229, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "9709:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5231, - "indexExpression": { - "argumentTypes": null, - "id": 5230, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5212, - "src": "9719:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "9709:19:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5232, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "9709:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "9684:57:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5243, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5235, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "9780:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 5236, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "9780:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5241, - "name": "initializationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3303, - "src": "9833:20:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5237, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5228, - "src": "9795:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5238, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getCreationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11181, - "src": "9795:31:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5239, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9795:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5240, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "9795:37:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5242, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9795:59:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "9780:74:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4f70657261746f72207374616b65206d75737420626520616374697665", - "id": 5244, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "9872:31:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_bf33512933a250e8918ce1359edeceb0f21a83f69e895857e329ea8b58fb0931", - "typeString": "literal_string \"Operator stake must be active\"" - }, - "value": "Operator stake must be active" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_bf33512933a250e8918ce1359edeceb0f21a83f69e895857e329ea8b58fb0931", - "typeString": "literal_string \"Operator stake must be active\"" - } - ], - "id": 5234, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "9755:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 5245, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9755:162:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5246, - "nodeType": "ExpressionStatement", - "src": "9755:162:11" - }, - { - "assignments": [ - 5248 - ], - "declarations": [ - { - "constant": false, - "id": 5248, - "name": "currentAmount", - "nodeType": "VariableDeclaration", - "scope": 5304, - "src": "9932:21:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5247, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "9932:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5252, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5249, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5228, - "src": "9956:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5250, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11146, - "src": "9956:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5251, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9956:26:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "9932:50:11" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5255, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5253, - "name": "currentAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5248, - "src": "10001:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "<", - "rightExpression": { - "argumentTypes": null, - "id": 5254, - "name": "amountToSlash", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5186, - "src": "10017:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "10001:29:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": { - "id": 5302, - "nodeType": "Block", - "src": "10255:248:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 5283, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 5278, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5197, - "src": "10273:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5281, - "name": "amountToSlash", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5186, - "src": "10315:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5279, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5197, - "src": "10293:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5280, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "10293:21:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5282, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10293:36:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "10273:56:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5284, - "nodeType": "ExpressionStatement", - "src": "10273:56:11" - }, - { - "assignments": [ - 5286 - ], - "declarations": [ - { - "constant": false, - "id": 5286, - "name": "newAmount", - "nodeType": "VariableDeclaration", - "scope": 5302, - "src": "10348:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5285, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "10348:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5291, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5289, - "name": "amountToSlash", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5186, - "src": "10386:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5287, - "name": "currentAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5248, - "src": "10368:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5288, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "10368:17:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5290, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10368:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "10348:52:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 5300, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5292, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "10418:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5294, - "indexExpression": { - "argumentTypes": null, - "id": 5293, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5212, - "src": "10428:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "10418:19:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5295, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "10418:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5298, - "name": "newAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5286, - "src": "10478:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5296, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5228, - "src": "10453:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5297, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "setAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11166, - "src": "10453:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5299, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10453:35:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "10418:70:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5301, - "nodeType": "ExpressionStatement", - "src": "10418:70:11" - } - ] - }, - "id": 5303, - "nodeType": "IfStatement", - "src": "9997:506:11", - "trueBody": { - "id": 5277, - "nodeType": "Block", - "src": "10032:217:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 5261, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 5256, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5197, - "src": "10050:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5259, - "name": "currentAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5248, - "src": "10092:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5257, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5197, - "src": "10070:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5258, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "10070:21:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5260, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10070:36:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "10050:56:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5262, - "nodeType": "ExpressionStatement", - "src": "10050:56:11" - }, - { - "assignments": [ - 5264 - ], - "declarations": [ - { - "constant": false, - "id": 5264, - "name": "newAmount", - "nodeType": "VariableDeclaration", - "scope": 5277, - "src": "10125:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5263, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "10125:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5266, - "initialValue": { - "argumentTypes": null, - "hexValue": "30", - "id": 5265, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "10145:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "nodeType": "VariableDeclarationStatement", - "src": "10125:21:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 5275, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5267, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "10164:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5269, - "indexExpression": { - "argumentTypes": null, - "id": 5268, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5212, - "src": "10174:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "10164:19:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5270, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "10164:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5273, - "name": "newAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5264, - "src": "10224:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5271, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5228, - "src": "10199:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5272, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "setAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11166, - "src": "10199:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5274, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10199:35:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "10164:70:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5276, - "nodeType": "ExpressionStatement", - "src": "10164:70:11" - } - ] - } - } - ] - }, - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5207, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5204, - "name": "i", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5201, - "src": "9500:1:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "<", - "rightExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5205, - "name": "misbehavedOperators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5189, - "src": "9504:19:11", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - } - }, - "id": 5206, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "length", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "9504:26:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "9500:30:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "id": 5305, - "initializationExpression": { - "assignments": [ - 5201 - ], - "declarations": [ - { - "constant": false, - "id": 5201, - "name": "i", - "nodeType": "VariableDeclaration", - "scope": 5305, - "src": "9488:6:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5200, - "name": "uint", - "nodeType": "ElementaryTypeName", - "src": "9488:4:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5203, - "initialValue": { - "argumentTypes": null, - "hexValue": "30", - "id": 5202, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "9497:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "nodeType": "VariableDeclarationStatement", - "src": "9488:10:11" - }, - "loopExpression": { - "expression": { - "argumentTypes": null, - "id": 5209, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "UnaryOperation", - "operator": "++", - "prefix": false, - "src": "9532:3:11", - "subExpression": { - "argumentTypes": null, - "id": 5208, - "name": "i", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5201, - "src": "9532:1:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5210, - "nodeType": "ExpressionStatement", - "src": "9532:3:11" - }, - "nodeType": "ForStatement", - "src": "9483:1030:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5309, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5197, - "src": "10534:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5306, - "name": "token", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3301, - "src": "10523:5:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "id": 5308, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "burn", - "nodeType": "MemberAccess", - "referencedDeclaration": 12369, - "src": "10523:10:11", - "typeDescriptions": { - "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$__$", - "typeString": "function (uint256) external" - } - }, - "id": 5310, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10523:29:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5311, - "nodeType": "ExpressionStatement", - "src": "10523:29:11" - } - ] - }, - "documentation": "@dev Slash provided token amount from every member in the misbehaved\noperators array and burn 100% of all the tokens.\n@param amountToSlash Token amount to slash from every misbehaved operator.\n@param misbehavedOperators Array of addresses to seize the tokens from.", - "id": 5313, - "implemented": true, - "kind": "function", - "modifiers": [ - { - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5192, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "9421:3:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 5193, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "9421:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - } - ], - "id": 5194, - "modifierName": { - "argumentTypes": null, - "id": 5191, - "name": "onlyApprovedOperatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4768, - "src": "9392:28:11", - "typeDescriptions": { - "typeIdentifier": "t_modifier$_t_address_$", - "typeString": "modifier (address)" - } - }, - "nodeType": "ModifierInvocation", - "src": "9392:40:11" - } - ], - "name": "slash", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5190, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5186, - "name": "amountToSlash", - "nodeType": "VariableDeclaration", - "scope": 5313, - "src": "9308:21:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5185, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "9308:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5189, - "name": "misbehavedOperators", - "nodeType": "VariableDeclaration", - "scope": 5313, - "src": "9331:36:11", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[]" - }, - "typeName": { - "baseType": { - "id": 5187, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "9331:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 5188, - "length": null, - "nodeType": "ArrayTypeName", - "src": "9331:9:11", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[]" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "9307:61:11" - }, - "returnParameters": { - "id": 5195, - "nodeType": "ParameterList", - "parameters": [], - "src": "9433:0:11" - }, - "scope": 5649, - "src": "9293:1266:11", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5466, - "nodeType": "Block", - "src": "11333:1299:11", - "statements": [ - { - "assignments": [ - 5330 - ], - "declarations": [ - { - "constant": false, - "id": 5330, - "name": "totalAmountToBurn", - "nodeType": "VariableDeclaration", - "scope": 5466, - "src": "11343:25:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5329, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "11343:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5332, - "initialValue": { - "argumentTypes": null, - "hexValue": "30", - "id": 5331, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "11371:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "nodeType": "VariableDeclarationStatement", - "src": "11343:29:11" - }, - { - "body": { - "id": 5437, - "nodeType": "Block", - "src": "11436:976:11", - "statements": [ - { - "assignments": [ - 5345 - ], - "declarations": [ - { - "constant": false, - "id": 5345, - "name": "operator", - "nodeType": "VariableDeclaration", - "scope": 5437, - "src": "11450:16:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5344, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "11450:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5349, - "initialValue": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5346, - "name": "misbehavedOperators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5322, - "src": "11469:19:11", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - } - }, - "id": 5348, - "indexExpression": { - "argumentTypes": null, - "id": 5347, - "name": "i", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5334, - "src": "11489:1:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "11469:22:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "11450:41:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5351, - "name": "authorizations", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4754, - "src": "11513:14:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$", - "typeString": "mapping(address => mapping(address => bool))" - } - }, - "id": 5354, - "indexExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5352, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "11528:3:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 5353, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "11528:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "11513:26:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", - "typeString": "mapping(address => bool)" - } - }, - "id": 5356, - "indexExpression": { - "argumentTypes": null, - "id": 5355, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5345, - "src": "11540:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "11513:36:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4e6f7420617574686f72697a6564", - "id": 5357, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "11551:16:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_fac3bac318c0d00994f57b0f2f4c643c313072b71db2302bf4b900309cc50b36", - "typeString": "literal_string \"Not authorized\"" - }, - "value": "Not authorized" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_fac3bac318c0d00994f57b0f2f4c643c313072b71db2302bf4b900309cc50b36", - "typeString": "literal_string \"Not authorized\"" - } - ], - "id": 5350, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "11505:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 5358, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11505:63:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5359, - "nodeType": "ExpressionStatement", - "src": "11505:63:11" - }, - { - "assignments": [ - 5361 - ], - "declarations": [ - { - "constant": false, - "id": 5361, - "name": "operatorParams", - "nodeType": "VariableDeclaration", - "scope": 5437, - "src": "11583:22:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5360, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "11583:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5366, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5362, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "11608:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5364, - "indexExpression": { - "argumentTypes": null, - "id": 5363, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5345, - "src": "11618:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "11608:19:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5365, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "11608:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "11583:57:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5376, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5368, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "11679:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 5369, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "11679:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5374, - "name": "initializationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3303, - "src": "11732:20:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5370, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5361, - "src": "11694:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5371, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getCreationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11181, - "src": "11694:31:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5372, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11694:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5373, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "11694:37:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5375, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11694:59:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "11679:74:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "argumentTypes": null, - "hexValue": "4f70657261746f72207374616b65206d75737420626520616374697665", - "id": 5377, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "11771:31:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_bf33512933a250e8918ce1359edeceb0f21a83f69e895857e329ea8b58fb0931", - "typeString": "literal_string \"Operator stake must be active\"" - }, - "value": "Operator stake must be active" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_bf33512933a250e8918ce1359edeceb0f21a83f69e895857e329ea8b58fb0931", - "typeString": "literal_string \"Operator stake must be active\"" - } - ], - "id": 5367, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - 12797, - 12798 - ], - "referencedDeclaration": 12798, - "src": "11654:7:11", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 5378, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11654:162:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5379, - "nodeType": "ExpressionStatement", - "src": "11654:162:11" - }, - { - "assignments": [ - 5381 - ], - "declarations": [ - { - "constant": false, - "id": 5381, - "name": "currentAmount", - "nodeType": "VariableDeclaration", - "scope": 5437, - "src": "11831:21:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5380, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "11831:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5385, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5382, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5361, - "src": "11855:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5383, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11146, - "src": "11855:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5384, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11855:26:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "11831:50:11" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5388, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5386, - "name": "currentAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5381, - "src": "11900:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "<", - "rightExpression": { - "argumentTypes": null, - "id": 5387, - "name": "amountToSeize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5315, - "src": "11916:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "11900:29:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": { - "id": 5435, - "nodeType": "Block", - "src": "12154:248:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 5416, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 5411, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5330, - "src": "12172:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5414, - "name": "amountToSeize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5315, - "src": "12214:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5412, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5330, - "src": "12192:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5413, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "12192:21:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5415, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12192:36:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "12172:56:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5417, - "nodeType": "ExpressionStatement", - "src": "12172:56:11" - }, - { - "assignments": [ - 5419 - ], - "declarations": [ - { - "constant": false, - "id": 5419, - "name": "newAmount", - "nodeType": "VariableDeclaration", - "scope": 5435, - "src": "12247:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5418, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "12247:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5424, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5422, - "name": "amountToSeize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5315, - "src": "12285:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5420, - "name": "currentAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5381, - "src": "12267:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5421, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "12267:17:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5423, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12267:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "12247:52:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 5433, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5425, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "12317:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5427, - "indexExpression": { - "argumentTypes": null, - "id": 5426, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5345, - "src": "12327:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "12317:19:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5428, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "12317:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5431, - "name": "newAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5419, - "src": "12377:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5429, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5361, - "src": "12352:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5430, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "setAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11166, - "src": "12352:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5432, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12352:35:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "12317:70:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5434, - "nodeType": "ExpressionStatement", - "src": "12317:70:11" - } - ] - }, - "id": 5436, - "nodeType": "IfStatement", - "src": "11896:506:11", - "trueBody": { - "id": 5410, - "nodeType": "Block", - "src": "11931:217:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 5394, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 5389, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5330, - "src": "11949:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5392, - "name": "currentAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5381, - "src": "11991:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5390, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5330, - "src": "11969:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5391, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "11969:21:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5393, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11969:36:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "11949:56:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5395, - "nodeType": "ExpressionStatement", - "src": "11949:56:11" - }, - { - "assignments": [ - 5397 - ], - "declarations": [ - { - "constant": false, - "id": 5397, - "name": "newAmount", - "nodeType": "VariableDeclaration", - "scope": 5410, - "src": "12024:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5396, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "12024:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5399, - "initialValue": { - "argumentTypes": null, - "hexValue": "30", - "id": 5398, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "12044:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "nodeType": "VariableDeclarationStatement", - "src": "12024:21:11" - }, - { - "expression": { - "argumentTypes": null, - "id": 5408, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5400, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "12063:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5402, - "indexExpression": { - "argumentTypes": null, - "id": 5401, - "name": "operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5345, - "src": "12073:8:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "12063:19:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5403, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "12063:32:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5406, - "name": "newAmount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5397, - "src": "12123:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5404, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5361, - "src": "12098:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5405, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "setAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11166, - "src": "12098:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5407, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12098:35:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "12063:70:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5409, - "nodeType": "ExpressionStatement", - "src": "12063:70:11" - } - ] - } - } - ] - }, - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5340, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5337, - "name": "i", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5334, - "src": "11399:1:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "<", - "rightExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5338, - "name": "misbehavedOperators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5322, - "src": "11403:19:11", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[] memory" - } - }, - "id": 5339, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "length", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "11403:26:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "11399:30:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "id": 5438, - "initializationExpression": { - "assignments": [ - 5334 - ], - "declarations": [ - { - "constant": false, - "id": 5334, - "name": "i", - "nodeType": "VariableDeclaration", - "scope": 5438, - "src": "11387:6:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5333, - "name": "uint", - "nodeType": "ElementaryTypeName", - "src": "11387:4:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5336, - "initialValue": { - "argumentTypes": null, - "hexValue": "30", - "id": 5335, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "11396:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "nodeType": "VariableDeclarationStatement", - "src": "11387:10:11" - }, - "loopExpression": { - "expression": { - "argumentTypes": null, - "id": 5342, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "UnaryOperation", - "operator": "++", - "prefix": false, - "src": "11431:3:11", - "subExpression": { - "argumentTypes": null, - "id": 5341, - "name": "i", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5334, - "src": "11431:1:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5343, - "nodeType": "ExpressionStatement", - "src": "11431:3:11" - }, - "nodeType": "ForStatement", - "src": "11382:1030:11" - }, - { - "assignments": [ - 5440 - ], - "declarations": [ - { - "constant": false, - "id": 5440, - "name": "tattletaleReward", - "nodeType": "VariableDeclaration", - "scope": 5466, - "src": "12422:24:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5439, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "12422:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5449, - "initialValue": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5447, - "name": "rewardMultiplier", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5317, - "src": "12488:16:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "components": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "hexValue": "35", - "id": 5443, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "12476:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_5_by_1", - "typeString": "int_const 5" - }, - "value": "5" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_rational_5_by_1", - "typeString": "int_const 5" - } - ], - "expression": { - "argumentTypes": null, - "id": 5441, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5330, - "src": "12450:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5442, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "percent", - "nodeType": "MemberAccess", - "referencedDeclaration": 11258, - "src": "12450:25:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5444, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12450:28:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "id": 5445, - "isConstant": false, - "isInlineArray": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "TupleExpression", - "src": "12449:30:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5446, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "percent", - "nodeType": "MemberAccess", - "referencedDeclaration": 11258, - "src": "12449:38:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5448, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12449:56:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "12422:83:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5453, - "name": "tattletale", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5319, - "src": "12535:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 5454, - "name": "tattletaleReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5440, - "src": "12547:16:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5450, - "name": "token", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3301, - "src": "12516:5:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "id": 5452, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "safeTransfer", - "nodeType": "MemberAccess", - "referencedDeclaration": 12485, - "src": "12516:18:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$12452_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$12452_$", - "typeString": "function (contract IERC20,address,uint256)" - } - }, - "id": 5455, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12516:48:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5456, - "nodeType": "ExpressionStatement", - "src": "12516:48:11" - }, - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5462, - "name": "tattletaleReward", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5440, - "src": "12607:16:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5460, - "name": "totalAmountToBurn", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5330, - "src": "12585:17:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5461, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sub", - "nodeType": "MemberAccess", - "referencedDeclaration": 11800, - "src": "12585:21:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5463, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12585:39:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5457, - "name": "token", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3301, - "src": "12574:5:11", - "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Burnable_$12383", - "typeString": "contract ERC20Burnable" - } - }, - "id": 5459, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "burn", - "nodeType": "MemberAccess", - "referencedDeclaration": 12369, - "src": "12574:10:11", - "typeDescriptions": { - "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$__$", - "typeString": "function (uint256) external" - } - }, - "id": 5464, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12574:51:11", - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 5465, - "nodeType": "ExpressionStatement", - "src": "12574:51:11" - } - ] - }, - "documentation": "@dev Seize provided token amount from every member in the misbehaved\noperators array. The tattletale is rewarded with 5% of the total seized\namount scaled by the reward adjustment parameter and the rest 95% is burned.\n@param amountToSeize Token amount to seize from every misbehaved operator.\n@param rewardMultiplier Reward adjustment in percentage. Min 1% and 100% max.\n@param tattletale Address to receive the 5% reward.\n@param misbehavedOperators Array of addresses to seize the tokens from.", - "id": 5467, - "implemented": true, - "kind": "function", - "modifiers": [ - { - "arguments": [ - { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5325, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12794, - "src": "11321:3:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 5326, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "11321:10:11", - "typeDescriptions": { - "typeIdentifier": "t_address_payable", - "typeString": "address payable" - } - } - ], - "id": 5327, - "modifierName": { - "argumentTypes": null, - "id": 5324, - "name": "onlyApprovedOperatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4768, - "src": "11292:28:11", - "typeDescriptions": { - "typeIdentifier": "t_modifier$_t_address_$", - "typeString": "modifier (address)" - } - }, - "nodeType": "ModifierInvocation", - "src": "11292:40:11" - } - ], - "name": "seize", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5323, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5315, - "name": "amountToSeize", - "nodeType": "VariableDeclaration", - "scope": 5467, - "src": "11149:21:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5314, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "11149:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5317, - "name": "rewardMultiplier", - "nodeType": "VariableDeclaration", - "scope": 5467, - "src": "11180:24:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5316, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "11180:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5319, - "name": "tattletale", - "nodeType": "VariableDeclaration", - "scope": 5467, - "src": "11214:18:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5318, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "11214:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5322, - "name": "misbehavedOperators", - "nodeType": "VariableDeclaration", - "scope": 5467, - "src": "11242:36:11", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[]" - }, - "typeName": { - "baseType": { - "id": 5320, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "11242:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 5321, - "length": null, - "nodeType": "ArrayTypeName", - "src": "11242:9:11", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[]" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "11139:145:11" - }, - "returnParameters": { - "id": 5328, - "nodeType": "ParameterList", - "parameters": [], - "src": "11333:0:11" - }, - "scope": 5649, - "src": "11125:1507:11", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5488, - "nodeType": "Block", - "src": "13117:68:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 5486, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5480, - "name": "authorizations", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4754, - "src": "13127:14:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$", - "typeString": "mapping(address => mapping(address => bool))" - } - }, - "id": 5483, - "indexExpression": { - "argumentTypes": null, - "id": 5481, - "name": "_operatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5471, - "src": "13142:17:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "13127:33:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", - "typeString": "mapping(address => bool)" - } - }, - "id": 5484, - "indexExpression": { - "argumentTypes": null, - "id": 5482, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5469, - "src": "13161:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "nodeType": "IndexAccess", - "src": "13127:44:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "hexValue": "74727565", - "id": 5485, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "bool", - "lValueRequested": false, - "nodeType": "Literal", - "src": "13174:4:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "value": "true" - }, - "src": "13127:51:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "id": 5487, - "nodeType": "ExpressionStatement", - "src": "13127:51:11" - } - ] - }, - "documentation": "@dev Authorizes operator contract to access staked token balance of\nthe provided operator. Can only be executed by stake operator authorizer.\n@param _operator address of stake operator.\n@param _operatorContract address of operator contract.", - "id": 5489, - "implemented": true, - "kind": "function", - "modifiers": [ - { - "arguments": [ - { - "argumentTypes": null, - "id": 5474, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5469, - "src": "13050:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "id": 5475, - "modifierName": { - "argumentTypes": null, - "id": 5473, - "name": "onlyOperatorAuthorizer", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3340, - "src": "13027:22:11", - "typeDescriptions": { - "typeIdentifier": "t_modifier$_t_address_$", - "typeString": "modifier (address)" - } - }, - "nodeType": "ModifierInvocation", - "src": "13027:33:11" - }, - { - "arguments": [ - { - "argumentTypes": null, - "id": 5477, - "name": "_operatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5471, - "src": "13098:17:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "id": 5478, - "modifierName": { - "argumentTypes": null, - "id": 5476, - "name": "onlyApprovedOperatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4768, - "src": "13069:28:11", - "typeDescriptions": { - "typeIdentifier": "t_modifier$_t_address_$", - "typeString": "modifier (address)" - } - }, - "nodeType": "ModifierInvocation", - "src": "13069:47:11" - } - ], - "name": "authorizeOperatorContract", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5472, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5469, - "name": "_operator", - "nodeType": "VariableDeclaration", - "scope": 5489, - "src": "12958:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5468, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "12958:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5471, - "name": "_operatorContract", - "nodeType": "VariableDeclaration", - "scope": 5489, - "src": "12977:25:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5470, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "12977:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "12957:46:11" - }, - "returnParameters": { - "id": 5479, - "nodeType": "ParameterList", - "parameters": [], - "src": "13117:0:11" - }, - "scope": 5649, - "src": "12923:262:11", - "stateMutability": "nonpayable", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5504, - "nodeType": "Block", - "src": "13538:68:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5498, - "name": "authorizations", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4754, - "src": "13555:14:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$", - "typeString": "mapping(address => mapping(address => bool))" - } - }, - "id": 5500, - "indexExpression": { - "argumentTypes": null, - "id": 5499, - "name": "_operatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5493, - "src": "13570:17:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "13555:33:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", - "typeString": "mapping(address => bool)" - } - }, - "id": 5502, - "indexExpression": { - "argumentTypes": null, - "id": 5501, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5491, - "src": "13589:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "13555:44:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "functionReturnParameters": 5497, - "id": 5503, - "nodeType": "Return", - "src": "13548:51:11" - } - ] - }, - "documentation": "@dev Checks if operator contract has access to the staked token balance of\nthe provided operator.\n@param _operator address of stake operator.\n@param _operatorContract address of operator contract.", - "id": 5505, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "isAuthorizedForOperator", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5494, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5491, - "name": "_operator", - "nodeType": "VariableDeclaration", - "scope": 5505, - "src": "13465:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5490, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "13465:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5493, - "name": "_operatorContract", - "nodeType": "VariableDeclaration", - "scope": 5505, - "src": "13484:25:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5492, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "13484:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "13464:46:11" - }, - "returnParameters": { - "id": 5497, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5496, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 5505, - "src": "13532:4:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 5495, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "13532:4:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "13531:6:11" - }, - "scope": 5649, - "src": "13432:174:11", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5578, - "nodeType": "Block", - "src": "14343:778:11", - "statements": [ - { - "assignments": [ - 5515 - ], - "declarations": [ - { - "constant": false, - "id": 5515, - "name": "isAuthorized", - "nodeType": "VariableDeclaration", - "scope": 5578, - "src": "14353:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 5514, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "14353:4:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5521, - "initialValue": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5516, - "name": "authorizations", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4754, - "src": "14373:14:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$", - "typeString": "mapping(address => mapping(address => bool))" - } - }, - "id": 5518, - "indexExpression": { - "argumentTypes": null, - "id": 5517, - "name": "_operatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5509, - "src": "14388:17:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "14373:33:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", - "typeString": "mapping(address => bool)" - } - }, - "id": 5520, - "indexExpression": { - "argumentTypes": null, - "id": 5519, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5507, - "src": "14407:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "14373:44:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "14353:64:11" - }, - { - "assignments": [ - 5523 - ], - "declarations": [ - { - "constant": false, - "id": 5523, - "name": "operatorParams", - "nodeType": "VariableDeclaration", - "scope": 5578, - "src": "14428:22:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5522, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "14428:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5528, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5524, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "14453:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5526, - "indexExpression": { - "argumentTypes": null, - "id": 5525, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5507, - "src": "14463:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "14453:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5527, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "14453:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "14428:58:11" - }, - { - "assignments": [ - 5530 - ], - "declarations": [ - { - "constant": false, - "id": 5530, - "name": "createdAt", - "nodeType": "VariableDeclaration", - "scope": 5578, - "src": "14496:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5529, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "14496:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5534, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5531, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5523, - "src": "14516:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5532, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getCreationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11181, - "src": "14516:31:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5533, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14516:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "14496:53:11" - }, - { - "assignments": [ - 5536 - ], - "declarations": [ - { - "constant": false, - "id": 5536, - "name": "undelegatedAt", - "nodeType": "VariableDeclaration", - "scope": 5578, - "src": "14559:21:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5535, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "14559:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5540, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5537, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5523, - "src": "14583:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5538, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getUndelegationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11213, - "src": "14583:35:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5539, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14583:37:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "14559:61:11" - }, - { - "assignments": [ - 5542 - ], - "declarations": [ - { - "constant": false, - "id": 5542, - "name": "isActive", - "nodeType": "VariableDeclaration", - "scope": 5578, - "src": "14631:13:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 5541, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "14631:4:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5550, - "initialValue": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5549, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5543, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "14647:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 5544, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "14647:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5547, - "name": "initializationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3303, - "src": "14676:20:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5545, - "name": "createdAt", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5530, - "src": "14662:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5546, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "14662:13:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5548, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14662:35:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "14647:50:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "14631:66:11" - }, - { - "assignments": [ - 5552 - ], - "declarations": [ - { - "constant": false, - "id": 5552, - "name": "isUndelegating", - "nodeType": "VariableDeclaration", - "scope": 5578, - "src": "14918:19:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 5551, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "14918:4:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5563, - "initialValue": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 5562, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "components": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5555, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5553, - "name": "undelegatedAt", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5536, - "src": "14941:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "!=", - "rightExpression": { - "argumentTypes": null, - "hexValue": "30", - "id": 5554, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "14958:1:11", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "14941:18:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - } - ], - "id": 5556, - "isConstant": false, - "isInlineArray": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "TupleExpression", - "src": "14940:20:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "&&", - "rightExpression": { - "argumentTypes": null, - "components": [ - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5560, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5557, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "14965:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 5558, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "14965:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "id": 5559, - "name": "undelegatedAt", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5536, - "src": "14980:13:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "14965:28:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - } - ], - "id": 5561, - "isConstant": false, - "isInlineArray": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "TupleExpression", - "src": "14964:30:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "14940:54:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "14918:76:11" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 5569, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 5566, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5564, - "name": "isAuthorized", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5515, - "src": "15009:12:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "&&", - "rightExpression": { - "argumentTypes": null, - "id": 5565, - "name": "isActive", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5542, - "src": "15025:8:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "15009:24:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "&&", - "rightExpression": { - "argumentTypes": null, - "id": 5568, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "UnaryOperation", - "operator": "!", - "prefix": true, - "src": "15037:15:11", - "subExpression": { - "argumentTypes": null, - "id": 5567, - "name": "isUndelegating", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5552, - "src": "15038:14:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "15009:43:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 5577, - "nodeType": "IfStatement", - "src": "15005:110:11", - "trueBody": { - "id": 5576, - "nodeType": "Block", - "src": "15054:61:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 5574, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 5570, - "name": "balance", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5512, - "src": "15068:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5571, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5523, - "src": "15078:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5572, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11146, - "src": "15078:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5573, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15078:26:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "15068:36:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5575, - "nodeType": "ExpressionStatement", - "src": "15068:36:11" - } - ] - } - } - ] - }, - "documentation": "@dev Gets the eligible stake balance of the specified address.\nAn eligible stake is a stake that passed the initialization period\nand is not currently undelegating. Also, the operator had to approve\nthe specified operator contract.\n * Operator with a minimum required amount of eligible stake can join the\nnetwork and participate in new work selection.\n * @param _operator address of stake operator.\n@param _operatorContract address of operator contract.\n@return an uint256 representing the eligible stake balance.", - "id": 5579, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "eligibleStake", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5510, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5507, - "name": "_operator", - "nodeType": "VariableDeclaration", - "scope": 5579, - "src": "14246:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5506, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "14246:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5509, - "name": "_operatorContract", - "nodeType": "VariableDeclaration", - "scope": 5579, - "src": "14273:25:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5508, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "14273:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "14236:68:11" - }, - "returnParameters": { - "id": 5513, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5512, - "name": "balance", - "nodeType": "VariableDeclaration", - "scope": 5579, - "src": "14326:15:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5511, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "14326:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "14325:17:11" - }, - "scope": 5649, - "src": "14214:907:11", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5630, - "nodeType": "Block", - "src": "16016:391:11", - "statements": [ - { - "assignments": [ - 5589 - ], - "declarations": [ - { - "constant": false, - "id": 5589, - "name": "isAuthorized", - "nodeType": "VariableDeclaration", - "scope": 5630, - "src": "16026:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 5588, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "16026:4:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5595, - "initialValue": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5590, - "name": "authorizations", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4754, - "src": "16046:14:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$", - "typeString": "mapping(address => mapping(address => bool))" - } - }, - "id": 5592, - "indexExpression": { - "argumentTypes": null, - "id": 5591, - "name": "_operatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5583, - "src": "16061:17:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "16046:33:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", - "typeString": "mapping(address => bool)" - } - }, - "id": 5594, - "indexExpression": { - "argumentTypes": null, - "id": 5593, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5581, - "src": "16080:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "16046:44:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "16026:64:11" - }, - { - "assignments": [ - 5597 - ], - "declarations": [ - { - "constant": false, - "id": 5597, - "name": "operatorParams", - "nodeType": "VariableDeclaration", - "scope": 5630, - "src": "16101:22:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5596, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "16101:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5602, - "initialValue": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "baseExpression": { - "argumentTypes": null, - "id": 5598, - "name": "operators", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3314, - "src": "16126:9:11", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Operator_$3323_storage_$", - "typeString": "mapping(address => struct StakeDelegatable.Operator storage ref)" - } - }, - "id": 5600, - "indexExpression": { - "argumentTypes": null, - "id": 5599, - "name": "_operator", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5581, - "src": "16136:9:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "16126:20:11", - "typeDescriptions": { - "typeIdentifier": "t_struct$_Operator_$3323_storage", - "typeString": "struct StakeDelegatable.Operator storage ref" - } - }, - "id": 5601, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "packedParams", - "nodeType": "MemberAccess", - "referencedDeclaration": 3316, - "src": "16126:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "16101:58:11" - }, - { - "assignments": [ - 5604 - ], - "declarations": [ - { - "constant": false, - "id": 5604, - "name": "createdAt", - "nodeType": "VariableDeclaration", - "scope": 5630, - "src": "16169:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5603, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "16169:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5608, - "initialValue": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5605, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5597, - "src": "16189:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5606, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getCreationBlock", - "nodeType": "MemberAccess", - "referencedDeclaration": 11181, - "src": "16189:31:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5607, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16189:33:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "16169:53:11" - }, - { - "assignments": [ - 5610 - ], - "declarations": [ - { - "constant": false, - "id": 5610, - "name": "isActive", - "nodeType": "VariableDeclaration", - "scope": 5630, - "src": "16233:13:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 5609, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "16233:4:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 5618, - "initialValue": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5617, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "expression": { - "argumentTypes": null, - "id": 5611, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 12784, - "src": "16249:5:11", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 5612, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "number", - "nodeType": "MemberAccess", - "referencedDeclaration": null, - "src": "16249:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5615, - "name": "initializationPeriod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 3303, - "src": "16278:20:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "argumentTypes": null, - "id": 5613, - "name": "createdAt", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5604, - "src": "16264:9:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5614, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "add", - "nodeType": "MemberAccess", - "referencedDeclaration": 11784, - "src": "16264:13:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256,uint256) pure returns (uint256)" - } - }, - "id": 5616, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16264:35:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "16249:50:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "16233:66:11" - }, - { - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 5621, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 5619, - "name": "isAuthorized", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5589, - "src": "16314:12:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "&&", - "rightExpression": { - "argumentTypes": null, - "id": 5620, - "name": "isActive", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5610, - "src": "16330:8:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "16314:24:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseBody": null, - "id": 5629, - "nodeType": "IfStatement", - "src": "16310:91:11", - "trueBody": { - "id": 5628, - "nodeType": "Block", - "src": "16340:61:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "id": 5626, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "argumentTypes": null, - "id": 5622, - "name": "balance", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5586, - "src": "16354:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "argumentTypes": null, - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "argumentTypes": null, - "id": 5623, - "name": "operatorParams", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5597, - "src": "16364:14:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5624, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getAmount", - "nodeType": "MemberAccess", - "referencedDeclaration": 11146, - "src": "16364:24:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", - "typeString": "function (uint256) pure returns (uint256)" - } - }, - "id": 5625, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16364:26:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "16354:36:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 5627, - "nodeType": "ExpressionStatement", - "src": "16354:36:11" - } - ] - } - } - ] - }, - "documentation": "@dev Gets the active stake balance of the specified address.\nAn active stake is a stake that passed the initialization period.\nAlso, the operator had to approve the specified operator contract.\n * The difference between eligible stake is that active stake does not make\nthe operator eligible for work selection but it may be still finishing\nearlier work during undelegation period. Operator with a minimum required\namount of active stake can join the network but cannot be selected to any\nnew work.\n * @param _operator address of stake operator.\n@param _operatorContract address of operator contract.\n@return an uint256 representing the eligible stake balance.", - "id": 5631, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "activeStake", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5584, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5581, - "name": "_operator", - "nodeType": "VariableDeclaration", - "scope": 5631, - "src": "15919:17:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5580, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "15919:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5583, - "name": "_operatorContract", - "nodeType": "VariableDeclaration", - "scope": 5631, - "src": "15946:25:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5582, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "15946:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "15909:68:11" - }, - "returnParameters": { - "id": 5587, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5586, - "name": "balance", - "nodeType": "VariableDeclaration", - "scope": 5631, - "src": "15999:15:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 5585, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "15999:7:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "15998:17:11" - }, - "scope": 5649, - "src": "15889:518:11", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - }, - { - "body": { - "id": 5647, - "nodeType": "Block", - "src": "17162:77:11", - "statements": [ - { - "expression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 5645, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 5641, - "name": "staker", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5633, - "src": "17191:6:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "argumentTypes": null, - "id": 5642, - "name": "operatorContract", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5635, - "src": "17199:16:11", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 5640, - "name": "activeStake", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 5631, - "src": "17179:11:11", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_uint256_$", - "typeString": "function (address,address) view returns (uint256)" - } - }, - "id": 5643, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17179:37:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">=", - "rightExpression": { - "argumentTypes": null, - "id": 5644, - "name": "minimumStake", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 4728, - "src": "17220:12:11", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "17179:53:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "functionReturnParameters": 5639, - "id": 5646, - "nodeType": "Return", - "src": "17172:60:11" - } - ] - }, - "documentation": "@dev Checks if the specified account has enough active stake to become\nnetwork operator and that the specified operator contract has been\nauthorized for potential slashing.\n * Having the required minimum of active stake makes the operator eligible\nto join the network. If the active stake is not currently undelegating,\noperator is also eligible for work selection.\n * @param staker Staker's address\n@param operatorContract Operator contract's address\n@return True if has enough active stake to participate in the network,\nfalse otherwise.", - "id": 5648, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "hasMinimumStake", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 5636, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5633, - "name": "staker", - "nodeType": "VariableDeclaration", - "scope": 5648, - "src": "17081:14:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5632, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "17081:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 5635, - "name": "operatorContract", - "nodeType": "VariableDeclaration", - "scope": 5648, - "src": "17105:24:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 5634, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "17105:7:11", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "17071:64:11" - }, - "returnParameters": { - "id": 5639, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 5638, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 5648, - "src": "17156:4:11", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 5637, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "17156:4:11", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "17155:6:11" - }, - "scope": 5649, - "src": "17047:192:11", - "stateMutability": "view", - "superFunction": null, - "visibility": "public" - } - ], - "scope": 5650, - "src": "477:16764:11" - } - ], - "src": "0:17242:11" - }, - "compiler": { - "name": "solc", - "version": "0.5.14+commit.01f1aaa4.Emscripten.clang" - }, - "networks": { - "3": { - "events": { - "0x564f402e70218efee257fcbf84954e2e95e3ecc52cebe7b06c79955463752d5a": { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "recoveredAt", - "type": "uint256" - } - ], - "name": "RecoveredStake", - "type": "event" - }, - "0x9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d": { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Staked", - "type": "event" - }, - "0x4ae68879209bc4b489a38251122202a3653305e3d95a27baf7a5681410c90b38": { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "undelegatedAt", - "type": "uint256" - } - ], - "name": "Undelegated", - "type": "event" - } - }, - "links": {}, - "address": "0x585A83EdA3d29e030C49A51B46B653FEcd9c5919", - "transactionHash": "0x14f497d115f4c933d06d4e92159e483ee8c34c35dc7d0477cdccdb930c54a008" - } - }, - "schemaVersion": "3.0.23", - "updatedAt": "2020-03-20T18:49:58.162Z", - "networkType": "ethereum", - "devdoc": { - "details": "A token staking contract for a specified standard ERC20Burnable token. A holder of the specified token can stake delegate its tokens to this contract and recover the stake after undelegation period is over.", - "methods": { - "activeStake(address,address)": { - "details": "Gets the active stake balance of the specified address. An active stake is a stake that passed the initialization period. Also, the operator had to approve the specified operator contract. * The difference between eligible stake is that active stake does not make the operator eligible for work selection but it may be still finishing earlier work during undelegation period. Operator with a minimum required amount of active stake can join the network but cannot be selected to any new work.", - "params": { - "_operator": "address of stake operator.", - "_operatorContract": "address of operator contract." - }, - "return": "an uint256 representing the eligible stake balance." - }, - "authorizeOperatorContract(address,address)": { - "details": "Authorizes operator contract to access staked token balance of the provided operator. Can only be executed by stake operator authorizer.", - "params": { - "_operator": "address of stake operator.", - "_operatorContract": "address of operator contract." - } - }, - "authorizerOf(address)": { - "details": "Gets the authorizer for the specified operator address.", - "return": "Authorizer address." - }, - "balanceOf(address)": { - "details": "Gets the stake balance of the specified address.", - "params": { - "_address": "The address to query the balance of." - }, - "return": "An uint256 representing the amount staked by the passed address." - }, - "cancelStake(address)": { - "params": { - "_operator": "Address of the stake operator." - } - }, - "constructor": { - "details": "Creates a token staking contract for a provided Standard ERC20Burnable token.", - "params": { - "_initializationPeriod": "To avoid certain attacks on work selection, recently created operators must wait for a specific period of time before being eligible for work selection.", - "_registry": "Address of a keep registry that will be linked to this contract.", - "_tokenAddress": "Address of a token that will be linked to this contract.", - "_undelegationPeriod": "The staking contract guarantees that an undelegated operator’s stakes will stay locked for a number of blocks after undelegation, and thus available as collateral for any work the operator is engaged in." - } - }, - "eligibleStake(address,address)": { - "details": "Gets the eligible stake balance of the specified address. An eligible stake is a stake that passed the initialization period and is not currently undelegating. Also, the operator had to approve the specified operator contract. * Operator with a minimum required amount of eligible stake can join the network and participate in new work selection.", - "params": { - "_operator": "address of stake operator.", - "_operatorContract": "address of operator contract." - }, - "return": "an uint256 representing the eligible stake balance." - }, - "getDelegationInfo(address)": { - "details": "Gets stake delegation info for the given operator.", - "params": { - "_operator": "Operator address." - }, - "return": "amount The amount of tokens the given operator delegated.createdAt The time when the stake has been delegated.undelegatedAt The time when undelegation has been requested. If undelegation has not been requested, 0 is returned." - }, - "hasMinimumStake(address,address)": { - "details": "Checks if the specified account has enough active stake to become network operator and that the specified operator contract has been authorized for potential slashing. * Having the required minimum of active stake makes the operator eligible to join the network. If the active stake is not currently undelegating, operator is also eligible for work selection.", - "params": { - "operatorContract": "Operator contract's address", - "staker": "Staker's address" - }, - "return": "True if has enough active stake to participate in the network, false otherwise." - }, - "isAuthorizedForOperator(address,address)": { - "details": "Checks if operator contract has access to the staked token balance of the provided operator.", - "params": { - "_operator": "address of stake operator.", - "_operatorContract": "address of operator contract." - } - }, - "beneficiaryOf(address)": { - "details": "Gets the beneficiary for the specified operator address.", - "return": "Beneficiary address." - }, - "operatorsOf(address)": { - "details": "Gets the list of operators of the specified address.", - "return": "An array of addresses." - }, - "ownerOf(address)": { - "details": "Gets the stake owner for the specified operator address.", - "return": "Stake owner address." - }, - "receiveApproval(address,uint256,address,bytes)": { - "details": "Makes sure provided token contract is the same one linked to this contract.", - "params": { - "_extraData": "Data for stake delegation. This byte array must have the following values concatenated: Beneficiary address (20 bytes) where the rewards for participation are sent, operator's (20 bytes) address, authorizer (20 bytes) address.", - "_from": "The owner of the tokens who approved them to transfer.", - "_token": "Token contract address.", - "_value": "Approved amount for the transfer and stake." - } - }, - "recoverStake(address)": { - "params": { - "_operator": "Operator address." - } - }, - "seize(uint256,uint256,address,address[])": { - "details": "Seize provided token amount from every member in the misbehaved operators array. The tattletale is rewarded with 5% of the total seized amount scaled by the reward adjustment parameter and the rest 95% is burned.", - "params": { - "amountToSeize": "Token amount to seize from every misbehaved operator.", - "misbehavedOperators": "Array of addresses to seize the tokens from.", - "rewardMultiplier": "Reward adjustment in percentage. Min 1% and 100% max.", - "tattletale": "Address to receive the 5% reward." - } - }, - "slash(uint256,address[])": { - "details": "Slash provided token amount from every member in the misbehaved operators array and burn 100% of all the tokens.", - "params": { - "amountToSlash": "Token amount to slash from every misbehaved operator.", - "misbehavedOperators": "Array of addresses to seize the tokens from." - } - }, - "undelegate(address)": { - "params": { - "_operator": "Address of the stake operator." - } - }, - "undelegateAt(address,uint256)": { - "params": { - "_operator": "Address of the stake operator.", - "_undelegationBlock": "The block undelegation is to start at." - } - } - }, - "title": "TokenStaking" - }, - "userdoc": { - "methods": { - "cancelStake(address)": { - "notice": "Cancels stake of tokens within the operator initialization period without being subjected to the token lockup for the undelegation period. This can be used to undo mistaken delegation to the wrong operator address." - }, - "receiveApproval(address,uint256,address,bytes)": { - "notice": "Receives approval of token transfer and stakes the approved amount." - }, - "recoverStake(address)": { - "notice": "Recovers staked tokens and transfers them back to the owner. Recovering tokens can only be performed when the operator is finished undelegating." - }, - "undelegate(address)": { - "notice": "Undelegates staked tokens. You will be able to recover your stake by calling `recoverStake()` with operator address once undelegation period is over." - }, - "undelegateAt(address,uint256)": { - "notice": "Set an undelegation time for staked tokens. Undelegation will begin at the specified block. You will be able to recover your stake by calling `recoverStake()` with operator address once undelegation period is over." - } - } - } -} diff --git a/infrastructure/eth-networks/keep-test/ropsten/changelog.adoc b/infrastructure/eth-networks/keep-test/ropsten/changelog.adoc deleted file mode 100644 index 4d0df171b8..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/changelog.adoc +++ /dev/null @@ -1,164 +0,0 @@ -= Keep Private Testnet Changelog - -Summary of Keep private testnet releases in reverse chronological order. - -== 2020-03-13 - -=== NEW FEATURES - -- We're proud to annouce the Keep token dashboard! Find at at `http://dashboard.test.keep.network` - The token dashboard allows you to manage your KEEP grants, staking, authorizations, and - operations. We'll be shipping a separate guide over the coming weeks. To use the dashboard all - you need to do is load your issued keep-client Ethereum account into metamask. - -== 2020-02-18 - -=== BUGFIXES - -- keep-clients can now recover from an underlying Ethreum node connection loss - -=== OTHERS - -- Implemented slashing scheme per Yellowpaper -- Adjusted rewards and reimbursements -- Continued gas cost optimization -- Increase active time for commitment and points validation phases of GJKR -- Remove idle states and wait delays from state machines -- Validate if a peer is allowed to participate in threshold signature -- libp2p transport layer encryption -- Eliminate the possibility of accepting late retransmission -- libp2p buffers adjustments - improve message delivery rate -- Improve libp2p broadcast channel message delivery pipeline - -== 2020-01-22 - -Happy New Year!! - -=== BUGFIXES - -- Group selection occasionally fails on Infura: We now account for Infura's load balancing pattern. -- Group selection is not triggered again after a failure: Resloved a condition where we would end up with zero groups on-chain. -- Undelegation failure: Resolved occasional function not found error in the staking dapp. - -=== OTHERS - -- Reentrancy protection: Retransmitter refinements and libp2p buffers adjustments to improve message delivery rates. -- Adjust gas price for Ropsten: Price adjust as compared to local environments. -- Signing group member as a relay entry timeout tattletale: Added group signers as tattletales by default. This should help reduce penalties and allow for additional beacon self-healing. - -== 2019-12-13 - -=== BUGFIXES - -- Relay submission: Ensure a valid relay request can only be submitted once. -- Timings: Corrected message unmarshallers being registered too late. -- Cost smoothing: Reduced relay entry verification gas cost peaks. -- DKG: Corrected failing DKG because of invalid detection of identical messages in network time cache. - -=== OTHERS - -- Simplified stake delegation: Operator's signature is no longer required. -- Migrated to Ropsten! - -== 2019-10-31 - -=== OTHERS - -- Block times optimization: Distributed group key generation and relay entry signing are two times - faster now. -- Relay entry timeout: Improved validation to do not accept relay entries after the deadline. -- Improved validation: In the candidate group member ticket submission to reject duplicate tickets. -- Beacon pricing: Experimental implementation of the pricing mechanism for the beacon. - -== 2019-10-15 - -=== BUGFIXES - -- on-chain BLS verification spuriously failing: In some cases our off-chain calculations for BLS - verification were not matching the on-chain counterpart. This happened when calculated values were - shorter than 32 bytes in length. The on-chain implementation was properly padding these cases, our - off-chain implementation was not. We've added padding to the off-chain piece so that we have a - proper match in these cases. - -== 2019-09-27 - -=== NEW FEATURES - -- Configurable `AnnouncedAddresses`: If you start a keep-client in a private network it's likely -that the IP address announced to the Keep Network is not accessible from the outside world. Now in -your `keep-client-confg.toml` file you can override the default annouced address by providing known -list of IP addresses or DNS hostnames in section `[LibP2P]` with key `AnnoucedAddresses`. -`AnnouncedAddresses` has been added to configuration files included with deployment bundles. See the -quickstart guide on formatting for `AnnoucedAddresses` entries. Leaving the configuration as-is -will result in setting the default announce address. - -=== OTHERS - -- Removed LibP2P NAT support: We've opted for configurable announced addresses instead of leaning on -LibP2P built-ins whose success can vary widely depending on network conditions. - -== 2019-09-09 - -=== BUGFIXES - -- Incorrect group threshold when signing relay entry: As part of a group there is an honest and -dishonest threshold for participants to produce a relay entry. Our current group size is set to -5. At a group size of 5 we need a minimum of 3 honest and max of 2 dishonest participants. We -have been calculating the threshold at 4, resulting in more stringent than desired threshold -requirements. Additionally, we corrected GJKR polynomial generation by setting the dishonest -threshold as the degree, instead of honest threshold. - -== 2019-09-06 - -=== NEW FEATURES -- Allow for LibP2P NAT support: This takes shape in the form of a new configuration option in your -`keep-client-confg.toml` file. If enabled this feature will attempt to connect with -auto-discovered network firewall using UPnP, open a port, and configure the mapping internally. -To enable this feature set `NAT = true` under section `[LibP2P]` in your `keep-client-confg.toml`. - -=== OTHERS -- Added enhanced logging around group statistics and network connection details. - -== 2019-08-22 - -=== NEW FEATURES -- Timeout for a relay entry: If the group selected to produce a new random number does not deliver -relay entry on time, we terminate that group and another one is selected to do the work. - -- Allow re-trigger genesis when the first group creation failed: We should be able to trigger -genesis once again if the first group creation failed. This is to avoid a situation that something -went wrong during the DKG and we are dead in the water with our contracts. - -=== BUGFIXES -- Non-uniform distribution of group selection results: Fixed bug in group selection protocol; not -all groups registered on the chain had the same chance of being selected in the case when we were -marking some groups as expired. We fixed this problem and now all groups have the same chance of -being selected. - -- Broadcast channel initialisation problems: When running Keep nodes and sending a request for a -new relay entry, occasionally we received the error coming from the chain saying “Total number of -groups must be greater than zero”. This was caused by bug in DKG protocol in broadcast channel -initialisation and happened when we had a network glitch for a while. This is addressed now. - -- Incorrect seed for group selection and Pedersen commitment: The group selection protocol should -take the previous beacon value along with staker-specific values to create a ticket. The buggy -implementation passed the seed instead of the previous beacon value to group selection. This could -threat the trapdoor of Pedersen commitment we use in DKG. - -=== OTHERS -- Upgrade to the newest OpenZeppelin version. - -- Covered all known corner cases DKG protocol with integration tests for member inactivity and fixed -all minor issues found. - -== 2019-07-16 -- Extended the deployment bundle and `docker run` command to include persistence. The addition of -persistence allows a restarted keep-client to recover group status/state. - -- Added more robust logging (now with Timestamps!). - -== 2019-07-10 -- Updated Docker image restores `relay request` command to the keep-client. - -- Updated config file for new contract references. - diff --git a/infrastructure/eth-networks/keep-test/ropsten/participants/bisontrails/config/eth-account-keyfile b/infrastructure/eth-networks/keep-test/ropsten/participants/bisontrails/config/eth-account-keyfile deleted file mode 100644 index d23a022d39..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/participants/bisontrails/config/eth-account-keyfile +++ /dev/null @@ -1 +0,0 @@ -{"address":"1833a1a046db585d9c405ad93bfce085d43b2b04","crypto":{"cipher":"aes-128-ctr","ciphertext":"25ef456ef1bd7b09108ccfffadb7575afb9a2ef46a14d262684402538d5144e1","cipherparams":{"iv":"ad3e034589829fd695d9b9cbe17bd64c"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"2a8ca0c5998d89c1442df8bcea7df5d92c058361f79a61cfa2c6ab63175c1f9b"},"mac":"10f9ab3d69edcdef7a37389b652f16012fc9c7c64a962e3ca5a5208637e1ea08"},"id":"9690a973-d1d2-495c-8801-7b1d11852ac9","version":3} \ No newline at end of file diff --git a/infrastructure/eth-networks/keep-test/ropsten/participants/bisontrails/config/keep-client-config.toml b/infrastructure/eth-networks/keep-test/ropsten/participants/bisontrails/config/keep-client-config.toml deleted file mode 100644 index 9419ff9d37..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/participants/bisontrails/config/keep-client-config.toml +++ /dev/null @@ -1,33 +0,0 @@ -[ethereum] - URL = "wss://ropsten.infura.io/ws/v3/59fb36a36fa4474b890c13dd30038be5" - URLRPC = "https://ropsten.infura.io/v3/59fb36a36fa4474b890c13dd30038be5" - - [ethereum.account] - Address = "0x1833a1a046db585d9c405ad93bfce085d43b2b04" - KeyFile = "/mnt/keep-client/config/eth-account-keyfile" - - # Contracts are already deployed to Ropsten. They are subject to change on deployment. - [ethereum.ContractAddresses] - # Hex-encoded address of KeepRandomBeaconOperator contract - KeepRandomBeaconOperator = "0x8d804f0c36d2c3A40EE128B7a01fe5269D511206" - # TokenStaking - TokenStaking = "0x585A83EdA3d29e030C49A51B46B653FEcd9c5919" - # Hex-encoded address of KeepRandomBeaconService contract. Only needed - # in cases where the client's utility functions will be used (e.g., the - # relay subcommand). - KeepRandomBeaconService = "0x17c43Fb5035b89a51b3481f7Dd11a987E7A8720d" - -# Testnet bootstrap peers hosted by the folks at Keep. -[LibP2P] - Peers = ["/dns4/bootstrap-0.test.keep.network/tcp/3919/ipfs/16Uiu2HAmCcfVpHwfBKNFbQuhvGuFXHVLQ65gB4sJm7HyrcZuLttH", "/dns4/bootstrap-1.test.keep.network/tcp/3919/ipfs/16Uiu2HAm3eJtyFKAttzJ85NLMromHuRg4yyum3CREMf6CHBBV6KY", "/dns4/bootstrap-2.test.keep.network/tcp/3919/ipfs/16Uiu2HAmNNuCp45z5bgB8KiTHv1vHTNAVbBgxxtTFGAndageo9Dp", "/dns4/bootstrap-3.test.keep.network/tcp/3919/ipfs/16Uiu2HAm8KJX32kr3eYUhDuzwTucSfAfspnjnXNf9veVhB12t6Vf", "/dns4/bootstrap-4.test.keep.network/tcp/3919/ipfs/16Uiu2HAkxRTeySEWZfW9C83GPFpQUXvrygmZryCN6DL4piZrbAv4"] - Port = 3919 - # AnnouncedAddresses: - # Leaving AnnouncedAddresses empty will set a default address to be - # announced to the network. The default address will vary by deploy - # conditions. Set AnnouncedAddresses if you have known external IPs - # or DNS entries you want to route traffic through. - AnnouncedAddresses = [] - -# In the real world this directory should be on persistent storage. -[Storage] - DataDir = "/mnt/keep-client/persistence" diff --git a/infrastructure/eth-networks/keep-test/ropsten/participants/blockdaemon/config/eth-account-keyfile b/infrastructure/eth-networks/keep-test/ropsten/participants/blockdaemon/config/eth-account-keyfile deleted file mode 100644 index 39646c5395..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/participants/blockdaemon/config/eth-account-keyfile +++ /dev/null @@ -1 +0,0 @@ -{"address":"b4f78caa0ad8c8c700eaac42b68e5db4f9efeddf","crypto":{"cipher":"aes-128-ctr","ciphertext":"daba4b93fbd829d0c5e0115463c6310dc1eacbad77407f54694df3a12b684751","cipherparams":{"iv":"94be82c26eff92d3a1cd53fec5dc21fe"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"21896f83ed8369706e1216e928ad4c171840f17285bfafdc0ab00b50d8a3ca0d"},"mac":"9fbc39657825c4ee09175fb6a20ec9edea6441ed7e48830b406d3e8057cb1556"},"id":"0e24af20-349c-4ecf-9414-a4a0dc30a460","version":3} \ No newline at end of file diff --git a/infrastructure/eth-networks/keep-test/ropsten/participants/blockdaemon/config/keep-client-config.toml b/infrastructure/eth-networks/keep-test/ropsten/participants/blockdaemon/config/keep-client-config.toml deleted file mode 100644 index 3513a8f9da..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/participants/blockdaemon/config/keep-client-config.toml +++ /dev/null @@ -1,33 +0,0 @@ -[ethereum] - URL = "wss://ropsten.infura.io/ws/v3/59fb36a36fa4474b890c13dd30038be5" - URLRPC = "https://ropsten.infura.io/v3/59fb36a36fa4474b890c13dd30038be5" - - [ethereum.account] - Address = "0xb4f78caa0ad8c8c700eaac42b68e5db4f9efeddf" - KeyFile = "/mnt/keep-client/config/eth-account-keyfile" - - # Contracts are already deployed to Ropsten. They are subject to change on deployment. - [ethereum.ContractAddresses] - # Hex-encoded address of KeepRandomBeaconOperator contract - KeepRandomBeaconOperator = "0x8d804f0c36d2c3A40EE128B7a01fe5269D511206" - # TokenStaking - TokenStaking = "0x585A83EdA3d29e030C49A51B46B653FEcd9c5919" - # Hex-encoded address of KeepRandomBeaconService contract. Only needed - # in cases where the client's utility functions will be used (e.g., the - # relay subcommand). - KeepRandomBeaconService = "0x17c43Fb5035b89a51b3481f7Dd11a987E7A8720d" - -# Testnet bootstrap peers hosted by the folks at Keep. -[LibP2P] - Peers = ["/dns4/bootstrap-0.test.keep.network/tcp/3919/ipfs/16Uiu2HAmCcfVpHwfBKNFbQuhvGuFXHVLQ65gB4sJm7HyrcZuLttH", "/dns4/bootstrap-1.test.keep.network/tcp/3919/ipfs/16Uiu2HAm3eJtyFKAttzJ85NLMromHuRg4yyum3CREMf6CHBBV6KY", "/dns4/bootstrap-2.test.keep.network/tcp/3919/ipfs/16Uiu2HAmNNuCp45z5bgB8KiTHv1vHTNAVbBgxxtTFGAndageo9Dp", "/dns4/bootstrap-3.test.keep.network/tcp/3919/ipfs/16Uiu2HAm8KJX32kr3eYUhDuzwTucSfAfspnjnXNf9veVhB12t6Vf", "/dns4/bootstrap-4.test.keep.network/tcp/3919/ipfs/16Uiu2HAkxRTeySEWZfW9C83GPFpQUXvrygmZryCN6DL4piZrbAv4"] - Port = 3919 - # AnnouncedAddresses: - # Leaving AnnouncedAddresses empty will set a default address to be - # announced to the network. The default address will vary by deploy - # conditions. Set AnnouncedAddresses if you have known external IPs - # or DNS entries you want to route traffic through. - AnnouncedAddresses = [] - -# In the real world this directory should be on persistent storage. -[Storage] - DataDir = "/mnt/keep-client/persistence" diff --git a/infrastructure/eth-networks/keep-test/ropsten/participants/figment/config/eth-account-keyfile b/infrastructure/eth-networks/keep-test/ropsten/participants/figment/config/eth-account-keyfile deleted file mode 100644 index e60aea22af..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/participants/figment/config/eth-account-keyfile +++ /dev/null @@ -1 +0,0 @@ -{"address":"9f778b5d9b6e598e5a9dfb789500f6cf20e3203e","crypto":{"cipher":"aes-128-ctr","ciphertext":"df33027271d8d026abfff03565d4a6ae5df8fb41bf845911bb7c7fe3f5848b4a","cipherparams":{"iv":"596a609761e6c5333d085e6022c2cb5b"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"aa6f5fb5e1149771f34a4687d8d9107215e662379b8a68f038280c9a02cf6834"},"mac":"f76cfee11c9257e2e85cb4421f705db2826e1d346218ec8756462fa5de97040b"},"id":"cafdc3a6-7f9c-4264-a15f-95c788faa55e","version":3} \ No newline at end of file diff --git a/infrastructure/eth-networks/keep-test/ropsten/participants/figment/config/keep-client-config.toml b/infrastructure/eth-networks/keep-test/ropsten/participants/figment/config/keep-client-config.toml deleted file mode 100644 index 0cb31b3a0f..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/participants/figment/config/keep-client-config.toml +++ /dev/null @@ -1,33 +0,0 @@ -[ethereum] - URL = "wss://ropsten.infura.io/ws/v3/59fb36a36fa4474b890c13dd30038be5" - URLRPC = "https://ropsten.infura.io/v3/59fb36a36fa4474b890c13dd30038be5" - - [ethereum.account] - Address = "0x9f778b5d9b6e598e5a9dfb789500f6cf20e3203e" - KeyFile = "/mnt/keep-client/config/eth-account-keyfile" - - # Contracts are already deployed to Ropsten. They are subject to change on deployment. - [ethereum.ContractAddresses] - # Hex-encoded address of KeepRandomBeaconOperator contract - KeepRandomBeaconOperator = "0x8d804f0c36d2c3A40EE128B7a01fe5269D511206" - # TokenStaking - TokenStaking = "0x585A83EdA3d29e030C49A51B46B653FEcd9c5919" - # Hex-encoded address of KeepRandomBeaconService contract. Only needed - # in cases where the client's utility functions will be used (e.g., the - # relay subcommand). - KeepRandomBeaconService = "0x17c43Fb5035b89a51b3481f7Dd11a987E7A8720d" - -# Testnet bootstrap peers hosted by the folks at Keep. -[LibP2P] - Peers = ["/dns4/bootstrap-0.test.keep.network/tcp/3919/ipfs/16Uiu2HAmCcfVpHwfBKNFbQuhvGuFXHVLQ65gB4sJm7HyrcZuLttH", "/dns4/bootstrap-1.test.keep.network/tcp/3919/ipfs/16Uiu2HAm3eJtyFKAttzJ85NLMromHuRg4yyum3CREMf6CHBBV6KY", "/dns4/bootstrap-2.test.keep.network/tcp/3919/ipfs/16Uiu2HAmNNuCp45z5bgB8KiTHv1vHTNAVbBgxxtTFGAndageo9Dp", "/dns4/bootstrap-3.test.keep.network/tcp/3919/ipfs/16Uiu2HAm8KJX32kr3eYUhDuzwTucSfAfspnjnXNf9veVhB12t6Vf", "/dns4/bootstrap-4.test.keep.network/tcp/3919/ipfs/16Uiu2HAkxRTeySEWZfW9C83GPFpQUXvrygmZryCN6DL4piZrbAv4"] - Port = 3919 - # AnnouncedAddresses: - # Leaving AnnouncedAddresses empty will set a default address to be - # announced to the network. The default address will vary by deploy - # conditions. Set AnnouncedAddresses if you have known external IPs - # or DNS entries you want to route traffic through. - AnnouncedAddresses = [] - -# In the real world this directory should be on persistent storage. -[Storage] - DataDir = "/mnt/keep-client/persistence" diff --git a/infrastructure/eth-networks/keep-test/ropsten/participants/maker/config/eth-account-keyfile b/infrastructure/eth-networks/keep-test/ropsten/participants/maker/config/eth-account-keyfile deleted file mode 100644 index ef017bba6b..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/participants/maker/config/eth-account-keyfile +++ /dev/null @@ -1 +0,0 @@ -{"address":"c2f4c01a446f199fce344df1167c92650651f9c0","crypto":{"cipher":"aes-128-ctr","ciphertext":"025399728da2b368be0a936e0a7eedacb20ad757212457fd252024bd72bd88a6","cipherparams":{"iv":"3272a169578ca974b0b2cf31fd2f9e3a"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"32d31450e0d6e2ef067bd45dc6c44d0b220cc001947bf48818651fe3b09efa0d"},"mac":"873ec45bb6e37137793ccf418b894dfbfa526405ee3208a5f114e4bb08070208"},"id":"335fdfd0-c3e5-497a-98b7-51ad2f32b6e0","version":3} \ No newline at end of file diff --git a/infrastructure/eth-networks/keep-test/ropsten/participants/maker/config/keep-client-config.toml b/infrastructure/eth-networks/keep-test/ropsten/participants/maker/config/keep-client-config.toml deleted file mode 100644 index 12e8aae146..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/participants/maker/config/keep-client-config.toml +++ /dev/null @@ -1,33 +0,0 @@ -[ethereum] - URL = "wss://ropsten.infura.io/ws/v3/59fb36a36fa4474b890c13dd30038be5" - URLRPC = "https://ropsten.infura.io/v3/59fb36a36fa4474b890c13dd30038be5" - - [ethereum.account] - Address = "0xc2f4c01a446f199fce344df1167c92650651f9c0" - KeyFile = "/mnt/keep-client/config/eth-account-keyfile" - - # Contracts are already deployed to Ropsten. They are subject to change on deployment. - [ethereum.ContractAddresses] - # Hex-encoded address of KeepRandomBeaconOperator contract - KeepRandomBeaconOperator = "0x8d804f0c36d2c3A40EE128B7a01fe5269D511206" - # TokenStaking - TokenStaking = "0x585A83EdA3d29e030C49A51B46B653FEcd9c5919" - # Hex-encoded address of KeepRandomBeaconService contract. Only needed - # in cases where the client's utility functions will be used (e.g., the - # relay subcommand). - KeepRandomBeaconService = "0x17c43Fb5035b89a51b3481f7Dd11a987E7A8720d" - -# Testnet bootstrap peers hosted by the folks at Keep. -[LibP2P] - Peers = ["/dns4/bootstrap-0.test.keep.network/tcp/3919/ipfs/16Uiu2HAmCcfVpHwfBKNFbQuhvGuFXHVLQ65gB4sJm7HyrcZuLttH", "/dns4/bootstrap-1.test.keep.network/tcp/3919/ipfs/16Uiu2HAm3eJtyFKAttzJ85NLMromHuRg4yyum3CREMf6CHBBV6KY", "/dns4/bootstrap-2.test.keep.network/tcp/3919/ipfs/16Uiu2HAmNNuCp45z5bgB8KiTHv1vHTNAVbBgxxtTFGAndageo9Dp", "/dns4/bootstrap-3.test.keep.network/tcp/3919/ipfs/16Uiu2HAm8KJX32kr3eYUhDuzwTucSfAfspnjnXNf9veVhB12t6Vf", "/dns4/bootstrap-4.test.keep.network/tcp/3919/ipfs/16Uiu2HAkxRTeySEWZfW9C83GPFpQUXvrygmZryCN6DL4piZrbAv4"] - Port = 3919 - # AnnouncedAddresses: - # Leaving AnnouncedAddresses empty will set a default address to be - # announced to the network. The default address will vary by deploy - # conditions. Set AnnouncedAddresses if you have known external IPs - # or DNS entries you want to route traffic through. - AnnouncedAddresses = [] - -# In the real world this directory should be on persistent storage. -[Storage] - DataDir = "/mnt/keep-client/persistence" diff --git a/infrastructure/eth-networks/keep-test/ropsten/participants/raghav/config/eth-account-keyfile b/infrastructure/eth-networks/keep-test/ropsten/participants/raghav/config/eth-account-keyfile deleted file mode 100644 index 27ab1bd7f8..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/participants/raghav/config/eth-account-keyfile +++ /dev/null @@ -1 +0,0 @@ -{"address":"32ce883e94ea3a75063e47064c777839aa4a0c94","crypto":{"cipher":"aes-128-ctr","ciphertext":"8272a25785adfb200d7b9f950ddfca1eed4d97fd4dd42c69e7e63ece13587ce5","cipherparams":{"iv":"c260cefb09dda77c6d856a86e6bc83bc"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"db7c70a400905c0a9ba62796366cc03385e74634eba11d05933086a9b054ad43"},"mac":"52bcf7d4e1c6211633d9050d2f3e2f59ce3535fec939d6a1ae62b54cffd17098"},"id":"b49df88c-c0bd-4052-913b-4db737aba6a6","version":3} \ No newline at end of file diff --git a/infrastructure/eth-networks/keep-test/ropsten/participants/raghav/config/keep-client-config.toml b/infrastructure/eth-networks/keep-test/ropsten/participants/raghav/config/keep-client-config.toml deleted file mode 100644 index c98d38fd2f..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/participants/raghav/config/keep-client-config.toml +++ /dev/null @@ -1,33 +0,0 @@ -[ethereum] - URL = "wss://ropsten.infura.io/ws/v3/59fb36a36fa4474b890c13dd30038be5" - URLRPC = "https://ropsten.infura.io/v3/59fb36a36fa4474b890c13dd30038be5" - - [ethereum.account] - Address = "0x32ce883e94ea3a75063e47064c777839aa4a0c94" - KeyFile = "/mnt/keep-client/config/eth-account-keyfile" - - # Contracts are already deployed to Ropsten. They are subject to change on deployment. - [ethereum.ContractAddresses] - # Hex-encoded address of KeepRandomBeaconOperator contract - KeepRandomBeaconOperator = "0x8d804f0c36d2c3A40EE128B7a01fe5269D511206" - # TokenStaking - TokenStaking = "0x585A83EdA3d29e030C49A51B46B653FEcd9c5919" - # Hex-encoded address of KeepRandomBeaconService contract. Only needed - # in cases where the client's utility functions will be used (e.g., the - # relay subcommand). - KeepRandomBeaconService = "0x17c43Fb5035b89a51b3481f7Dd11a987E7A8720d" - -# Testnet bootstrap peers hosted by the folks at Keep. -[LibP2P] - Peers = ["/dns4/bootstrap-0.test.keep.network/tcp/3919/ipfs/16Uiu2HAmCcfVpHwfBKNFbQuhvGuFXHVLQ65gB4sJm7HyrcZuLttH", "/dns4/bootstrap-1.test.keep.network/tcp/3919/ipfs/16Uiu2HAm3eJtyFKAttzJ85NLMromHuRg4yyum3CREMf6CHBBV6KY", "/dns4/bootstrap-2.test.keep.network/tcp/3919/ipfs/16Uiu2HAmNNuCp45z5bgB8KiTHv1vHTNAVbBgxxtTFGAndageo9Dp", "/dns4/bootstrap-3.test.keep.network/tcp/3919/ipfs/16Uiu2HAm8KJX32kr3eYUhDuzwTucSfAfspnjnXNf9veVhB12t6Vf", "/dns4/bootstrap-4.test.keep.network/tcp/3919/ipfs/16Uiu2HAkxRTeySEWZfW9C83GPFpQUXvrygmZryCN6DL4piZrbAv4"] - Port = 3919 - # AnnouncedAddresses: - # Leaving AnnouncedAddresses empty will set a default address to be - # announced to the network. The default address will vary by deploy - # conditions. Set AnnouncedAddresses if you have known external IPs - # or DNS entries you want to route traffic through. - AnnouncedAddresses = [] - -# In the real world this directory should be on persistent storage. -[Storage] - DataDir = "/mnt/keep-client/persistence" diff --git a/infrastructure/eth-networks/keep-test/ropsten/participants/stake-capital/config/eth-account-keyfile b/infrastructure/eth-networks/keep-test/ropsten/participants/stake-capital/config/eth-account-keyfile deleted file mode 100644 index dc83534508..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/participants/stake-capital/config/eth-account-keyfile +++ /dev/null @@ -1 +0,0 @@ -{"address":"5c769c2a379ebd630aa8ac9f125176209f170e6d","crypto":{"cipher":"aes-128-ctr","ciphertext":"f3d8ea887b40823ab73dbe4d232c3a5b631af37c4e80c681f4792fb0855f39a0","cipherparams":{"iv":"ed39d578e3e07a8e03619565af359f94"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"9073aedfc2bc14c93d0259f66c104b63248c8a68c91a57c721144a0e3b548f5a"},"mac":"8bd56a719c1d990439550e7c8014ea2a628e231877ab8bea0987d6f4a88f905f"},"id":"ec11ab22-7e1e-43fa-9d3f-17104aa5d53c","version":3} \ No newline at end of file diff --git a/infrastructure/eth-networks/keep-test/ropsten/participants/stake-capital/config/keep-client-config.toml b/infrastructure/eth-networks/keep-test/ropsten/participants/stake-capital/config/keep-client-config.toml deleted file mode 100644 index bd0b7a5548..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/participants/stake-capital/config/keep-client-config.toml +++ /dev/null @@ -1,33 +0,0 @@ -[ethereum] - URL = "wss://ropsten.infura.io/ws/v3/59fb36a36fa4474b890c13dd30038be5" - URLRPC = "https://ropsten.infura.io/v3/59fb36a36fa4474b890c13dd30038be5" - - [ethereum.account] - Address = "0x5c769c2a379ebd630aa8ac9f125176209f170e6d" - KeyFile = "/mnt/keep-client/config/eth-account-keyfile" - - # Contracts are already deployed to Ropsten. They are subject to change on deployment. - [ethereum.ContractAddresses] - # Hex-encoded address of KeepRandomBeaconOperator contract - KeepRandomBeaconOperator = "0x8d804f0c36d2c3A40EE128B7a01fe5269D511206" - # TokenStaking - TokenStaking = "0x585A83EdA3d29e030C49A51B46B653FEcd9c5919" - # Hex-encoded address of KeepRandomBeaconService contract. Only needed - # in cases where the client's utility functions will be used (e.g., the - # relay subcommand). - KeepRandomBeaconService = "0x17c43Fb5035b89a51b3481f7Dd11a987E7A8720d" - -# Testnet bootstrap peers hosted by the folks at Keep. -[LibP2P] - Peers = ["/dns4/bootstrap-0.test.keep.network/tcp/3919/ipfs/16Uiu2HAmCcfVpHwfBKNFbQuhvGuFXHVLQ65gB4sJm7HyrcZuLttH", "/dns4/bootstrap-1.test.keep.network/tcp/3919/ipfs/16Uiu2HAm3eJtyFKAttzJ85NLMromHuRg4yyum3CREMf6CHBBV6KY", "/dns4/bootstrap-2.test.keep.network/tcp/3919/ipfs/16Uiu2HAmNNuCp45z5bgB8KiTHv1vHTNAVbBgxxtTFGAndageo9Dp", "/dns4/bootstrap-3.test.keep.network/tcp/3919/ipfs/16Uiu2HAm8KJX32kr3eYUhDuzwTucSfAfspnjnXNf9veVhB12t6Vf", "/dns4/bootstrap-4.test.keep.network/tcp/3919/ipfs/16Uiu2HAkxRTeySEWZfW9C83GPFpQUXvrygmZryCN6DL4piZrbAv4"] - Port = 3919 - # AnnouncedAddresses: - # Leaving AnnouncedAddresses empty will set a default address to be - # announced to the network. The default address will vary by deploy - # conditions. Set AnnouncedAddresses if you have known external IPs - # or DNS entries you want to route traffic through. - AnnouncedAddresses = [] - -# In the real world this directory should be on persistent storage. -[Storage] - DataDir = "/mnt/keep-client/persistence" diff --git a/infrastructure/eth-networks/keep-test/ropsten/participants/staked/config/eth-account-keyfile b/infrastructure/eth-networks/keep-test/ropsten/participants/staked/config/eth-account-keyfile deleted file mode 100644 index fd889d1902..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/participants/staked/config/eth-account-keyfile +++ /dev/null @@ -1 +0,0 @@ -{"address":"ca8754f7060a0648824f274e3a4d897fa497139d","crypto":{"cipher":"aes-128-ctr","ciphertext":"bd167b8ea05c507cda4046d425c64ef2d0b6ec1152e974fb38b69c01129ad713","cipherparams":{"iv":"fccc1a87531c43c9304795148a2f8e90"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"33fdb3f42f3164b489d8c52ea633a3894e047f75621260e7103949af4b76f141"},"mac":"52b4cee8d7de7384b44a16a5ee30fd5c5ee21cf67826d4c9ae6e53e13efba91d"},"id":"bdb9d35d-2a9c-450d-938d-7299f8186c88","version":3} \ No newline at end of file diff --git a/infrastructure/eth-networks/keep-test/ropsten/participants/staked/config/keep-client-config.toml b/infrastructure/eth-networks/keep-test/ropsten/participants/staked/config/keep-client-config.toml deleted file mode 100644 index 65d8984828..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/participants/staked/config/keep-client-config.toml +++ /dev/null @@ -1,33 +0,0 @@ -[ethereum] - URL = "wss://ropsten.infura.io/ws/v3/59fb36a36fa4474b890c13dd30038be5" - URLRPC = "https://ropsten.infura.io/v3/59fb36a36fa4474b890c13dd30038be5" - - [ethereum.account] - Address = "0xca8754f7060a0648824f274e3a4d897fa497139d" - KeyFile = "/mnt/keep-client/config/eth-account-keyfile" - - # Contracts are already deployed to Ropsten. They are subject to change on deployment. - [ethereum.ContractAddresses] - # Hex-encoded address of KeepRandomBeaconOperator contract - KeepRandomBeaconOperator = "0x8d804f0c36d2c3A40EE128B7a01fe5269D511206" - # TokenStaking - TokenStaking = "0x585A83EdA3d29e030C49A51B46B653FEcd9c5919" - # Hex-encoded address of KeepRandomBeaconService contract. Only needed - # in cases where the client's utility functions will be used (e.g., the - # relay subcommand). - KeepRandomBeaconService = "0x17c43Fb5035b89a51b3481f7Dd11a987E7A8720d" - -# Testnet bootstrap peers hosted by the folks at Keep. -[LibP2P] - Peers = ["/dns4/bootstrap-0.test.keep.network/tcp/3919/ipfs/16Uiu2HAmCcfVpHwfBKNFbQuhvGuFXHVLQ65gB4sJm7HyrcZuLttH", "/dns4/bootstrap-1.test.keep.network/tcp/3919/ipfs/16Uiu2HAm3eJtyFKAttzJ85NLMromHuRg4yyum3CREMf6CHBBV6KY", "/dns4/bootstrap-2.test.keep.network/tcp/3919/ipfs/16Uiu2HAmNNuCp45z5bgB8KiTHv1vHTNAVbBgxxtTFGAndageo9Dp", "/dns4/bootstrap-3.test.keep.network/tcp/3919/ipfs/16Uiu2HAm8KJX32kr3eYUhDuzwTucSfAfspnjnXNf9veVhB12t6Vf", "/dns4/bootstrap-4.test.keep.network/tcp/3919/ipfs/16Uiu2HAkxRTeySEWZfW9C83GPFpQUXvrygmZryCN6DL4piZrbAv4"] - Port = 3919 - # AnnouncedAddresses: - # Leaving AnnouncedAddresses empty will set a default address to be - # announced to the network. The default address will vary by deploy - # conditions. Set AnnouncedAddresses if you have known external IPs - # or DNS entries you want to route traffic through. - AnnouncedAddresses = [] - -# In the real world this directory should be on persistent storage. -[Storage] - DataDir = "/mnt/keep-client/persistence" diff --git a/infrastructure/eth-networks/keep-test/ropsten/participants/synapse/config/eth-account-keyfile b/infrastructure/eth-networks/keep-test/ropsten/participants/synapse/config/eth-account-keyfile deleted file mode 100644 index ab391c9c36..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/participants/synapse/config/eth-account-keyfile +++ /dev/null @@ -1 +0,0 @@ -{"address":"8e258d2299bc1ee92ec9e70efb381d9b7c70c3d7","crypto":{"cipher":"aes-128-ctr","ciphertext":"cfd076fdacdb2bcfbc30d716fe493a42e4ef30e8f02b704fc04363e9ad26878f","cipherparams":{"iv":"e9424ae5c6135f9c3d3e5168eeb4b63e"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"4cefb32e604d4e3a2c90c36cfd13f55db6ca7d0971bbc17d515747a935d5d54f"},"mac":"904966f2bd79210dcbde119093cd0814066cb11b018b344c171910c18cc78e1d"},"id":"4d79ee9e-7ba3-409e-87cc-1a9fa22485a3","version":3} \ No newline at end of file diff --git a/infrastructure/eth-networks/keep-test/ropsten/participants/synapse/config/keep-client-config.toml b/infrastructure/eth-networks/keep-test/ropsten/participants/synapse/config/keep-client-config.toml deleted file mode 100644 index 2b22c4a5e1..0000000000 --- a/infrastructure/eth-networks/keep-test/ropsten/participants/synapse/config/keep-client-config.toml +++ /dev/null @@ -1,33 +0,0 @@ -[ethereum] - URL = "wss://ropsten.infura.io/ws/v3/59fb36a36fa4474b890c13dd30038be5" - URLRPC = "https://ropsten.infura.io/v3/59fb36a36fa4474b890c13dd30038be5" - - [ethereum.account] - Address = "0x8e258d2299bc1ee92ec9e70efb381d9b7c70c3d7" - KeyFile = "/mnt/keep-client/config/eth-account-keyfile" - - # Contracts are already deployed to Ropsten. They are subject to change on deployment. - [ethereum.ContractAddresses] - # Hex-encoded address of KeepRandomBeaconOperator contract - KeepRandomBeaconOperator = "0x8d804f0c36d2c3A40EE128B7a01fe5269D511206" - # TokenStaking - TokenStaking = "0x585A83EdA3d29e030C49A51B46B653FEcd9c5919" - # Hex-encoded address of KeepRandomBeaconService contract. Only needed - # in cases where the client's utility functions will be used (e.g., the - # relay subcommand). - KeepRandomBeaconService = "0x17c43Fb5035b89a51b3481f7Dd11a987E7A8720d" - -# Testnet bootstrap peers hosted by the folks at Keep. -[LibP2P] - Peers = ["/dns4/bootstrap-0.test.keep.network/tcp/3919/ipfs/16Uiu2HAmCcfVpHwfBKNFbQuhvGuFXHVLQ65gB4sJm7HyrcZuLttH", "/dns4/bootstrap-1.test.keep.network/tcp/3919/ipfs/16Uiu2HAm3eJtyFKAttzJ85NLMromHuRg4yyum3CREMf6CHBBV6KY", "/dns4/bootstrap-2.test.keep.network/tcp/3919/ipfs/16Uiu2HAmNNuCp45z5bgB8KiTHv1vHTNAVbBgxxtTFGAndageo9Dp", "/dns4/bootstrap-3.test.keep.network/tcp/3919/ipfs/16Uiu2HAm8KJX32kr3eYUhDuzwTucSfAfspnjnXNf9veVhB12t6Vf", "/dns4/bootstrap-4.test.keep.network/tcp/3919/ipfs/16Uiu2HAkxRTeySEWZfW9C83GPFpQUXvrygmZryCN6DL4piZrbAv4"] - Port = 3919 - # AnnouncedAddresses: - # Leaving AnnouncedAddresses empty will set a default address to be - # announced to the network. The default address will vary by deploy - # conditions. Set AnnouncedAddresses if you have known external IPs - # or DNS entries you want to route traffic through. - AnnouncedAddresses = [] - -# In the real world this directory should be on persistent storage. -[Storage] - DataDir = "/mnt/keep-client/persistence" diff --git a/infrastructure/eth-networks/scripts/create-eth-accounts.sh b/infrastructure/eth-networks/scripts/create-eth-accounts.sh deleted file mode 100755 index 7747846591..0000000000 --- a/infrastructure/eth-networks/scripts/create-eth-accounts.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -# Requires geth https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Mac -# Requres bip39-cli https://www.npmjs.com/package/bip39-cli - -# Please don't use this for mainnet accounts, it's for testing only. - -HELP="Usage: ./$(basename $0) -n \ne.g. ./$(basename $0) -n 5" - -while getopts ":n:" opt; do - case $opt in - n ) NUMBER_OF_ACCOUNTS=$OPTARG;; - \? ) echo "Unknown option: -$OPTARG"; echo -e $HELP; exit 1 - esac -done - -if [ $# -eq 0 ] -then - echo -e $HELP - exit 1 -fi - -PASSWORD_FILE="./account-password.txt" -ACCOUNT_INFO_FILE="./account-info.txt" - -for ((ACCOUNT_ORDINAL=0; $ACCOUNT_ORDINAL<$NUMBER_OF_ACCOUNTS; ACCOUNT_ORDINAL++)) -do - echo "=====Account $ACCOUNT_ORDINAL=====" - - ACCOUNT_PASSWORD=$(bip39-cli generate) - - echo $ACCOUNT_PASSWORD > $PASSWORD_FILE - - ACCOUNT=$(geth account new --keystore ./ --password $PASSWORD_FILE) - - echo "Account $ACCOUNT_ORDINAL: $ACCOUNT / $ACCOUNT_PASSWORD" | tee -a $ACCOUNT_INFO_FILE -done - -rm $PASSWORD_FILE \ No newline at end of file diff --git a/infrastructure/eth-networks/scripts/fetch-contract-data.sh b/infrastructure/eth-networks/scripts/fetch-contract-data.sh deleted file mode 100755 index 2b81f8331c..0000000000 --- a/infrastructure/eth-networks/scripts/fetch-contract-data.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash -set -e - -CONTRACTS=( KeepToken.json TokenStaking.json KeepRandomBeaconOperator.json ) - -SOURCE_PROJECT_ID=keep-test-f3e0 -SOURCE_CONTRACT_BUCKET=keep-test-contract-data/keep-core -CURRENT_PROJECT=$(gcloud config get-value project) - -TARGET_DIR=../keep-test/ropsten - - - if [ $CURRENT_PROJECT != $SOURCE_PROJECT_ID ] - then - echo "--Current gcloud project: ${CURRENT_PROJECT}" - echo "--Setting your gcloud context to the keep-test project!" - gcloud config set project $SOURCE_PROJECT_ID - for contract in "${CONTRACTS[@]}"; do - gsutil cp gs://${SOURCE_CONTRACT_BUCKET}/$contract $TARGET_DIR - done - echo "--Returning to original glcoud project: ${CURRENT_PROJECT}" - gcloud config set project $CURRENT_PROJECT - else - for contract in "${CONTRACTS[@]}"; do - gsutil cp gs://${SOURCE_CONTRACT_BUCKET}/$contract $TARGET_DIR - done - fi diff --git a/infrastructure/eth-networks/scripts/package-lock.json b/infrastructure/eth-networks/scripts/package-lock.json deleted file mode 100644 index cd5413c857..0000000000 --- a/infrastructure/eth-networks/scripts/package-lock.json +++ /dev/null @@ -1,5591 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@babel/runtime": { - "version": "7.7.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.6.tgz", - "integrity": "sha512-BWAJxpNVa0QlE5gZdWjSxXtemZyZ9RmrmVozxt3NUXeZhVIJ5ANyqmMc0JDrivBZyxUuQvFxlvH4OWWOogGfUw==", - "requires": { - "regenerator-runtime": "^0.13.2" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" - } - } - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@truffle/error": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.0.8.tgz", - "integrity": "sha512-x55rtRuNfRO1azmZ30iR0pf0OJ6flQqbax1hJz+Avk1K5fdmOv5cr22s9qFnwTWnS6Bw0jvJEoR0ITsM7cPKtQ==" - }, - "@truffle/hdwallet-provider": { - "version": "1.0.26", - "resolved": "https://registry.npmjs.org/@truffle/hdwallet-provider/-/hdwallet-provider-1.0.26.tgz", - "integrity": "sha512-ITEUOwT8o8FZmnAiZtFLHhTLFOlT5q/DIh9QzV+gG0GocqIY6D2CSLkhaqTn89xCGVftQfyQAFBqXfGRblNQKw==", - "requires": { - "@truffle/provider": "^0.2.3", - "any-promise": "^1.3.0", - "bindings": "^1.5.0", - "bip39": "^2.4.2", - "ethereum-protocol": "^1.0.1", - "ethereumjs-tx": "^1.0.0", - "ethereumjs-util": "^6.1.0", - "ethereumjs-wallet": "^0.6.3", - "web3": "1.2.2", - "web3-provider-engine": "git+https://github.com/trufflesuite/provider-engine.git#web3-one" - }, - "dependencies": { - "web3": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.2.tgz", - "integrity": "sha512-/ChbmB6qZpfGx6eNpczt5YSUBHEA5V2+iUCbn85EVb3Zv6FVxrOo5Tv7Lw0gE2tW7EEjASbCyp3mZeiZaCCngg==", - "requires": { - "@types/node": "^12.6.1", - "web3-bzz": "1.2.2", - "web3-core": "1.2.2", - "web3-eth": "1.2.2", - "web3-eth-personal": "1.2.2", - "web3-net": "1.2.2", - "web3-shh": "1.2.2", - "web3-utils": "1.2.2" - } - } - } - }, - "@truffle/interface-adapter": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.4.0.tgz", - "integrity": "sha512-3xCL38jOByT/CN/Sar9Yx0q3xXRzEYpd28eQfI/nTZk/+T1m+aYU7C4Dv2JSnqgB3mjQd++2rRnMYjE2uxYg5w==", - "requires": { - "bn.js": "^4.11.8", - "ethers": "^4.0.32", - "lodash": "^4.17.13", - "web3": "1.2.2" - }, - "dependencies": { - "web3": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.2.tgz", - "integrity": "sha512-/ChbmB6qZpfGx6eNpczt5YSUBHEA5V2+iUCbn85EVb3Zv6FVxrOo5Tv7Lw0gE2tW7EEjASbCyp3mZeiZaCCngg==", - "requires": { - "@types/node": "^12.6.1", - "web3-bzz": "1.2.2", - "web3-core": "1.2.2", - "web3-eth": "1.2.2", - "web3-eth-personal": "1.2.2", - "web3-net": "1.2.2", - "web3-shh": "1.2.2", - "web3-utils": "1.2.2" - } - } - } - }, - "@truffle/provider": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@truffle/provider/-/provider-0.2.3.tgz", - "integrity": "sha512-EsAE7eiXMlTAQBNst12fuTKddMMtqB7d9jQmVvYvq+/G3ryZCf50dTiod0lhTIh0dIQ/tirFdvBRKDfc8c+hsQ==", - "requires": { - "@truffle/error": "^0.0.8", - "@truffle/interface-adapter": "^0.4.0", - "web3": "1.2.2" - }, - "dependencies": { - "web3": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.2.tgz", - "integrity": "sha512-/ChbmB6qZpfGx6eNpczt5YSUBHEA5V2+iUCbn85EVb3Zv6FVxrOo5Tv7Lw0gE2tW7EEjASbCyp3mZeiZaCCngg==", - "requires": { - "@types/node": "^12.6.1", - "web3-bzz": "1.2.2", - "web3-core": "1.2.2", - "web3-eth": "1.2.2", - "web3-eth-personal": "1.2.2", - "web3-net": "1.2.2", - "web3-shh": "1.2.2", - "web3-utils": "1.2.2" - } - } - } - }, - "@types/bn.js": { - "version": "4.11.5", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.5.tgz", - "integrity": "sha512-AEAZcIZga0JgVMHNtl1CprA/hXX7/wPt79AgR4XqaDt7jyj3QWYw6LPoOiznPtugDmlubUnAahMs2PFxGcQrng==", - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "12.12.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.17.tgz", - "integrity": "sha512-Is+l3mcHvs47sKy+afn2O1rV4ldZFU7W8101cNlOd+MRbjM4Onida8jSZnJdTe/0Pcf25g9BNIUsuugmE6puHA==" - }, - "@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", - "requires": { - "@types/node": "*" - } - }, - "abstract-leveldown": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", - "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", - "requires": { - "xtend": "~4.0.0" - } - }, - "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "dependencies": { - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - } - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - }, - "async-eventemitter": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", - "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "requires": { - "async": "^2.4.0" - } - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", - "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==" - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "requires": { - "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-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" - } - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "requires": { - "regenerator-transform": "^0.10.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-preset-env": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", - "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - } - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - }, - "backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", - "requires": { - "precond": "0.2" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base-x": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.7.tgz", - "integrity": "sha512-zAKJGuQPihXW22fkrfOclUUZXM2g92z5GzlSMHxhO6r6Qj+Nm0ccaGNBzDZojzwOMkpjAv4J0fOv1U4go+a4iw==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bip39": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-2.6.0.tgz", - "integrity": "sha512-RrnQRG2EgEoqO24ea+Q/fftuPUZLmrEM3qNhhGsA3PbaXaCW791LTzPuVyx/VprXQcTbPJ3K3UeTna8ZnVl2sg==", - "requires": { - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1", - "safe-buffer": "^5.0.1", - "unorm": "^1.3.3" - } - }, - "bip66": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", - "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", - "requires": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" - } - }, - "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", - "requires": { - "base-x": "^3.0.2" - } - }, - "bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "buffer": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", - "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "caniuse-lite": { - "version": "1.0.30001015", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001015.tgz", - "integrity": "sha512-/xL2AbW/XWHNu1gnIrO8UitBGoFthcsDgU9VLK1/dpsoxbaD5LscHozKze05R6WLsBvLhqv78dAPozMFQBYLbQ==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "checkpoint-store": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", - "integrity": "sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=", - "requires": { - "functional-red-black-tree": "^1.0.1" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "coinstring": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/coinstring/-/coinstring-2.3.0.tgz", - "integrity": "sha1-zbYzY6lhUCQEolr7gsLibV/2J6Q=", - "requires": { - "bs58": "^2.0.1", - "create-hash": "^1.1.1" - }, - "dependencies": { - "bs58": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-2.0.1.tgz", - "integrity": "sha1-VZCNWPGYKrogCPob7Y+RmYopv40=" - } - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" - }, - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-fetch": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.6.tgz", - "integrity": "sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA==", - "requires": { - "node-fetch": "^2.6.7", - "whatwg-fetch": "^2.0.4" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - } - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==" - }, - "decompress": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", - "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", - "requires": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "requires": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - } - }, - "decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "requires": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" - }, - "dependencies": { - "file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" - } - } - }, - "decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "requires": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" - } - }, - "decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", - "requires": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" - }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" - }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - } - } - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" - }, - "defer-to-connect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.1.tgz", - "integrity": "sha512-J7thop4u3mRTkYRQ+Vpfwy2G5Ehoy82I14+14W4YMDLKdWloI9gSzRbV30s/NckQGVJtPkWNcW4oMAUigTdqiQ==" - }, - "deferred-leveldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", - "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", - "requires": { - "abstract-leveldown": "~2.6.0" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "requires": { - "repeating": "^2.0.0" - } - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" - }, - "drbg.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", - "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", - "requires": { - "browserify-aes": "^1.0.6", - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.3.322", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz", - "integrity": "sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA==" - }, - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "~0.4.13" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "requires": { - "prr": "~1.0.1" - } - }, - "es-abstract": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.3.tgz", - "integrity": "sha512-WtY7Fx5LiOnSYgF5eg/1T+GONaGmpvpPdCpSnYij+U2gDTL0UPfWrhDw7b2IYb+9NQJsYpCA0wOQvZfsd6YwRw==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "string.prototype.trimleft": "^2.1.0", - "string.prototype.trimright": "^2.1.0" - }, - "dependencies": { - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" - } - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "eth-block-tracker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz", - "integrity": "sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==", - "requires": { - "eth-query": "^2.1.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.3", - "ethjs-util": "^0.1.3", - "json-rpc-engine": "^3.6.0", - "pify": "^2.3.0", - "tape": "^4.6.3" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "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" - } - }, - "keccak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", - "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", - "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" - } - } - } - }, - "eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=", - "requires": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" - } - }, - "eth-json-rpc-infura": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz", - "integrity": "sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw==", - "requires": { - "cross-fetch": "^2.1.1", - "eth-json-rpc-middleware": "^1.5.0", - "json-rpc-engine": "^3.4.0", - "json-rpc-error": "^2.0.0" - } - }, - "eth-json-rpc-middleware": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz", - "integrity": "sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==", - "requires": { - "async": "^2.5.0", - "eth-query": "^2.1.2", - "eth-tx-summary": "^3.1.2", - "ethereumjs-block": "^1.6.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.2", - "ethereumjs-vm": "^2.1.0", - "fetch-ponyfill": "^4.0.0", - "json-rpc-engine": "^3.6.0", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "tape": "^4.6.3" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "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" - } - }, - "keccak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", - "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", - "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" - } - } - } - }, - "eth-lib": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", - "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" - } - }, - "eth-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", - "integrity": "sha1-1nQdkAAQa1FRDHLbktY2VFam2l4=", - "requires": { - "json-rpc-random-id": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", - "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "ethereumjs-util": "^5.1.1" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "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" - } - }, - "keccak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", - "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", - "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" - } - } - } - }, - "eth-tx-summary": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz", - "integrity": "sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg==", - "requires": { - "async": "^2.1.2", - "clone": "^2.0.0", - "concat-stream": "^1.5.1", - "end-of-stream": "^1.1.0", - "eth-query": "^2.0.2", - "ethereumjs-block": "^1.4.1", - "ethereumjs-tx": "^1.1.1", - "ethereumjs-util": "^5.0.1", - "ethereumjs-vm": "^2.6.0", - "through2": "^2.0.3" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "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" - } - }, - "keccak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", - "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", - "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" - } - } - } - }, - "ethereum-bloom-filters": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.6.tgz", - "integrity": "sha512-dE9CGNzgOOsdh7msZirvv8qjHtnHpvBlKe2647kM8v+yeF71IRso55jpojemvHV+jMjr48irPWxMRaHuOWzAFA==", - "requires": { - "js-sha3": "^0.8.0" - }, - "dependencies": { - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - } - } - }, - "ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=" - }, - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "keccak": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", - "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", - "requires": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, - "secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "requires": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - } - } - }, - "ethereum-protocol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ethereum-protocol/-/ethereum-protocol-1.0.1.tgz", - "integrity": "sha512-3KLX1mHuEsBW0dKG+c6EOJS1NBNqdCICvZW9sInmZTt5aY0oxmHVggYRE0lJu1tcnMD1K+AKHdLi6U43Awm1Vg==" - }, - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#1cfbb13862f90f0b391d8a699544d5fe4dfb8c7b", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-account": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", - "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", - "requires": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "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" - } - }, - "keccak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", - "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", - "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" - } - } - } - }, - "ethereumjs-block": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", - "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", - "requires": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereum-common": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", - "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==" - }, - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "ethereumjs-common": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz", - "integrity": "sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ==" - }, - "ethereumjs-tx": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", - "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "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" - } - }, - "keccak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", - "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", - "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" - } - } - } - }, - "ethereumjs-util": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz", - "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==", - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^2.0.0", - "rlp": "^2.2.3", - "secp256k1": "^3.0.1" - } - }, - "ethereumjs-vm": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", - "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-block": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", - "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "ethereumjs-tx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", - "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - } - } - }, - "ethereumjs-wallet": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.3.tgz", - "integrity": "sha512-qiXPiZOsStem+Dj/CQHbn5qex+FVkuPmGH7SvSnA9F3tdRDt8dLMyvIj3+U05QzVZNPYh4HXEdnzoYI4dZkr9w==", - "requires": { - "aes-js": "^3.1.1", - "bs58check": "^2.1.2", - "ethereumjs-util": "^6.0.0", - "hdkey": "^1.1.0", - "randombytes": "^2.0.6", - "safe-buffer": "^5.1.2", - "scrypt.js": "^0.3.0", - "utf8": "^3.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "aes-js": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" - }, - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" - } - } - }, - "ethers": { - "version": "4.0.40", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.40.tgz", - "integrity": "sha512-MC9BtV7Hpq4dgFONEfanx9aU9GhhoWU270F+/wegHZXA7FR+2KXFdt36YIQYLmVY5ykUWswDxd+f9EVkIa7JOA==", - "requires": { - "aes-js": "3.0.0", - "bn.js": "^4.4.0", - "elliptic": "6.5.2", - "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" - } - }, - "ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", - "requires": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" - }, - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - } - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fake-merkle-patricia-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz", - "integrity": "sha1-S4w6z7Ugr635hgsfFM2M40As3dM=", - "requires": { - "checkpoint-store": "^1.1.0" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "requires": { - "pend": "~1.2.0" - } - }, - "fetch-ponyfill": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz", - "integrity": "sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=", - "requires": { - "node-fetch": "~1.7.1" - }, - "dependencies": { - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - } - } - }, - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - } - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "requires": { - "min-document": "^2.19.0", - "process": "~0.5.1" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "hdkey": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-1.1.1.tgz", - "integrity": "sha512-DvHZ5OuavsfWs5yfVJZestsnc3wzPvLWNk6c2nRUfo6X+OtxypGt20vDDf7Ba+MJzjL3KS1og2nw2eBbLCOUTA==", - "requires": { - "coinstring": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", - "requires": { - "punycode": "2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" - } - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz", - "integrity": "sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw=" - }, - "is-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" - }, - "is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" - }, - "is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "requires": { - "has": "^1.0.1" - } - }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, - "json-rpc-engine": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz", - "integrity": "sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==", - "requires": { - "async": "^2.0.1", - "babel-preset-env": "^1.7.0", - "babelify": "^7.3.0", - "json-rpc-error": "^2.0.0", - "promise-to-callback": "^1.0.0", - "safe-event-emitter": "^1.0.1" - } - }, - "json-rpc-error": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/json-rpc-error/-/json-rpc-error-2.0.0.tgz", - "integrity": "sha1-p6+cICg4tekFxyUOVH8a/3cligI=", - "requires": { - "inherits": "^2.0.1" - } - }, - "json-rpc-random-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", - "integrity": "sha1-uknZat7RRE27jaPSA3SKy7zeyMg=" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "keccak": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", - "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==", - "requires": { - "bindings": "^1.5.0", - "inherits": "^2.0.4", - "nan": "^2.14.0", - "safe-buffer": "^5.2.0" - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "requires": { - "json-buffer": "3.0.0" - } - }, - "level-codec": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", - "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" - }, - "level-errors": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", - "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", - "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", - "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "level-ws": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", - "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", - "requires": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "levelup": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", - "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", - "requires": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - }, - "dependencies": { - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - } - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, - "ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=" - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memdown": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", - "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", - "requires": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", - "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", - "requires": { - "xtend": "~4.0.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merkle-patricia-tree": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", - "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", - "requires": { - "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" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "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" - } - }, - "keccak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", - "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", - "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" - } - } - } - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.42.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", - "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==" - }, - "mime-types": { - "version": "2.1.25", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", - "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", - "requires": { - "mime-db": "1.42.0" - } - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "requires": { - "dom-walk": "^0.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", - "requires": { - "mkdirp": "*" - } - }, - "mock-fs": { - "version": "4.10.4", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.10.4.tgz", - "integrity": "sha512-gDfZDLaPIvtOusbusLinfx6YSe2YpQsDT8qdP41P47dQ/NQggtkHukz7hwqgt8QvMBmAv+Z6DGmXPyb5BWX2nQ==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - }, - "nano-json-stream-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" - }, - "node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==" - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", - "requires": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-inspect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "oboe": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz", - "integrity": "sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=", - "requires": { - "http-https": "^1.0.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "requires": { - "p-finally": "^1.0.0" - } - }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-headers": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", - "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" - }, - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "promise-to-callback": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz", - "integrity": "sha1-XSp0kBC/tn2WNZj805YHRqaP7vc=", - "requires": { - "is-fn": "^1.0.0", - "set-immediate-shim": "^1.0.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "psl": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.6.0.tgz", - "integrity": "sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "~0.5.0" - } - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" - }, - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" - } - } - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "resumer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", - "requires": { - "through": "~2.3.4" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rlp": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.4.tgz", - "integrity": "sha512-fdq2yYCWpAQBhwkZv+Z8o/Z4sPmYm1CUq6P7n6lVTOdb949CnqA0sndXal5C1NleSVSZm6q5F3iEbauyVln/iw==", - "requires": { - "bn.js": "^4.11.1" - } - }, - "rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" - }, - "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" - }, - "safe-event-emitter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz", - "integrity": "sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==", - "requires": { - "events": "^3.0.0" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "scrypt": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", - "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", - "optional": true, - "requires": { - "nan": "^2.0.8" - } - }, - "scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" - }, - "scrypt-shim": { - "version": "github:web3-js/scrypt-shim#be5e616323a8b5e568788bf94d03c1b8410eac54", - "from": "github:web3-js/scrypt-shim", - "requires": { - "scryptsy": "^2.1.0", - "semver": "^6.3.0" - } - }, - "scrypt.js": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.3.0.tgz", - "integrity": "sha512-42LTc1nyFsyv/o0gcHtDztrn+aqpkaCNt5Qh7ATBZfhEZU7IC/0oT/qbBH+uRNoAPvs2fwiOId68FDEoSRA8/A==", - "requires": { - "scrypt": "^6.0.2", - "scryptsy": "^1.2.1" - }, - "dependencies": { - "scryptsy": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", - "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", - "requires": { - "pbkdf2": "^3.0.3" - } - } - } - }, - "scryptsy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", - "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" - }, - "secp256k1": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.7.1.tgz", - "integrity": "sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==", - "requires": { - "bindings": "^1.5.0", - "bip66": "^1.1.5", - "bn.js": "^4.11.8", - "create-hash": "^1.2.0", - "drbg.js": "^1.0.1", - "elliptic": "^6.4.1", - "nan": "^2.14.0", - "safe-buffer": "^5.1.2" - } - }, - "seek-bzip": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", - "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", - "requires": { - "commander": "~2.8.1" - } - }, - "semaphore": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", - "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==" - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - }, - "servify": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", - "requires": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" - } - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" - }, - "setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "dependencies": { - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" - } - } - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" - }, - "simple-get": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", - "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", - "requires": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "requires": { - "source-map": "^0.5.6" - } - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, - "string.prototype.trim": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", - "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.0", - "function-bind": "^1.0.2" - } - }, - "string.prototype.trimleft": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", - "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", - "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "requires": { - "is-natural-number": "^4.0.1" - } - }, - "strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "swarm-js": { - "version": "0.1.39", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.39.tgz", - "integrity": "sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg==", - "requires": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "decompress": "^4.0.0", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request-promise": "^0.1.2" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - } - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { - "prepend-http": "^1.0.1" - } - } - } - }, - "tape": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/tape/-/tape-4.11.0.tgz", - "integrity": "sha512-yixvDMX7q7JIs/omJSzSZrqulOV51EC9dK8dM0TzImTIkHWfe2/kFyL5v+d9C+SrCMaICk59ujsqFAVidDqDaA==", - "requires": { - "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.4", - "minimist": "~1.2.0", - "object-inspect": "~1.6.0", - "resolve": "~1.11.1", - "resumer": "~0.0.0", - "string.prototype.trim": "~1.1.2", - "through": "~2.3.8" - } - }, - "tar": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", - "requires": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" - }, - "unbzip2-stream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", - "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "^2.1.0" - } - }, - "url-parse": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", - "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", - "requires": { - "querystringify": "^2.0.0", - "requires-port": "^1.0.0" - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "requires": { - "prepend-http": "^2.0.0" - } - }, - "url-set-query": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" - }, - "utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "web3": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.55.tgz", - "integrity": "sha512-yJpwy4IUA3T/F9hWzYQVn0GbJCrAaZ0KTIO3iuqkhaYH0Y09KV7k4GzFi4hN7hT4cFTj4yIKaeVCwQ5kzvi2Vg==", - "requires": { - "@babel/runtime": "^7.3.1", - "@types/node": "^10.12.18", - "web3-core": "1.0.0-beta.55", - "web3-eth": "1.0.0-beta.55", - "web3-eth-personal": "1.0.0-beta.55", - "web3-net": "1.0.0-beta.55", - "web3-providers": "1.0.0-beta.55", - "web3-shh": "1.0.0-beta.55", - "web3-utils": "1.0.0-beta.55" - }, - "dependencies": { - "@types/node": { - "version": "10.17.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.9.tgz", - "integrity": "sha512-+6VygF9LbG7Gaqeog2G7u1+RUcmo0q1rI+2ZxdIg2fAUngk5Vz9fOCHXdloNUOHEPd1EuuOpL5O0CdgN9Fx5UQ==" - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==" - }, - "utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, - "web3-core": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.55.tgz", - "integrity": "sha512-AMMp7TLEtE7u8IJAu/THrRhBTZyZzeo7Y6GiWYNwb5+KStC9hIGLr9cI1KX9R6ZioTOLRHrqT7awDhnJ1ku2mg==", - "requires": { - "@babel/runtime": "^7.3.1", - "@types/bn.js": "^4.11.4", - "@types/node": "^10.12.18", - "lodash": "^4.17.11", - "web3-core-method": "1.0.0-beta.55", - "web3-providers": "1.0.0-beta.55", - "web3-utils": "1.0.0-beta.55" - } - }, - "web3-core-helpers": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.55.tgz", - "integrity": "sha512-suj9Xy/lIqajaYLJTEjr2rlFgu6hGYwChHmf8+qNrC2luZA6kirTamtB9VThWMxbywx7p0bqQFjW6zXogAgWhg==", - "requires": { - "@babel/runtime": "^7.3.1", - "lodash": "^4.17.11", - "web3-core": "1.0.0-beta.55", - "web3-eth-iban": "1.0.0-beta.55", - "web3-utils": "1.0.0-beta.55" - } - }, - "web3-core-method": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.55.tgz", - "integrity": "sha512-w1cW/s2ji9qGELHk2uMJCn1ooay0JJLVoPD1nvmsW6OTRWcVjxa62nJrFQhe6P5lEb83Xk9oHgmCxZoVUHibOw==", - "requires": { - "@babel/runtime": "^7.3.1", - "eventemitter3": "3.1.0", - "lodash": "^4.17.11", - "rxjs": "^6.4.0", - "web3-core": "1.0.0-beta.55", - "web3-core-helpers": "1.0.0-beta.55", - "web3-core-subscriptions": "1.0.0-beta.55", - "web3-utils": "1.0.0-beta.55" - } - }, - "web3-core-subscriptions": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.55.tgz", - "integrity": "sha512-pb3oQbUzK7IoyXwag8TYInQddg0rr7BHxKc+Pbs/92hVNQ5ps4iGMVJKezdrjlQ1IJEEUiDIglXl4LZ1hIuMkw==", - "requires": { - "@babel/runtime": "^7.3.1", - "eventemitter3": "^3.1.0", - "lodash": "^4.17.11" - } - }, - "web3-eth": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.55.tgz", - "integrity": "sha512-F3zJ9I1gOgQdNGfi2Dy2lmj6OqCMJoRN01XHhQZagq0HY1JYMfObtfMi5E3L+qsegsSddHbqp4YY57tKx6uxpA==", - "requires": { - "@babel/runtime": "^7.3.1", - "ethereumjs-tx": "^1.3.7", - "rxjs": "^6.4.0", - "web3-core": "1.0.0-beta.55", - "web3-core-helpers": "1.0.0-beta.55", - "web3-core-method": "1.0.0-beta.55", - "web3-core-subscriptions": "1.0.0-beta.55", - "web3-eth-abi": "1.0.0-beta.55", - "web3-eth-accounts": "1.0.0-beta.55", - "web3-eth-contract": "1.0.0-beta.55", - "web3-eth-ens": "1.0.0-beta.55", - "web3-eth-iban": "1.0.0-beta.55", - "web3-eth-personal": "1.0.0-beta.55", - "web3-net": "1.0.0-beta.55", - "web3-providers": "1.0.0-beta.55", - "web3-utils": "1.0.0-beta.55" - } - }, - "web3-eth-abi": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.55.tgz", - "integrity": "sha512-3h1xnm/vYmKUXTOYAOP0OsB5uijQV76pNNRGKOB6Dq6GR1pbcbD3WrB/4I643YA8l91t5FRzFzUiA3S77R2iqw==", - "requires": { - "@babel/runtime": "^7.3.1", - "ethers": "^4.0.27", - "lodash": "^4.17.11", - "web3-utils": "1.0.0-beta.55" - } - }, - "web3-eth-accounts": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.55.tgz", - "integrity": "sha512-VfzvwpSDHXqRVelIxsBVhgbV9BkFvhJ/q+bKhnVUUXV0JAhMK/7uC92TsqKk4EBYuqpHyZ1jjqrL4n03fMU7zw==", - "requires": { - "@babel/runtime": "^7.3.1", - "browserify-cipher": "^1.0.1", - "eth-lib": "0.2.8", - "lodash": "^4.17.11", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "scrypt.js": "0.3.0", - "uuid": "3.3.2", - "web3-core": "1.0.0-beta.55", - "web3-core-helpers": "1.0.0-beta.55", - "web3-core-method": "1.0.0-beta.55", - "web3-providers": "1.0.0-beta.55", - "web3-utils": "1.0.0-beta.55" - } - }, - "web3-eth-contract": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.55.tgz", - "integrity": "sha512-v6oB1wfH039/A5sTb4ZTKX++fcBTHEkuQGpq50ATIDoxP/UTz2+6S+iL+3sCJTsByPw2/Bni/HM7NmLkXqzg/Q==", - "requires": { - "@babel/runtime": "^7.3.1", - "@types/bn.js": "^4.11.4", - "lodash": "^4.17.11", - "web3-core": "1.0.0-beta.55", - "web3-core-helpers": "1.0.0-beta.55", - "web3-core-method": "1.0.0-beta.55", - "web3-core-subscriptions": "1.0.0-beta.55", - "web3-eth-abi": "1.0.0-beta.55", - "web3-eth-accounts": "1.0.0-beta.55", - "web3-providers": "1.0.0-beta.55", - "web3-utils": "1.0.0-beta.55" - } - }, - "web3-eth-ens": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.0.0-beta.55.tgz", - "integrity": "sha512-jEL17coO0FJXb7KYq4+7DhVXj0Rh+wHfZ86jOvFUvJsRaUHfqK2TlMatuhD2mbrmxpBYb6oMPnXVnNK9bnD5Rg==", - "requires": { - "@babel/runtime": "^7.3.1", - "eth-ens-namehash": "2.0.8", - "lodash": "^4.17.11", - "web3-core": "1.0.0-beta.55", - "web3-core-helpers": "1.0.0-beta.55", - "web3-core-method": "1.0.0-beta.55", - "web3-eth-abi": "1.0.0-beta.55", - "web3-eth-accounts": "1.0.0-beta.55", - "web3-eth-contract": "1.0.0-beta.55", - "web3-net": "1.0.0-beta.55", - "web3-providers": "1.0.0-beta.55", - "web3-utils": "1.0.0-beta.55" - } - }, - "web3-eth-iban": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.55.tgz", - "integrity": "sha512-a2Fxsb5Mssa+jiXgjUdIzJipE0175IcQXJbZLpKft2+zeSJWNTbaa3PQD2vPPpIM4W789q06N+f9Zc0Fyls+1g==", - "requires": { - "@babel/runtime": "^7.3.1", - "bn.js": "4.11.8", - "web3-utils": "1.0.0-beta.55" - } - }, - "web3-eth-personal": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.55.tgz", - "integrity": "sha512-H0mahLQx6Oj7lpgTamKAswr3rHChRUZijeWAar2Hj7BABQlLRKwx8n09nYhxggvvLYQNQS90JjvQue7rAo2LQQ==", - "requires": { - "@babel/runtime": "^7.3.1", - "web3-core": "1.0.0-beta.55", - "web3-core-helpers": "1.0.0-beta.55", - "web3-core-method": "1.0.0-beta.55", - "web3-eth-accounts": "1.0.0-beta.55", - "web3-net": "1.0.0-beta.55", - "web3-providers": "1.0.0-beta.55", - "web3-utils": "1.0.0-beta.55" - } - }, - "web3-net": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.55.tgz", - "integrity": "sha512-do2WY8+/GArJSWX7k/zZ7nBnV9Y3n6LhPYkwT3LeFqDzD515bKwlomaNC8hOaTc6UQyXIoPprYTK2FevL7jrZw==", - "requires": { - "@babel/runtime": "^7.3.1", - "lodash": "^4.17.11", - "web3-core": "1.0.0-beta.55", - "web3-core-helpers": "1.0.0-beta.55", - "web3-core-method": "1.0.0-beta.55", - "web3-providers": "1.0.0-beta.55", - "web3-utils": "1.0.0-beta.55" - } - }, - "web3-shh": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.55.tgz", - "integrity": "sha512-lGP2HQ/1ThNnfoU8677aL48KsTx4Ht+2KQIn39dGpxVZqysQmovQIltbymVnAr4h8wofwcEz46iNHGa+PAyNzA==", - "requires": { - "@babel/runtime": "^7.3.1", - "web3-core": "1.0.0-beta.55", - "web3-core-helpers": "1.0.0-beta.55", - "web3-core-method": "1.0.0-beta.55", - "web3-core-subscriptions": "1.0.0-beta.55", - "web3-net": "1.0.0-beta.55", - "web3-providers": "1.0.0-beta.55", - "web3-utils": "1.0.0-beta.55" - } - }, - "web3-utils": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.55.tgz", - "integrity": "sha512-ASWqUi8gtWK02Tp8ZtcoAbHenMpQXNvHrakgzvqTNNZn26wgpv+Q4mdPi0KOR6ZgHFL8R/9b5BBoUTglS1WPpg==", - "requires": { - "@babel/runtime": "^7.3.1", - "@types/bn.js": "^4.11.4", - "@types/node": "^10.12.18", - "bn.js": "4.11.8", - "eth-lib": "0.2.8", - "ethjs-unit": "^0.1.6", - "lodash": "^4.17.11", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "2.1.1" - } - } - } - }, - "web3-bzz": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.2.tgz", - "integrity": "sha512-b1O2ObsqUN1lJxmFSjvnEC4TsaCbmh7Owj3IAIWTKqL9qhVgx7Qsu5O9cD13pBiSPNZJ68uJPaKq380QB4NWeA==", - "requires": { - "@types/node": "^10.12.18", - "got": "9.6.0", - "swarm-js": "0.1.39", - "underscore": "1.9.1" - }, - "dependencies": { - "@types/node": { - "version": "10.17.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.9.tgz", - "integrity": "sha512-+6VygF9LbG7Gaqeog2G7u1+RUcmo0q1rI+2ZxdIg2fAUngk5Vz9fOCHXdloNUOHEPd1EuuOpL5O0CdgN9Fx5UQ==" - } - } - }, - "web3-core": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.2.tgz", - "integrity": "sha512-miHAX3qUgxV+KYfaOY93Hlc3kLW2j5fH8FJy6kSxAv+d4d5aH0wwrU2IIoJylQdT+FeenQ38sgsCnFu9iZ1hCQ==", - "requires": { - "@types/bn.js": "^4.11.4", - "@types/node": "^12.6.1", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-requestmanager": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-core-helpers": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.2.tgz", - "integrity": "sha512-HJrRsIGgZa1jGUIhvGz4S5Yh6wtOIo/TMIsSLe+Xay+KVnbseJpPprDI5W3s7H2ODhMQTbogmmUFquZweW2ImQ==", - "requires": { - "underscore": "1.9.1", - "web3-eth-iban": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-core-method": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.2.tgz", - "integrity": "sha512-szR4fDSBxNHaF1DFqE+j6sFR/afv9Aa36OW93saHZnrh+iXSrYeUUDfugeNcRlugEKeUCkd4CZylfgbK2SKYJA==", - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2", - "web3-core-promievent": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-core-promievent": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.2.tgz", - "integrity": "sha512-tKvYeT8bkUfKABcQswK6/X79blKTKYGk949urZKcLvLDEaWrM3uuzDwdQT3BNKzQ3vIvTggFPX9BwYh0F1WwqQ==", - "requires": { - "any-promise": "1.3.0", - "eventemitter3": "3.1.2" - } - }, - "web3-core-requestmanager": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.2.tgz", - "integrity": "sha512-a+gSbiBRHtHvkp78U2bsntMGYGF2eCb6219aMufuZWeAZGXJ63Wc2321PCbA8hF9cQrZI4EoZ4kVLRI4OF15Hw==", - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2", - "web3-providers-http": "1.2.2", - "web3-providers-ipc": "1.2.2", - "web3-providers-ws": "1.2.2" - } - }, - "web3-core-subscriptions": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.2.tgz", - "integrity": "sha512-QbTgigNuT4eicAWWr7ahVpJyM8GbICsR1Ys9mJqzBEwpqS+RXTRVSkwZ2IsxO+iqv6liMNwGregbJLq4urMFcQ==", - "requires": { - "eventemitter3": "3.1.2", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2" - } - }, - "web3-eth": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.2.tgz", - "integrity": "sha512-UXpC74mBQvZzd4b+baD4Ocp7g+BlwxhBHumy9seyE/LMIcMlePXwCKzxve9yReNpjaU16Mmyya6ZYlyiKKV8UA==", - "requires": { - "underscore": "1.9.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-eth-abi": "1.2.2", - "web3-eth-accounts": "1.2.2", - "web3-eth-contract": "1.2.2", - "web3-eth-ens": "1.2.2", - "web3-eth-iban": "1.2.2", - "web3-eth-personal": "1.2.2", - "web3-net": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-eth-abi": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.2.tgz", - "integrity": "sha512-Yn/ZMgoOLxhTVxIYtPJ0eS6pnAnkTAaJgUJh1JhZS4ekzgswMfEYXOwpMaD5eiqPJLpuxmZFnXnBZlnQ1JMXsw==", - "requires": { - "ethers": "4.0.0-beta.3", - "underscore": "1.9.1", - "web3-utils": "1.2.2" - }, - "dependencies": { - "@types/node": { - "version": "10.17.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.9.tgz", - "integrity": "sha512-+6VygF9LbG7Gaqeog2G7u1+RUcmo0q1rI+2ZxdIg2fAUngk5Vz9fOCHXdloNUOHEPd1EuuOpL5O0CdgN9Fx5UQ==" - }, - "elliptic": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", - "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "ethers": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.3.tgz", - "integrity": "sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog==", - "requires": { - "@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.3", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - }, - "scrypt-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", - "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=" - } - } - }, - "web3-eth-accounts": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.2.tgz", - "integrity": "sha512-KzHOEyXOEZ13ZOkWN3skZKqSo5f4Z1ogPFNn9uZbKCz+kSp+gCAEKxyfbOsB/JMAp5h7o7pb6eYsPCUBJmFFiA==", - "requires": { - "any-promise": "1.3.0", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.7", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", - "scrypt-shim": "github:web3-js/scrypt-shim", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-utils": "1.2.2" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "ethereumjs-tx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.1.tgz", - "integrity": "sha512-QtVriNqowCFA19X9BCRPMgdVNJ0/gMBS91TQb1DfrhsbR748g4STwxZptFAwfqehMyrF8rDwB23w87PQwru0wA==", - "requires": { - "ethereumjs-common": "^1.3.1", - "ethereumjs-util": "^6.0.0" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - } - } - }, - "web3-eth-contract": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.2.tgz", - "integrity": "sha512-EKT2yVFws3FEdotDQoNsXTYL798+ogJqR2//CaGwx3p0/RvQIgfzEwp8nbgA6dMxCsn9KOQi7OtklzpnJMkjtA==", - "requires": { - "@types/bn.js": "^4.11.4", - "underscore": "1.9.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-promievent": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-eth-abi": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-eth-ens": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.2.tgz", - "integrity": "sha512-CFjkr2HnuyMoMFBoNUWojyguD4Ef+NkyovcnUc/iAb9GP4LHohKrODG4pl76R5u61TkJGobC2ij6TyibtsyVYg==", - "requires": { - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-promievent": "1.2.2", - "web3-eth-abi": "1.2.2", - "web3-eth-contract": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-eth-iban": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.2.tgz", - "integrity": "sha512-gxKXBoUhaTFHr0vJB/5sd4i8ejF/7gIsbM/VvemHT3tF5smnmY6hcwSMmn7sl5Gs+83XVb/BngnnGkf+I/rsrQ==", - "requires": { - "bn.js": "4.11.8", - "web3-utils": "1.2.2" - } - }, - "web3-eth-personal": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.2.tgz", - "integrity": "sha512-4w+GLvTlFqW3+q4xDUXvCEMU7kRZ+xm/iJC8gm1Li1nXxwwFbs+Y+KBK6ZYtoN1qqAnHR+plYpIoVo27ixI5Rg==", - "requires": { - "@types/node": "^12.6.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-net": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-net": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.2.tgz", - "integrity": "sha512-K07j2DXq0x4UOJgae65rWZKraOznhk8v5EGSTdFqASTx7vWE/m+NqBijBYGEsQY1lSMlVaAY9UEQlcXK5HzXTw==", - "requires": { - "web3-core": "1.2.2", - "web3-core-method": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-provider-engine": { - "version": "git+https://github.com/trufflesuite/provider-engine.git#3538c60bc4836b73ccae1ac3f64c8fed8ef19c1a", - "from": "git+https://github.com/trufflesuite/provider-engine.git#web3-one", - "requires": { - "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" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "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" - } - }, - "keccak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", - "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", - "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" - } - }, - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "web3-providers": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-providers/-/web3-providers-1.0.0-beta.55.tgz", - "integrity": "sha512-MNifc7W+iF6rykpbDR1MuX152jshWdZXHAU9Dk0Ja2/23elhIs4nCWs7wOX9FHrKgdrQbscPoq0uy+0aGzyWVQ==", - "requires": { - "@babel/runtime": "^7.3.1", - "@types/node": "^10.12.18", - "eventemitter3": "3.1.0", - "lodash": "^4.17.11", - "url-parse": "1.4.4", - "web3-core": "1.0.0-beta.55", - "web3-core-helpers": "1.0.0-beta.55", - "web3-core-method": "1.0.0-beta.55", - "web3-utils": "1.0.0-beta.55", - "websocket": "^1.0.28", - "xhr2-cookies": "1.1.0" - }, - "dependencies": { - "@types/node": { - "version": "10.17.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.9.tgz", - "integrity": "sha512-+6VygF9LbG7Gaqeog2G7u1+RUcmo0q1rI+2ZxdIg2fAUngk5Vz9fOCHXdloNUOHEPd1EuuOpL5O0CdgN9Fx5UQ==" - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==" - }, - "utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" - }, - "web3-core": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.55.tgz", - "integrity": "sha512-AMMp7TLEtE7u8IJAu/THrRhBTZyZzeo7Y6GiWYNwb5+KStC9hIGLr9cI1KX9R6ZioTOLRHrqT7awDhnJ1ku2mg==", - "requires": { - "@babel/runtime": "^7.3.1", - "@types/bn.js": "^4.11.4", - "@types/node": "^10.12.18", - "lodash": "^4.17.11", - "web3-core-method": "1.0.0-beta.55", - "web3-providers": "1.0.0-beta.55", - "web3-utils": "1.0.0-beta.55" - } - }, - "web3-core-helpers": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.55.tgz", - "integrity": "sha512-suj9Xy/lIqajaYLJTEjr2rlFgu6hGYwChHmf8+qNrC2luZA6kirTamtB9VThWMxbywx7p0bqQFjW6zXogAgWhg==", - "requires": { - "@babel/runtime": "^7.3.1", - "lodash": "^4.17.11", - "web3-core": "1.0.0-beta.55", - "web3-eth-iban": "1.0.0-beta.55", - "web3-utils": "1.0.0-beta.55" - } - }, - "web3-core-method": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.55.tgz", - "integrity": "sha512-w1cW/s2ji9qGELHk2uMJCn1ooay0JJLVoPD1nvmsW6OTRWcVjxa62nJrFQhe6P5lEb83Xk9oHgmCxZoVUHibOw==", - "requires": { - "@babel/runtime": "^7.3.1", - "eventemitter3": "3.1.0", - "lodash": "^4.17.11", - "rxjs": "^6.4.0", - "web3-core": "1.0.0-beta.55", - "web3-core-helpers": "1.0.0-beta.55", - "web3-core-subscriptions": "1.0.0-beta.55", - "web3-utils": "1.0.0-beta.55" - } - }, - "web3-core-subscriptions": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.55.tgz", - "integrity": "sha512-pb3oQbUzK7IoyXwag8TYInQddg0rr7BHxKc+Pbs/92hVNQ5ps4iGMVJKezdrjlQ1IJEEUiDIglXl4LZ1hIuMkw==", - "requires": { - "@babel/runtime": "^7.3.1", - "eventemitter3": "^3.1.0", - "lodash": "^4.17.11" - } - }, - "web3-eth-iban": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.55.tgz", - "integrity": "sha512-a2Fxsb5Mssa+jiXgjUdIzJipE0175IcQXJbZLpKft2+zeSJWNTbaa3PQD2vPPpIM4W789q06N+f9Zc0Fyls+1g==", - "requires": { - "@babel/runtime": "^7.3.1", - "bn.js": "4.11.8", - "web3-utils": "1.0.0-beta.55" - } - }, - "web3-utils": { - "version": "1.0.0-beta.55", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.55.tgz", - "integrity": "sha512-ASWqUi8gtWK02Tp8ZtcoAbHenMpQXNvHrakgzvqTNNZn26wgpv+Q4mdPi0KOR6ZgHFL8R/9b5BBoUTglS1WPpg==", - "requires": { - "@babel/runtime": "^7.3.1", - "@types/bn.js": "^4.11.4", - "@types/node": "^10.12.18", - "bn.js": "4.11.8", - "eth-lib": "0.2.8", - "ethjs-unit": "^0.1.6", - "lodash": "^4.17.11", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "2.1.1" - } - } - } - }, - "web3-providers-http": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.2.tgz", - "integrity": "sha512-BNZ7Hguy3eBszsarH5gqr9SIZNvqk9eKwqwmGH1LQS1FL3NdoOn7tgPPdddrXec4fL94CwgNk4rCU+OjjZRNDg==", - "requires": { - "web3-core-helpers": "1.2.2", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.2.tgz", - "integrity": "sha512-t97w3zi5Kn/LEWGA6D9qxoO0LBOG+lK2FjlEdCwDQatffB/+vYrzZ/CLYVQSoyFZAlsDoBasVoYSWZK1n39aHA==", - "requires": { - "oboe": "2.1.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2" - } - }, - "web3-providers-ws": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.2.tgz", - "integrity": "sha512-Wb1mrWTGMTXOpJkL0yGvL/WYLt8fUIXx8k/l52QB2IiKzvyd42dTWn4+j8IKXGSYYzOm7NMqv6nhA5VDk12VfA==", - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2", - "websocket": "github:web3-js/WebSocket-Node#polyfill/globalThis" - }, - "dependencies": { - "websocket": { - "version": "github:web3-js/WebSocket-Node#905deb4812572b344f5801f8c9ce8bb02799d82e", - "from": "github:web3-js/WebSocket-Node#polyfill/globalThis", - "requires": { - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "nan": "^2.14.0", - "typedarray-to-buffer": "^3.1.5", - "yaeti": "^0.0.6" - } - } - } - }, - "web3-shh": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.2.tgz", - "integrity": "sha512-og258NPhlBn8yYrDWjoWBBb6zo1OlBgoWGT+LL5/LPqRbjPe09hlOYHgscAAr9zZGtohTOty7RrxYw6Z6oDWCg==", - "requires": { - "web3-core": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-net": "1.2.2" - } - }, - "web3-utils": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.2.tgz", - "integrity": "sha512-joF+s3243TY5cL7Z7y4h1JsJpUCf/kmFmj+eJar7Y2yNIGVcW961VyrAms75tjUysSuHaUQ3eQXjBEUJueT52A==", - "requires": { - "bn.js": "4.11.8", - "eth-lib": "0.2.7", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - } - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "websocket": { - "version": "1.0.29", - "resolved": "github:web3-js/WebSocket-Node#905deb4812572b344f5801f8c9ce8bb02799d82e", - "requires": { - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "nan": "^2.14.0", - "typedarray-to-buffer": "^3.1.5", - "yaeti": "^0.0.6" - } - }, - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "xhr": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", - "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", - "requires": { - "global": "~4.3.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "xhr-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "requires": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" - } - }, - "xhr-request-promise": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", - "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", - "requires": { - "xhr-request": "^1.0.1" - } - }, - "xhr2-cookies": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", - "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", - "requires": { - "cookiejar": "^2.1.1" - } - }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - } - } -} diff --git a/infrastructure/eth-networks/scripts/package.json b/infrastructure/eth-networks/scripts/package.json deleted file mode 100644 index 51982e6575..0000000000 --- a/infrastructure/eth-networks/scripts/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "dependencies": { - "@truffle/hdwallet-provider": "^1.0.25", - "minimist": "^1.2.6", - "web3": "1.0.0-beta.55" - } -} diff --git a/infrastructure/eth-networks/scripts/prepare-participant-bundles.sh b/infrastructure/eth-networks/scripts/prepare-participant-bundles.sh deleted file mode 100755 index d8f563e6f5..0000000000 --- a/infrastructure/eth-networks/scripts/prepare-participant-bundles.sh +++ /dev/null @@ -1,65 +0,0 @@ -BASEDIR=$(dirname "$0") - -EXTERNAL_PARTICIPANT_PATH="${BASEDIR}/../keep-test/ropsten/participants" -EXTERNAL_PARTICIPANTS=$(ls $EXTERNAL_PARTICIPANT_PATH) - -function clean_deployment_bundles() { - echo "=====REMOVING OLD BUNDLES=====" - for participant in $EXTERNAL_PARTICIPANTS - do - echo $EXTERNAL_PARTICIPANT_PATH - PARTICIPANT_PATH="$EXTERNAL_PARTICIPANT_PATH/$participant" - CURRENT_BUNDLE=$(ls $PARTICIPANT_PATH | grep ".tar.gz") - echo $PARTICIPANT_PATH - - if [ -z $CURRENT_BUNDLE ] - then - echo "No bundle in $PARTICIPANT_PATH to remove..." - else - echo "Removing $CURRENT_BUNDLE from $PARTICIPANT_PATH..." - rm $PARTICIPANT_PATH/$CURRENT_BUNDLE - echo "Bundle removed!" - fi - done - echo "==============================\n" -} - -function create_deployment_bundles() { - echo "=====CREATING DEPLOYMENT BUNDLES=====" - DATE=$(date +%F) - - for participant in $EXTERNAL_PARTICIPANTS - do - PARTICIPANT_PATH=$EXTERNAL_PARTICIPANT_PATH/$participant - - echo "$participant" - tar -zcvf $PARTICIPANT_PATH/$DATE-keep-client-deployment-bundle.tar.gz \ - -C $BASEDIR/../../../docs/ keep-client-quickstart.adoc \ - -C ../infrastructure/eth-networks/keep-test/ropsten changelog.adoc \ - ./keep-client-snapshot.tar \ - -C ./participants/$participant config \ - ./persistence \ - ./.secrets/eth-account-password.txt - echo "==============================\n" - done -} - -function fetch_keep_client_image() { - echo "=====FETCHING LATEST KEEP-CLIENT IMAGE=====" - docker pull gcr.io/keep-test-f3e0/keep-client - echo "==============================\n" -} - -function save_keep_client_image() { - echo "=====SAVING LATEST KEEP-CLIENT IMAGE=====" - echo "This will take several seconds..." - docker save -o ../keep-test/ropsten/keep-client-snapshot.tar gcr.io/keep-test-f3e0/keep-client - echo "==============================\n" -} - -clean_deployment_bundles -fetch_keep_client_image -save_keep_client_image -create_deployment_bundles -echo "All done!" - diff --git a/infrastructure/eth-networks/scripts/stake-accounts.js b/infrastructure/eth-networks/scripts/stake-accounts.js deleted file mode 100644 index 1edec55fdd..0000000000 --- a/infrastructure/eth-networks/scripts/stake-accounts.js +++ /dev/null @@ -1,105 +0,0 @@ -const fs = require('fs'); -const Web3 = require('web3'); -const HDWalletProvider = require("@truffle/hdwallet-provider"); - -// ETH host info -const ethUrl = 'https://ropsten.infura.io/v3/59fb36a36fa4474b890c13dd30038be5'; -const ethNetworkId = '3'; - -// Contract owner info -const contractOwnerAddress = '0x923C5Dbf353e99394A21Aa7B67F3327Ca111C67D'; -const contractOwnerProvider = new HDWalletProvider(process.env.CONTRACT_OWNER_ETH_ACCOUNT_PRIVATE_KEY, ethUrl); -const authorizer = contractOwnerAddress - -// We override transactionConfirmationBlocks and transactionBlockTimeout because they're -// 25 and 50 blocks respectively at default. The result of this on small private testnets -// is long wait times for scripts to execute. -const web3_options = { - defaultBlock: 'latest', - defaultGas: 4712388, - transactionBlockTimeout: 25, - transactionConfirmationBlocks: 3, - transactionPollingTimeout: 480 -}; - -// We use the contractOwner for all web3 calls except those where the operator address is -// required. -const web3 = new Web3(contractOwnerProvider, null, web3_options); - -const operatorAddresses = [ - '0x1833a1a046db585d9c405ad93bfce085d43b2b04', - '0xb4f78caa0ad8c8c700eaac42b68e5db4f9efeddf', - '0x9f778b5d9b6e598e5a9dfb789500f6cf20e3203e', - '0xc2f4c01a446f199fce344df1167c92650651f9c0', - '0x32ce883e94ea3a75063e47064c777839aa4a0c94', - '0xca8754f7060a0648824f274e3a4d897fa497139d', - '0x8e258d2299bc1ee92ec9e70efb381d9b7c70c3d7', - '0x5c769c2a379ebd630aa8ac9f125176209f170e6d' -]; - -const contractDir = '../keep-test/ropsten' - -// Each file is sourced directly from the InitContainer. Files are generated by -// Truffle during contract and copied to the InitContainer image via Circle. -// TokenStaking -const tokenStakingContractJsonFile = `${contractDir}/TokenStaking.json`; -const tokenStakingContractParsed = JSON.parse(fs.readFileSync(tokenStakingContractJsonFile)); -const tokenStakingContractAbi = tokenStakingContractParsed.abi; -const tokenStakingContractAddress = tokenStakingContractParsed.networks[ethNetworkId].address; -const tokenStakingContract = new web3.eth.Contract(tokenStakingContractAbi, tokenStakingContractAddress); - -// KeepToken -const keepTokenContractJsonFile = `${contractDir}/KeepToken.json`; -const keepTokenContractParsed = JSON.parse(fs.readFileSync(keepTokenContractJsonFile)); -const keepTokenContractAbi = keepTokenContractParsed.abi; -const keepTokenContractAddress = keepTokenContractParsed.networks[ethNetworkId].address; -const keepTokenContract = new web3.eth.Contract(keepTokenContractAbi, keepTokenContractAddress); - -// KeepRandomBeaconOperator -const keepRandomBeaconOperatorContractJsonFile = `${contractDir}/KeepRandomBeaconOperator.json`; -const keepRandomBeaconOperatorContractParsed = JSON.parse(fs.readFileSync(keepRandomBeaconOperatorContractJsonFile)); -const keepRandomBeaconOperatorContractAddress = keepRandomBeaconOperatorContractParsed.networks[ethNetworkId].address; - -async function provisionOperatorAccount(operatorAddress, contractOwnerAddress, authorizer) { - await stakeOperatorAccount(operatorAddress, contractOwnerAddress) - await authorizeOperatorContract(operatorAddress, authorizer) -} - -async function stakeOperatorAccount(operatorAddress, contractOwnerAddress) { - - let delegation = '0x' + Buffer.concat([ - Buffer.from(contractOwnerAddress.substr(2), 'hex'), - Buffer.from(operatorAddress.substr(2), 'hex'), - Buffer.from(contractOwnerAddress.substr(2), 'hex') // authorizer - ]).toString('hex');; - - console.log(`Staking 20000000 KEEP tokens on operator account ${operatorAddress}`); - - // Current minimumStake value configured on the TokenStaking contract. - let stakeAmount = web3.utils.numberToHex('20000000000000000000000000') - - await keepTokenContract.methods.approveAndCall( - tokenStakingContract.address, - stakeAmount, - delegation).send({from: contractOwnerAddress}); - - console.log(`Account ${operatorAddress} staked!`); -}; - -async function authorizeOperatorContract(operatorAddress, authorizer) { - - console.log(`Authorizing Operator Contract ${keepRandomBeaconOperatorContractAddress} for operator account ${operatorAddress}`); - - await tokenStakingContract.methods.authorizeOperatorContract( - operatorAddress, - keepRandomBeaconOperatorContractAddress).send({from: authorizer}); - - console.log(`Account ${operatorAddress} Authorized!`); -}; - -operatorAddresses.forEach(operatorAddress => { - provisionOperatorAccount(operatorAddress, contractOwnerAddress, authorizer).catch(error => { - console.error(error); - process.exit(1); - }) -}); diff --git a/infrastructure/gcp/keep-test/google-functions/keep-faucet/.eslintrc b/infrastructure/gcp/keep-test/google-functions/keep-faucet/.eslintrc deleted file mode 100644 index 39363e69b5..0000000000 --- a/infrastructure/gcp/keep-test/google-functions/keep-faucet/.eslintrc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": ["eslint-config-keep"], - "parserOptions": { - "ecmaVersion": 2017, - "sourceType": "module" - }, - "env": { - "es6": true, - "mocha": true - } -} - diff --git a/infrastructure/gcp/keep-test/google-functions/keep-faucet/.gcloudignore b/infrastructure/gcp/keep-test/google-functions/keep-faucet/.gcloudignore deleted file mode 100644 index 9dbefdfeb4..0000000000 --- a/infrastructure/gcp/keep-test/google-functions/keep-faucet/.gcloudignore +++ /dev/null @@ -1,19 +0,0 @@ -# This file specifies files that are *not* uploaded to Google Cloud Platform -# using gcloud. It follows the same syntax as .gitignore, with the addition of -# "#!include" directives (which insert the entries of the given .gitignore-style -# file at that point). -# -# For more information, run: -# $ gcloud topic gcloudignore -# -.gcloudignore -# If you would like to upload your .git directory, .gitignore file or files -# from your .gitignore file, remove the corresponding line -# below: -.git -.gitignore - -deploy-faucet.sh -node_modules - -.eslintrc.js diff --git a/infrastructure/gcp/keep-test/google-functions/keep-faucet/deploy-faucet.sh b/infrastructure/gcp/keep-test/google-functions/keep-faucet/deploy-faucet.sh deleted file mode 100755 index 4da552c4c8..0000000000 --- a/infrastructure/gcp/keep-test/google-functions/keep-faucet/deploy-faucet.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -gcloud functions deploy keep-faucet-ropsten \ - --trigger-http \ - --runtime nodejs10 \ - --entry-point issueGrant \ - --max-instances 1 \ - --set-env-vars KEEP_CONTRACT_OWNER_ADDRESS=$KEEP_CONTRACT_OWNER_ADDRESS,KEEP_CONTRACT_OWNER_PRIVATE_KEY=$KEEP_CONTRACT_OWNER_PRIVATE_KEY,ETHEREUM_HOST=$ETHEREUM_HOST,ETHEREUM_NETWORK_ID=$ETHEREUM_NETWORK_ID diff --git a/infrastructure/gcp/keep-test/google-functions/keep-faucet/issue-grant.js b/infrastructure/gcp/keep-test/google-functions/keep-faucet/issue-grant.js deleted file mode 100644 index 58966bc131..0000000000 --- a/infrastructure/gcp/keep-test/google-functions/keep-faucet/issue-grant.js +++ /dev/null @@ -1,289 +0,0 @@ -// Function deps -const url = require("url") -const Web3 = /** @type {import('web3').default} */ ( - /** @type {unknown } */ (require("web3")) -) -const HDWalletProvider = require("@truffle/hdwallet-provider") - -/** @typedef { import('bn.js') } BN */ - -// Ethereum host info -const ethereumHost = process.env.ETHEREUM_HOST -const ethereumNetworkId = process.env.ETHEREUM_NETWORK_ID - -// Keep contract owner info -const keepContractOwnerAddress = process.env.KEEP_CONTRACT_OWNER_ADDRESS -const keepContractOwnerPrivateKey = process.env.KEEP_CONTRACT_OWNER_PRIVATE_KEY -const keepContractOwnerProvider = new HDWalletProvider( - `${keepContractOwnerPrivateKey}`, - `${ethereumHost}` -) - -// Contract artifacts -const tokenGrantJson = require("@keep-network/keep-core/artifacts/TokenGrant.json") -const keepTokenJson = require("@keep-network/keep-core/artifacts/KeepToken.json") -const permissiveStakingPolicyJson = require("@keep-network/keep-core/artifacts/PermissiveStakingPolicy.json") - -// We override transactionConfirmationBlocks and transactionBlockTimeout because they're -// 25 and 50 blocks respectively at default. The result of this on small private testnets -// is long wait times for scripts to execute. -const web3Options = { - defaultBlock: "latest", - defaultGas: 4712388, - transactionBlockTimeout: 25, - transactionConfirmationBlocks: 3, - transactionPollingTimeout: 480, - handleRevert: true, -} - -// Setup web3 provider. We use the keepContractOwner since it needs to sign the approveAndCall transaction. -const web3 = new Web3(keepContractOwnerProvider) -web3.options = web3Options - -// TokenGrant -const tokenGrantAbi = tokenGrantJson.abi -const tokenGrantAddress = tokenGrantJson.networks[ethereumNetworkId].address -const tokenGrant = new web3.eth.Contract(tokenGrantAbi, tokenGrantAddress) - -// KeepToken -const keepTokenAbi = keepTokenJson.abi -const keepTokenAddress = keepTokenJson.networks[ethereumNetworkId].address -const keepToken = new web3.eth.Contract(keepTokenAbi, keepTokenAddress) - -// PermissiveStakingPolicy -const permissiveStakingPolicyAddress = - permissiveStakingPolicyJson.networks[ethereumNetworkId].address - -const ethAccountRegExp = /^(0x)?[0-9a-f]{40}$/i -const tokenDecimalMultiplier = web3.utils.toBN(10).pow(web3.utils.toBN(18)) - -const baseGrantAmount = web3.utils.toBN(300e3) // 300k tokens -const grantAmount = baseGrantAmount.mul(tokenDecimalMultiplier) // to 18-decimal precision -const ERRORS = { - "max-keep": { - status: 400, - message: ` - Token grant failed: your account has the maximum testnet KEEP allowed.\n - You can manage your token grants at: https://dashboard.test.keep.network\n - If you have questions, you can find us on Discord: https://discord.gg/jqxBU4m\n - `, - }, - "unexpected-revert": { - status: 500, - message: ` - Unexpected revert during token grant creation:\n - {reason} - `, - }, - "unexpected-error": { - status: 500, - message: ` - Token grant failed, consider trying again.\n - If problems persist find us on Discord: https://discord.gg/jqxBU4m .\n - `, - }, -} -const SUCCESSES = { - created: ` - Created token grant with {grantAmount} KEEP for account: {granteeAccount}\n - You can follow the transaction at https://ropsten.etherscan.io/tx/{transactionHash}\n - You can manage your token grants at: https://dashboard.test.keep.network .\n - You can find us on Discord at: https://discord.gg/jqxBU4m .\n - `, -} - -const SECOND = 1 -const SECONDS = SECOND -const MINUTE = 60 * SECONDS -const MINUTES = MINUTE -const HOUR = 60 * MINUTES -const HOURS = HOUR - -exports.issueGrant = async (request, response) => { - response.type("text/plain") - try { - const requestUrl = url.parse(request.url, true) - const account = /** @type {string} */ (requestUrl.query.account) - - if (!account) { - console.error("Unspecified account.") - return response - .status(400) - .send( - "No account address set, please set an account with ?account=

    \n" - ) - } else if (!ethAccountRegExp.test(account)) { - console.error("Bad account address [", account, "].") - return response - .status(400) - .send( - "Improperly formatted account address, please correct and try again.\n" - ) - } else { - try { - const content = await issueGrant(account, grantAmount) - response.send( - SUCCESSES[content.code].replace( - /{(.*?)}/g, - (_, property) => content && content[property] - ) - ) - } catch (e) { - if (e.payload && e.payload.code && ERRORS[e.payload.code]) { - const { code, content } = e.payload - const { status, message } = ERRORS[code] || {} - console.error("Caught error issuing grant: ", e, "url: ", request.url) - response - .status(status) - .send( - (message || `unknown error with code ${code}`).replace( - /{(.*?)}/g, - (_, property) => content && content[property] - ) - ) - } else { - throw e - } - } - } - } catch (e) { - const { status, message } = ERRORS["unexpected-error"] - console.error("Caught unexpected error: ", e, "url: ", request.url) - response.status(status).send(message) - } -} - -/** - * @param {string} granteeAccount The account to issue the grant to, if the - * account currently has < the grant amount granted. - * @param {BN} grantAmount The amount to grant. - * @param {number} [currentNonce] The nonce to start with; if left off, resolved - * by calling `getTransactionCount` for the grant creator account. - * @param {number} [gasPrice] If set, the gas price to use. - */ -async function issueGrant(granteeAccount, grantAmount, currentNonce, gasPrice) { - console.log(`Fetching existing balance for account [${granteeAccount}]...`) - const existingBalance = await existingGrantBalance(granteeAccount) - console.log( - `Existing balance for account [${granteeAccount}] is [${existingBalance}].` - ) - - if (existingBalance.gte(grantAmount)) { - console.warn( - `[${granteeAccount}] requested grant while at limit. Balance: [${existingBalance}].` - ) - - throw new PayloadError({ code: "max-keep" }) - } else { - // Date.now is ms from epoch, start is seconds from epoch. - const start = web3.utils.toBN(Math.floor(Date.now() / 1000)) - const cliff = web3.utils.toBN(48 * HOURS) - // Unlock = cliff means everything unlocks at once. - const unlockingDuration = cliff - const revocable = true - - console.log( - `Submitting grant for [${grantAmount}] to [${granteeAccount}]...` - ) - const grantData = web3.eth.abi.encodeParameters( - [ - "address", - "address", - "uint256", - "uint256", - "uint256", - "bool", - "address", - ], - [ - keepContractOwnerAddress, - granteeAccount, - unlockingDuration, - start, - cliff, - revocable, - permissiveStakingPolicyAddress, - ] - ) - - const nonce = - currentNonce || - (await web3.eth.getTransactionCount(keepContractOwnerAddress, "pending")) - - console.log( - `Test submission for account ${granteeAccount} with nonce ${nonce}...` - ) - // Try calling; if this throws, we'll have a proper error message thanks - // to handleRevert above. - try { - await keepToken.methods - .approveAndCall(tokenGrantAddress, grantAmount, grantData) - .call({ from: keepContractOwnerAddress, nonce: nonce }) - } catch (e) { - e.reason = e.reason || e.message - throw new PayloadError({ code: "unexpected-revert", content: e }) - } - - return new Promise((resolve, reject) => { - // If the call didn't revert, try submitting the transaction proper. - console.log( - `Submitting transaction for account ${granteeAccount} with nonce ${nonce}...` - ) - keepToken.methods - .approveAndCall(tokenGrantAddress, grantAmount, grantData) - .send({ from: keepContractOwnerAddress, nonce: nonce }) - .on("transactionHash", (hash) => { - console.log( - `Submitted grant for [${grantAmount}] to [${granteeAccount}] ` + - `with hash [${hash}]`, - `and nonce [${nonce}]` - ) - - resolve({ - code: "created", - transactionHash: hash, - granteeAccount, - grantAmount, - }) - }) - .on("error", (error) => { - if ( - // Confirmed transaction with this nonce, so bump it. - (error.message && error.message == "nonce too low") || - // Pending transaction with this nonce, so bump it and queue up. - (error.message && - error.message == "replacement transaction underpriced") - ) { - console.error( - `Error with account grant transaction for ${granteeAccount}, ` + - `nonce too low at [${nonce}], retry at [${nonce + 1}].` - ) - console.log("Retrying transaction with higher nonce...") - resolve(issueGrant(granteeAccount, grantAmount, nonce + 1)) - } else { - reject( - new PayloadError({ code: "unexpected-error", content: error }) - ) - } - }) - }) - } -} - -/** - * @param {string} account The account whose grant balance to check. - */ -async function existingGrantBalance(account) { - const grantBalanceString = await tokenGrant.methods - .balanceOf(account) - .call({}, "pending") - - return web3.utils.toBN(grantBalanceString) -} - -class PayloadError extends Error { - constructor(payload) { - super(`Error with payload: ${JSON.stringify(payload)}`) - this.payload = payload - } -} diff --git a/infrastructure/gcp/keep-test/google-functions/keep-faucet/package-lock.json b/infrastructure/gcp/keep-test/google-functions/keep-faucet/package-lock.json deleted file mode 100644 index 27d3ceccc5..0000000000 --- a/infrastructure/gcp/keep-test/google-functions/keep-faucet/package-lock.json +++ /dev/null @@ -1,6128 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", - "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.3" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-validator-identifier": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", - "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", - "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.3", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz", - "integrity": "sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw==", - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - } - } - }, - "@ethersproject/abi": { - "version": "5.0.0-beta.153", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz", - "integrity": "sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==", - "requires": { - "@ethersproject/address": ">=5.0.0-beta.128", - "@ethersproject/bignumber": ">=5.0.0-beta.130", - "@ethersproject/bytes": ">=5.0.0-beta.129", - "@ethersproject/constants": ">=5.0.0-beta.128", - "@ethersproject/hash": ">=5.0.0-beta.128", - "@ethersproject/keccak256": ">=5.0.0-beta.127", - "@ethersproject/logger": ">=5.0.0-beta.129", - "@ethersproject/properties": ">=5.0.0-beta.131", - "@ethersproject/strings": ">=5.0.0-beta.130" - } - }, - "@ethersproject/address": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.3.tgz", - "integrity": "sha512-LMmLxL1wTNtvwgm/eegcaxtG/W7vHXKzHGUkK9KZEI9W+SfHrpT7cGX+hBcatcUXPANjS3TmOaQ+mq5JU5sGTw==", - "requires": { - "@ethersproject/bignumber": "^5.0.6", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/rlp": "^5.0.3", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bignumber": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.6.tgz", - "integrity": "sha512-fLilYOSH3DJXBrimx7PwrJdY/zAI5MGp229Mvhtcur76Lgt4qNWu9HTiwMGHP01Tkm3YP5gweF83GrQrA2tYUA==", - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bytes": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.4.tgz", - "integrity": "sha512-9R6A6l9JN8x1U4s1dJCR+9h3MZTT3xQofr/Xx8wbDvj6NnY4CbBB0o8ZgHXvR74yV90pY2EzCekpkMBJnRzkSw==", - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/constants": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.3.tgz", - "integrity": "sha512-iN7KBrA0zNFybDyrkcAPOcyU3CHXYFMd+KM2Jr07Kjg+DVB5wPpEXsOdd/K1KWFsFtGfNdPZ7QP8siLtCePXrQ==", - "requires": { - "@ethersproject/bignumber": "^5.0.6" - } - }, - "@ethersproject/hash": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.0.3.tgz", - "integrity": "sha512-KSnJyL0G9lxbOK0UPrUcaYTc/RidrX8c+kn7xnEpTmSGxqlndw4BzvQcRgYt31bOIwuFtwlWvOo6AN2tJgdQtA==", - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/strings": "^5.0.3" - } - }, - "@ethersproject/keccak256": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.3.tgz", - "integrity": "sha512-VhW3mgZMBZlETV6AyOmjNeNG+Pg68igiKkPpat8/FZl0CKnfgQ+KZQZ/ee1vT+X0IUM8/djqnei6btmtbA27Ug==", - "requires": { - "@ethersproject/bytes": "^5.0.4", - "js-sha3": "0.5.7" - } - }, - "@ethersproject/logger": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.5.tgz", - "integrity": "sha512-gJj72WGzQhUtCk6kfvI8elTaPOQyMvrMghp/nbz0ivTo39fZ7IjypFh/ySDeUSdBNplAwhzWKKejQhdpyefg/w==" - }, - "@ethersproject/properties": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.3.tgz", - "integrity": "sha512-wLCSrbywkQgTO6tIF9ZdKsH9AIxPEqAJF/z5xcPkz1DK4mMAZgAXRNw1MrKYhyb+7CqNHbj3vxenNKFavGY/IA==", - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/rlp": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.3.tgz", - "integrity": "sha512-Hz4yyA/ilGafASAqtTlLWkA/YqwhQmhbDAq2LSIp1AJNx+wtbKWFAKSckpeZ+WG/xZmT+fw5OFKK7a5IZ4DR5g==", - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/signing-key": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.4.tgz", - "integrity": "sha512-I6pJoga1IvhtjYK5yXzCjs4ZpxrVbt9ZRAlpEw0SW9UuV020YfJH5EIVEGR2evdRceS3nAQIggqbsXSkP8Y1Dg==", - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "elliptic": "6.5.3" - }, - "dependencies": { - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - } - } - }, - "@ethersproject/strings": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.0.3.tgz", - "integrity": "sha512-8kEx3+Z6cMn581yh093qnaSa8H7XzmLn6g8YFDHUpzXM7+bvXvnL2ciHrJ+EbvaMQZpej6nNtl0nm7XF4PmQHA==", - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.3", - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/transactions": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.3.tgz", - "integrity": "sha512-cqsAAFUQV6iWqfgLL7KCPNfd3pXJPDdYtE6QuBEAIpc7cgbJ7TIDCF/dN+1otfERHJIbjGSNrhh4axKRnSFswg==", - "requires": { - "@ethersproject/address": "^5.0.3", - "@ethersproject/bignumber": "^5.0.6", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.3", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/rlp": "^5.0.3", - "@ethersproject/signing-key": "^5.0.4" - } - }, - "@google-cloud/functions-framework": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@google-cloud/functions-framework/-/functions-framework-1.6.0.tgz", - "integrity": "sha512-b9dT2bAH5Y2e0Q89zFaBJoQmIxRiSeFYxHMBBTREXLWD6rs7in4M7I/hbwbXBXximDDlC1m9QGXrIwYw/7RouA==", - "dev": true, - "requires": { - "body-parser": "^1.18.3", - "express": "^4.16.4", - "minimist": "^1.2.0", - "on-finished": "^2.3.0" - } - }, - "@keep-network/keep-core": { - "version": "1.3.0-rc.1", - "resolved": "https://registry.npmjs.org/@keep-network/keep-core/-/keep-core-1.3.0-rc.1.tgz", - "integrity": "sha512-u12pMnmTRbwx7OYeZOzM3+7U4eE7tRco/FZwv/0kKVdwVFfsETVJD9s4SLOdwUrzzG13YNQHfYpD0blC2EYA3Q==", - "requires": { - "@openzeppelin/contracts-ethereum-package": "^2.4.0", - "@openzeppelin/upgrades": "^2.7.2", - "openzeppelin-solidity": "2.4.0" - } - }, - "@openzeppelin/contracts-ethereum-package": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-ethereum-package/-/contracts-ethereum-package-2.5.0.tgz", - "integrity": "sha512-14CijdTyy4Y/3D3UUeFC2oW12nt1Yq1M8gFOtkuODEvSYPe3YSAKnKyhUeGf0UDNCZzwfGr15KdiFK6AoJjoSQ==" - }, - "@openzeppelin/upgrades": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades/-/upgrades-2.8.0.tgz", - "integrity": "sha512-LzjTQPeljPsgHDPdZyH9cMCbIHZILgd2cpNcYEkdsC2IylBYRHShlbEDXJV9snnqg9JWfzPiKIqyj3XVliwtqQ==", - "requires": { - "@types/cbor": "^2.0.0", - "axios": "^0.18.0", - "bignumber.js": "^7.2.0", - "cbor": "^4.1.5", - "chalk": "^2.4.1", - "ethers": "^4.0.20", - "glob": "^7.1.3", - "lodash": "^4.17.15", - "semver": "^5.5.1", - "spinnies": "^0.4.2", - "truffle-flattener": "^1.4.0", - "web3": "1.2.2", - "web3-eth": "1.2.2", - "web3-eth-contract": "1.2.2", - "web3-utils": "1.2.2" - }, - "dependencies": { - "@types/node": { - "version": "12.12.54", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.54.tgz", - "integrity": "sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "web3": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.2.tgz", - "integrity": "sha512-/ChbmB6qZpfGx6eNpczt5YSUBHEA5V2+iUCbn85EVb3Zv6FVxrOo5Tv7Lw0gE2tW7EEjASbCyp3mZeiZaCCngg==", - "requires": { - "@types/node": "^12.6.1", - "web3-bzz": "1.2.2", - "web3-core": "1.2.2", - "web3-eth": "1.2.2", - "web3-eth-personal": "1.2.2", - "web3-net": "1.2.2", - "web3-shh": "1.2.2", - "web3-utils": "1.2.2" - } - } - } - }, - "@resolver-engine/core": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@resolver-engine/core/-/core-0.2.1.tgz", - "integrity": "sha512-nsLQHmPJ77QuifqsIvqjaF5B9aHnDzJjp73Q1z6apY3e9nqYrx4Dtowhpsf7Jwftg/XzVDEMQC+OzUBNTS+S1A==", - "requires": { - "debug": "^3.1.0", - "request": "^2.85.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "@resolver-engine/fs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.2.1.tgz", - "integrity": "sha512-7kJInM1Qo2LJcKyDhuYzh9ZWd+mal/fynfL9BNjWOiTcOpX+jNfqb/UmGUqros5pceBITlWGqS4lU709yHFUbg==", - "requires": { - "@resolver-engine/core": "^0.2.1", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "@resolver-engine/imports": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.2.2.tgz", - "integrity": "sha512-u5/HUkvo8q34AA+hnxxqqXGfby5swnH0Myw91o3Sm2TETJlNKXibFGSKBavAH+wvWdBi4Z5gS2Odu0PowgVOUg==", - "requires": { - "@resolver-engine/core": "^0.2.1", - "debug": "^3.1.0", - "hosted-git-info": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "@resolver-engine/imports-fs": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.2.2.tgz", - "integrity": "sha512-gFCgMvCwyppjwq0UzIjde/WI+yDs3oatJhozG9xdjJdewwtd7LiF0T5i9lrHAUtqrQbqoFE4E+ZMRVHWpWHpKQ==", - "requires": { - "@resolver-engine/fs": "^0.2.1", - "@resolver-engine/imports": "^0.2.2", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" - }, - "@solidity-parser/parser": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.6.2.tgz", - "integrity": "sha512-kUVUvrqttndeprLoXjI5arWHeiP3uh4XODAKbG+ZaWHCVQeelxCbnXBeWxZ2BPHdXgH0xR9dU1b916JhDhbgAA==" - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@truffle/hdwallet-provider": { - "version": "1.0.43", - "resolved": "https://registry.npmjs.org/@truffle/hdwallet-provider/-/hdwallet-provider-1.0.43.tgz", - "integrity": "sha512-BzHkHh5K096JycwhalAj2lO5ia6K422zegni17d4N2889jxNw7qdC4GhvofbTLpxkVkVFBLP37++x7mCSC7T5w==", - "requires": { - "@trufflesuite/web3-provider-engine": "15.0.13-1", - "@types/web3": "^1.0.20", - "any-promise": "^1.3.0", - "bindings": "^1.5.0", - "ethereum-cryptography": "^0.1.3", - "ethereum-protocol": "^1.0.1", - "ethereumjs-tx": "^1.0.0", - "ethereumjs-util": "^6.1.0", - "ethereumjs-wallet": "^0.6.3", - "source-map-support": "^0.5.19" - }, - "dependencies": { - "ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=" - }, - "ethereumjs-tx": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", - "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - } - } - }, - "@trufflesuite/eth-json-rpc-filters": { - "version": "4.1.2-1", - "resolved": "https://registry.npmjs.org/@trufflesuite/eth-json-rpc-filters/-/eth-json-rpc-filters-4.1.2-1.tgz", - "integrity": "sha512-/MChvC5dw2ck9NU1cZmdovCz2VKbOeIyR4tcxDvA5sT+NaL0rA2/R5U0yI7zsbo1zD+pgqav77rQHTzpUdDNJQ==", - "requires": { - "@trufflesuite/eth-json-rpc-middleware": "^4.4.2-0", - "await-semaphore": "^0.1.3", - "eth-query": "^2.1.2", - "json-rpc-engine": "^5.1.3", - "lodash.flatmap": "^4.5.0", - "safe-event-emitter": "^1.0.1" - } - }, - "@trufflesuite/eth-json-rpc-infura": { - "version": "4.0.3-0", - "resolved": "https://registry.npmjs.org/@trufflesuite/eth-json-rpc-infura/-/eth-json-rpc-infura-4.0.3-0.tgz", - "integrity": "sha512-xaUanOmo0YLqRsL0SfXpFienhdw5bpQ1WEXxMTRi57az4lwpZBv4tFUDvcerdwJrxX9wQqNmgUgd1BrR01dumw==", - "requires": { - "@trufflesuite/eth-json-rpc-middleware": "^4.4.2-1", - "cross-fetch": "^2.1.1", - "eth-json-rpc-errors": "^1.0.1", - "json-rpc-engine": "^5.1.3" - }, - "dependencies": { - "eth-json-rpc-errors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/eth-json-rpc-errors/-/eth-json-rpc-errors-1.1.1.tgz", - "integrity": "sha512-WT5shJ5KfNqHi9jOZD+ID8I1kuYWNrigtZat7GOQkvwo99f8SzAVaEcWhJUv656WiZOAg3P1RiJQANtUmDmbIg==", - "requires": { - "fast-safe-stringify": "^2.0.6" - } - } - } - }, - "@trufflesuite/eth-json-rpc-middleware": { - "version": "4.4.2-1", - "resolved": "https://registry.npmjs.org/@trufflesuite/eth-json-rpc-middleware/-/eth-json-rpc-middleware-4.4.2-1.tgz", - "integrity": "sha512-iEy9H8ja7/8aYES5HfrepGBKU9n/Y4OabBJEklVd/zIBlhCCBAWBqkIZgXt11nBXO/rYAeKwYuE3puH3ByYnLA==", - "requires": { - "@trufflesuite/eth-sig-util": "^1.4.2", - "btoa": "^1.2.1", - "clone": "^2.1.1", - "eth-json-rpc-errors": "^1.0.1", - "eth-query": "^2.1.2", - "ethereumjs-block": "^1.6.0", - "ethereumjs-tx": "^1.3.7", - "ethereumjs-util": "^5.1.2", - "ethereumjs-vm": "^2.6.0", - "fetch-ponyfill": "^4.0.0", - "json-rpc-engine": "^5.1.3", - "json-stable-stringify": "^1.0.1", - "pify": "^3.0.0", - "safe-event-emitter": "^1.0.1" - }, - "dependencies": { - "eth-json-rpc-errors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/eth-json-rpc-errors/-/eth-json-rpc-errors-1.1.1.tgz", - "integrity": "sha512-WT5shJ5KfNqHi9jOZD+ID8I1kuYWNrigtZat7GOQkvwo99f8SzAVaEcWhJUv656WiZOAg3P1RiJQANtUmDmbIg==", - "requires": { - "fast-safe-stringify": "^2.0.6" - } - }, - "ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=" - }, - "ethereumjs-tx": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", - "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "@trufflesuite/eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@trufflesuite/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha512-+GyfN6b0LNW77hbQlH3ufZ/1eCON7mMrGym6tdYf7xiNw9Vv3jBO72bmmos1EId2NgBvPMhmYYm6DSLQFTmzrA==", - "requires": { - "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^5.1.1" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "@trufflesuite/web3-provider-engine": { - "version": "15.0.13-1", - "resolved": "https://registry.npmjs.org/@trufflesuite/web3-provider-engine/-/web3-provider-engine-15.0.13-1.tgz", - "integrity": "sha512-6u3x/iIN5fyj8pib5QTUDmIOUiwAGhaqdSTXdqCu6v9zo2BEwdCqgEJd1uXDh3DBmPRDfiZ/ge8oUPy7LerpHg==", - "requires": { - "@trufflesuite/eth-json-rpc-filters": "^4.1.2-1", - "@trufflesuite/eth-json-rpc-infura": "^4.0.3-0", - "@trufflesuite/eth-json-rpc-middleware": "^4.4.2-1", - "@trufflesuite/eth-sig-util": "^1.4.2", - "async": "^2.5.0", - "backoff": "^2.5.0", - "clone": "^2.0.0", - "cross-fetch": "^2.1.0", - "eth-block-tracker": "^4.4.2", - "eth-json-rpc-errors": "^2.0.2", - "ethereumjs-block": "^1.2.2", - "ethereumjs-tx": "^1.2.0", - "ethereumjs-util": "^5.1.5", - "ethereumjs-vm": "^2.3.4", - "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" - }, - "dependencies": { - "ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=" - }, - "ethereumjs-tx": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", - "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "requires": { - "@types/node": "*" - } - }, - "@types/cbor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/cbor/-/cbor-2.0.0.tgz", - "integrity": "sha1-xievwu4i8j8jN/7LNGKKT5fGr7s=", - "requires": { - "@types/node": "*" - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "@types/node": { - "version": "13.1.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.1.7.tgz", - "integrity": "sha512-HU0q9GXazqiKwviVxg9SI/+t/nAsGkvLDkIdxz+ObejG2nX6Si00TeLqHMoS+a/1tjH7a8YpKVQwtgHuMQsldg==" - }, - "@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/secp256k1": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.1.tgz", - "integrity": "sha512-+ZjSA8ELlOp8SlKi0YLB2tz9d5iPNEmOBd+8Rz21wTMdaXQIa9b6TEnD6l5qKOCypE7FSyPyck12qZJxSDNoog==", - "requires": { - "@types/node": "*" - } - }, - "@types/web3": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/web3/-/web3-1.2.2.tgz", - "integrity": "sha512-eFiYJKggNrOl0nsD+9cMh2MLk4zVBfXfGnVeRFbpiZzBE20eet4KLA3fXcjSuHaBn0RnQzwLAGdgzgzdet4C0A==", - "requires": { - "web3": "*" - } - }, - "abstract-leveldown": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", - "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", - "requires": { - "xtend": "~4.0.0" - } - }, - "acorn": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", - "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", - "dev": true - }, - "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", - "dev": true - }, - "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "dependencies": { - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - } - } - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - }, - "async-eventemitter": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", - "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "requires": { - "async": "^2.4.0" - } - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "await-semaphore": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/await-semaphore/-/await-semaphore-0.1.3.tgz", - "integrity": "sha512-d1W2aNSYcz/sxYO4pMGX9vq65qOTu0P800epMud+6cYYX0QcT7zyqcxec3VWzpgvdXo57UWmVbZpLMjX2m1I7Q==" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" - }, - "axios": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", - "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", - "requires": { - "follow-redirects": "1.5.10", - "is-buffer": "^2.0.2" - } - }, - "backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", - "requires": { - "precond": "0.2" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base-x": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", - "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bignumber.js": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", - "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bip66": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "blakejs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz", - "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=" - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", - "requires": { - "base-x": "^3.0.2" - } - }, - "bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "btoa": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==" - }, - "buffer": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", - "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "bufferutil": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.1.tgz", - "integrity": "sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA==", - "requires": { - "node-gyp-build": "~3.7.0" - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "cbor": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-4.3.0.tgz", - "integrity": "sha512-CvzaxQlaJVa88sdtTWvLJ++MbdtPHtZOBBNjm7h3YKUHILMs9nQyD4AC6hvFZy7GBVB3I6bRibJcxeHydyT2IQ==", - "requires": { - "bignumber.js": "^9.0.0", - "commander": "^3.0.0", - "json-text-sequence": "^0.1", - "nofilter": "^1.0.3" - }, - "dependencies": { - "bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" - } - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "checkpoint-store": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", - "integrity": "sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=", - "requires": { - "functional-red-black-tree": "^1.0.1" - } - }, - "cids": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", - "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", - "requires": { - "buffer": "^5.5.0", - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "^1.0.0", - "multihashes": "~0.4.15" - }, - "dependencies": { - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "multicodec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", - "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", - "requires": { - "buffer": "^5.6.0", - "varint": "^5.0.0" - } - } - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-is": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "content-hash": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", - "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", - "requires": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-fetch": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.6.tgz", - "integrity": "sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA==", - "requires": { - "node-fetch": "^2.6.7", - "whatwg-fetch": "^2.0.4" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - } - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==" - }, - "decompress": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", - "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", - "requires": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "requires": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - } - }, - "decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "requires": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" - }, - "dependencies": { - "file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" - } - } - }, - "decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "requires": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" - } - }, - "decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", - "requires": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" - }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" - }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - } - } - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "defer-to-connect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.1.tgz", - "integrity": "sha512-J7thop4u3mRTkYRQ+Vpfwy2G5Ehoy82I14+14W4YMDLKdWloI9gSzRbV30s/NckQGVJtPkWNcW4oMAUigTdqiQ==" - }, - "deferred-leveldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", - "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", - "requires": { - "abstract-leveldown": "~2.6.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delimit-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", - "integrity": "sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" - }, - "drbg.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", - "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", - "requires": { - "browserify-aes": "^1.0.6", - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "requires": { - "prr": "~1.0.1" - } - }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "eslint-config-google": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.13.0.tgz", - "integrity": "sha512-ELgMdOIpn0CFdsQS+FuxO+Ttu4p+aLaXHv9wA9yVnzqlUGV7oN/eRRnJekk7TCur6Cu2FXX0fqfIXRBaM14lpQ==", - "dev": true - }, - "eslint-config-keep": { - "version": "github:keep-network/eslint-config-keep#fed0f9a92d4bb4abbf738266d7521b56a08987ee", - "from": "github:keep-network/eslint-config-keep#0.3.0", - "dev": true, - "requires": { - "eslint-config-google": "^0.13.0", - "eslint-config-prettier": "^6.10.0", - "eslint-plugin-no-only-tests": "^2.3.1", - "eslint-plugin-prettier": "^3.1.2" - } - }, - "eslint-config-prettier": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", - "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", - "dev": true, - "requires": { - "get-stdin": "^6.0.0" - } - }, - "eslint-plugin-no-only-tests": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.6.0.tgz", - "integrity": "sha512-T9SmE/g6UV1uZo1oHAqOvL86XWl7Pl2EpRpnLI8g/bkJu+h7XBCB+1LnubRZ2CUQXj805vh4/CYZdnqtVaEo2Q==", - "dev": true - }, - "eslint-plugin-prettier": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", - "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", - "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "eth-block-tracker": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz", - "integrity": "sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw==", - "requires": { - "@babel/plugin-transform-runtime": "^7.5.5", - "@babel/runtime": "^7.5.5", - "eth-query": "^2.1.0", - "json-rpc-random-id": "^1.0.1", - "pify": "^3.0.0", - "safe-event-emitter": "^1.0.1" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=", - "requires": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" - } - }, - "eth-json-rpc-errors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eth-json-rpc-errors/-/eth-json-rpc-errors-2.0.2.tgz", - "integrity": "sha512-uBCRM2w2ewusRHGxN8JhcuOb2RN3ueAOYH/0BhqdFmQkZx5lj5+fLKTz0mIVOzd4FG5/kUksCzCD7eTEim6gaA==", - "requires": { - "fast-safe-stringify": "^2.0.6" - } - }, - "eth-lib": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", - "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" - } - }, - "eth-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", - "integrity": "sha1-1nQdkAAQa1FRDHLbktY2VFam2l4=", - "requires": { - "json-rpc-random-id": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "eth-rpc-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz", - "integrity": "sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg==", - "requires": { - "fast-safe-stringify": "^2.0.6" - } - }, - "ethereum-bloom-filters": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.6.tgz", - "integrity": "sha512-dE9CGNzgOOsdh7msZirvv8qjHtnHpvBlKe2647kM8v+yeF71IRso55jpojemvHV+jMjr48irPWxMRaHuOWzAFA==", - "requires": { - "js-sha3": "^0.8.0" - }, - "dependencies": { - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - } - } - }, - "ethereum-common": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", - "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==" - }, - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - }, - "dependencies": { - "node-gyp-build": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", - "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==" - }, - "scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, - "secp256k1": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", - "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", - "requires": { - "elliptic": "^6.5.2", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - } - } - }, - "ethereum-protocol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ethereum-protocol/-/ethereum-protocol-1.0.1.tgz", - "integrity": "sha512-3KLX1mHuEsBW0dKG+c6EOJS1NBNqdCICvZW9sInmZTt5aY0oxmHVggYRE0lJu1tcnMD1K+AKHdLi6U43Awm1Vg==" - }, - "ethereumjs-abi": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", - "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-account": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", - "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", - "requires": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "ethereumjs-block": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", - "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", - "requires": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereumjs-tx": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", - "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - }, - "dependencies": { - "ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=" - } - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "ethereumjs-common": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz", - "integrity": "sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ==" - }, - "ethereumjs-tx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", - "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-util": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz", - "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==", - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^2.0.0", - "rlp": "^2.2.3", - "secp256k1": "^3.0.1" - }, - "dependencies": { - "keccak": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", - "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==", - "requires": { - "bindings": "^1.5.0", - "inherits": "^2.0.4", - "nan": "^2.14.0", - "safe-buffer": "^5.2.0" - } - } - } - }, - "ethereumjs-vm": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", - "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-block": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", - "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - } - } - }, - "ethereumjs-wallet": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz", - "integrity": "sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA==", - "requires": { - "aes-js": "^3.1.1", - "bs58check": "^2.1.2", - "ethereum-cryptography": "^0.1.3", - "ethereumjs-util": "^6.0.0", - "randombytes": "^2.0.6", - "safe-buffer": "^5.1.2", - "scryptsy": "^1.2.1", - "utf8": "^3.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "aes-js": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" - }, - "scryptsy": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", - "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", - "requires": { - "pbkdf2": "^3.0.3" - } - } - } - }, - "ethers": { - "version": "4.0.48", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.48.tgz", - "integrity": "sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g==", - "requires": { - "aes-js": "3.0.0", - "bn.js": "^4.4.0", - "elliptic": "6.5.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" - }, - "dependencies": { - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" - } - } - }, - "ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", - "requires": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" - }, - "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==" - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - } - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fake-merkle-patricia-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz", - "integrity": "sha1-S4w6z7Ugr635hgsfFM2M40As3dM=", - "requires": { - "checkpoint-store": "^1.1.0" - } - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "requires": { - "pend": "~1.2.0" - } - }, - "fetch-ponyfill": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz", - "integrity": "sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=", - "requires": { - "node-fetch": "~1.7.1" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "requires": { - "debug": "=3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "requires": { - "min-document": "^2.19.0", - "process": "~0.5.1" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", - "requires": { - "punycode": "2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" - } - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==" - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "inquirer": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.2.0.tgz", - "integrity": "sha512-E0c4rPwr9ByePfNlTIB8z51kK1s2n6jrHuJeEHENl/sbq2G/S1auvibgEwNR4uSyiU+PiYHqSwsgGiXjG8p5ZQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz", - "integrity": "sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw=" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" - }, - "is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, - "json-rpc-engine": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-5.3.0.tgz", - "integrity": "sha512-+diJ9s8rxB+fbJhT7ZEf8r8spaLRignLd8jTgQ/h5JSGppAHGtNMZtCoabipCaleR1B3GTGxbXBOqhaJSGmPGQ==", - "requires": { - "eth-rpc-errors": "^3.0.0", - "safe-event-emitter": "^1.0.1" - } - }, - "json-rpc-random-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", - "integrity": "sha1-uknZat7RRE27jaPSA3SKy7zeyMg=" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json-text-sequence": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", - "integrity": "sha1-py8hfcSvxGKf/1/rME3BvVGi89I=", - "requires": { - "delimit-stream": "0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "keccak": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", - "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", - "requires": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "dependencies": { - "node-gyp-build": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", - "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==" - } - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "requires": { - "json-buffer": "3.0.0" - } - }, - "level-codec": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", - "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" - }, - "level-errors": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", - "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", - "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", - "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "level-ws": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", - "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", - "requires": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "levelup": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", - "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", - "requires": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - }, - "dependencies": { - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - } - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.flatmap": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.flatmap/-/lodash.flatmap-4.5.0.tgz", - "integrity": "sha1-74y/QI9uSCaGYzRTBcaswLd4cC4=" - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, - "ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=" - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memdown": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", - "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", - "requires": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", - "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", - "requires": { - "xtend": "~4.0.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merkle-patricia-tree": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", - "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", - "requires": { - "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" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" - }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "requires": { - "mime-db": "1.43.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "requires": { - "dom-walk": "^0.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", - "requires": { - "mkdirp": "*" - } - }, - "mock-fs": { - "version": "4.10.4", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.10.4.tgz", - "integrity": "sha512-gDfZDLaPIvtOusbusLinfx6YSe2YpQsDT8qdP41P47dQ/NQggtkHukz7hwqgt8QvMBmAv+Z6DGmXPyb5BWX2nQ==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multibase": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", - "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", - "requires": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - }, - "dependencies": { - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - } - } - }, - "multicodec": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", - "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", - "requires": { - "varint": "^5.0.0" - } - }, - "multihashes": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", - "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", - "requires": { - "buffer": "^5.5.0", - "multibase": "^0.7.0", - "varint": "^5.0.0" - }, - "dependencies": { - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "multibase": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", - "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", - "requires": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - } - } - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - }, - "nano-json-stream-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" - }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, - "node-gyp-build": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.7.0.tgz", - "integrity": "sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w==" - }, - "nofilter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", - "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==" - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" - }, - "number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", - "requires": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" - }, - "oboe": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz", - "integrity": "sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=", - "requires": { - "http-https": "^1.0.0" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "openzeppelin-solidity": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/openzeppelin-solidity/-/openzeppelin-solidity-2.4.0.tgz", - "integrity": "sha512-533gc5jkspxW5YT0qJo02Za5q1LHwXK9CJCc48jNj/22ncNM/3M/3JfWLqfpB90uqLwOKOovpl0JfaMQTR+gXQ==" - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "requires": { - "p-finally": "^1.0.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-headers": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", - "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, - "prettier": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", - "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-to-callback": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz", - "integrity": "sha1-XSp0kBC/tn2WNZj805YHRqaP7vc=", - "requires": { - "is-fn": "^1.0.0", - "set-immediate-shim": "^1.0.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "psl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", - "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" - }, - "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rlp": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.4.tgz", - "integrity": "sha512-fdq2yYCWpAQBhwkZv+Z8o/Z4sPmYm1CUq6P7n6lVTOdb949CnqA0sndXal5C1NleSVSZm6q5F3iEbauyVln/iw==", - "requires": { - "bn.js": "^4.11.1" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" - }, - "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" - }, - "safe-event-emitter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz", - "integrity": "sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==", - "requires": { - "events": "^3.0.0" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" - }, - "secp256k1": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz", - "integrity": "sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==", - "requires": { - "bindings": "^1.5.0", - "bip66": "^1.1.5", - "bn.js": "^4.11.8", - "create-hash": "^1.2.0", - "drbg.js": "^1.0.1", - "elliptic": "^6.5.2", - "nan": "^2.14.0", - "safe-buffer": "^5.1.2" - } - }, - "seek-bzip": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", - "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", - "requires": { - "commander": "^2.8.1" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - } - } - }, - "semaphore": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", - "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==" - }, - "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", - "dev": true - }, - "servify": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", - "requires": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" - } - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" - }, - "simple-get": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", - "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", - "requires": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spinnies": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/spinnies/-/spinnies-0.4.3.tgz", - "integrity": "sha512-TTA2vWXrXJpfThWAl2t2hchBnCMI1JM5Wmb2uyI7Zkefdw/xO98LDy6/SBYwQPiYXL3swx3Eb44ZxgoS8X5wpA==", - "requires": { - "chalk": "^2.4.2", - "cli-cursor": "^3.0.0", - "strip-ansi": "^5.2.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "requires": { - "is-natural-number": "^4.0.1" - } - }, - "strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", - "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "swarm-js": { - "version": "0.1.39", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.39.tgz", - "integrity": "sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg==", - "requires": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "decompress": "^4.0.0", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request-promise": "^0.1.2" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - } - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { - "prepend-http": "^1.0.1" - } - } - } - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tar": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", - "requires": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "truffle-flattener": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/truffle-flattener/-/truffle-flattener-1.4.4.tgz", - "integrity": "sha512-S/WmvubzlUj1mn56wEI6yo1bmPpKDNdEe5rtyVC1C5iNfZWobD/V69pAYI15IBDJrDqUyh+iXgpTkzov50zpQw==", - "requires": { - "@resolver-engine/imports-fs": "^0.2.2", - "@solidity-parser/parser": "^0.6.0", - "find-up": "^2.1.0", - "mkdirp": "^1.0.4", - "tsort": "0.0.1" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - } - } - }, - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - }, - "tsort": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y=" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" - }, - "unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "^2.1.0" - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "requires": { - "prepend-http": "^2.0.0" - } - }, - "url-set-query": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" - }, - "utf-8-validate": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.2.tgz", - "integrity": "sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw==", - "requires": { - "node-gyp-build": "~3.7.0" - } - }, - "utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" - }, - "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", - "dev": true - }, - "varint": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", - "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "web3": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.11.tgz", - "integrity": "sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ==", - "requires": { - "web3-bzz": "1.2.11", - "web3-core": "1.2.11", - "web3-eth": "1.2.11", - "web3-eth-personal": "1.2.11", - "web3-net": "1.2.11", - "web3-shh": "1.2.11", - "web3-utils": "1.2.11" - }, - "dependencies": { - "@types/node": { - "version": "12.12.54", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.54.tgz", - "integrity": "sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w==" - }, - "bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" - }, - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - }, - "ethereumjs-tx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", - "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, - "swarm-js": { - "version": "0.1.40", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", - "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", - "requires": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - }, - "dependencies": { - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - } - } - } - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { - "prepend-http": "^1.0.1" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, - "web3-bzz": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.11.tgz", - "integrity": "sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg==", - "requires": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40", - "underscore": "1.9.1" - } - }, - "web3-core": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.11.tgz", - "integrity": "sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ==", - "requires": { - "@types/bn.js": "^4.11.5", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-requestmanager": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-core-helpers": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz", - "integrity": "sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A==", - "requires": { - "underscore": "1.9.1", - "web3-eth-iban": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-core-method": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.11.tgz", - "integrity": "sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw==", - "requires": { - "@ethersproject/transactions": "^5.0.0-beta.135", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-core-promievent": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz", - "integrity": "sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA==", - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-core-requestmanager": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz", - "integrity": "sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA==", - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "web3-providers-http": "1.2.11", - "web3-providers-ipc": "1.2.11", - "web3-providers-ws": "1.2.11" - } - }, - "web3-core-subscriptions": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz", - "integrity": "sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg==", - "requires": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11" - } - }, - "web3-eth": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.11.tgz", - "integrity": "sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ==", - "requires": { - "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-eth-accounts": "1.2.11", - "web3-eth-contract": "1.2.11", - "web3-eth-ens": "1.2.11", - "web3-eth-iban": "1.2.11", - "web3-eth-personal": "1.2.11", - "web3-net": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-eth-abi": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz", - "integrity": "sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg==", - "requires": { - "@ethersproject/abi": "5.0.0-beta.153", - "underscore": "1.9.1", - "web3-utils": "1.2.11" - } - }, - "web3-eth-accounts": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz", - "integrity": "sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw==", - "requires": { - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", - "scrypt-js": "^3.0.1", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-utils": "1.2.11" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - } - } - }, - "web3-eth-contract": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz", - "integrity": "sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow==", - "requires": { - "@types/bn.js": "^4.11.5", - "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-eth-ens": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz", - "integrity": "sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA==", - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-eth-contract": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-eth-iban": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz", - "integrity": "sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ==", - "requires": { - "bn.js": "^4.11.9", - "web3-utils": "1.2.11" - } - }, - "web3-eth-personal": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz", - "integrity": "sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw==", - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-net": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-net": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.11.tgz", - "integrity": "sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg==", - "requires": { - "web3-core": "1.2.11", - "web3-core-method": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-providers-http": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.11.tgz", - "integrity": "sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA==", - "requires": { - "web3-core-helpers": "1.2.11", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz", - "integrity": "sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ==", - "requires": { - "oboe": "2.1.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11" - } - }, - "web3-providers-ws": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz", - "integrity": "sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg==", - "requires": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "websocket": "^1.0.31" - } - }, - "web3-shh": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.11.tgz", - "integrity": "sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg==", - "requires": { - "web3-core": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-net": "1.2.11" - } - }, - "web3-utils": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz", - "integrity": "sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==", - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - } - } - }, - "websocket": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.32.tgz", - "integrity": "sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q==", - "requires": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - } - } - } - }, - "web3-bzz": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.2.tgz", - "integrity": "sha512-b1O2ObsqUN1lJxmFSjvnEC4TsaCbmh7Owj3IAIWTKqL9qhVgx7Qsu5O9cD13pBiSPNZJ68uJPaKq380QB4NWeA==", - "requires": { - "@types/node": "^10.12.18", - "got": "9.6.0", - "swarm-js": "0.1.39", - "underscore": "1.9.1" - }, - "dependencies": { - "@types/node": { - "version": "10.17.28", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.28.tgz", - "integrity": "sha512-dzjES1Egb4c1a89C7lKwQh8pwjYmlOAG9dW1pBgxEk57tMrLnssOfEthz8kdkNaBd7lIqQx7APm5+mZ619IiCQ==" - } - } - }, - "web3-core": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.2.tgz", - "integrity": "sha512-miHAX3qUgxV+KYfaOY93Hlc3kLW2j5fH8FJy6kSxAv+d4d5aH0wwrU2IIoJylQdT+FeenQ38sgsCnFu9iZ1hCQ==", - "requires": { - "@types/bn.js": "^4.11.4", - "@types/node": "^12.6.1", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-requestmanager": "1.2.2", - "web3-utils": "1.2.2" - }, - "dependencies": { - "@types/node": { - "version": "12.12.54", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.54.tgz", - "integrity": "sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w==" - } - } - }, - "web3-core-helpers": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.2.tgz", - "integrity": "sha512-HJrRsIGgZa1jGUIhvGz4S5Yh6wtOIo/TMIsSLe+Xay+KVnbseJpPprDI5W3s7H2ODhMQTbogmmUFquZweW2ImQ==", - "requires": { - "underscore": "1.9.1", - "web3-eth-iban": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-core-method": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.2.tgz", - "integrity": "sha512-szR4fDSBxNHaF1DFqE+j6sFR/afv9Aa36OW93saHZnrh+iXSrYeUUDfugeNcRlugEKeUCkd4CZylfgbK2SKYJA==", - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2", - "web3-core-promievent": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-core-promievent": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.2.tgz", - "integrity": "sha512-tKvYeT8bkUfKABcQswK6/X79blKTKYGk949urZKcLvLDEaWrM3uuzDwdQT3BNKzQ3vIvTggFPX9BwYh0F1WwqQ==", - "requires": { - "any-promise": "1.3.0", - "eventemitter3": "3.1.2" - } - }, - "web3-core-requestmanager": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.2.tgz", - "integrity": "sha512-a+gSbiBRHtHvkp78U2bsntMGYGF2eCb6219aMufuZWeAZGXJ63Wc2321PCbA8hF9cQrZI4EoZ4kVLRI4OF15Hw==", - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2", - "web3-providers-http": "1.2.2", - "web3-providers-ipc": "1.2.2", - "web3-providers-ws": "1.2.2" - } - }, - "web3-core-subscriptions": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.2.tgz", - "integrity": "sha512-QbTgigNuT4eicAWWr7ahVpJyM8GbICsR1Ys9mJqzBEwpqS+RXTRVSkwZ2IsxO+iqv6liMNwGregbJLq4urMFcQ==", - "requires": { - "eventemitter3": "3.1.2", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2" - } - }, - "web3-eth": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.2.tgz", - "integrity": "sha512-UXpC74mBQvZzd4b+baD4Ocp7g+BlwxhBHumy9seyE/LMIcMlePXwCKzxve9yReNpjaU16Mmyya6ZYlyiKKV8UA==", - "requires": { - "underscore": "1.9.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-eth-abi": "1.2.2", - "web3-eth-accounts": "1.2.2", - "web3-eth-contract": "1.2.2", - "web3-eth-ens": "1.2.2", - "web3-eth-iban": "1.2.2", - "web3-eth-personal": "1.2.2", - "web3-net": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-eth-abi": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.2.tgz", - "integrity": "sha512-Yn/ZMgoOLxhTVxIYtPJ0eS6pnAnkTAaJgUJh1JhZS4ekzgswMfEYXOwpMaD5eiqPJLpuxmZFnXnBZlnQ1JMXsw==", - "requires": { - "ethers": "4.0.0-beta.3", - "underscore": "1.9.1", - "web3-utils": "1.2.2" - }, - "dependencies": { - "@types/node": { - "version": "10.17.28", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.28.tgz", - "integrity": "sha512-dzjES1Egb4c1a89C7lKwQh8pwjYmlOAG9dW1pBgxEk57tMrLnssOfEthz8kdkNaBd7lIqQx7APm5+mZ619IiCQ==" - }, - "elliptic": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", - "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "ethers": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.3.tgz", - "integrity": "sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog==", - "requires": { - "@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.3", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "scrypt-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", - "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=" - }, - "setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" - } - } - }, - "web3-eth-accounts": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.2.tgz", - "integrity": "sha512-KzHOEyXOEZ13ZOkWN3skZKqSo5f4Z1ogPFNn9uZbKCz+kSp+gCAEKxyfbOsB/JMAp5h7o7pb6eYsPCUBJmFFiA==", - "requires": { - "any-promise": "1.3.0", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.7", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-utils": "1.2.2" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - } - } - }, - "web3-eth-contract": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.2.tgz", - "integrity": "sha512-EKT2yVFws3FEdotDQoNsXTYL798+ogJqR2//CaGwx3p0/RvQIgfzEwp8nbgA6dMxCsn9KOQi7OtklzpnJMkjtA==", - "requires": { - "@types/bn.js": "^4.11.4", - "underscore": "1.9.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-promievent": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-eth-abi": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-eth-ens": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.2.tgz", - "integrity": "sha512-CFjkr2HnuyMoMFBoNUWojyguD4Ef+NkyovcnUc/iAb9GP4LHohKrODG4pl76R5u61TkJGobC2ij6TyibtsyVYg==", - "requires": { - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-promievent": "1.2.2", - "web3-eth-abi": "1.2.2", - "web3-eth-contract": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-eth-iban": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.2.tgz", - "integrity": "sha512-gxKXBoUhaTFHr0vJB/5sd4i8ejF/7gIsbM/VvemHT3tF5smnmY6hcwSMmn7sl5Gs+83XVb/BngnnGkf+I/rsrQ==", - "requires": { - "bn.js": "4.11.8", - "web3-utils": "1.2.2" - } - }, - "web3-eth-personal": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.2.tgz", - "integrity": "sha512-4w+GLvTlFqW3+q4xDUXvCEMU7kRZ+xm/iJC8gm1Li1nXxwwFbs+Y+KBK6ZYtoN1qqAnHR+plYpIoVo27ixI5Rg==", - "requires": { - "@types/node": "^12.6.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-net": "1.2.2", - "web3-utils": "1.2.2" - }, - "dependencies": { - "@types/node": { - "version": "12.12.54", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.54.tgz", - "integrity": "sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w==" - } - } - }, - "web3-net": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.2.tgz", - "integrity": "sha512-K07j2DXq0x4UOJgae65rWZKraOznhk8v5EGSTdFqASTx7vWE/m+NqBijBYGEsQY1lSMlVaAY9UEQlcXK5HzXTw==", - "requires": { - "web3-core": "1.2.2", - "web3-core-method": "1.2.2", - "web3-utils": "1.2.2" - } - }, - "web3-providers-http": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.2.tgz", - "integrity": "sha512-BNZ7Hguy3eBszsarH5gqr9SIZNvqk9eKwqwmGH1LQS1FL3NdoOn7tgPPdddrXec4fL94CwgNk4rCU+OjjZRNDg==", - "requires": { - "web3-core-helpers": "1.2.2", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.2.tgz", - "integrity": "sha512-t97w3zi5Kn/LEWGA6D9qxoO0LBOG+lK2FjlEdCwDQatffB/+vYrzZ/CLYVQSoyFZAlsDoBasVoYSWZK1n39aHA==", - "requires": { - "oboe": "2.1.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2" - } - }, - "web3-providers-ws": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.2.tgz", - "integrity": "sha512-Wb1mrWTGMTXOpJkL0yGvL/WYLt8fUIXx8k/l52QB2IiKzvyd42dTWn4+j8IKXGSYYzOm7NMqv6nhA5VDk12VfA==", - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.2", - "websocket": "github:web3-js/WebSocket-Node#polyfill/globalThis" - } - }, - "web3-shh": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.2.tgz", - "integrity": "sha512-og258NPhlBn8yYrDWjoWBBb6zo1OlBgoWGT+LL5/LPqRbjPe09hlOYHgscAAr9zZGtohTOty7RrxYw6Z6oDWCg==", - "requires": { - "web3-core": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-net": "1.2.2" - } - }, - "web3-utils": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.2.tgz", - "integrity": "sha512-joF+s3243TY5cL7Z7y4h1JsJpUCf/kmFmj+eJar7Y2yNIGVcW961VyrAms75tjUysSuHaUQ3eQXjBEUJueT52A==", - "requires": { - "bn.js": "4.11.8", - "eth-lib": "0.2.7", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - } - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "websocket": { - "version": "github:web3-js/WebSocket-Node#ef5ea2f41daf4a2113b80c9223df884b4d56c400", - "from": "github:web3-js/WebSocket-Node#polyfill/globalThis", - "requires": { - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "nan": "^2.14.0", - "typedarray-to-buffer": "^3.1.5", - "yaeti": "^0.0.6" - } - }, - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "xhr": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", - "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", - "requires": { - "global": "~4.3.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "xhr-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "requires": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" - } - }, - "xhr-request-promise": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", - "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", - "requires": { - "xhr-request": "^1.0.1" - } - }, - "xhr2-cookies": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", - "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", - "requires": { - "cookiejar": "^2.1.1" - } - }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - } - } -} diff --git a/infrastructure/gcp/keep-test/google-functions/keep-faucet/package.json b/infrastructure/gcp/keep-test/google-functions/keep-faucet/package.json deleted file mode 100644 index 7ed8097878..0000000000 --- a/infrastructure/gcp/keep-test/google-functions/keep-faucet/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "main": "issue-grant.js", - "dependencies": { - "@keep-network/keep-core": ">1.3.0-rc <1.3.0", - "@truffle/hdwallet-provider": "^1.0.43", - "web3": "1.2.11" - }, - "devDependencies": { - "@google-cloud/functions-framework": "^1.6.0", - "eslint": "^6.8.0", - "eslint-config-keep": "github:keep-network/eslint-config-keep#0.3.0", - "prettier": "^2.0.2" - }, - "scripts": { - "start": "functions-framework --target=issueGrant", - "lint:js": "eslint issue-grant.js", - "lint:fix:js": "eslint --fix issue-grant.js" - } -} diff --git a/infrastructure/kube/keep-dev/eth-miner-ropsten-p2p-tcp-service.yaml b/infrastructure/kube/keep-dev/eth-miner-ropsten-p2p-tcp-service.yaml deleted file mode 100644 index 4d0517a2d2..0000000000 --- a/infrastructure/kube/keep-dev/eth-miner-ropsten-p2p-tcp-service.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: ropsten-miner-p2p-tcp - namespace: default - labels: - app: geth - type: ropsten-miner -spec: - type: LoadBalancer - loadBalancerIP: 35.238.26.96 - ports: - - name: tcp-p2p-30303 - port: 30303 - targetPort: 30303 - selector: - app: geth - type: ropsten-miner diff --git a/infrastructure/kube/keep-dev/eth-miner-ropsten-p2p-udp-service.yaml b/infrastructure/kube/keep-dev/eth-miner-ropsten-p2p-udp-service.yaml deleted file mode 100644 index 3b3af0eda0..0000000000 --- a/infrastructure/kube/keep-dev/eth-miner-ropsten-p2p-udp-service.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: eth-miner-p2p-udp - namespace: default - labels: - app: geth - type: ropsten-miner -spec: - type: LoadBalancer - loadBalancerIP: 35.238.26.96 - ports: - - name: udp-p2p-30303 - port: 30303 - targetPort: 30303 - protocol: UDP - selector: - app: geth - type: ropsten-miner diff --git a/infrastructure/kube/keep-dev/eth-miner-ropsten-rpc-ws-service.yaml b/infrastructure/kube/keep-dev/eth-miner-ropsten-rpc-ws-service.yaml deleted file mode 100644 index 354ae787a8..0000000000 --- a/infrastructure/kube/keep-dev/eth-miner-ropsten-rpc-ws-service.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: ropsten-miner-rpc-ws - namespace: default - labels: - app: geth - type: ropsten-miner -spec: - ports: - - name: tcp-rpc-8545 - port: 8545 - targetPort: 8545 - - name: tcp-ws-8546 - port: 8546 - targetPort: 8546 - selector: - app: geth - type: ropsten-miner diff --git a/infrastructure/kube/keep-dev/eth-miner-ropsten-statefulset.yaml b/infrastructure/kube/keep-dev/eth-miner-ropsten-statefulset.yaml deleted file mode 100644 index 88dc4e9e9f..0000000000 --- a/infrastructure/kube/keep-dev/eth-miner-ropsten-statefulset.yaml +++ /dev/null @@ -1,42 +0,0 @@ ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: ropsten-miner - namespace: default -spec: - replicas: 1 - serviceName: ropsten-miner - volumeClaimTemplates: - - metadata: - name: ropsten-miner - spec: - accessModes: [ReadWriteOnce] - storageClassName: ropsten-miner - resources: - requests: - storage: 500Gi - selector: - matchLabels: - app: geth - type: ropsten-miner - template: - metadata: - labels: - app: geth - type: ropsten-miner - spec: - containers: - - name: miner - image: ethereum/client-go:v1.9.12 - ports: - - containerPort: 8545 - - containerPort: 8546 - - containerPort: 30303 - volumeMounts: - - name: ropsten-miner - mountPath: /root/.ethereum - args: ["--testnet", "--networkid=3", "--datadir=/root/.ethereum", "--syncmode=fast", "--rpc", "--rpcapi=eth,web3,personal,admin,net,miner", "--rpcport=8545", "--rpcaddr=0.0.0.0", "--rpccorsdomain=\"\"", "--rpcvhosts=*", "--ws", "--wsport=8546", "--wsaddr=0.0.0.0", "--wsorigins=*", --mine, --minerthreads=2, --miner.etherbase=0xF7886F29Ffc82D349E3a9131a463Ba0eD35b7C58] - nodeSelector: - pool-type: eth-ropsten - diff --git a/infrastructure/kube/keep-dev/eth-miner-ropsten-storageclass.yaml b/infrastructure/kube/keep-dev/eth-miner-ropsten-storageclass.yaml deleted file mode 100644 index 40de75b15d..0000000000 --- a/infrastructure/kube/keep-dev/eth-miner-ropsten-storageclass.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: storage.k8s.io/v1 -kind: StorageClass -metadata: - name: ropsten-miner - namespace: default -provisioner: kubernetes.io/gce-pd -parameters: - type: pd-ssd - replication-type: none -reclaimPolicy: Retain -allowVolumeExpansion: true -mountOptions: - - debug -volumeBindingMode: Immediate diff --git a/infrastructure/kube/keep-dev/eth-network-ropsten-configmap.yaml b/infrastructure/kube/keep-dev/eth-network-ropsten-configmap.yaml deleted file mode 100644 index 79a236ee53..0000000000 --- a/infrastructure/kube/keep-dev/eth-network-ropsten-configmap.yaml +++ /dev/null @@ -1,10 +0,0 @@ -kind: ConfigMap -apiVersion: v1 -metadata: - name: eth-network-ropsten - namespace: default -data: - rpc-url: http://eth-tx-ropsten.test.keep.network:8545 - ws-url: ws://eth-tx-ropsten.test.keep.network:8546 - network-id: '3' - contract-owner-eth-account-address: '0x923c5dbf353e99394a21aa7b67f3327ca111c67d' diff --git a/infrastructure/kube/keep-dev/eth-tx-ropsten-p2p-tcp-service.yaml b/infrastructure/kube/keep-dev/eth-tx-ropsten-p2p-tcp-service.yaml deleted file mode 100644 index 54be06b9bf..0000000000 --- a/infrastructure/kube/keep-dev/eth-tx-ropsten-p2p-tcp-service.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: eth-tx-p2p-tcp - namespace: ropsten - labels: - app: geth - type: tx -spec: - type: LoadBalancer - loadBalancerIP: 35.193.141.192 - ports: - - name: tcp-p2p-30303 - port: 30303 - targetPort: 30303 - selector: - app: geth - type: tx diff --git a/infrastructure/kube/keep-dev/eth-tx-ropsten-p2p-udp-service.yaml b/infrastructure/kube/keep-dev/eth-tx-ropsten-p2p-udp-service.yaml deleted file mode 100644 index 86a01a6136..0000000000 --- a/infrastructure/kube/keep-dev/eth-tx-ropsten-p2p-udp-service.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: eth-tx-p2p-udp - namespace: ropsten - labels: - app: geth - type: tx -spec: - type: LoadBalancer - loadBalancerIP: 35.193.141.192 - ports: - - name: udp-p2p-30303 - port: 30303 - targetPort: 30303 - protocol: UDP - selector: - app: geth - type: tx diff --git a/infrastructure/kube/keep-dev/eth-tx-ropsten-rpc-ws-service.yaml b/infrastructure/kube/keep-dev/eth-tx-ropsten-rpc-ws-service.yaml deleted file mode 100644 index a7d861834d..0000000000 --- a/infrastructure/kube/keep-dev/eth-tx-ropsten-rpc-ws-service.yaml +++ /dev/null @@ -1,20 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: eth-tx-rpc-ws - namespace: ropsten - labels: - app: geth - type: tx -spec: - type: LoadBalancer - ports: - - name: tcp-rpc-8545 - port: 8545 - targetPort: 8545 - - name: tcp-ws-8546 - port: 8546 - targetPort: 8546 - selector: - app: geth - type: tx diff --git a/infrastructure/kube/keep-dev/eth-tx-ropsten-statefulset.yaml b/infrastructure/kube/keep-dev/eth-tx-ropsten-statefulset.yaml deleted file mode 100644 index efea0685ff..0000000000 --- a/infrastructure/kube/keep-dev/eth-tx-ropsten-statefulset.yaml +++ /dev/null @@ -1,40 +0,0 @@ ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: eth-tx - namespace: ropsten -spec: - replicas: 1 - serviceName: eth-tx - volumeClaimTemplates: - - metadata: - name: eth-tx - spec: - accessModes: [ReadWriteOnce] - storageClassName: eth-tx - resources: - requests: - storage: 100Gi - selector: - matchLabels: - app: geth - type: tx - template: - metadata: - labels: - app: geth - type: tx - spec: - containers: - - name: tx - image: ethereum/client-go:v1.9.9 - ports: - - containerPort: 8545 - - containerPort: 8546 - - containerPort: 30303 - volumeMounts: - - name: eth-tx - mountPath: /root/.ethereum - args: ["--testnet", "--networkid=3", "--datadir=/root/.ethereum", "--syncmode=fast", "--txpool.accountslots=128", "--txpool.accountqueue=512", "--whitelist=6485846=0x43f0cd1e5b1f9c4d5cda26c240b59ee4f1b510d0a185aa8fd476d091b0097a80", "--rpc", "--rpcapi=eth,web3,personal,admin,net", "--rpcport=8545", "--rpcaddr=0.0.0.0", "--rpccorsdomain=\"\"", "--rpcvhosts=*", "--ws", "--wsport=8546", "--wsaddr=0.0.0.0", "--wsorigins=*"] - diff --git a/infrastructure/kube/keep-dev/eth-tx-ropsten-storageclass.yaml b/infrastructure/kube/keep-dev/eth-tx-ropsten-storageclass.yaml deleted file mode 100644 index dc02ff5edf..0000000000 --- a/infrastructure/kube/keep-dev/eth-tx-ropsten-storageclass.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: storage.k8s.io/v1 -kind: StorageClass -metadata: - name: eth-tx - namespace: ropsten -provisioner: kubernetes.io/gce-pd -parameters: - type: pd-ssd - replication-type: none -reclaimPolicy: Retain -allowVolumeExpansion: true -mountOptions: - - debug -volumeBindingMode: Immediate diff --git a/infrastructure/terraform/keep-dev/main.tf b/infrastructure/terraform/keep-dev/main.tf index 5a97122a66..f436f8eb57 100644 --- a/infrastructure/terraform/keep-dev/main.tf +++ b/infrastructure/terraform/keep-dev/main.tf @@ -144,22 +144,6 @@ module "gke_cluster" { labels = "${local.labels}" } -resource "google_compute_address" "eth_tx_ropsten_loadbalancer_ip" { - name = "${var.eth_tx_ropsten_loadbalancer_name}" - project = "${module.project.project_id}" - region = "${var.region_data["region"]}" - address_type = "${upper(var.eth_tx_ropsten_loadbalancer_address_type)}" - labels = "${local.labels}" -} - -resource "google_compute_address" "eth_miner_ropsten_loadbalancer_ip" { - name = "${var.eth_miner_ropsten_loadbalancer_name}" - project = "${module.project.project_id}" - region = "${var.region_data["region"]}" - address_type = "${upper(var.eth_miner_ropsten_loadbalancer_address_type)}" - labels = "${local.labels}" -} - /* Using this module will create a data read and an update for the * prometheus-to-sd resource on each Terraform planand apply run. These * updates will do nothing and are an artifact of the depends_on in the diff --git a/infrastructure/terraform/keep-dev/outputs.tf b/infrastructure/terraform/keep-dev/outputs.tf index b7dc6ba34a..27c86fc22a 100644 --- a/infrastructure/terraform/keep-dev/outputs.tf +++ b/infrastructure/terraform/keep-dev/outputs.tf @@ -77,7 +77,3 @@ output "nat_gateway_zone_b_route_tag" { output "nat_gateway_zone_c_route_tag" { value = "${module.nat_gateway_zone_c.routing_tag_zonal}" } - -output "eth_tx_ropsten_loadbalancer_external_ip" { - value = "${google_compute_address.eth_tx_ropsten_loadbalancer_ip.address}" -} diff --git a/infrastructure/terraform/keep-dev/variables.tf b/infrastructure/terraform/keep-dev/variables.tf index cc771c5472..2136a9be3e 100644 --- a/infrastructure/terraform/keep-dev/variables.tf +++ b/infrastructure/terraform/keep-dev/variables.tf @@ -168,26 +168,6 @@ variable "gke_subnet" { } } -variable "eth_tx_ropsten_loadbalancer_name" { - description = "The name for your ropsten tx node IP." - default = "keep-dev-eth-tx-ropsten-loadbalancer-external-ip" -} - -variable "eth_tx_ropsten_loadbalancer_address_type" { - description = "Internet facing or not. internal or external" - default = "external" -} - -variable "eth_miner_ropsten_loadbalancer_name" { - description = "The name for your ropsten miner IP." - default = "keep-dev-eth-miner-ropsten-loadbalancer-external-ip" -} - -variable "eth_miner_ropsten_loadbalancer_address_type" { - description = "Internet facing or not. internal or external" - default = "external" -} - # gke_metrics variable "gke_metrics_namespace" { default = "metrics"