diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..f270456 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,15 @@ +module.exports = { + env: { + browser: true, + commonjs: true, + es2021: true, + mocha: true, // for test files + "truffle/globals": true, // same as "truffle/truffle": true + }, + extends: "prettier", + parserOptions: { + ecmaVersion: 2020, + }, + rules: {}, + plugins: ["truffle"], +}; diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..52031de --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.sol linguist-language=Solidity diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml new file mode 100644 index 0000000..7a2097e --- /dev/null +++ b/.github/workflows/node.js.yml @@ -0,0 +1,33 @@ +# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: Node.js CI + +on: + push: + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [10.x, 12.x, 14.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + - name: Installing Packages + run: npm ci + - name: Checking Formatting + run: npm run lint && npm run prettier-check + - name: Code Coverage + run: npm run coverage + - name: Coveralls GitHub Action + uses: coverallsapp/github-action@1.1.3 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 6704566..0f9a45e 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,14 @@ dist # TernJS port file .tern-port + +# Custom +cache +build +artifacts +.vscode +coverage +coverage.json +.DS_Store +ORIGINS.code-workspace +__pycache__ \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..2de3bfd --- /dev/null +++ b/.prettierignore @@ -0,0 +1,18 @@ +__pycache__ +.DS_Store +.history +.hypothesis/ +artifacts/ +build/ +reports/ +node_modules/ +!.solhint.json +package-lock.json +coverage +coverage.json +docs +truffle-config.js +package.json +cache +brownie-config.yaml +.vscode \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..f3005b7 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,15 @@ +{ + "overrides": [ + { + "files": ["*.sol", "*.js", "*.test.js", "*.json"], + "options": { + "printWidth": 140, + "tabWidth": 4, + "useTabs": true, + "singleQuote": false, + "bracketSpacing": true, + "explicitTypes": "always" + } + } + ] +} diff --git a/.solcover.js b/.solcover.js new file mode 100644 index 0000000..9a79e9f --- /dev/null +++ b/.solcover.js @@ -0,0 +1,3 @@ +module.exports = { + skipFiles: ["Sovryn", "Openzeppelin", "Interfaces"], +}; diff --git a/.solhint.json b/.solhint.json new file mode 100644 index 0000000..6dade57 --- /dev/null +++ b/.solhint.json @@ -0,0 +1,9 @@ +{ + "extends": "solhint:recommended", + "plugins": ["prettier"], + "rules": { + "prettier/prettier": "error", + "max-line-length": ["warn", 140], + "compiler-version": ["warn"] + } +} diff --git a/.solhintignore b/.solhintignore new file mode 100644 index 0000000..9a3b82f --- /dev/null +++ b/.solhintignore @@ -0,0 +1,2 @@ +contracts/Openzeppelin +contracts/Sovryn \ No newline at end of file diff --git a/Inheritance.svg b/Inheritance.svg new file mode 100644 index 0000000..34addf1 --- /dev/null +++ b/Inheritance.svg @@ -0,0 +1,527 @@ + + + + + + +G + + + +OriginsBase + +OriginsBase + + + +IOrigins + +IOrigins + + + +OriginsBase->IOrigins + + + + + +OriginsEvents + +OriginsEvents + + + +OriginsBase->OriginsEvents + + + + + +OriginsAdmin + +OriginsAdmin + + + +OriginsEvents->OriginsAdmin + + + + + +OriginsStorage + +OriginsStorage + + + +OriginsAdmin->OriginsStorage + + + + + +IERC20 + +IERC20 + + + +SafeMath + +SafeMath + + + +ILockedFund + +ILockedFund + + + +RSKAddrValidator + +RSKAddrValidator + + + +FeeSharingProxyMockup + +FeeSharingProxyMockup + + + +FeeSharingProxy + +FeeSharingProxy + + + +FeeSharingProxyMockup->FeeSharingProxy + + + + + +SafeMath96 + +SafeMath96 + + + +FeeSharingProxy->SafeMath96 + + + + + +IFeeSharingProxy + +IFeeSharingProxy + + + +FeeSharingProxy->IFeeSharingProxy + + + + + +IProtocol + +IProtocol + + + +ILoanToken + +ILoanToken + + + +SafeERC20 + +SafeERC20 + + + +Address + +Address + + + +IStaking + +IStaking + + + +ErrorDecoder + +ErrorDecoder + + + +Staking + +Staking + + + +Staking->IStaking + + + + + +WeightedStaking + +WeightedStaking + + + +Staking->WeightedStaking + + + + + +ApprovalReceiver + +ApprovalReceiver + + + +Staking->ApprovalReceiver + + + + + +Checkpoints + +Checkpoints + + + +WeightedStaking->Checkpoints + + + + + +ApprovalReceiver->ErrorDecoder + + + + + +IApproveAndCall + +IApproveAndCall + + + +ApprovalReceiver->IApproveAndCall + + + + + +Checkpoints->SafeMath96 + + + + + +StakingStorage + +StakingStorage + + + +Checkpoints->StakingStorage + + + + + +Ownable + +Ownable + + + +StakingStorage->Ownable + + + + + +Context + +Context + + + +Ownable->Context + + + + + +ITeamVesting + +ITeamVesting + + + +IVesting + +IVesting + + + +StakingProxy + +StakingProxy + + + +StakingProxy->StakingStorage + + + + + +UpgradableProxy + +UpgradableProxy + + + +StakingProxy->UpgradableProxy + + + + + +Proxy + +Proxy + + + +UpgradableProxy->Proxy + + + + + +MultiSigWallet + +MultiSigWallet + + + +Token + +Token + + + +Token->Ownable + + + + + +ERC20 + +ERC20 + + + +Token->ERC20 + + + + + +ERC20Detailed + +ERC20Detailed + + + +Token->ERC20Detailed + + + + + +ERC20->Context + + + + + +IERC20_ + +IERC20_ + + + +ERC20->IERC20_ + + + + + +ERC20Detailed->ERC20 + + + + + +IVestingFactory + +IVestingFactory + + + +VestingRegistry3 + +VestingRegistry3 + + + +VestingRegistry3->Ownable + + + + + +IVestingLogic + +IVestingLogic + + + +VestingStorage + +VestingStorage + + + +IVestingLogic->VestingStorage + + + + + +VestingStorage->Ownable + + + + + +VestingFactory + +VestingFactory + + + +VestingFactory->Ownable + + + + + +VestingFactory->IVestingFactory + + + + + +Vesting + +Vesting + + + +TeamVesting + +TeamVesting + + + +Vesting->TeamVesting + + + + + +TeamVesting->Proxy + + + + + +TeamVesting->VestingStorage + + + + + +VestingLogic + +VestingLogic + + + +VestingLogic->ApprovalReceiver + + + + + +VestingLogic->IVesting + + + + + +VestingLogic->VestingStorage + + + + + +IVestingRegistry + +IVestingRegistry + + + +LockedFund + +LockedFund + + + +LockedFund->ILockedFund + + + + + +ReentrancyGuard + +ReentrancyGuard + + + \ No newline at end of file diff --git a/README.md b/README.md index 92fb621..c6ef046 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,134 @@ -# origins +# Origins + The Origins Platform Smart Contracts + +## Badges + +Version & Tag: + +[![NPM Package](https://img.shields.io/npm/v/origins-launchpad.svg?style=flat)](https://www.npmjs.org/package/origins-launchpad) +![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/DistributedCollective/origins) + +Issue & PR: + +![GitHub issues](https://img.shields.io/github/issues/DistributedCollective/origins) +![GitHub pull requests](https://img.shields.io/github/issues-pr/DistributedCollective/origins) + +CI & Code Coverage: + +[![Node.js CI](https://github.com/DistributedCollective/origins/actions/workflows/node.js.yml/badge.svg)](https://github.com/DistributedCollective/origins/actions/workflows/node.js.yml) +[![Coverage Status](https://coveralls.io/repos/github/DistributedCollective/origins/badge.svg?branch=main)](https://coveralls.io/github/DistributedCollective/origins?branch=main) + +Code Style: + +[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat)](https://github.com/prettier/prettier) + +Metrics & Activity: + +![GitHub language count](https://img.shields.io/github/languages/count/DistributedCollective/origins) +![GitHub commit activity](https://img.shields.io/github/commit-activity/y/DistributedCollective/origins) +![GitHub last commit](https://img.shields.io/github/last-commit/DistributedCollective/origins) + +## Main Contracts + +- OriginsStorage +- OriginsAdmin +- OriginsEvents +- OriginsBase +- LockedFund + +### OriginsStorage + +A contract with all the storage of `OriginsBase`. Basically acts as the harddisk of the system. + +### OriginsAdmin + +A basic contract with currently two main roles: + +- Owner +- Verifier + +An owner has the right on major decision making functions. The owner has too many rights, including the withdrawal of proceedings, thus it is recommended to use a multisig for the same. + +A Verifier currently has the right to add any address as verified. To make someone a verifier, owner should call the `addVerifier` function in OriginsAdmin. + +### OriginsEvents + +A contract with all the events of `OriginsBase` listed in it. + +### OriginsBase + +This is the main contract which does all the major works. Each sale is a Tier. And a single contract will be enough to do multiple sales of a unique Token. + +The proceedings of the raised amount could be taken by the owner or a pre-set deposit address. + +Tier creation could be done with a single function call, or can be done by multiple calls. Individual Tier parameters can be edited as well based on Tier ID. + +Verification of participants at the moment can be done by address. And any verifier can add address and tiers for which the address is approved. Verification Type also gives freedom to pass anyone, thus allowing a public sale. + +Sale time is also dependent on two different methods mainly, one is duration (calculated from the start time) or the end timestamp itself. Another method is until supply last as well. + +Deposit asset can be either RBTC or any other ERC20 Compliant Token as well, and it can be unique for each tier also. + +Transfer Type can be: + +- `None`, Transfer hasn't set yet. This is default. +- `Unlocked`, Tokens are unlocked immediately +- `WaitedUnlock`, which means the unlock will happen after a certain period +- `Locked`, which means the tokens will be a linear vesting +- `Vested`, which is tokens vested linearly, but the difference being the voting power in Governance. + +The current version only support None, Unlocked, Waited Unlock and Vested for now. + +The contract also keeps track of participating wallets per tier, the number of tokens sold per tier, etc. + +### LockedFund + +Currently it's functionality is limited to vest tokens and withdraw tokens after a certain time period. In the future, it will allow for further features like locked tokens and unlocked tokens, etc. + +For Vesting, it uses the contracts of `Sovryn-smart-contract` repo. The registry used in this case with be `VestingRegistry3`. + +## Call Graph + +![Call Graph](callGraph.svg) + +P.S. It is a simple project, isn't it? + +## UML Diagram + +![UML Diagram](UML.svg) + +## Inheritance + +![Inheritance](Inheritance.svg) + +## Deployment + +Deployment README's are mentioned in the scripts folder. There are mainly two. + +- Origins - The script contains all the Origins and LockedFund related deployment and interaction script. +- Token - The script contains all the Token, Governance, Staking, Vesting, etc related deployment and interaction script. + +### Deployment Parameters + +Please make sure to read the README mentioned in the scripts folder before running it. + +## Assumptions + +- Admin has a lot of power, and is assumed to be the right, fair and just person/party. It is highly advised to have a multisig as admin, rather than just a EOA. + +## Limitations + +- If the deposit asset price is lower than the token which is sold, currently that is not possible with this system. A simple solution is to have a divisor constant or a numerator & denominator system instead of the rate system. +- LockedFund can only have a single cliff and duration per person. Tier based system would be much better when the vesting registry is updated (waiting for a PR to be merged in Sovryn). +- Address can only be validated, and cannot be invalidated. Adding a simple function should suffice. To be done in the next update. + +## Improvements + +- NFT Based Sale. +- Decoupling Tier for lesser gas usage and minimize the stack too deep error. +- Fee for use of Origins platform (Contracts, UI and Setup). +- Maybe a single contract can act as the platform if instead of different tiers based on ID, the tiers are based on token address (which is to be sold), thus having multiple tiers based on that. So, a single contract can handle multiple sales at once with multiple tiers. This can only be done after struct decoupling and gas profiling of each function and possible gas saving methods added. +- Total unique wallets participated in all tiers. Currently only unique wallets participated in a each tier is counted, which is not the same as unique wallets participated in all tiers combined. New storage structure will be required. +- Tests related to other type of sales to be added. +- Reduce the reason string text size, or use a numbering system with errors in mainly LockedFund and OriginsBase. diff --git a/UML.svg b/UML.svg new file mode 100644 index 0000000..4519124 --- /dev/null +++ b/UML.svg @@ -0,0 +1,1768 @@ + + + + + + +UmlClassDiagram + + + +5 + +<<Interface>> +IApproveAndCall + + + +External: +     receiveApproval(_sender: address, _amount: uint256, _token: address, _data: bytes) + + + +6 + +<<Abstract>> +IERC20 + +Public: +   name: string +   decimals: uint8 +   symbol: string + +Public: +    <<abstract>> totalSupply(): uint256 +    <<abstract>> balanceOf(_who: address): uint256 +    <<abstract>> allowance(_owner: address, _spender: address): uint256 +    <<abstract>> approve(_spender: address, _value: uint256): bool +    <<abstract>> transfer(_to: address, _value: uint256): bool +    <<abstract>> transferFrom(_from: address, _to: address, _value: uint256): bool +    <<event>> Transfer(from: address, to: address, value: uint256) +    <<event>> Approval(owner: address, spender: address, value: uint256) + + + +7 + +<<Interface>> +IFeeSharingProxy + + + +External: +     withdrawFees(_token: address) +     transferTokens(_token: address, _amount: uint96) +     withdraw(_loanPoolToken: address, _maxCheckpoints: uint32, _receiver: address) + + + +8 + +<<Abstract>> +ILockedFund + + + +External: +    <<abstract>> addAdmin(_newAdmin: address) +    <<abstract>> removeAdmin(_adminToRemove: address) +    <<abstract>> withdrawWaitedUnlockedBalance(_receiverAddress: address) +    <<abstract>> createVestingAndStake() +    <<abstract>> createVesting(): (_vestingAddress: address) +    <<abstract>> stakeTokens() +    <<abstract>> withdrawAndStakeTokens(_receiverAddress: address) +Public: +    <<abstract>> changeVestingRegistry(_vestingRegistry: address) +    <<abstract>> changeWaitedTS(_waitedTS: uint256) +    <<abstract>> depositVested(_userAddress: address, _amount: uint256, _cliff: uint256, _duration: uint256, _basisPoint: uint256, _unlockedOrWaited: uint256) +    <<abstract>> depositLocked(_userAddress: address, _amount: uint256, _cliff: uint256, _duration: uint256, _basisPoint: uint256, _unlockedOrWaited: uint256) +    <<abstract>> depositWaitedUnlocked(_userAddress: address, _amount: uint256, _basisPoint: uint256) + + + +9 + +<<Abstract>> +IOrigins + + + +External: +    <<abstract>> setDepositAddress(_depositAddress: address) +    <<abstract>> setLockedFund(_lockedFund: address) +    <<abstract>> createTier(_maxAmount: uint256, _remainingTokens: uint256, _saleStartTS: uint256, _saleEnd: uint256, _unlockedBP: uint256, _vestOrLockCliff: uint256, _vestOrLockDuration: uint256, _depositRate: uint256, _depositType: uint256, _verificationType: uint256, _saleEndDurationOrTS: uint256, _transferType: uint256): (_tierID: uint256) +    <<abstract>> setTierVerification(_tierID: uint256, _verificationType: uint256) +    <<abstract>> setTierDeposit(_tierID: uint256, _depositRate: uint256, _depositToken: address, _depositType: uint256) +    <<abstract>> setTierTokenLimit(_tierID: uint256, _minAmount: uint256, _maxAmount: uint256) +    <<abstract>> setTierTokenAmount(_tierID: uint256, _remainingTokens: uint256) +    <<abstract>> setTierVestOrLock(_tierID: uint256, _vestOrLockCliff: uint256, _vestOrLockDuration: uint256, _unlockedBP: uint256, _transferType: uint256) +    <<abstract>> setTierTime(_tierID: uint256, _saleStartTS: uint256, _saleEnd: uint256, _saleEndDurationOrTS: uint256) +    <<abstract>> addressVerification(_addressToBeVerified: address, _tierID: uint256) +    <<abstract>> singleAddressMultipleTierVerification(_addressToBeVerified: address, _tierID: uint256[]) +    <<abstract>> multipleAddressSingleTierVerification(_addressToBeVerified: address[], _tierID: uint256) +    <<abstract>> multipleAddressAndTierVerification(_addressToBeVerified: address[], _tierID: uint256[]) +    <<abstract>> buy(_tierID: uint256, _amount: uint256) +    <<abstract>> withdrawSaleDeposit() +    <<abstract>> getTierCount(): uint256 +    <<abstract>> getDepositAddress(): address +    <<abstract>> getToken(): address +    <<abstract>> getLockDetails(): address +    <<abstract>> readTierPartA(_tierID: uint256): (_minAmount: uint256, _maxAmount: uint256, _remainingTokens: uint256, _saleStartTS: uint256, _saleEnd: uint256, _unlockedBP: uint256, _vestOrLockCliff: uint256, _vestOrLockDuration: uint256, _depositRate: uint256) +    <<abstract>> readTierPartB(_tierID: uint256): (_depositToken: address, _depositType: uint256, _verificationType: uint256, _saleEndDurationOrTS: uint256, _transferType: uint256) +    <<abstract>> getTokensBoughtByAddressOnTier(_addr: address, _tierID: uint256): uint256 +    <<abstract>> getParticipatingWalletCountPerTier(_tierID: uint256): uint256 +    <<abstract>> getTotalTokenAllocationPerTier(_tierID: uint256): uint256 +    <<abstract>> getTokensSoldPerTier(_tierID: uint256): uint256 +    <<abstract>> checkSaleEnded(_tierID: uint256): (_status: bool) +    <<abstract>> isAddressApproved(_addr: address, _tierID: uint256): bool + + + +10 + +<<Interface>> +IStaking + + + +External: +     stakesBySchedule(amount: uint256, cliff: uint256, duration: uint256, intervalLength: uint256, stakeFor: address, delegatee: address) +     stake(amount: uint96, until: uint256, stakeFor: address, delegatee: address) +     getPriorVotes(account: address, blockNumber: uint256, date: uint256): uint96 +     getPriorTotalVotingPower(blockNumber: uint32, time: uint256): uint96 +     getPriorWeightedStake(account: address, blockNumber: uint256, date: uint256): uint96 +     timestampToLockDate(timestamp: uint256): (lockDate: uint256) + + + +11 + +<<Interface>> +ITeamVesting + + + +External: +     governanceWithdrawTokens(receiver: address) + + + +12 + +<<Interface>> +IVesting + + + +External: +     duration(): uint256 +     endDate(): uint256 +     stakeTokens(amount: uint256) + + + +13 + +<<Interface>> +IVestingFactory + + + +External: +     deployVesting(_SOV: address, _staking: address, _tokenOwner: address, _cliff: uint256, _duration: uint256, _feeSharing: address, _owner: address): address +     deployTeamVesting(_SOV: address, _staking: address, _tokenOwner: address, _cliff: uint256, _duration: uint256, _feeSharing: address, _owner: address): address + + + +14 + +<<Abstract>> +IVestingLogic + + + +Public: +    <<abstract>> stakeTokens(_amount: uint256) +    <<abstract>> withdrawTokens(receiver: address) + + + +47 + +VestingStorage + +Public: +   SOV: IERC20 +   staking: Staking +   tokenOwner: address +   feeSharingProxy: IFeeSharingProxy +   cliff: uint256 +   duration: uint256 +   startDate: uint256 +   endDate: uint256 +   FOUR_WEEKS: uint256 + + + + + +14->47 + + + + + +15 + +<<Abstract>> +IVestingRegistry + + + +Public: +    <<abstract>> createVesting(_tokenOwner: address, _amount: uint256, _cliff: uint256, _duration: uint256) +    <<abstract>> stakeTokens(_vesting: address, _amount: uint256) +    <<abstract>> getVesting(_tokenOwner: address): address + + + +0 + +LockedFund + +Internal: +   MAX_BASIS_POINT: uint256 +   MAX_DURATION: uint256 +Public: +   waitedTS: uint256 +   INTERVAL: uint256 +   token: IERC20 +   vestingRegistry: IVestingRegistry +   vestedBalances: mapping(address=>uint256) +   lockedBalances: mapping(address=>uint256) +   waitedUnlockedBalances: mapping(address=>uint256) +   unlockedBalances: mapping(address=>uint256) +   isAdmin: mapping(address=>bool) +   cliff: mapping(address=>uint256) +   duration: mapping(address=>uint256) + +Internal: +    _addAdmin(_newAdmin: address) +    _removeAdmin(_adminToRemove: address) +    _changeVestingRegistry(_vestingRegistry: address) +    _changeWaitedTS(_waitedTS: uint256) +    _depositVested(_userAddress: address, _amount: uint256, _cliff: uint256, _duration: uint256, _basisPoint: uint256, _unlockedOrWaited: UnlockType) +    _depositWaitedUnlocked(_userAddress: address, _amount: uint256, _basisPoint: uint256) +    _withdrawWaitedUnlockedBalance(_sender: address, _receiverAddress: address) +    _createVesting(_tokenOwner: address): (_vestingAddress: address) +    _getVesting(_tokenOwner: address): (_vestingAddress: address) +    _stakeTokens(_sender: address, _vesting: address) +    _createVestingAndStake(_sender: address) +External: +    addAdmin(_newAdmin: address) +    removeAdmin(_adminToRemove: address) +    withdrawWaitedUnlockedBalance(_receiverAddress: address) +    createVestingAndStake() +    createVesting(): (_vestingAddress: address) +    stakeTokens() +    withdrawAndStakeTokens(_receiverAddress: address) +    getWaitedTS(): uint256 +    getVestedBalance(_addr: address): (_balance: uint256) +    getLockedBalance(_addr: address): (_balance: uint256) +    getWaitedUnlockedBalance(_addr: address): (_balance: uint256) +    getUnlockedBalance(_addr: address): (_balance: uint256) +    adminStatus(_addr: address): (_status: bool) +    getCliffAndDuration(_addr: address): (uint256, uint256) +Public: +    <<event>> AdminAdded(_initiator: address, _newAdmin: address) +    <<event>> AdminRemoved(_initiator: address, _removedAdmin: address) +    <<event>> VestingRegistryUpdated(_initiator: address, _vestingRegistry: address) +    <<event>> WaitedTSUpdated(_initiator: address, _waitedTS: uint256) +    <<event>> VestedDeposited(_initiator: address, _userAddress: address, _amount: uint256, _cliff: uint256, _duration: uint256, _basisPoint: uint256) +    <<event>> WaitedUnlockedDeposited(_initiator: address, _userAddress: address, _amount: uint256, _basisPoint: uint256) +    <<event>> Withdrawn(_initiator: address, _userAddress: address, _amount: uint256) +    <<event>> VestingCreated(_initiator: address, _userAddress: address, _vesting: address) +    <<event>> TokenStaked(_initiator: address, _vesting: address, _amount: uint256) +    <<modifier>> onlyAdmin() +    constructor(_waitedTS: uint256, _token: address, _vestingRegistry: address, _admins: address[]) +    changeVestingRegistry(_vestingRegistry: address) +    changeWaitedTS(_waitedTS: uint256) +    depositVested(_userAddress: address, _amount: uint256, _cliff: uint256, _duration: uint256, _basisPoint: uint256, _unlockedOrWaited: uint256) +    depositLocked(_userAddress: address, _amount: uint256, _cliff: uint256, _duration: uint256, _basisPoint: uint256, _unlockedOrWaited: uint256) +    depositWaitedUnlocked(_userAddress: address, _amount: uint256, _basisPoint: uint256) +    getToken(): address +    getVestingDetails(): address + + + +0->6 + + + + + +0->8 + + + + + +0->14 + + + + + +0->15 + + + + + +24 + +<<Library>> +SafeMath + + + +Internal: +    add(a: uint256, b: uint256): uint256 +    sub(a: uint256, b: uint256): uint256 +    sub(a: uint256, b: uint256, errorMessage: string): uint256 +    mul(a: uint256, b: uint256): uint256 +    div(a: uint256, b: uint256): uint256 +    div(a: uint256, b: uint256, errorMessage: string): uint256 +    divCeil(a: uint256, b: uint256): uint256 +    divCeil(a: uint256, b: uint256, errorMessage: string): uint256 +    mod(a: uint256, b: uint256): uint256 +    mod(a: uint256, b: uint256, errorMessage: string): uint256 +    min256(_a: uint256, _b: uint256): uint256 + + + +0->24 + + + + + +0enum0 + +<<enum>> +UnlockType + +None +Immediate +Waited + + + +0enum0->0 + + + + + +16 + +<<Library>> +Address + + + +Internal: +    isContract(account: address): bool +    toPayable(account: address): (payable: address) +    sendValue(recipient: address, amount: uint256) + + + +17 + +Context + + + +Internal: +    _msgSender(): (payable: address) +    _msgData(): bytes +Public: +    constructor() + + + +18 + +ERC20 + +Private: +   _balances: mapping(address=>uint256) +   _allowances: mapping(address=>mapping(address=>uint256)) +   _totalSupply: uint256 + +Internal: +    _transfer(sender: address, recipient: address, amount: uint256) +    _mint(account: address, amount: uint256) +    _burn(account: address, amount: uint256) +    _approve(owner: address, spender: address, amount: uint256) +    _burnFrom(account: address, amount: uint256) +Public: +    totalSupply(): uint256 +    balanceOf(account: address): uint256 +    transfer(recipient: address, amount: uint256): bool +    allowance(owner: address, spender: address): uint256 +    approve(spender: address, amount: uint256): bool +    transferFrom(sender: address, recipient: address, amount: uint256): bool +    increaseAllowance(spender: address, addedValue: uint256): bool +    decreaseAllowance(spender: address, subtractedValue: uint256): bool + + + +18->17 + + + + + +20 + +<<Interface>> +IERC20_ + + + +External: +     totalSupply(): uint256 +     balanceOf(account: address): uint256 +     transfer(recipient: address, amount: uint256): bool +     allowance(owner: address, spender: address): uint256 +     approve(spender: address, amount: uint256): bool +     transferFrom(sender: address, recipient: address, amount: uint256): bool +Public: +    <<event>> Transfer(from: address, to: address, value: uint256) +    <<event>> Approval(owner: address, spender: address, value: uint256) + + + +18->20 + + + + + +18->24 + + + + + +19 + +ERC20Detailed + +Private: +   _name: string +   _symbol: string +   _decimals: uint8 + +Public: +    constructor(name: string, symbol: string, decimals: uint8) +    name(): string +    symbol(): string +    decimals(): uint8 + + + +19->18 + + + + + +21 + +Ownable + +Private: +   _owner: address + +Internal: +    _transferOwnership(newOwner: address) +Public: +    <<event>> OwnershipTransferred(previousOwner: address, newOwner: address) +    <<modifier>> onlyOwner() +    constructor() +    owner(): address +    isOwner(): bool +    transferOwnership(newOwner: address) + + + +21->17 + + + + + +22 + +ReentrancyGuard + +Internal: +   REENTRANCY_GUARD_FREE: uint256 +   REENTRANCY_GUARD_LOCKED: uint256 +   reentrancyLock: uint256 + +Public: +    <<modifier>> nonReentrant() + + + +23 + +<<Library>> +SafeERC20 + + + +Private: +    callOptionalReturn(token: IERC20, data: bytes) +Internal: +    safeTransfer(token: IERC20, to: address, value: uint256) +    safeTransferFrom(token: IERC20, from: address, to: address, value: uint256) +    safeApprove(token: IERC20, spender: address, value: uint256) +    safeIncreaseAllowance(token: IERC20, spender: address, value: uint256) +    safeDecreaseAllowance(token: IERC20, spender: address, value: uint256) + + + +23->6 + + + + + +23->16 + + + + + +23->24 + + + + + +1 + +OriginsAdmin + +Private: +   owners: address[] +   verifiers: address[] +   isOwner: mapping(address=>bool) +   isVerifier: mapping(address=>bool) + +Internal: +    _addOwner(_newOwner: address) +    _removeOwner(_ownerToRemove: address) +    _addVerifier(_newVerifier: address) +    _removeVerifier(_verifierToRemove: address) +Public: +    <<event>> OwnerAdded(_initiator: address, _newOwner: address) +    <<event>> OwnerRemoved(_initiator: address, _removedOwner: address) +    <<event>> VerifierAdded(_initiator: address, _newVerifier: address) +    <<event>> VerifierRemoved(_initiator: address, _removedVerifier: address) +    <<modifier>> onlyOwner() +    <<modifier>> onlyVerifier() +    constructor(_owners: address[]) +    addOwner(_newOwner: address) +    removeOwner(_ownerToRemove: address) +    addVerifier(_newVerifier: address) +    removeVerifier(_verifierToRemove: address) +    checkOwner(_addr: address): bool +    checkVerifier(_addr: address): bool +    getOwners(): address[] +    getVerifiers(): address[] + + + +4 + +OriginsStorage + +Internal: +   tierCount: uint256 +   MAX_BASIS_POINT: uint256 +   depositAddress: address +   token: IERC20 +   lockedFund: ILockedFund +   tiers: mapping(uint256=>Tier) +   tokensBoughtByAddressOnTier: mapping(address=>mapping(uint256=>uint256)) +   participatingWalletCountPerTier: mapping(uint256=>uint256) +   totalTokenAllocationPerTier: mapping(uint256=>uint256) +   tokensSoldPerTier: mapping(uint256=>uint256) +   tierSaleEnded: mapping(uint256=>bool) +   tierSaleWithdrawn: mapping(uint256=>bool) +   addressApproved: mapping(address=>mapping(uint256=>bool)) + + + + + +1->4 + + + + + +2 + +OriginsBase + + + +Internal: +    _setDepositAddress(_depositAddress: address) +    _setLockedFund(_lockedFund: address) +    _setTierVerification(_tierID: uint256, _verificationType: VerificationType) +    _setTierDeposit(_tierID: uint256, _depositRate: uint256, _depositToken: address, _depositType: DepositType) +    _setTierTokenLimit(_tierID: uint256, _minAmount: uint256, _maxAmount: uint256) +    _getTotalRemainingTokens(): (_totalBal: uint256) +    _setTierTokenAmount(_tierID: uint256, _remainingTokens: uint256) +    _setTierVestOrLock(_tierID: uint256, _vestOrLockCliff: uint256, _vestOrLockDuration: uint256, _unlockedBP: uint256, _transferType: TransferType) +    _setTierTime(_tierID: uint256, _saleStartTS: uint256, _saleEnd: uint256, _saleEndDurationOrTS: SaleEndDurationOrTS) +    _addressVerification(_addressToBeVerified: address, _tierID: uint256) +    _saleAllowed(_id: uint256): bool +    _tokenTransferOnBuy(_tierDetails: Tier, _tokensBought: uint256) +    _updateTierTokenDetailsAfterBuy(_tierID: uint256) +    _updateWalletCount(_tierID: uint256, _deposit: uint256, _tokensBoughtByAddress: uint256, _tokensBought: uint256) +    _buy(_tierID: uint256, _amount: uint256) +    _withdrawSaleDeposit() +External: +    <<payable>> buy(_tierID: uint256, _amount: uint256) +    setDepositAddress(_depositAddress: address) +    setLockedFund(_lockedFund: address) +    createTier(_maxAmount: uint256, _remainingTokens: uint256, _saleStartTS: uint256, _saleEnd: uint256, _unlockedBP: uint256, _vestOrLockCliff: uint256, _vestOrLockDuration: uint256, _depositRate: uint256, _depositType: uint256, _verificationType: uint256, _saleEndDurationOrTS: uint256, _transferType: uint256): (_tierID: uint256) +    setTierVerification(_tierID: uint256, _verificationType: uint256) +    setTierDeposit(_tierID: uint256, _depositRate: uint256, _depositToken: address, _depositType: uint256) +    setTierTokenLimit(_tierID: uint256, _minAmount: uint256, _maxAmount: uint256) +    setTierTokenAmount(_tierID: uint256, _remainingTokens: uint256) +    setTierVestOrLock(_tierID: uint256, _vestOrLockCliff: uint256, _vestOrLockDuration: uint256, _unlockedBP: uint256, _transferType: uint256) +    setTierTime(_tierID: uint256, _saleStartTS: uint256, _saleEnd: uint256, _saleEndDurationOrTS: uint256) +    addressVerification(_addressToBeVerified: address, _tierID: uint256) +    singleAddressMultipleTierVerification(_addressToBeVerified: address, _tierID: uint256[]) +    multipleAddressSingleTierVerification(_addressToBeVerified: address[], _tierID: uint256) +    multipleAddressAndTierVerification(_addressToBeVerified: address[], _tierID: uint256[]) +    withdrawSaleDeposit() +    getTierCount(): uint256 +    getDepositAddress(): address +    getToken(): address +    getLockDetails(): address +    readTierPartA(_tierID: uint256): (_minAmount: uint256, _maxAmount: uint256, _remainingTokens: uint256, _saleStartTS: uint256, _saleEnd: uint256, _unlockedBP: uint256, _vestOrLockCliff: uint256, _vestOrLockDuration: uint256, _depositRate: uint256) +    readTierPartB(_tierID: uint256): (_depositToken: address, _depositType: uint256, _verificationType: uint256, _saleEndDurationOrTS: uint256, _transferType: uint256) +    getTokensBoughtByAddressOnTier(_addr: address, _tierID: uint256): uint256 +    getParticipatingWalletCountPerTier(_tierID: uint256): uint256 +    getTotalTokenAllocationPerTier(_tierID: uint256): uint256 +    getTokensSoldPerTier(_tierID: uint256): uint256 +    checkSaleEnded(_tierID: uint256): (_status: bool) +    isAddressApproved(_addr: address, _tierID: uint256): bool +Public: +    constructor(_owners: address[], _token: address, _depositAddress: address) + + + +2->9 + + + + + +3 + +OriginsEvents + + + +Public: +    <<event>> AddressVerified(_initiator: address, _verifiedAddress: address, _tierID: uint256) +    <<event>> DepositAddressUpdated(_initiator: address, _oldDepositAddr: address, _newDepositAddr: address) +    <<event>> LockedFundUpdated(_initiator: address, _oldLockedFund: address, _newLockedFund: address) +    <<event>> NewTierCreated(_initiator: address, _tierID: uint256) +    <<event>> TierTokenLimitUpdated(_initiator: address, _tierID: uint256, _minAmount: uint256, _maxAmount: uint256) +    <<event>> TierTokenAmountUpdated(_initiator: address, _tierID: uint256, _remainingTokens: uint256) +    <<event>> TierTimeUpdated(_initiator: address, _tierID: uint256, _saleStartTS: uint256, _saleEnd: uint256, _saleEndDurationOrTS: SaleEndDurationOrTS) +    <<event>> TierVestOrLockUpdated(_initiator: address, _tierID: uint256, _vestOrLockCliff: uint256, _vestOrLockDuration: uint256, _unlockedBP: uint256, _transferType: TransferType) +    <<event>> TierDepositUpdated(_initiator: address, _tierID: uint256, _depositRate: uint256, _depositToken: address, _depositType: DepositType) +    <<event>> TierVerificationUpdated(_initiator: address, _tierID: uint256, _verificationType: VerificationType) +    <<event>> TierSaleEnded(_initiator: address, _tierID: uint256) +    <<event>> TierSaleUpdatedMinimum(_initiator: address, _tierID: uint256) +    <<event>> TierSaleUpdatedMaximum(_initiator: address, _tierID: uint256, _updatedMaxAmount: uint256) +    <<event>> TokenBuy(_initiator: address, _tierID: uint256, _tokensBought: uint256) +    <<event>> ProceedingWithdrawn(_initiator: address, _receiver: address, _tierID: uint256, _depositType: DepositType, _amount: uint256) +    <<event>> RemainingTokenWithdrawn(_initiator: address, _receiver: address, _tierID: uint256, _remainingToken: uint256) + + + +2->3 + + + + + +3->1 + + + + + +4->6 + + + + + +4->8 + + + + + +4->24 + + + + + +4struct0 + +<<struct>> +Tier + +minAmount: uint256 +maxAmount: uint256 +remainingTokens: uint256 +saleStartTS: uint256 +saleEnd: uint256 +unlockedBP: uint256 +vestOrLockCliff: uint256 +vestOrLockDuration: uint256 +depositRate: uint256 +depositToken: IERC20 +depositType: DepositType +verificationType: VerificationType +saleEndDurationOrTS: SaleEndDurationOrTS +transferType: TransferType + + + +4struct0->4 + + + + + +4enum0 + +<<enum>> +DepositType + +RBTC +Token + + + +4enum0->4 + + + + + +4enum1 + +<<enum>> +SaleEndDurationOrTS + +None +UntilSupply +Duration +Timestamp + + + +4enum1->4 + + + + + +4enum2 + +<<enum>> +VerificationType + +None +Everyone +ByAddress + + + +4enum2->4 + + + + + +4enum3 + +<<enum>> +TransferType + +None +Unlocked +WaitedUnlock +Vested +Locked + + + +4enum3->4 + + + + + +4enum4 + +<<enum>> +UnlockType + +None +Immediate +Waited + + + +4enum4->4 + + + + + +25 + +FeeSharingProxy + +Public: +   FEE_WITHDRAWAL_INTERVAL: uint256 +   MAX_CHECKPOINTS: uint32 +   protocol: IProtocol +   staking: IStaking +   tokenCheckpoints: mapping(address=>mapping(uint256=>Checkpoint)) +   numTokenCheckpoints: mapping(address=>uint32) +   processedCheckpoints: mapping(address=>mapping(address=>uint32)) +   lastFeeWithdrawalTime: mapping(address=>uint256) +   unprocessedAmount: mapping(address=>uint96) + +Internal: +    _addCheckpoint(_token: address) +    _getAccumulatedFees(_user: address, _loanPoolToken: address, _maxCheckpoints: uint32): (uint256, uint32) +    _getEndOfRange(start: uint32, _loanPoolToken: address, _maxCheckpoints: uint32): uint32 +    _writeTokenCheckpoint(_token: address, _numTokens: uint96) +Public: +    <<event>> FeeWithdrawn(sender: address, token: address, amount: uint256) +    <<event>> TokensTransferred(sender: address, token: address, amount: uint256) +    <<event>> CheckpointAdded(sender: address, token: address, amount: uint256) +    <<event>> UserFeeWithdrawn(sender: address, receiver: address, token: address, amount: uint256) +    constructor(_protocol: IProtocol, _staking: IStaking) +    withdrawFees(_token: address) +    transferTokens(_token: address, _amount: uint96) +    withdraw(_loanPoolToken: address, _maxCheckpoints: uint32, _receiver: address) +    getAccumulatedFees(_user: address, _loanPoolToken: address): uint256 + + + +25->7 + + + + + +25->10 + + + + + +25->23 + + + + + +25->24 + + + + + +26 + +<<Interface>> +IProtocol + + + +External: +     withdrawFees(token: address, receiver: address): uint256 +     underlyingToLoanPool(token: address): address + + + +25->26 + + + + + +27 + +<<Interface>> +ILoanToken + + + +External: +     mint(receiver: address, depositAmount: uint256): (mintAmount: uint256) + + + +25->27 + + + + + +29 + +SafeMath96 + + + +Internal: +    safe32(n: uint256, errorMessage: string): uint32 +    safe64(n: uint256, errorMessage: string): uint64 +    safe96(n: uint256, errorMessage: string): uint96 +    add96(a: uint96, b: uint96, errorMessage: string): uint96 +    sub96(a: uint96, b: uint96, errorMessage: string): uint96 +    mul96(a: uint96, b: uint96, errorMessage: string): uint96 +    div96(a: uint96, b: uint96, errorMessage: string): uint96 + + + +25->29 + + + + + +25struct0 + +<<struct>> +Checkpoint + +blockNumber: uint32 +timestamp: uint32 +totalWeightedStake: uint96 +numTokens: uint96 + + + +25struct0->25 + + + + + +37 + +Checkpoints + + + +Internal: +    _increaseUserStake(account: address, lockedTS: uint256, value: uint96) +    _decreaseUserStake(account: address, lockedTS: uint256, value: uint96) +    _writeUserCheckpoint(account: address, lockedTS: uint256, nCheckpoints: uint32, newStake: uint96) +    _increaseDelegateStake(delegatee: address, lockedTS: uint256, value: uint96) +    _decreaseDelegateStake(delegatee: address, lockedTS: uint256, value: uint96) +    _writeDelegateCheckpoint(delegatee: address, lockedTS: uint256, nCheckpoints: uint32, newStake: uint96) +    _increaseDailyStake(lockedTS: uint256, value: uint96) +    _decreaseDailyStake(lockedTS: uint256, value: uint96) +    _writeStakingCheckpoint(lockedTS: uint256, nCheckpoints: uint32, newStake: uint96) +Public: +    <<event>> DelegateChanged(delegator: address, lockedUntil: uint256, fromDelegate: address, toDelegate: address) +    <<event>> DelegateStakeChanged(delegate: address, lockedUntil: uint256, previousBalance: uint256, newBalance: uint256) +    <<event>> TokensStaked(staker: address, amount: uint256, lockedUntil: uint256, totalStaked: uint256) +    <<event>> TokensWithdrawn(staker: address, receiver: address, amount: uint256) +    <<event>> VestingTokensWithdrawn(vesting: address, receiver: address) +    <<event>> TokensUnlocked(amount: uint256) +    <<event>> ExtendedStakingDuration(staker: address, previousDate: uint256, newDate: uint256) +    <<event>> AdminAdded(admin: address) +    <<event>> AdminRemoved(admin: address) +    <<event>> ContractCodeHashAdded(hash: bytes32) +    <<event>> ContractCodeHashRemoved(hash: bytes32) + + + +40 + +StakingStorage + +Public: +   TWO_WEEKS: uint256 +   MAX_VOTING_WEIGHT: uint96 +   WEIGHT_FACTOR: uint96 +   MAX_DURATION: uint256 +   MAX_DURATION_POW_2: uint96 +   DEFAULT_WEIGHT_SCALING: uint96 +   MIN_WEIGHT_SCALING: uint96 +   MAX_WEIGHT_SCALING: uint96 +   kickoffTS: uint256 +   name: string +   SOVToken: IERC20 +   delegates: mapping(address=>mapping(uint256=>address)) +   allUnlocked: bool +   DOMAIN_TYPEHASH: bytes32 +   DELEGATION_TYPEHASH: bytes32 +   newStakingContract: address +   totalStakingCheckpoints: mapping(uint256=>mapping(uint32=>Checkpoint)) +   numTotalStakingCheckpoints: mapping(uint256=>uint32) +   delegateStakingCheckpoints: mapping(address=>mapping(uint256=>mapping(uint32=>Checkpoint))) +   numDelegateStakingCheckpoints: mapping(address=>mapping(uint256=>uint32)) +   userStakingCheckpoints: mapping(address=>mapping(uint256=>mapping(uint32=>Checkpoint))) +   numUserStakingCheckpoints: mapping(address=>mapping(uint256=>uint32)) +   nonces: mapping(address=>uint256) +   feeSharing: IFeeSharingProxy +   weightScaling: uint96 +   vestingWhitelist: mapping(address=>bool) +   admins: mapping(address=>bool) +   vestingCodeHashes: mapping(bytes32=>bool) + + + + + +37->40 + + + + + +37->29 + + + + + +38 + +Staking + +Public: +   FOUR_WEEKS: uint256 + +Internal: +    _stake(sender: address, amount: uint96, until: uint256, stakeFor: address, delegatee: address, timeAdjusted: bool) +    _increaseStake(sender: address, amount: uint96, stakeFor: address, until: uint256) +    _withdraw(amount: uint96, until: uint256, receiver: address, isGovernance: bool) +    _withdrawNext(amount: uint96, until: uint256, receiver: address, isGovernance: bool) +    _getPunishedAmount(amount: uint96, until: uint256): uint96 +    _validateWithdrawParams(amount: uint96, until: uint256) +    currentBalance(account: address, lockDate: uint256): uint96 +    _delegate(delegator: address, delegatee: address, lockedTS: uint256) +    _delegateNext(delegator: address, delegatee: address, lockedTS: uint256) +    _moveDelegates(srcRep: address, dstRep: address, amount: uint96, lockedTS: uint256) +    getChainId(): uint256 +    _getToken(): address +    _getSelectors(): bytes4[] +External: +    stake(amount: uint96, until: uint256, stakeFor: address, delegatee: address) +    getCurrentVotes(account: address): uint96 +    getCurrentStakedUntil(lockedTS: uint256): uint96 +Public: +    stakeWithApproval(sender: address, amount: uint96, until: uint256, stakeFor: address, delegatee: address) +    extendStakingDuration(previousLock: uint256, until: uint256) +    stakesBySchedule(amount: uint256, cliff: uint256, duration: uint256, intervalLength: uint256, stakeFor: address, delegatee: address) +    withdraw(amount: uint96, until: uint256, receiver: address) +    governanceWithdraw(amount: uint96, until: uint256, receiver: address) +    governanceWithdrawVesting(vesting: address, receiver: address) +    getWithdrawAmounts(amount: uint96, until: uint256): (uint96, uint96) +    balanceOf(account: address): (balance: uint96) +    delegate(delegatee: address, lockDate: uint256) +    delegateBySig(delegatee: address, lockDate: uint256, nonce: uint256, expiry: uint256, v: uint8, r: bytes32, s: bytes32) +    setNewStakingContract(_newStakingContract: address) +    setFeeSharing(_feeSharing: address) +    setWeightScaling(_weightScaling: uint96) +    migrateToNewStakingContract() +    unlockAllTokens() +    getStakes(account: address): (dates: uint256[], stakes: uint96[]) + + + +38->10 + + + + + +38->11 + + + + + +38->12 + + + + + +38->24 + + + + + +41 + +WeightedStaking + + + +Internal: +    _totalPowerByDate(date: uint256, startDate: uint256, blockNumber: uint256): (power: uint96) +    _totalPowerByDateForDelegatee(account: address, date: uint256, startDate: uint256, blockNumber: uint256): (power: uint96) +    _getPriorUserStakeByDate(account: address, date: uint256, blockNumber: uint256): uint96 +    _adjustDateForOrigin(date: uint256): uint256 +    _isVestingContract(): bool +    _getCodeHash(_contract: address): bytes32 +External: +    getPriorUserStakeByDate(account: address, date: uint256, blockNumber: uint256): uint96 +Public: +    <<modifier>> onlyAuthorized() +    getPriorTotalVotingPower(blockNumber: uint32, time: uint256): (totalVotingPower: uint96) +    getPriorTotalStakesForDate(date: uint256, blockNumber: uint256): uint96 +    getPriorVotes(account: address, blockNumber: uint256, date: uint256): (votes: uint96) +    getPriorStakeByDateForDelegatee(account: address, date: uint256, blockNumber: uint256): uint96 +    getPriorWeightedStake(account: address, blockNumber: uint256, date: uint256): (votes: uint96) +    weightedStakeByDate(account: address, date: uint256, startDate: uint256, blockNumber: uint256): (power: uint96) +    computeWeightByDate(date: uint256, startDate: uint256): (weight: uint96) +    timestampToLockDate(timestamp: uint256): (lockDate: uint256) +    addAdmin(_admin: address) +    removeAdmin(_admin: address) +    addContractCodeHash(vesting: address) +    removeContractCodeHash(vesting: address) + + + +38->41 + + + + + +34 + +<<Library>> +RSKAddrValidator + + + +Internal: +    checkPKNotZero(addr: address): bool +    safeEquals(addr1: address, addr2: address): bool + + + +38->34 + + + + + +35 + +ApprovalReceiver + + + +Internal: +    _getToken(): address +    _getSelectors(): bytes4[] +    _call(_data: bytes) +    _getSig(_data: bytes): (sig: bytes4) +External: +    receiveApproval(_sender: address, _amount: uint256, _token: address, _data: bytes) +Public: +    <<modifier>> onlyThisContract() + + + +38->35 + + + + + +39 + +StakingProxy + + + +Public: +    constructor(SOV: address) + + + +39->40 + + + + + +33 + +UpgradableProxy + + + +Public: +    setImplementation(_implementation: address) +    setProxyOwner(_owner: address) + + + +39->33 + + + + + +40->6 + + + + + +40->7 + + + + + +40->21 + + + + + +40struct0 + +<<struct>> +Checkpoint + +fromBlock: uint32 +stake: uint96 + + + +40struct0->40 + + + + + +41->16 + + + + + +41->37 + + + + + +42 + +TeamVesting + + + +Public: +    constructor(_logic: address, _SOV: address, _stakingAddress: address, _tokenOwner: address, _cliff: uint256, _duration: uint256, _feeSharingProxy: address) + + + +42->6 + + + + + +42->7 + + + + + +42->38 + + + + + +42->47 + + + + + +32 + +Proxy + +Private: +   KEY_IMPLEMENTATION: bytes32 +   KEY_OWNER: bytes32 + +Internal: +    _setImplementation(_implementation: address) +    _setProxyOwner(_owner: address) +Public: +    <<fallback>> () +    <<event>> OwnershipTransferred(_oldOwner: address, _newOwner: address) +    <<event>> ImplementationChanged(_oldImplementation: address, _newImplementation: address) +    <<modifier>> onlyProxyOwner() +    constructor() +    getImplementation(): (_implementation: address) +    getProxyOwner(): (_owner: address) + + + +42->32 + + + + + +43 + +Vesting + + + +Public: +    constructor(_logic: address, _SOV: address, _stakingAddress: address, _tokenOwner: address, _cliff: uint256, _duration: uint256, _feeSharingProxy: address) +    governanceWithdrawTokens(receiver: address) + + + +43->42 + + + + + +44 + +VestingFactory + +Public: +   vestingLogic: address + +External: +    deployVesting(_SOV: address, _staking: address, _tokenOwner: address, _cliff: uint256, _duration: uint256, _feeSharing: address, _vestingOwner: address): address +    deployTeamVesting(_SOV: address, _staking: address, _tokenOwner: address, _cliff: uint256, _duration: uint256, _feeSharing: address, _vestingOwner: address): address +Public: +    constructor(_vestingLogic: address) + + + +44->13 + + + + + +44->21 + + + + + +44->42 + + + + + +44->43 + + + + + +45 + +VestingLogic + + + +Internal: +    _stakeTokens(_sender: address, _amount: uint256) +    _withdrawTokens(receiver: address, isGovernance: bool) +    _getToken(): address +    _getSelectors(): bytes4[] +Public: +    <<event>> TokensStaked(caller: address, amount: uint256) +    <<event>> VotesDelegated(caller: address, delegatee: address) +    <<event>> TokensWithdrawn(caller: address, receiver: address) +    <<event>> DividendsCollected(caller: address, loanPoolToken: address, receiver: address, maxCheckpoints: uint32) +    <<event>> MigratedToNewStakingContract(caller: address, newStakingContract: address) +    <<modifier>> onlyOwners() +    <<modifier>> onlyTokenOwner() +    stakeTokens(_amount: uint256) +    stakeTokensWithApproval(_sender: address, _amount: uint256) +    delegate(_delegatee: address) +    governanceWithdrawTokens(receiver: address) +    withdrawTokens(receiver: address) +    collectDividends(_loanPoolToken: address, _maxCheckpoints: uint32, _receiver: address) +    migrateToNewStakingContract() + + + +45->12 + + + + + +45->38 + + + + + +45->47 + + + + + +45->35 + + + + + +46 + +VestingRegistry3 + +Public: +   vestingFactory: IVestingFactory +   SOV: address +   staking: address +   feeSharingProxy: address +   vestingOwner: address +   vestingContracts: mapping(address=>mapping(uint256=>address)) +   admins: mapping(address=>bool) + +Internal: +    _setVestingFactory(_vestingFactory: address) +    _getOrCreateVesting(_tokenOwner: address, _cliff: uint256, _duration: uint256): address +    _getOrCreateTeamVesting(_tokenOwner: address, _cliff: uint256, _duration: uint256): address +Public: +    <<event>> SOVTransferred(receiver: address, amount: uint256) +    <<event>> VestingCreated(tokenOwner: address, vesting: address, cliff: uint256, duration: uint256, amount: uint256) +    <<event>> TeamVestingCreated(tokenOwner: address, vesting: address, cliff: uint256, duration: uint256, amount: uint256) +    <<event>> TokensStaked(vesting: address, amount: uint256) +    <<event>> AdminAdded(admin: address) +    <<event>> AdminRemoved(admin: address) +    <<modifier>> onlyAuthorized() +    constructor(_vestingFactory: address, _SOV: address, _staking: address, _feeSharingProxy: address, _vestingOwner: address) +    addAdmin(_admin: address) +    removeAdmin(_admin: address) +    setVestingFactory(_vestingFactory: address) +    transferSOV(_receiver: address, _amount: uint256) +    createVesting(_tokenOwner: address, _amount: uint256, _cliff: uint256, _duration: uint256) +    createTeamVesting(_tokenOwner: address, _amount: uint256, _cliff: uint256, _duration: uint256) +    stakeTokens(_vesting: address, _amount: uint256) +    getVesting(_tokenOwner: address): address +    getTeamVesting(_tokenOwner: address): address + + + +46->6 + + + + + +46->12 + + + + + +46->13 + + + + + +46->21 + + + + + +46->24 + + + + + +46enum0 + +<<enum>> +VestingType + +TeamVesting +Vesting + + + +46enum0->46 + + + + + +47->6 + + + + + +47->7 + + + + + +47->21 + + + + + +47->38 + + + + + +28 + +ErrorDecoder + +Public: +   ERROR_MESSAGE_SHIFT: uint256 + +Internal: +    _addErrorMessage(str1: string, str2: string): string + + + +30 + +FeeSharingProxyMockup + +Public: +   testData: TestData + +Public: +    constructor(_protocol: IProtocol, _staking: IStaking) +    withdraw(_loanPoolToken: address, _maxCheckpoints: uint32, _receiver: address) + + + +30->25 + + + + + +30->26 + + + + + +30struct0 + +<<struct>> +TestData + +loanPoolToken: address +maxCheckpoints: uint32 +receiver: address + + + +30struct0->30 + + + + + +31 + +MultiSigWallet + +Public: +   MAX_OWNER_COUNT: uint256 +   transactions: mapping(uint256=>Transaction) +   confirmations: mapping(uint256=>mapping(address=>bool)) +   isOwner: mapping(address=>bool) +   owners: address[] +   required: uint256 +   transactionCount: uint256 + +Internal: +    external_call(destination: address, value: uint256, dataLength: uint256, data: bytes): bool +    addTransaction(destination: address, value: uint256, data: bytes): (transactionId: uint256) +Public: +    <<fallback>> () +    <<event>> Confirmation(sender: address, transactionId: uint256) +    <<event>> Revocation(sender: address, transactionId: uint256) +    <<event>> Submission(transactionId: uint256) +    <<event>> Execution(transactionId: uint256) +    <<event>> ExecutionFailure(transactionId: uint256) +    <<event>> Deposit(sender: address, value: uint256) +    <<event>> OwnerAddition(owner: address) +    <<event>> OwnerRemoval(owner: address) +    <<event>> RequirementChange(required: uint256) +    <<modifier>> onlyWallet() +    <<modifier>> ownerDoesNotExist(owner: address) +    <<modifier>> ownerExists(owner: address) +    <<modifier>> transactionExists(transactionId: uint256) +    <<modifier>> confirmed(transactionId: uint256, owner: address) +    <<modifier>> notConfirmed(transactionId: uint256, owner: address) +    <<modifier>> notExecuted(transactionId: uint256) +    <<modifier>> notNull(_address: address) +    <<modifier>> validRequirement(ownerCount: uint256, _required: uint256) +    constructor(_owners: address[], _required: uint256) +    addOwner(owner: address) +    removeOwner(owner: address) +    replaceOwner(owner: address, newOwner: address) +    changeRequirement(_required: uint256) +    submitTransaction(destination: address, value: uint256, data: bytes): (transactionId: uint256) +    confirmTransaction(transactionId: uint256) +    revokeConfirmation(transactionId: uint256) +    executeTransaction(transactionId: uint256) +    isConfirmed(transactionId: uint256): bool +    getConfirmationCount(transactionId: uint256): (count: uint256) +    getTransactionCount(pending: bool, executed: bool): (count: uint256) +    getOwners(): address[] +    getConfirmations(transactionId: uint256): (_confirmations: address[]) +    getTransactionIds(from: uint256, to: uint256, pending: bool, executed: bool): (_transactionIds: uint256[]) + + + +31struct0 + +<<struct>> +Transaction + +destination: address +value: uint256 +data: bytes +executed: bool + + + +31struct0->31 + + + + + +33->32 + + + + + +35->5 + + + + + +35->28 + + + + + +36 + +Token + +Public: +   NAME: string +   SYMBOL: string +   DECIMALS: uint8 + +Public: +    constructor(_initialAmount: uint256, _name: string, _symbol: string, _decimals: uint8) +    mint(_account: address, _amount: uint256) +    approveAndCall(_spender: address, _amount: uint256, _data: bytes) + + + +36->5 + + + + + +36->18 + + + + + +36->19 + + + + + +36->21 + + + + + diff --git a/brownie-config.yaml b/brownie-config.yaml new file mode 100644 index 0000000..7b1c366 --- /dev/null +++ b/brownie-config.yaml @@ -0,0 +1,66 @@ +# Brownie configuration file +# https://eth-brownie.readthedocs.io/en/stable/config.html + +project_structure: + build: build + contracts: contracts + interfaces: contracts/Interfaces + reports: reports + scripts: scripts + tests: tests + +networks: + default: development + development: + gas_limit: 6800000 + gas_price: 65000000 + reverting_tx_gas_limit: 8000000 + default_contract_owner: true + cmd_settings: + port: 8545 + gas_limit: 6800000 + accounts: 10 + evm_version: istanbul + mnemonic: brownie + block_time: 0 + default_balance: 1000000 + # time: 2020-05-08T14:54:08+0000 + live: + cmd_settings: + port: 443 + # gas_limit: 6800000 + gas_price: 65100000 # 8000000000 + reverting_tx_gas_limit: false + default_contract_owner: false + +compiler: + evm_version: null + solc: + version: null + optimizer: + enabled: true + runs: 200 + remappings: null + +console: + show_colors: true + color_style: monokai + auto_suggest: true + completions: true + +reports: + exclude_paths: + - contracts/Openzeppelin/*.* + - contracts/Testhelpers/*.* + exclude_contracts: + - MultiSigWallet + +hypothesis: + deadline: null + max_examples: 50 + report_multiple_bugs: False + stateful_step_count: 10 + +autofetch_sources: false +dependencies: null +dev_deployment_artifacts: false diff --git a/callGraph.svg b/callGraph.svg new file mode 100644 index 0000000..8871eec --- /dev/null +++ b/callGraph.svg @@ -0,0 +1,4676 @@ + + + + + + +G + + +clusterOriginsBase + +OriginsBase + + +clusterIOrigins + +IOrigins + + +clusterOriginsAdmin + +OriginsAdmin + + +clusterIERC20 + +IERC20 + + +clusterSafeMath + +SafeMath  (lib) + + +clusterILockedFund + +ILockedFund + + +clusterRSKAddrValidator + +RSKAddrValidator  (lib) + + +clusterFeeSharingProxyMockup + +FeeSharingProxyMockup + + +clusterFeeSharingProxy + +FeeSharingProxy + + +clusterIProtocol + +IProtocol  (iface) + + +clusterILoanToken + +ILoanToken  (iface) + + +clusterSafeMath96 + +SafeMath96 + + +clusterSafeERC20 + +SafeERC20  (lib) + + +clusterAddress + +Address  (lib) + + +clusterIFeeSharingProxy + +IFeeSharingProxy  (iface) + + +clusterIStaking + +IStaking  (iface) + + +clusterErrorDecoder + +ErrorDecoder + + +clusterStaking + +Staking + + +clusterWeightedStaking + +WeightedStaking + + +clusterCheckpoints + +Checkpoints + + +clusterOwnable + +Ownable + + +clusterContext + +Context + + +clusterITeamVesting + +ITeamVesting  (iface) + + +clusterIVesting + +IVesting  (iface) + + +clusterApprovalReceiver + +ApprovalReceiver + + +clusterIApproveAndCall + +IApproveAndCall  (iface) + + +clusterUpgradableProxy + +UpgradableProxy + + +clusterProxy + +Proxy + + +clusterMultiSigWallet + +MultiSigWallet + + +clusterToken + +Token + + +clusterERC20Detailed + +ERC20Detailed + + +clusterERC20 + +ERC20 + + +clusterIERC20_ + +IERC20_  (iface) + + +clusterIVestingFactory + +IVestingFactory  (iface) + + +clusterVestingRegistry3 + +VestingRegistry3 + + +clusterIVestingLogic + +IVestingLogic + + +clusterVesting + +Vesting + + +clusterVestingLogic + +VestingLogic + + +clusterIVestingRegistry + +IVestingRegistry + + +clusterLockedFund + +LockedFund + + +clusterReentrancyGuard + +ReentrancyGuard + + +cluster_totalBal + +_totalBal + + +clusterrequiredBal + +requiredBal + + +clustercurrentBal + +currentBal + + +cluster_saleStartTS + +_saleStartTS + + +clustertokensBoughtByAddress + +tokensBoughtByAddress + + +clusterdeposit + +deposit + + +clusterreceiver + +receiver + + +clusteramount + +amount + + +clusteruntil + +until + + +clusterlockedTS + +lockedTS + + +cluster_totalSupply + +_totalSupply + + +cluster_amount + +_amount + + +cluster_01 + +Legend + + + +OriginsBase.<Constructor> + +<Constructor> + + + +OriginsBase.setDepositAddress + +setDepositAddress + + + +OriginsBase._setDepositAddress + +_setDepositAddress + + + +OriginsBase.setDepositAddress->OriginsBase._setDepositAddress + + + + + +OriginsBase.setLockedFund + +setLockedFund + + + +OriginsBase._setLockedFund + +_setLockedFund + + + +OriginsBase.setLockedFund->OriginsBase._setLockedFund + + + + + +OriginsBase.createTier + +createTier + + + +OriginsBase._setTierVerification + +_setTierVerification + + + +OriginsBase.createTier->OriginsBase._setTierVerification + + + + + +OriginsBase._setTierDeposit + +_setTierDeposit + + + +OriginsBase.createTier->OriginsBase._setTierDeposit + + + + + +OriginsBase._setTierTokenLimit + +_setTierTokenLimit + + + +OriginsBase.createTier->OriginsBase._setTierTokenLimit + + + + + +OriginsBase._setTierTokenAmount + +_setTierTokenAmount + + + +OriginsBase.createTier->OriginsBase._setTierTokenAmount + + + + + +OriginsBase._setTierVestOrLock + +_setTierVestOrLock + + + +OriginsBase.createTier->OriginsBase._setTierVestOrLock + + + + + +OriginsBase._setTierTime + +_setTierTime + + + +OriginsBase.createTier->OriginsBase._setTierTime + + + + + +OriginsBase.VerificationType + +VerificationType + + + +OriginsBase.createTier->OriginsBase.VerificationType + + + + + +OriginsBase.DepositType + +DepositType + + + +OriginsBase.createTier->OriginsBase.DepositType + + + + + +OriginsBase.TransferType + +TransferType + + + +OriginsBase.createTier->OriginsBase.TransferType + + + + + +OriginsBase.SaleEndDurationOrTS + +SaleEndDurationOrTS + + + +OriginsBase.createTier->OriginsBase.SaleEndDurationOrTS + + + + + +OriginsBase.setTierVerification + +setTierVerification + + + +OriginsBase.setTierVerification->OriginsBase._setTierVerification + + + + + +OriginsBase.setTierVerification->OriginsBase.VerificationType + + + + + +OriginsBase.setTierDeposit + +setTierDeposit + + + +OriginsBase.setTierDeposit->OriginsBase._setTierDeposit + + + + + +OriginsBase.setTierDeposit->OriginsBase.DepositType + + + + + +OriginsBase.setTierTokenLimit + +setTierTokenLimit + + + +OriginsBase.setTierTokenLimit->OriginsBase._setTierTokenLimit + + + + + +OriginsBase.setTierTokenAmount + +setTierTokenAmount + + + +OriginsBase.setTierTokenAmount->OriginsBase._setTierTokenAmount + + + + + +OriginsBase.setTierVestOrLock + +setTierVestOrLock + + + +OriginsBase.setTierVestOrLock->OriginsBase._setTierVestOrLock + + + + + +OriginsBase.setTierVestOrLock->OriginsBase.TransferType + + + + + +OriginsBase.setTierTime + +setTierTime + + + +OriginsBase.setTierTime->OriginsBase._setTierTime + + + + + +OriginsBase.setTierTime->OriginsBase.SaleEndDurationOrTS + + + + + +OriginsBase.addressVerification + +addressVerification + + + +OriginsBase._addressVerification + +_addressVerification + + + +OriginsBase.addressVerification->OriginsBase._addressVerification + + + + + +OriginsBase.singleAddressMultipleTierVerification + +singleAddressMultipleTierVerification + + + +OriginsBase.singleAddressMultipleTierVerification->OriginsBase._addressVerification + + + + + +OriginsBase.multipleAddressSingleTierVerification + +multipleAddressSingleTierVerification + + + +OriginsBase.multipleAddressSingleTierVerification->OriginsBase._addressVerification + + + + + +OriginsBase.multipleAddressAndTierVerification + +multipleAddressAndTierVerification + + + +OriginsBase.multipleAddressAndTierVerification->OriginsBase._addressVerification + + + + + +OriginsBase.buy + +buy + + + +OriginsBase._buy + +_buy + + + +OriginsBase.buy->OriginsBase._buy + + + + + +OriginsBase.withdrawSaleDeposit + +withdrawSaleDeposit + + + +OriginsBase._withdrawSaleDeposit + +_withdrawSaleDeposit + + + +OriginsBase.withdrawSaleDeposit->OriginsBase._withdrawSaleDeposit + + + + + +OriginsBase._setTierDeposit->OriginsBase.DepositType + + + + + +OriginsBase._getTotalRemainingTokens + +_getTotalRemainingTokens + + + +_totalBal.add + +add + + + +OriginsBase._getTotalRemainingTokens->_totalBal.add + + + + + +OriginsBase._setTierTokenAmount->OriginsBase._getTotalRemainingTokens + + + + + +IERC20.balanceOf + +balanceOf + + + +OriginsBase._setTierTokenAmount->IERC20.balanceOf + + + + + +IERC20.transferFrom + +transferFrom + + + +OriginsBase._setTierTokenAmount->IERC20.transferFrom + + + + + +IERC20.transfer + +transfer + + + +OriginsBase._setTierTokenAmount->IERC20.transfer + + + + + +requiredBal.sub + +sub + + + +OriginsBase._setTierTokenAmount->requiredBal.sub + + + + + +OriginsBase._setTierTokenAmount->requiredBal.sub + + + + + +currentBal.sub + +sub + + + +OriginsBase._setTierTokenAmount->currentBal.sub + + + + + +OriginsBase._setTierTokenAmount->currentBal.sub + + + + + +_saleStartTS.add + +add + + + +OriginsBase._setTierTime->_saleStartTS.add + + + + + +OriginsBase._saleAllowed + +_saleAllowed + + + +OriginsBase._tokenTransferOnBuy + +_tokenTransferOnBuy + + + +OriginsBase._tokenTransferOnBuy->IERC20.transfer + + + + + +IERC20.approve + +approve + + + +OriginsBase._tokenTransferOnBuy->IERC20.approve + + + + + +ILockedFund.depositWaitedUnlocked + +depositWaitedUnlocked + + + +OriginsBase._tokenTransferOnBuy->ILockedFund.depositWaitedUnlocked + + + + + +ILockedFund.depositVested + +depositVested + + + +OriginsBase._tokenTransferOnBuy->ILockedFund.depositVested + + + + + +ILockedFund.depositLocked + +depositLocked + + + +OriginsBase._tokenTransferOnBuy->ILockedFund.depositLocked + + + + + +OriginsBase._updateTierTokenDetailsAfterBuy + +_updateTierTokenDetailsAfterBuy + + + +OriginsBase._updateWalletCount + +_updateWalletCount + + + +OriginsBase._buy->OriginsBase._saleAllowed + + + + + +OriginsBase._buy->OriginsBase._tokenTransferOnBuy + + + + + +OriginsBase._buy->OriginsBase._updateTierTokenDetailsAfterBuy + + + + + +OriginsBase._buy->OriginsBase._updateWalletCount + + + + + +tokensBoughtByAddress.div + +div + + + +OriginsBase._buy->tokensBoughtByAddress.div + + + + + +deposit.add + +add + + + +OriginsBase._buy->deposit.add + + + + + +deposit.mul + +mul + + + +OriginsBase._buy->deposit.mul + + + + + +OriginsBase._withdrawSaleDeposit->OriginsBase._saleAllowed + + + + + +OriginsBase.checkOwner + +checkOwner + + + +OriginsBase._withdrawSaleDeposit->OriginsBase.checkOwner + + + + + +OriginsBase._withdrawSaleDeposit->IERC20.transfer + + + + + +receiver.transfer + +transfer + + + +OriginsBase._withdrawSaleDeposit->receiver.transfer + + + + + +OriginsBase.getTierCount + +getTierCount + + + +OriginsBase.getDepositAddress + +getDepositAddress + + + +OriginsBase.getToken + +getToken + + + +OriginsBase.getLockDetails + +getLockDetails + + + +OriginsBase.readTierPartA + +readTierPartA + + + +OriginsBase.readTierPartB + +readTierPartB + + + +OriginsBase.getTokensBoughtByAddressOnTier + +getTokensBoughtByAddressOnTier + + + +OriginsBase.getParticipatingWalletCountPerTier + +getParticipatingWalletCountPerTier + + + +OriginsBase.getTotalTokenAllocationPerTier + +getTotalTokenAllocationPerTier + + + +OriginsBase.getTokensSoldPerTier + +getTokensSoldPerTier + + + +OriginsBase.checkSaleEnded + +checkSaleEnded + + + +OriginsBase.isAddressApproved + +isAddressApproved + + + +IOrigins.setDepositAddress + +setDepositAddress + + + +IOrigins.setLockedFund + +setLockedFund + + + +IOrigins.createTier + +createTier + + + +IOrigins.setTierVerification + +setTierVerification + + + +IOrigins.setTierDeposit + +setTierDeposit + + + +IOrigins.setTierTokenLimit + +setTierTokenLimit + + + +IOrigins.setTierTokenAmount + +setTierTokenAmount + + + +IOrigins.setTierVestOrLock + +setTierVestOrLock + + + +IOrigins.setTierTime + +setTierTime + + + +IOrigins.addressVerification + +addressVerification + + + +IOrigins.singleAddressMultipleTierVerification + +singleAddressMultipleTierVerification + + + +IOrigins.multipleAddressSingleTierVerification + +multipleAddressSingleTierVerification + + + +IOrigins.multipleAddressAndTierVerification + +multipleAddressAndTierVerification + + + +IOrigins.buy + +buy + + + +IOrigins.withdrawSaleDeposit + +withdrawSaleDeposit + + + +IOrigins.getTierCount + +getTierCount + + + +IOrigins.getDepositAddress + +getDepositAddress + + + +IOrigins.getToken + +getToken + + + +IOrigins.getLockDetails + +getLockDetails + + + +IOrigins.readTierPartA + +readTierPartA + + + +IOrigins.readTierPartB + +readTierPartB + + + +IOrigins.getTokensBoughtByAddressOnTier + +getTokensBoughtByAddressOnTier + + + +IOrigins.getParticipatingWalletCountPerTier + +getParticipatingWalletCountPerTier + + + +IOrigins.getTotalTokenAllocationPerTier + +getTotalTokenAllocationPerTier + + + +IOrigins.getTokensSoldPerTier + +getTokensSoldPerTier + + + +IOrigins.checkSaleEnded + +checkSaleEnded + + + +IOrigins.isAddressApproved + +isAddressApproved + + + +OriginsAdmin.onlyOwner + + +onlyOwner + + + +OriginsAdmin.onlyVerifier + + +onlyVerifier + + + +OriginsAdmin.<Constructor> + +<Constructor> + + + +OriginsAdmin.addOwner + +addOwner + + + +OriginsAdmin._addOwner + +_addOwner + + + +OriginsAdmin.addOwner->OriginsAdmin._addOwner + + + + + +OriginsAdmin.removeOwner + +removeOwner + + + +OriginsAdmin._removeOwner + +_removeOwner + + + +OriginsAdmin.removeOwner->OriginsAdmin._removeOwner + + + + + +OriginsAdmin.addVerifier + +addVerifier + + + +OriginsAdmin._addVerifier + +_addVerifier + + + +OriginsAdmin.addVerifier->OriginsAdmin._addVerifier + + + + + +OriginsAdmin.removeVerifier + +removeVerifier + + + +OriginsAdmin._removeVerifier + +_removeVerifier + + + +OriginsAdmin.removeVerifier->OriginsAdmin._removeVerifier + + + + + +OriginsAdmin.checkOwner + +checkOwner + + + +OriginsAdmin.checkVerifier + +checkVerifier + + + +OriginsAdmin.getOwners + +getOwners + + + +OriginsAdmin.getVerifiers + +getVerifiers + + + +IERC20.totalSupply + +totalSupply + + + +IERC20.allowance + +allowance + + + +IERC20.isContract + +isContract + + + +IERC20.call + +call + + + +SafeMath.add + +add + + + +SafeMath.sub + +sub + + + +SafeMath.sub->SafeMath.sub + + + + + +SafeMath.mul + +mul + + + +SafeMath.div + +div + + + +SafeMath.div->SafeMath.div + + + + + +SafeMath.divCeil + +divCeil + + + +SafeMath.divCeil->SafeMath.divCeil + + + + + +SafeMath.mod + +mod + + + +SafeMath.mod->SafeMath.mod + + + + + +SafeMath.min256 + +min256 + + + +LockedFund._depositWaitedUnlocked + +_depositWaitedUnlocked + + + +ILockedFund.depositWaitedUnlocked->LockedFund._depositWaitedUnlocked + + + + + +LockedFund._depositVested + +_depositVested + + + +ILockedFund.depositVested->LockedFund._depositVested + + + + + +LockedFund.UnlockType + +UnlockType + + + +ILockedFund.depositVested->LockedFund.UnlockType + + + + + +ILockedFund.addAdmin + +addAdmin + + + +ILockedFund.removeAdmin + +removeAdmin + + + +ILockedFund.changeVestingRegistry + +changeVestingRegistry + + + +ILockedFund.changeWaitedTS + +changeWaitedTS + + + +ILockedFund.withdrawWaitedUnlockedBalance + +withdrawWaitedUnlockedBalance + + + +ILockedFund.createVestingAndStake + +createVestingAndStake + + + +ILockedFund.createVesting + +createVesting + + + +ILockedFund.stakeTokens + +stakeTokens + + + +ILockedFund.withdrawAndStakeTokens + +withdrawAndStakeTokens + + + +RSKAddrValidator.checkPKNotZero + +checkPKNotZero + + + +RSKAddrValidator.safeEquals + +safeEquals + + + +FeeSharingProxyMockup.<Constructor> + +<Constructor> + + + +FeeSharingProxyMockup.withdraw + +withdraw + + + +FeeSharingProxy.<Constructor> + +<Constructor> + + + +FeeSharingProxy.withdrawFees + +withdrawFees + + + +FeeSharingProxy._addCheckpoint + +_addCheckpoint + + + +FeeSharingProxy.withdrawFees->FeeSharingProxy._addCheckpoint + + + + + +FeeSharingProxy.safe96 + +safe96 + + + +FeeSharingProxy.withdrawFees->FeeSharingProxy.safe96 + + + + + +FeeSharingProxy.add96 + +add96 + + + +FeeSharingProxy.withdrawFees->FeeSharingProxy.add96 + + + + + +IProtocol.withdrawFees + +withdrawFees + + + +FeeSharingProxy.withdrawFees->IProtocol.withdrawFees + + + + + +IProtocol.underlyingToLoanPool + +underlyingToLoanPool + + + +FeeSharingProxy.withdrawFees->IProtocol.underlyingToLoanPool + + + + + +FeeSharingProxy.transferTokens + +transferTokens + + + +FeeSharingProxy.transferTokens->FeeSharingProxy._addCheckpoint + + + + + +FeeSharingProxy.transferTokens->FeeSharingProxy.add96 + + + + + +FeeSharingProxy._writeTokenCheckpoint + +_writeTokenCheckpoint + + + +FeeSharingProxy._addCheckpoint->FeeSharingProxy._writeTokenCheckpoint + + + + + +FeeSharingProxy.withdraw + +withdraw + + + +FeeSharingProxy._getAccumulatedFees + +_getAccumulatedFees + + + +FeeSharingProxy.withdraw->FeeSharingProxy._getAccumulatedFees + + + + + +FeeSharingProxy.getAccumulatedFees + +getAccumulatedFees + + + +FeeSharingProxy.getAccumulatedFees->FeeSharingProxy._getAccumulatedFees + + + + + +FeeSharingProxy._getEndOfRange + +_getEndOfRange + + + +FeeSharingProxy._getAccumulatedFees->FeeSharingProxy._getEndOfRange + + + + + +IStaking.timestampToLockDate + +timestampToLockDate + + + +FeeSharingProxy._getAccumulatedFees->IStaking.timestampToLockDate + + + + + +IStaking.getPriorWeightedStake + +getPriorWeightedStake + + + +FeeSharingProxy._getAccumulatedFees->IStaking.getPriorWeightedStake + + + + + +amount.add + +add + + + +FeeSharingProxy._getAccumulatedFees->amount.add + + + + + +FeeSharingProxy.safe32 + +safe32 + + + +FeeSharingProxy._getEndOfRange->FeeSharingProxy.safe32 + + + + + +FeeSharingProxy._writeTokenCheckpoint->FeeSharingProxy.safe32 + + + + + +FeeSharingProxy._writeTokenCheckpoint->FeeSharingProxy.safe32 + + + + + +IStaking.getPriorTotalVotingPower + +getPriorTotalVotingPower + + + +FeeSharingProxy._writeTokenCheckpoint->IStaking.getPriorTotalVotingPower + + + + + +ILoanToken.mint + +mint + + + +SafeMath96.safe32 + +safe32 + + + +SafeMath96.safe64 + +safe64 + + + +SafeMath96.safe96 + +safe96 + + + +SafeMath96.add96 + +add96 + + + +SafeMath96.sub96 + +sub96 + + + +SafeMath96.mul96 + +mul96 + + + +SafeMath96.div96 + +div96 + + + +SafeERC20.safeTransfer + +safeTransfer + + + +SafeERC20.callOptionalReturn + +callOptionalReturn + + + +SafeERC20.safeTransfer->SafeERC20.callOptionalReturn + + + + + +SafeERC20.safeTransferFrom + +safeTransferFrom + + + +SafeERC20.safeTransferFrom->SafeERC20.callOptionalReturn + + + + + +SafeERC20.safeApprove + +safeApprove + + + +SafeERC20.safeApprove->IERC20.allowance + + + + + +SafeERC20.safeApprove->SafeERC20.callOptionalReturn + + + + + +SafeERC20.safeIncreaseAllowance + +safeIncreaseAllowance + + + +SafeERC20.safeIncreaseAllowance->IERC20.allowance + + + + + +SafeERC20.safeIncreaseAllowance->SafeERC20.callOptionalReturn + + + + + +SafeERC20.safeDecreaseAllowance + +safeDecreaseAllowance + + + +SafeERC20.safeDecreaseAllowance->IERC20.allowance + + + + + +SafeERC20.safeDecreaseAllowance->SafeERC20.callOptionalReturn + + + + + +SafeERC20.callOptionalReturn->IERC20.isContract + + + + + +SafeERC20.callOptionalReturn->IERC20.call + + + + + +Address.isContract + +isContract + + + +Address.toPayable + +toPayable + + + +Address.sendValue + +sendValue + + + +IFeeSharingProxy.withdrawFees + +withdrawFees + + + +IFeeSharingProxy.transferTokens + +transferTokens + + + +IFeeSharingProxy.withdraw + +withdraw + + + +IStaking.stakesBySchedule + +stakesBySchedule + + + +IStaking.stake + +stake + + + +IStaking.getPriorVotes + +getPriorVotes + + + +ErrorDecoder._addErrorMessage + +_addErrorMessage + + + +Staking.stake + +stake + + + +Staking._stake + +_stake + + + +Staking.stake->Staking._stake + + + + + +Staking.stakeWithApproval + +stakeWithApproval + + + +Staking.stakeWithApproval->Staking._stake + + + + + +Staking._stake->IStaking.timestampToLockDate + + + + + +Staking._stake->IStaking.timestampToLockDate + + + + + +Staking._increaseStake + +_increaseStake + + + +Staking._stake->Staking._increaseStake + + + + + +Staking.currentBalance + +currentBalance + + + +Staking._stake->Staking.currentBalance + + + + + +Staking._decreaseDelegateStake + +_decreaseDelegateStake + + + +Staking._stake->Staking._decreaseDelegateStake + + + + + +Staking.add96 + +add96 + + + +Staking._stake->Staking.add96 + + + + + +Staking._increaseDelegateStake + +_increaseDelegateStake + + + +Staking._stake->Staking._increaseDelegateStake + + + + + +Staking.extendStakingDuration + +extendStakingDuration + + + +Staking.extendStakingDuration->IStaking.timestampToLockDate + + + + + +Staking.extendStakingDuration->IStaking.timestampToLockDate + + + + + +Staking.extendStakingDuration->Staking._decreaseDelegateStake + + + + + +Staking.extendStakingDuration->Staking._increaseDelegateStake + + + + + +Staking._getPriorUserStakeByDate + +_getPriorUserStakeByDate + + + +Staking.extendStakingDuration->Staking._getPriorUserStakeByDate + + + + + +Staking._decreaseUserStake + +_decreaseUserStake + + + +Staking.extendStakingDuration->Staking._decreaseUserStake + + + + + +Staking._increaseUserStake + +_increaseUserStake + + + +Staking.extendStakingDuration->Staking._increaseUserStake + + + + + +Staking._decreaseDailyStake + +_decreaseDailyStake + + + +Staking.extendStakingDuration->Staking._decreaseDailyStake + + + + + +Staking._increaseDailyStake + +_increaseDailyStake + + + +Staking.extendStakingDuration->Staking._increaseDailyStake + + + + + +Staking._increaseStake->IERC20.transferFrom + + + + + +Staking._increaseStake->Staking.currentBalance + + + + + +Staking._increaseStake->Staking.add96 + + + + + +Staking._increaseStake->Staking._increaseUserStake + + + + + +Staking._increaseStake->Staking._increaseDailyStake + + + + + +Staking.stakesBySchedule + +stakesBySchedule + + + +Staking.stakesBySchedule->IStaking.timestampToLockDate + + + + + +Staking.stakesBySchedule->IStaking.timestampToLockDate + + + + + +Staking.stakesBySchedule->Staking._stake + + + + + +Staking.stakesBySchedule->Staking._stake + + + + + +Staking.withdraw + +withdraw + + + +Staking._withdraw + +_withdraw + + + +Staking.withdraw->Staking._withdraw + + + + + +Staking._withdrawNext + +_withdrawNext + + + +Staking.withdraw->Staking._withdrawNext + + + + + +Staking.governanceWithdraw + +governanceWithdraw + + + +Staking.governanceWithdraw->Staking._withdraw + + + + + +Staking.governanceWithdraw->Staking._withdrawNext + + + + + +Staking.governanceWithdrawVesting + +governanceWithdrawVesting + + + +Staking._withdraw->IERC20.transfer + + + + + +Staking._withdraw->IERC20.approve + + + + + +Staking._withdraw->IFeeSharingProxy.transferTokens + + + + + +Staking._getPunishedAmount + +_getPunishedAmount + + + +Staking._withdraw->Staking._getPunishedAmount + + + + + +Staking._validateWithdrawParams + +_validateWithdrawParams + + + +Staking._withdraw->Staking._validateWithdrawParams + + + + + +Staking._withdraw->Staking._decreaseDelegateStake + + + + + +Staking._withdraw->Staking._decreaseUserStake + + + + + +Staking._withdraw->Staking._decreaseDailyStake + + + + + +Staking._isVestingContract + +_isVestingContract + + + +Staking._withdraw->Staking._isVestingContract + + + + + +Staking._adjustDateForOrigin + +_adjustDateForOrigin + + + +Staking._withdraw->Staking._adjustDateForOrigin + + + + + +Staking._withdrawNext->Staking._withdraw + + + + + +Staking._withdrawNext->Staking._getPriorUserStakeByDate + + + + + +Staking._withdrawNext->Staking._isVestingContract + + + + + +until.add + +add + + + +Staking._withdrawNext->until.add + + + + + +Staking.getWithdrawAmounts + +getWithdrawAmounts + + + +Staking.getWithdrawAmounts->Staking._getPunishedAmount + + + + + +Staking.getWithdrawAmounts->Staking._validateWithdrawParams + + + + + +Staking._getPunishedAmount->IStaking.timestampToLockDate + + + + + +Staking.computeWeightByDate + +computeWeightByDate + + + +Staking._getPunishedAmount->Staking.computeWeightByDate + + + + + +Staking._validateWithdrawParams->Staking._getPriorUserStakeByDate + + + + + +Staking.balanceOf + +balanceOf + + + +Staking.balanceOf->Staking.currentBalance + + + + + +Staking.balanceOf->Staking.add96 + + + + + +Staking.delegate + +delegate + + + +Staking._delegate + +_delegate + + + +Staking.delegate->Staking._delegate + + + + + +Staking._delegateNext + +_delegateNext + + + +Staking.delegate->Staking._delegateNext + + + + + +Staking.delegateBySig + +delegateBySig + + + +Staking.delegateBySig->RSKAddrValidator.checkPKNotZero + + + + + +Staking.delegateBySig->Staking._delegate + + + + + +Staking.delegateBySig->Staking._delegateNext + + + + + +Staking.getChainId + +getChainId + + + +Staking.delegateBySig->Staking.getChainId + + + + + +Staking.getCurrentVotes + +getCurrentVotes + + + +Staking.getPriorVotes + +getPriorVotes + + + +Staking.getCurrentVotes->Staking.getPriorVotes + + + + + +Staking.getCurrentStakedUntil + +getCurrentStakedUntil + + + +Staking._delegate->Staking.currentBalance + + + + + +Staking._moveDelegates + +_moveDelegates + + + +Staking._delegate->Staking._moveDelegates + + + + + +Staking._delegateNext->Staking._delegate + + + + + +Staking._delegateNext->Staking._delegate + + + + + +Staking._delegateNext->Staking._isVestingContract + + + + + +lockedTS.add + +add + + + +Staking._delegateNext->lockedTS.add + + + + + +Staking._delegateNext->lockedTS.add + + + + + +Staking._moveDelegates->Staking._decreaseDelegateStake + + + + + +Staking._moveDelegates->Staking._increaseDelegateStake + + + + + +Staking.setNewStakingContract + +setNewStakingContract + + + +Staking.setFeeSharing + +setFeeSharing + + + +Staking.setWeightScaling + +setWeightScaling + + + +Staking.migrateToNewStakingContract + +migrateToNewStakingContract + + + +Staking.unlockAllTokens + +unlockAllTokens + + + +Staking.unlockAllTokens->IERC20.balanceOf + + + + + +Staking.getStakes + +getStakes + + + +Staking.getStakes->IStaking.timestampToLockDate + + + + + +Staking.getStakes->Staking.currentBalance + + + + + +Staking.getStakes->Staking.currentBalance + + + + + +Staking._getToken + +_getToken + + + +Staking._getSelectors + +_getSelectors + + + +Staking.MAX_DURATION + +MAX_DURATION + + + +Staking.allUnlocked + +allUnlocked + + + +Staking.newStakingContract + +newStakingContract + + + +WeightedStaking.onlyAuthorized + + +onlyAuthorized + + + +WeightedStaking.isOwner + +isOwner + + + +WeightedStaking.onlyAuthorized->WeightedStaking.isOwner + + + + + +WeightedStaking.getPriorTotalVotingPower + +getPriorTotalVotingPower + + + +WeightedStaking._totalPowerByDate + +_totalPowerByDate + + + +WeightedStaking.getPriorTotalVotingPower->WeightedStaking._totalPowerByDate + + + + + +WeightedStaking.timestampToLockDate + +timestampToLockDate + + + +WeightedStaking.getPriorTotalVotingPower->WeightedStaking.timestampToLockDate + + + + + +WeightedStaking.add96 + +add96 + + + +WeightedStaking.getPriorTotalVotingPower->WeightedStaking.add96 + + + + + +WeightedStaking.getPriorTotalStakesForDate + +getPriorTotalStakesForDate + + + +WeightedStaking._totalPowerByDate->WeightedStaking.getPriorTotalStakesForDate + + + + + +WeightedStaking.computeWeightByDate + +computeWeightByDate + + + +WeightedStaking._totalPowerByDate->WeightedStaking.computeWeightByDate + + + + + +WeightedStaking.mul96 + +mul96 + + + +WeightedStaking._totalPowerByDate->WeightedStaking.mul96 + + + + + +WeightedStaking.getPriorVotes + +getPriorVotes + + + +WeightedStaking._totalPowerByDateForDelegatee + +_totalPowerByDateForDelegatee + + + +WeightedStaking.getPriorVotes->WeightedStaking._totalPowerByDateForDelegatee + + + + + +WeightedStaking.getPriorVotes->WeightedStaking.timestampToLockDate + + + + + +WeightedStaking.getPriorVotes->WeightedStaking.add96 + + + + + +WeightedStaking.getPriorStakeByDateForDelegatee + +getPriorStakeByDateForDelegatee + + + +WeightedStaking._totalPowerByDateForDelegatee->WeightedStaking.getPriorStakeByDateForDelegatee + + + + + +WeightedStaking._totalPowerByDateForDelegatee->WeightedStaking.computeWeightByDate + + + + + +WeightedStaking._totalPowerByDateForDelegatee->WeightedStaking.mul96 + + + + + +WeightedStaking.getPriorWeightedStake + +getPriorWeightedStake + + + +WeightedStaking.weightedStakeByDate + +weightedStakeByDate + + + +WeightedStaking.getPriorWeightedStake->WeightedStaking.weightedStakeByDate + + + + + +WeightedStaking.getPriorWeightedStake->WeightedStaking.timestampToLockDate + + + + + +WeightedStaking.getPriorWeightedStake->WeightedStaking.add96 + + + + + +WeightedStaking._getPriorUserStakeByDate + +_getPriorUserStakeByDate + + + +WeightedStaking.weightedStakeByDate->WeightedStaking._getPriorUserStakeByDate + + + + + +WeightedStaking.weightedStakeByDate->WeightedStaking.computeWeightByDate + + + + + +WeightedStaking.weightedStakeByDate->WeightedStaking.mul96 + + + + + +WeightedStaking.getPriorUserStakeByDate + +getPriorUserStakeByDate + + + +WeightedStaking.getPriorUserStakeByDate->WeightedStaking._getPriorUserStakeByDate + + + + + +WeightedStaking._isVestingContract + +_isVestingContract + + + +WeightedStaking.getPriorUserStakeByDate->WeightedStaking._isVestingContract + + + + + +WeightedStaking._adjustDateForOrigin + +_adjustDateForOrigin + + + +WeightedStaking._getPriorUserStakeByDate->WeightedStaking._adjustDateForOrigin + + + + + +WeightedStaking.computeWeightByDate->WeightedStaking.add96 + + + + + +WeightedStaking.computeWeightByDate->WeightedStaking.mul96 + + + + + +WeightedStaking.sub96 + +sub96 + + + +WeightedStaking.computeWeightByDate->WeightedStaking.sub96 + + + + + +WeightedStaking._adjustDateForOrigin->WeightedStaking.timestampToLockDate + + + + + +WeightedStaking.addAdmin + +addAdmin + + + +WeightedStaking.removeAdmin + +removeAdmin + + + +WeightedStaking.addContractCodeHash + +addContractCodeHash + + + +WeightedStaking._getCodeHash + +_getCodeHash + + + +WeightedStaking.addContractCodeHash->WeightedStaking._getCodeHash + + + + + +WeightedStaking.removeContractCodeHash + +removeContractCodeHash + + + +WeightedStaking.removeContractCodeHash->WeightedStaking._getCodeHash + + + + + +WeightedStaking._isVestingContract->WeightedStaking._getCodeHash + + + + + +Checkpoints._increaseUserStake + +_increaseUserStake + + + +Checkpoints._writeUserCheckpoint + +_writeUserCheckpoint + + + +Checkpoints._increaseUserStake->Checkpoints._writeUserCheckpoint + + + + + +Checkpoints.add96 + +add96 + + + +Checkpoints._increaseUserStake->Checkpoints.add96 + + + + + +Checkpoints._decreaseUserStake + +_decreaseUserStake + + + +Checkpoints._decreaseUserStake->Checkpoints._writeUserCheckpoint + + + + + +Checkpoints.sub96 + +sub96 + + + +Checkpoints._decreaseUserStake->Checkpoints.sub96 + + + + + +Checkpoints.safe32 + +safe32 + + + +Checkpoints._writeUserCheckpoint->Checkpoints.safe32 + + + + + +Checkpoints._increaseDelegateStake + +_increaseDelegateStake + + + +Checkpoints._writeDelegateCheckpoint + +_writeDelegateCheckpoint + + + +Checkpoints._increaseDelegateStake->Checkpoints._writeDelegateCheckpoint + + + + + +Checkpoints._increaseDelegateStake->Checkpoints.add96 + + + + + +Checkpoints._decreaseDelegateStake + +_decreaseDelegateStake + + + +Checkpoints._decreaseDelegateStake->Checkpoints._writeDelegateCheckpoint + + + + + +Checkpoints._decreaseDelegateStake->Checkpoints.sub96 + + + + + +Checkpoints._writeDelegateCheckpoint->Checkpoints.safe32 + + + + + +Checkpoints._increaseDailyStake + +_increaseDailyStake + + + +Checkpoints._writeStakingCheckpoint + +_writeStakingCheckpoint + + + +Checkpoints._increaseDailyStake->Checkpoints._writeStakingCheckpoint + + + + + +Checkpoints._increaseDailyStake->Checkpoints.add96 + + + + + +Checkpoints._decreaseDailyStake + +_decreaseDailyStake + + + +Checkpoints._decreaseDailyStake->Checkpoints._writeStakingCheckpoint + + + + + +Checkpoints._decreaseDailyStake->Checkpoints.sub96 + + + + + +Checkpoints._writeStakingCheckpoint->Checkpoints.safe32 + + + + + +Ownable.<Constructor> + +<Constructor> + + + +Ownable._msgSender + +_msgSender + + + +Ownable.<Constructor>->Ownable._msgSender + + + + + +Token._mint + +_mint + + + +Ownable.<Constructor>->Token._mint + + + + + +VestingRegistry3._setVestingFactory + +_setVestingFactory + + + +Ownable.<Constructor>->VestingRegistry3._setVestingFactory + + + + + +Ownable.owner + +owner + + + +Ownable.onlyOwner + + +onlyOwner + + + +Ownable.isOwner + +isOwner + + + +Ownable.onlyOwner->Ownable.isOwner + + + + + +Ownable.isOwner->Ownable._msgSender + + + + + +Ownable.transferOwnership + +transferOwnership + + + +Ownable._transferOwnership + +_transferOwnership + + + +Ownable.transferOwnership->Ownable._transferOwnership + + + + + +Context.<Constructor> + +<Constructor> + + + +Context._msgSender + +_msgSender + + + +Context._msgData + +_msgData + + + +ITeamVesting.governanceWithdrawTokens + +governanceWithdrawTokens + + + +IVesting.duration + +duration + + + +IVesting.endDate + +endDate + + + +IVesting.stakeTokens + +stakeTokens + + + +ApprovalReceiver.onlyThisContract + + +onlyThisContract + + + +ApprovalReceiver.receiveApproval + +receiveApproval + + + +ApprovalReceiver._getToken + +_getToken + + + +ApprovalReceiver.receiveApproval->ApprovalReceiver._getToken + + + + + +ApprovalReceiver._getSelectors + +_getSelectors + + + +ApprovalReceiver.receiveApproval->ApprovalReceiver._getSelectors + + + + + +ApprovalReceiver._call + +_call + + + +ApprovalReceiver.receiveApproval->ApprovalReceiver._call + + + + + +ApprovalReceiver._getSig + +_getSig + + + +ApprovalReceiver.receiveApproval->ApprovalReceiver._getSig + + + + + +ApprovalReceiver.call + +call + + + +ApprovalReceiver._call->ApprovalReceiver.call + + + + + +ApprovalReceiver._addErrorMessage + +_addErrorMessage + + + +ApprovalReceiver._call->ApprovalReceiver._addErrorMessage + + + + + +IApproveAndCall.receiveApproval + +receiveApproval + + + +UpgradableProxy.setImplementation + +setImplementation + + + +UpgradableProxy._setImplementation + +_setImplementation + + + +UpgradableProxy.setImplementation->UpgradableProxy._setImplementation + + + + + +UpgradableProxy.setProxyOwner + +setProxyOwner + + + +UpgradableProxy._setProxyOwner + +_setProxyOwner + + + +UpgradableProxy.setProxyOwner->UpgradableProxy._setProxyOwner + + + + + +Proxy.<Constructor> + +<Constructor> + + + +Proxy.<Constructor>->Staking.MAX_DURATION + + + + + +Proxy._setImplementation + +_setImplementation + + + +Proxy.<Constructor>->Proxy._setImplementation + + + + + +Proxy._setProxyOwner + +_setProxyOwner + + + +Proxy.<Constructor>->Proxy._setProxyOwner + + + + + +Proxy.onlyProxyOwner + + +onlyProxyOwner + + + +Proxy.getProxyOwner + +getProxyOwner + + + +Proxy.onlyProxyOwner->Proxy.getProxyOwner + + + + + +Proxy.getImplementation + +getImplementation + + + +Proxy._setImplementation->Proxy.getImplementation + + + + + +Proxy._setProxyOwner->Proxy.getProxyOwner + + + + + +Proxy.<Fallback> + +<Fallback> + + + +Proxy.<Fallback>->Proxy.getImplementation + + + + + +MultiSigWallet.onlyWallet + + +onlyWallet + + + +MultiSigWallet.ownerDoesNotExist + + +ownerDoesNotExist + + + +MultiSigWallet.ownerExists + + +ownerExists + + + +MultiSigWallet.transactionExists + + +transactionExists + + + +MultiSigWallet.confirmed + + +confirmed + + + +MultiSigWallet.notConfirmed + + +notConfirmed + + + +MultiSigWallet.notExecuted + + +notExecuted + + + +MultiSigWallet.notNull + + +notNull + + + +MultiSigWallet.validRequirement + + +validRequirement + + + +MultiSigWallet.<Fallback> + +<Fallback> + + + +MultiSigWallet.<Constructor> + +<Constructor> + + + +MultiSigWallet.addOwner + +addOwner + + + +MultiSigWallet.removeOwner + +removeOwner + + + +MultiSigWallet.changeRequirement + +changeRequirement + + + +MultiSigWallet.removeOwner->MultiSigWallet.changeRequirement + + + + + +MultiSigWallet.replaceOwner + +replaceOwner + + + +MultiSigWallet.submitTransaction + +submitTransaction + + + +MultiSigWallet.confirmTransaction + +confirmTransaction + + + +MultiSigWallet.submitTransaction->MultiSigWallet.confirmTransaction + + + + + +MultiSigWallet.addTransaction + +addTransaction + + + +MultiSigWallet.submitTransaction->MultiSigWallet.addTransaction + + + + + +MultiSigWallet.executeTransaction + +executeTransaction + + + +MultiSigWallet.confirmTransaction->MultiSigWallet.executeTransaction + + + + + +MultiSigWallet.revokeConfirmation + +revokeConfirmation + + + +MultiSigWallet.external_call + +external_call + + + +MultiSigWallet.executeTransaction->MultiSigWallet.external_call + + + + + +MultiSigWallet.isConfirmed + +isConfirmed + + + +MultiSigWallet.executeTransaction->MultiSigWallet.isConfirmed + + + + + +MultiSigWallet.getConfirmationCount + +getConfirmationCount + + + +MultiSigWallet.getTransactionCount + +getTransactionCount + + + +MultiSigWallet.getOwners + +getOwners + + + +MultiSigWallet.getConfirmations + +getConfirmations + + + +MultiSigWallet.getTransactionIds + +getTransactionIds + + + +Token.mint + +mint + + + +Token.mint->Token._mint + + + + + +Token.approveAndCall + +approveAndCall + + + +Token.approve + +approve + + + +Token.approveAndCall->Token.approve + + + + + +ERC20Detailed.<Constructor> + +<Constructor> + + + +ERC20Detailed.name + +name + + + +ERC20Detailed.symbol + +symbol + + + +ERC20Detailed.decimals + +decimals + + + +ERC20.totalSupply + +totalSupply + + + +ERC20.balanceOf + +balanceOf + + + +ERC20.transfer + +transfer + + + +ERC20._transfer + +_transfer + + + +ERC20.transfer->ERC20._transfer + + + + + +ERC20._msgSender + +_msgSender + + + +ERC20.transfer->ERC20._msgSender + + + + + +ERC20.allowance + +allowance + + + +ERC20.approve + +approve + + + +ERC20._approve + +_approve + + + +ERC20.approve->ERC20._approve + + + + + +ERC20.approve->ERC20._msgSender + + + + + +ERC20.transferFrom + +transferFrom + + + +ERC20.transferFrom->ERC20._transfer + + + + + +ERC20.transferFrom->ERC20._approve + + + + + +ERC20.transferFrom->ERC20._msgSender + + + + + +ERC20.transferFrom->ERC20._msgSender + + + + + +ERC20.increaseAllowance + +increaseAllowance + + + +ERC20.increaseAllowance->ERC20._approve + + + + + +ERC20.increaseAllowance->ERC20._msgSender + + + + + +ERC20.increaseAllowance->ERC20._msgSender + + + + + +ERC20.decreaseAllowance + +decreaseAllowance + + + +ERC20.decreaseAllowance->ERC20._approve + + + + + +ERC20.decreaseAllowance->ERC20._msgSender + + + + + +ERC20.decreaseAllowance->ERC20._msgSender + + + + + +ERC20._mint + +_mint + + + +_totalSupply.add + +add + + + +ERC20._mint->_totalSupply.add + + + + + +ERC20._burn + +_burn + + + +_totalSupply.sub + +sub + + + +ERC20._burn->_totalSupply.sub + + + + + +ERC20._burnFrom + +_burnFrom + + + +ERC20._burnFrom->ERC20._burn + + + + + +ERC20._burnFrom->ERC20._approve + + + + + +ERC20._burnFrom->ERC20._msgSender + + + + + +ERC20._burnFrom->ERC20._msgSender + + + + + +IERC20_.totalSupply + +totalSupply + + + +IERC20_.balanceOf + +balanceOf + + + +IERC20_.transfer + +transfer + + + +IERC20_.allowance + +allowance + + + +IERC20_.approve + +approve + + + +IERC20_.transferFrom + +transferFrom + + + +IVestingFactory.deployVesting + +deployVesting + + + +IVestingFactory.deployTeamVesting + +deployTeamVesting + + + +VestingRegistry3.onlyAuthorized + + +onlyAuthorized + + + +VestingRegistry3.onlyAuthorized->Ownable.isOwner + + + + + +VestingRegistry3.addAdmin + +addAdmin + + + +VestingRegistry3.removeAdmin + +removeAdmin + + + +VestingRegistry3.setVestingFactory + +setVestingFactory + + + +VestingRegistry3.setVestingFactory->VestingRegistry3._setVestingFactory + + + + + +VestingRegistry3.transferSOV + +transferSOV + + + +VestingRegistry3.createVesting + +createVesting + + + +VestingRegistry3._getOrCreateVesting + +_getOrCreateVesting + + + +VestingRegistry3.createVesting->VestingRegistry3._getOrCreateVesting + + + + + +VestingRegistry3.createTeamVesting + +createTeamVesting + + + +VestingRegistry3._getOrCreateTeamVesting + +_getOrCreateTeamVesting + + + +VestingRegistry3.createTeamVesting->VestingRegistry3._getOrCreateTeamVesting + + + + + +VestingRegistry3.stakeTokens + +stakeTokens + + + +VestingRegistry3.getVesting + +getVesting + + + +VestingRegistry3.getTeamVesting + +getTeamVesting + + + +VestingRegistry3._getOrCreateVesting->IVestingFactory.deployVesting + + + + + +VestingRegistry3._getOrCreateTeamVesting->IVestingFactory.deployTeamVesting + + + + + +IVestingLogic.stakeTokens + +stakeTokens + + + +IVestingLogic.withdrawTokens + +withdrawTokens + + + +IVestingLogic.cliff + +cliff + + + +IVestingLogic.duration + +duration + + + +Vesting.governanceWithdrawTokens + +governanceWithdrawTokens + + + +VestingLogic.onlyOwners + + +onlyOwners + + + +VestingLogic.onlyOwners->Ownable.isOwner + + + + + +VestingLogic.onlyTokenOwner + + +onlyTokenOwner + + + +VestingLogic.stakeTokens + +stakeTokens + + + +VestingLogic._stakeTokens + +_stakeTokens + + + +VestingLogic.stakeTokens->VestingLogic._stakeTokens + + + + + +VestingLogic.stakeTokensWithApproval + +stakeTokensWithApproval + + + +VestingLogic.stakeTokensWithApproval->VestingLogic._stakeTokens + + + + + +VestingLogic._stakeTokens->IERC20.transferFrom + + + + + +VestingLogic._stakeTokens->IERC20.approve + + + + + +VestingLogic._stakeTokens->Staking.stakesBySchedule + + + + + +VestingLogic._stakeTokens->WeightedStaking.timestampToLockDate + + + + + +VestingLogic._stakeTokens->WeightedStaking.timestampToLockDate + + + + + +VestingLogic.delegate + +delegate + + + +VestingLogic.delegate->Staking.delegate + + + + + +VestingLogic.governanceWithdrawTokens + +governanceWithdrawTokens + + + +VestingLogic._withdrawTokens + +_withdrawTokens + + + +VestingLogic.governanceWithdrawTokens->VestingLogic._withdrawTokens + + + + + +VestingLogic.withdrawTokens + +withdrawTokens + + + +VestingLogic.withdrawTokens->VestingLogic._withdrawTokens + + + + + +VestingLogic._withdrawTokens->Staking.withdraw + + + + + +VestingLogic._withdrawTokens->Staking.governanceWithdraw + + + + + +VestingLogic._withdrawTokens->Staking.allUnlocked + + + + + +VestingLogic._withdrawTokens->WeightedStaking.getPriorUserStakeByDate + + + + + +VestingLogic.collectDividends + +collectDividends + + + +VestingLogic.collectDividends->IFeeSharingProxy.withdraw + + + + + +VestingLogic.migrateToNewStakingContract + +migrateToNewStakingContract + + + +VestingLogic.migrateToNewStakingContract->Staking.migrateToNewStakingContract + + + + + +VestingLogic.migrateToNewStakingContract->Staking.newStakingContract + + + + + +IVestingRegistry.createVesting + +createVesting + + + +IVestingRegistry.stakeTokens + +stakeTokens + + + +IVestingRegistry.getVesting + +getVesting + + + +LockedFund.onlyAdmin + + +onlyAdmin + + + +LockedFund.<Constructor> + +<Constructor> + + + +LockedFund.addAdmin + +addAdmin + + + +LockedFund._addAdmin + +_addAdmin + + + +LockedFund.addAdmin->LockedFund._addAdmin + + + + + +LockedFund.removeAdmin + +removeAdmin + + + +LockedFund._removeAdmin + +_removeAdmin + + + +LockedFund.removeAdmin->LockedFund._removeAdmin + + + + + +LockedFund.changeVestingRegistry + +changeVestingRegistry + + + +LockedFund._changeVestingRegistry + +_changeVestingRegistry + + + +LockedFund.changeVestingRegistry->LockedFund._changeVestingRegistry + + + + + +LockedFund.changeWaitedTS + +changeWaitedTS + + + +LockedFund._changeWaitedTS + +_changeWaitedTS + + + +LockedFund.changeWaitedTS->LockedFund._changeWaitedTS + + + + + +LockedFund.withdrawWaitedUnlockedBalance + +withdrawWaitedUnlockedBalance + + + +LockedFund._withdrawWaitedUnlockedBalance + +_withdrawWaitedUnlockedBalance + + + +LockedFund.withdrawWaitedUnlockedBalance->LockedFund._withdrawWaitedUnlockedBalance + + + + + +LockedFund.createVestingAndStake + +createVestingAndStake + + + +LockedFund._createVestingAndStake + +_createVestingAndStake + + + +LockedFund.createVestingAndStake->LockedFund._createVestingAndStake + + + + + +LockedFund.createVesting + +createVesting + + + +LockedFund._createVesting + +_createVesting + + + +LockedFund.createVesting->LockedFund._createVesting + + + + + +LockedFund.stakeTokens + +stakeTokens + + + +LockedFund.stakeTokens->IVestingLogic.cliff + + + + + +LockedFund.stakeTokens->IVestingLogic.duration + + + + + +LockedFund._getVesting + +_getVesting + + + +LockedFund.stakeTokens->LockedFund._getVesting + + + + + +LockedFund._stakeTokens + +_stakeTokens + + + +LockedFund.stakeTokens->LockedFund._stakeTokens + + + + + +LockedFund.withdrawAndStakeTokens + +withdrawAndStakeTokens + + + +LockedFund.withdrawAndStakeTokens->LockedFund._withdrawWaitedUnlockedBalance + + + + + +LockedFund.withdrawAndStakeTokens->LockedFund._createVestingAndStake + + + + + +LockedFund._depositVested->IERC20.transferFrom + + + + + +_amount.mul + +mul + + + +LockedFund._depositVested->_amount.mul + + + + + +LockedFund._depositWaitedUnlocked->IERC20.transferFrom + + + + + +LockedFund._depositWaitedUnlocked->_amount.mul + + + + + +LockedFund._withdrawWaitedUnlockedBalance->IERC20.transfer + + + + + +LockedFund._createVesting->IVestingRegistry.createVesting + + + + + +LockedFund._createVesting->LockedFund._getVesting + + + + + +LockedFund._getVesting->IVestingRegistry.getVesting + + + + + +LockedFund._stakeTokens->IERC20.approve + + + + + +LockedFund._createVestingAndStake->LockedFund._createVesting + + + + + +LockedFund._createVestingAndStake->LockedFund._getVesting + + + + + +LockedFund._createVestingAndStake->LockedFund._stakeTokens + + + + + +LockedFund.getWaitedTS + +getWaitedTS + + + +LockedFund.getToken + +getToken + + + +LockedFund.getVestingDetails + +getVestingDetails + + + +LockedFund.getVestedBalance + +getVestedBalance + + + +LockedFund.getLockedBalance + +getLockedBalance + + + +LockedFund.getWaitedUnlockedBalance + +getWaitedUnlockedBalance + + + +LockedFund.getUnlockedBalance + +getUnlockedBalance + + + +LockedFund.adminStatus + +adminStatus + + + +LockedFund.getCliffAndDuration + +getCliffAndDuration + + + +ReentrancyGuard.nonReentrant + + +nonReentrant + + + +key + +Internal Call +External Call +Defined Contract +Undefined Contract + + + +key2 + +    +    + +    + + + + +key:e->key2:w + + + + + +key:e->key2:w + + + + + \ No newline at end of file diff --git a/contracts/Interfaces/IApproveAndCall.sol b/contracts/Interfaces/IApproveAndCall.sol new file mode 100644 index 0000000..55c7284 --- /dev/null +++ b/contracts/Interfaces/IApproveAndCall.sol @@ -0,0 +1,21 @@ +pragma solidity ^0.5.17; + +/** + * @title Interface for contract governance/ApprovalReceiver.sol + * @dev Interfaces are used to cast a contract address into a callable instance. + */ +interface IApproveAndCall { + /** + * @notice Receives approval from SOV token. + * @param _sender The sender of SOV.approveAndCall function. + * @param _amount The amount was approved. + * @param _token The address of token. + * @param _data The data will be used for low level call. + * */ + function receiveApproval( + address _sender, + uint256 _amount, + address _token, + bytes calldata _data + ) external; +} diff --git a/contracts/Interfaces/IERC20.sol b/contracts/Interfaces/IERC20.sol new file mode 100644 index 0000000..268d593 --- /dev/null +++ b/contracts/Interfaces/IERC20.sol @@ -0,0 +1,31 @@ +/** + * Copyright 2017-2021, bZeroX, LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0. + */ + +pragma solidity >=0.5.0 <0.6.0; + +contract IERC20 { + string public name; + uint8 public decimals; + string public symbol; + + function totalSupply() public view returns (uint256); + + function balanceOf(address _who) public view returns (uint256); + + function allowance(address _owner, address _spender) public view returns (uint256); + + function approve(address _spender, uint256 _value) public returns (bool); + + function transfer(address _to, uint256 _value) public returns (bool); + + function transferFrom( + address _from, + address _to, + uint256 _value + ) public returns (bool); + + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/contracts/Interfaces/IFeeSharingProxy.sol b/contracts/Interfaces/IFeeSharingProxy.sol new file mode 100644 index 0000000..10898bb --- /dev/null +++ b/contracts/Interfaces/IFeeSharingProxy.sol @@ -0,0 +1,17 @@ +pragma solidity ^0.5.17; + +/** + * @title Interface for contract governance/FeeSharingProxy.sol + * @dev Interfaces are used to cast a contract address into a callable instance. + * */ +interface IFeeSharingProxy { + function withdrawFees(address _token) external; + + function transferTokens(address _token, uint96 _amount) external; + + function withdraw( + address _loanPoolToken, + uint32 _maxCheckpoints, + address _receiver + ) external; +} diff --git a/contracts/Interfaces/ILockedFund.sol b/contracts/Interfaces/ILockedFund.sol new file mode 100644 index 0000000..9424e4b --- /dev/null +++ b/contracts/Interfaces/ILockedFund.sol @@ -0,0 +1,116 @@ +pragma solidity ^0.5.17; + +/** + * @title An interface of Locked Fund Contract. + * @author Franklin Richards - powerhousefrank@protonmail.com + */ +contract ILockedFund { + /* Functions */ + + /** + * @notice The function to add a new admin. + * @param _newAdmin The address of the new admin. + * @dev Only callable by an Admin. + */ + function addAdmin(address _newAdmin) external; + + /** + * @notice The function to remove an admin. + * @param _adminToRemove The address of the admin which should be removed. + * @dev Only callable by an Admin. + */ + function removeAdmin(address _adminToRemove) external; + + /** + * @notice The function to update the Vesting Registry, Duration and Cliff. + * @param _vestingRegistry The Vesting Registry Address. + */ + function changeVestingRegistry(address _vestingRegistry) public; + + /** + * @notice The function used to update the waitedTS. + * @param _waitedTS The timestamp after which withdrawal is allowed. + */ + function changeWaitedTS(uint256 _waitedTS) public; + + /** + * @notice Adds Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`). + * @param _userAddress The user whose locked balance has to be updated with `_amount`. + * @param _amount The amount of Token to be added to the locked and/or unlocked balance. + * @param _cliff The cliff for vesting. + * @param _duration The duration for vesting. + * @param _basisPoint The % (in Basis Point) which determines how much will be (waited) unlocked immediately. + * @param _unlockedOrWaited Determines if the Basis Point determines the Unlocked or Waited Unlock Balance. + * @dev Future iteration will have choice between waited unlock and immediate unlock. + */ + function depositVested( + address _userAddress, + uint256 _amount, + uint256 _cliff, + uint256 _duration, + uint256 _basisPoint, + uint256 _unlockedOrWaited + ) public; + + /** + * @notice Adds Token to the user balance (Locked and Waited Unlocked Balance based on `_basisPoint`). + * @param _userAddress The user whose locked balance has to be updated with `_amount`. + * @param _amount The amount of Token to be added to the locked and/or unlocked balance. + * @param _cliff The cliff for vesting. + * @param _duration The duration for vesting. + * @param _basisPoint The % (in Basis Point) which determines how much will be (waited) unlocked immediately. + * @param _unlockedOrWaited Determines if the Basis Point determines the Unlocked or Waited Unlock Balance. + * @dev Future iteration will have choice between waited unlock and immediate unlock. + */ + function depositLocked( + address _userAddress, + uint256 _amount, + uint256 _cliff, + uint256 _duration, + uint256 _basisPoint, + uint256 _unlockedOrWaited + ) public; + + /** + * @notice Adds Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`). + * @param _userAddress The user whose locked balance has to be updated with `_amount`. + * @param _amount The amount of Token to be added to the locked and/or unlocked balance. + * @param _basisPoint The % (in Basis Point) which determines how much will be unlocked immediately. + * @dev Future iteration will have choice between waited unlock and immediate unlock. + */ + function depositWaitedUnlocked( + address _userAddress, + uint256 _amount, + uint256 _basisPoint + ) public; + + /** + * @notice A function to withdraw the waited unlocked balance. + * @param _receiverAddress If specified, the unlocked balance will go to this address, else to msg.sender. + */ + function withdrawWaitedUnlockedBalance(address _receiverAddress) external; + + /** + * @notice Creates vesting if not already created and Stakes tokens for a user. + * @dev Only use this function if the `duration` is small. + */ + function createVestingAndStake() external; + + /** + * @notice Creates vesting contract (if it hasn't been created yet) for the calling user. + * @return _vestingAddress The New Vesting Contract Created. + */ + function createVesting() external returns (address _vestingAddress); + + /** + * @notice Stakes tokens for a user who already have a vesting created. + * @dev The user should already have a vesting created, else this function will throw error. + */ + function stakeTokens() external; + + /** + * @notice Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created. + * @param _receiverAddress If specified, the unlocked balance will go to this address, else to msg.sender. + */ + function withdrawAndStakeTokens(address _receiverAddress) external; +} diff --git a/contracts/Interfaces/IOrigins.sol b/contracts/Interfaces/IOrigins.sol new file mode 100644 index 0000000..378065b --- /dev/null +++ b/contracts/Interfaces/IOrigins.sol @@ -0,0 +1,291 @@ +pragma solidity ^0.5.17; + +/** + * @title Interface of the Origins Platform. + * @author Franklin Richards - powerhousefrank@protonmail.com + */ +contract IOrigins { + /* Functions */ + + /* Public & External Functions */ + + /** + * @notice Function to set the deposit address. + * @param _depositAddress The address of deposit address where all the raised fund will go. + * @dev If this is not set, an owner can withdraw the funds. Here owner is supposed to be a multisig. Or a trusted party. + */ + function setDepositAddress(address payable _depositAddress) external; + + /** + * @notice Function to set the Locked Fund Contract Address. + * @param _lockedFund The address of new the Vesting registry. + */ + function setLockedFund(address _lockedFund) external; + + /** + * @notice Function to create a new tier. + * @param _maxAmount The maximum amount of asset which can be deposited. + * @param _remainingTokens Contains the remaining tokens for sale. + * @param _saleStartTS Contains the timestamp for the sale to start. Before which no user will be able to buy tokens. + * @param _saleEnd Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens. + * @param _unlockedBP Contains the unlock amount in Basis Point for Vesting/Lock. + * @param _vestOrLockCliff Contains the cliff of the vesting/lock for distribution. + * @param _vestOrLockDuration Contains the duration of the vesting/lock for distribution. + * @param _depositRate Contains the rate of the token w.r.t. the depositing asset. + * @param _verificationType Contains the method by which verification happens. + * @param _saleEndDurationOrTS Contains whether end of sale is by Duration or Timestamp. + * @param _transferType Contains the type of token transfer after a user buys to get the tokens. + * @return _tierID The newly created tier ID. + * @dev In the future this should be decoupled. + * Some are currently sent with default value due to Stack Too Deep problem. + */ + function createTier( + uint256 _maxAmount, + uint256 _remainingTokens, + uint256 _saleStartTS, + uint256 _saleEnd, + uint256 _unlockedBP, + uint256 _vestOrLockCliff, + uint256 _vestOrLockDuration, + uint256 _depositRate, + uint256 _depositType, + uint256 _verificationType, + uint256 _saleEndDurationOrTS, + uint256 _transferType + ) external returns (uint256 _tierID); + + /** + * @notice Function to set the Tier Verification Method. + * @param _tierID The Tier ID which is being updated. + * @param _verificationType The type of verification for the particular sale. + */ + function setTierVerification(uint256 _tierID, uint256 _verificationType) external; + + /** + * @notice Function to set the Tier Deposit Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _depositRate The rate is the, asset * rate = token. + * @param _depositToken The token for that particular Tier Sale. + * @param _depositType The type of deposit for the particular sale. + */ + function setTierDeposit( + uint256 _tierID, + uint256 _depositRate, + address _depositToken, + uint256 _depositType + ) external; + + /** + * @notice Function to set the Tier Token Limit Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _minAmount The minimum asset amount required to participate in that tier. + * @param _maxAmount The maximum asset amount allowed to participate in that tier. + */ + function setTierTokenLimit( + uint256 _tierID, + uint256 _minAmount, + uint256 _maxAmount + ) external; + + /** + * @notice Function to set the Tier Token Amount Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _remainingTokens The maximum number of tokens allowed to be sold in the tier. + */ + function setTierTokenAmount(uint256 _tierID, uint256 _remainingTokens) external; + + /** + * @notice Function to set the Tier Vest/Lock Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _vestOrLockCliff The Vest/Lock Cliff = A * LockedFund.Interval, where A is the cliff. + * @param _vestOrLockDuration The Vest/Lock Duration = A * LockedFund.Interval, where A is the duration. + * @param _unlockedBP The unlocked token amount in BP. + * @param _transferType The Tier Transfer Type for the Tier. + */ + function setTierVestOrLock( + uint256 _tierID, + uint256 _vestOrLockCliff, + uint256 _vestOrLockDuration, + uint256 _unlockedBP, + uint256 _transferType + ) external; + + /** + * @notice Function to set the Tier Time Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _saleStartTS The Tier Sale Start Timestamp. + * @param _saleEnd The Tier Sale End Duration or Timestamp. + * @param _saleEndDurationOrTS The Tier Sale End Type for the Tier. + */ + function setTierTime( + uint256 _tierID, + uint256 _saleStartTS, + uint256 _saleEnd, + uint256 _saleEndDurationOrTS + ) external; + + /** + * @notice Function to verify a single address with a single tier. + * @param _addressToBeVerified The address which has to be veriried for the sale. + * @param _tierID The tier for which the address has to be verified. + */ + function addressVerification(address _addressToBeVerified, uint256 _tierID) external; + + /** + * @notice Function to verify a single address with multiple tiers. + * @param _addressToBeVerified The address which has to be veriried for the sale. + * @param _tierID The tiers for which the address has to be verified. + */ + function singleAddressMultipleTierVerification(address _addressToBeVerified, uint256[] calldata _tierID) external; + + /** + * @notice Function to verify multiple address with a single tier. + * @param _addressToBeVerified The addresses which has to be veriried for the sale. + * @param _tierID The tier for which the addresses has to be verified. + */ + function multipleAddressSingleTierVerification(address[] calldata _addressToBeVerified, uint256 _tierID) external; + + /** + * @notice Function to verify multiple address with multiple tiers. + * @param _addressToBeVerified The addresses which has to be veriried for the sale. + * @param _tierID The tiers for which the addresses has to be verified. + */ + function multipleAddressAndTierVerification(address[] calldata _addressToBeVerified, uint256[] calldata _tierID) external; + + /** + * @notice Function to buy tokens from sale based on tier. + * @param _tierID The Tier ID from which the token has to be bought. + * @param _amount The amount of token (deposit asset) which will be sent for purchasing. + * @dev If deposit type if RBTC, then _amount can be passed as zero. + */ + function buy(uint256 _tierID, uint256 _amount) external payable; + + /** + * @notice The function used by the admin or deposit address to withdraw the sale proceedings. + * @dev In the future this could be made to be accessible only to seller, rather than owner. + */ + function withdrawSaleDeposit() external; + + /* Getter Functions */ + + /** + * @notice Function to read the tier count. + * @return The number of tiers present in the contract. + */ + function getTierCount() external view returns (uint256); + + /** + * @notice Function to read the deposit address. + * @return The address of the deposit address. + * @dev If zero is returned, any of the owners can withdraw the raised funds. + */ + function getDepositAddress() external view returns (address); + + /** + * @notice Function to read the token on sale. + * @return The Token contract address which is being sold in the contract. + */ + function getToken() external view returns (address); + + /** + * @notice Function to read the locked fund contract address. + * @return Address of Locked Fund Contract. + */ + function getLockDetails() external view returns (address); + + /** + * @notice Function to read a Tier parameter. + * @param _tierID The Tier whose info is to be read. + * @return _minAmount The minimum amount which can be deposited. + * @return _maxAmount The maximum amount which can be deposited. + * @return _remainingTokens Contains the remaining tokens for sale. + * @return _saleStartTS Contains the timestamp for the sale to start. Before which no user will be able to buy tokens. + * @return _saleEnd Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens. + * @return _unlockedBP Contains the unlock amount in Basis Point for Vesting/Lock. + * @return _vestOrLockCliff Contains the cliff of the vesting/lock for distribution. + * @return _vestOrLockDuration Contains the duration of the vesting/lock for distribution. + * @return _depositRate Contains the rate of the token w.r.t. the depositing asset. + */ + function readTierPartA(uint256 _tierID) + external + view + returns ( + uint256 _minAmount, + uint256 _maxAmount, + uint256 _remainingTokens, + uint256 _saleStartTS, + uint256 _saleEnd, + uint256 _unlockedBP, + uint256 _vestOrLockCliff, + uint256 _vestOrLockDuration, + uint256 _depositRate + ); + + /** + * @notice Function to read a Tier parameter. + * @param _tierID The Tier whose info is to be read. + * @return _depositToken Contains the deposit token address if the deposit type is Token. + * @return _depositType The type of deposit for the particular sale. + * @return _verificationType Contains the method by which verification happens. + * @return _saleEndDurationOrTS Contains whether end of sale is by Duration or Timestamp. + * @return _transferType Contains the type of token transfer after a user buys to get the tokens. + */ + function readTierPartB(uint256 _tierID) + external + view + returns ( + address _depositToken, + uint256 _depositType, + uint256 _verificationType, + uint256 _saleEndDurationOrTS, + uint256 _transferType + ); + + /** + * @notice Function to read tokens bought by an address on a particular tier. + * @param _addr The address which has to be checked. + * @param _tierID The tier ID for which the address has to be checked. + * @return The amount of tokens bought by the address. + */ + function getTokensBoughtByAddressOnTier(address _addr, uint256 _tierID) external view returns (uint256); + + /** + * @notice Function to read participating wallet count per tier. + * @param _tierID The tier ID for which the count has to be checked. + * @return The number of wallets who participated in that Tier. + * @dev Total participation of wallets cannot be determined by this. + * A user can participate on one round and not on other. + * In the future maybe a count on that can be created. + */ + function getParticipatingWalletCountPerTier(uint256 _tierID) external view returns (uint256); + + /** + * @notice Function to read total token allocation per tier. + * @param _tierID The tier ID for which the metrics has to be checked. + * @return The amount of tokens allocation on that tier. + */ + function getTotalTokenAllocationPerTier(uint256 _tierID) external view returns (uint256); + + /** + * @notice Function to read tokens sold per tier. + * @param _tierID The tier ID for which the sold metrics has to be checked. + * @return The amount of tokens sold on that tier. + */ + function getTokensSoldPerTier(uint256 _tierID) external view returns (uint256); + + /** + * @notice Function to check if a tier sale ended or not. + * @param _tierID The Tier whose info is to be read. + * @return True is sale ended, False otherwise. + * @dev A return of false does not necessary mean the sale is active. It can also be in inactive state. + */ + function checkSaleEnded(uint256 _tierID) external view returns (bool _status); + + /** + * @notice Function to read address which are approved for sale in a tier. + * @param _addr The address which has to be checked. + * @param _tierID The tier ID for which the address has to be checked. + * @return True is allowed, False otherwise. + */ + function isAddressApproved(address _addr, uint256 _tierID) external view returns (bool); +} diff --git a/contracts/Interfaces/IStaking.sol b/contracts/Interfaces/IStaking.sol new file mode 100644 index 0000000..a82cbd1 --- /dev/null +++ b/contracts/Interfaces/IStaking.sol @@ -0,0 +1,39 @@ +pragma solidity ^0.5.17; + +/** + * @title Interface for contract governance/Staking/Staking.sol + * @dev Interfaces are used to cast a contract address into a callable instance. + */ +interface IStaking { + function stakesBySchedule( + uint256 amount, + uint256 cliff, + uint256 duration, + uint256 intervalLength, + address stakeFor, + address delegatee + ) external; + + function stake( + uint96 amount, + uint256 until, + address stakeFor, + address delegatee + ) external; + + function getPriorVotes( + address account, + uint256 blockNumber, + uint256 date + ) external view returns (uint96); + + function getPriorTotalVotingPower(uint32 blockNumber, uint256 time) external view returns (uint96); + + function getPriorWeightedStake( + address account, + uint256 blockNumber, + uint256 date + ) external view returns (uint96); + + function timestampToLockDate(uint256 timestamp) external view returns (uint256 lockDate); +} diff --git a/contracts/Interfaces/ITeamVesting.sol b/contracts/Interfaces/ITeamVesting.sol new file mode 100644 index 0000000..006d0c4 --- /dev/null +++ b/contracts/Interfaces/ITeamVesting.sol @@ -0,0 +1,11 @@ +pragma solidity ^0.5.17; + +/** + * @title Interface for TeamVesting contract. + * @dev Interfaces are used to cast a contract address into a callable instance. + * This interface is used by Staking contract to call governanceWithdrawTokens + * function having the vesting contract instance address. + */ +interface ITeamVesting { + function governanceWithdrawTokens(address receiver) external; +} diff --git a/contracts/Interfaces/IVesting.sol b/contracts/Interfaces/IVesting.sol new file mode 100644 index 0000000..12a68af --- /dev/null +++ b/contracts/Interfaces/IVesting.sol @@ -0,0 +1,16 @@ +pragma solidity ^0.5.17; + +/** + * @title Interface for Vesting contract. + * @dev Interfaces are used to cast a contract address into a callable instance. + * This interface is used by VestingLogic contract to implement stakeTokens function + * and on VestingRegistry contract to call IVesting(vesting).stakeTokens function + * at a vesting instance. + */ +interface IVesting { + function duration() external returns (uint256); + + function endDate() external returns (uint256); + + function stakeTokens(uint256 amount) external; +} diff --git a/contracts/Interfaces/IVestingFactory.sol b/contracts/Interfaces/IVestingFactory.sol new file mode 100644 index 0000000..05fc882 --- /dev/null +++ b/contracts/Interfaces/IVestingFactory.sol @@ -0,0 +1,30 @@ +pragma solidity ^0.5.17; + +/** + * @title Interface for Vesting Factory contract. + * @dev Interfaces are used to cast a contract address into a callable instance. + * This interface is used by VestingFactory contract to override empty + * implemention of deployVesting and deployTeamVesting functions + * and on VestingRegistry contract to use an instance of VestingFactory. + */ +interface IVestingFactory { + function deployVesting( + address _SOV, + address _staking, + address _tokenOwner, + uint256 _cliff, + uint256 _duration, + address _feeSharing, + address _owner + ) external returns (address); + + function deployTeamVesting( + address _SOV, + address _staking, + address _tokenOwner, + uint256 _cliff, + uint256 _duration, + address _feeSharing, + address _owner + ) external returns (address); +} diff --git a/contracts/Interfaces/IVestingLogic.sol b/contracts/Interfaces/IVestingLogic.sol new file mode 100644 index 0000000..cd74718 --- /dev/null +++ b/contracts/Interfaces/IVestingLogic.sol @@ -0,0 +1,23 @@ +pragma solidity ^0.5.17; + +import "../Sovryn/Governance/Vesting/VestingStorage.sol"; + +/** + * @title Vesting Logic Interface + */ +contract IVestingLogic is VestingStorage { + /* Functions */ + + /** + * @notice Stakes tokens according to the vesting schedule. + * @param _amount The amount of tokens to stake. + * */ + function stakeTokens(uint256 _amount) public; + + /** + * @notice Withdraws unlocked tokens from the staking contract and + * forwards them to an address specified by the token owner. + * @param receiver The receiving address. + * */ + function withdrawTokens(address receiver) public; +} diff --git a/contracts/Interfaces/IVestingRegistry.sol b/contracts/Interfaces/IVestingRegistry.sol new file mode 100644 index 0000000..b999f7a --- /dev/null +++ b/contracts/Interfaces/IVestingRegistry.sol @@ -0,0 +1,33 @@ +pragma solidity ^0.5.17; + +/** + * @title Vesting Registry Interface + */ +contract IVestingRegistry { + /** + * @notice creates Vesting contract + * @param _tokenOwner the owner of the tokens + * @param _amount the amount to be staked + * @param _cliff the cliff in seconds + * @param _duration the total duration in seconds + */ + function createVesting( + address _tokenOwner, + uint256 _amount, + uint256 _cliff, + uint256 _duration + ) public; + + /** + * @notice stakes tokens according to the vesting schedule + * @param _vesting the address of Vesting contract + * @param _amount the amount of tokens to stake + */ + function stakeTokens(address _vesting, uint256 _amount) public; + + /** + * @notice returns vesting contract address for the given token owner + * @param _tokenOwner the owner of the tokens + */ + function getVesting(address _tokenOwner) public view returns (address); +} diff --git a/contracts/LockedFund.sol b/contracts/LockedFund.sol new file mode 100644 index 0000000..d8fb0bc --- /dev/null +++ b/contracts/LockedFund.sol @@ -0,0 +1,608 @@ +pragma solidity ^0.5.17; + +import "./Interfaces/IERC20.sol"; +import "./Interfaces/ILockedFund.sol"; +import "./Openzeppelin/SafeMath.sol"; +import "./Interfaces/IVestingLogic.sol"; +import "./Interfaces/IVestingRegistry.sol"; + +/** + * @title A holding contract for Locked Fund. + * @author Franklin Richards - powerhousefrank@protonmail.com + * @notice You can use this contract for timed token release from Locked Fund. + * @dev This is not the final form of this contract. + */ +contract LockedFund is ILockedFund { + using SafeMath for uint256; + + /* Storage */ + + /// @notice The time after which waited unlock balance can be withdrawn. + uint256 public waitedTS; + + /// @notice The maximum basis point which is allowed. + uint256 internal constant MAX_BASIS_POINT = 10000; + /// @notice The maximum duration allowed for staking. + uint256 internal constant MAX_DURATION = 36; + /// @notice The interval duration. + uint256 public constant INTERVAL = 4 weeks; + + /// @notice The token contract. + IERC20 public token; + /// @notice The Vesting registry contract. + IVestingRegistry public vestingRegistry; + + /** + * @notice The type of Unlock. + * None - The unlock is not set yet. + * Immediate - The tokens will be unlocked immediately. + * Waited - The tokens will be unlocked only after a particular time period. + */ + enum UnlockType { + None, + Immediate, + Waited + } + + /// @notice The vested balances. + mapping(address => uint256) public vestedBalances; + /// @notice The locked user balances. Not used right now. + mapping(address => uint256) public lockedBalances; + /// @notice The waited unlocked user balances. + mapping(address => uint256) public waitedUnlockedBalances; + /// @notice The unlocked user balances. Not used right now. + mapping(address => uint256) public unlockedBalances; + /// @notice The contracts/wallets with admin power. + mapping(address => bool) public isAdmin; + + /// @notice The Cliff specified for an address. + mapping(address => uint256) public cliff; + /// @notice The Duration specified for an address. + mapping(address => uint256) public duration; + + /* Events */ + + /** + * @notice Emitted when a new Admin is added to the admin list. + * @param _initiator The address which initiated this event to be emitted. + * @param _newAdmin The address of the new admin. + */ + event AdminAdded(address indexed _initiator, address indexed _newAdmin); + + /** + * @notice Emitted when an admin is removed from the admin list. + * @param _initiator The address which initiated this event to be emitted. + * @param _removedAdmin The address of the removed admin. + */ + event AdminRemoved(address indexed _initiator, address indexed _removedAdmin); + + /** + * @notice Emitted when Vesting Registry is updated. + * @param _initiator The address which initiated this event to be emitted. + * @param _vestingRegistry The Vesting Registry Contract. + */ + event VestingRegistryUpdated(address indexed _initiator, address indexed _vestingRegistry); + + /** + * @notice Emitted when Waited Timestamp is updated. + * @param _initiator The address which initiated this event to be emitted. + * @param _waitedTS The waited timestamp. + */ + event WaitedTSUpdated(address indexed _initiator, uint256 _waitedTS); + + /** + * @notice Emitted when a new deposit is made. + * @param _initiator The address which initiated this event to be emitted. + * @param _userAddress The user to whose un/locked balance a new deposit was made. + * @param _amount The amount of Token to be added to the un/locked balance. + * @param _cliff The cliff for vesting. + * @param _duration The duration for vesting. + * @param _basisPoint The % (in Basis Point) which determines how much will be unlocked immediately. + */ + event VestedDeposited( + address indexed _initiator, + address indexed _userAddress, + uint256 _amount, + uint256 _cliff, + uint256 _duration, + uint256 _basisPoint + ); + + /** + * @notice Emitted when a new deposit is made. + * @param _initiator The address which initiated this event to be emitted. + * @param _userAddress The user to whose un/locked balance a new deposit was made. + * @param _amount The amount of Token to be added to the un/locked balance. + * @param _basisPoint The % (in Basis Point) which determines how much will be unlocked immediately. + */ + event WaitedUnlockedDeposited(address indexed _initiator, address indexed _userAddress, uint256 _amount, uint256 _basisPoint); + + /** + * @notice Emitted when a user withdraws the fund. + * @param _initiator The address which initiated this event to be emitted. + * @param _userAddress The user whose unlocked balance has to be withdrawn. + * @param _amount The amount of Token withdrawn from the unlocked balance. + */ + event Withdrawn(address indexed _initiator, address indexed _userAddress, uint256 _amount); + + /** + * @notice Emitted when a user creates a vesting for himself. + * @param _initiator The address which initiated this event to be emitted. + * @param _userAddress The user whose unlocked balance has to be withdrawn. + * @param _vesting The Vesting Contract. + */ + event VestingCreated(address indexed _initiator, address indexed _userAddress, address indexed _vesting); + + /** + * @notice Emitted when a user stakes tokens. + * @param _initiator The address which initiated this event to be emitted. + * @param _vesting The Vesting Contract. + * @param _amount The amount of locked tokens staked by the user. + */ + event TokenStaked(address indexed _initiator, address indexed _vesting, uint256 _amount); + + /* Modifiers */ + + /** + * @notice Modifier to check only admin is allowed for certain functions. + */ + modifier onlyAdmin() { + require(isAdmin[msg.sender], "LockedFund: Only admin can call this."); + _; + } + + /* Functions */ + + /** + * @notice Setup the required parameters. + * @param _waitedTS The time after which unlocked token balance withdrawal is allowed. + * @param _token The Token Address. + * @param _vestingRegistry The Vesting Registry Address. + * @param _admins The list of Admins to be added. + */ + constructor( + uint256 _waitedTS, + address _token, + address _vestingRegistry, + address[] memory _admins + ) public { + require(_waitedTS != 0, "LockedFund: Waited TS cannot be zero."); + require(_token != address(0), "LockedFund: Invalid Token Address."); + require(_vestingRegistry != address(0), "LockedFund: Vesting registry address is invalid."); + + waitedTS = _waitedTS; + token = IERC20(_token); + vestingRegistry = IVestingRegistry(_vestingRegistry); + + for (uint256 index = 0; index < _admins.length; index++) { + require(_admins[index] != address(0), "LockedFund: Invalid Address."); + isAdmin[_admins[index]] = true; + emit AdminAdded(msg.sender, _admins[index]); + } + } + + /* Public or External Functions */ + + /** + * @notice The function to add a new admin. + * @param _newAdmin The address of the new admin. + * @dev Only callable by an Admin. + */ + function addAdmin(address _newAdmin) external onlyAdmin { + _addAdmin(_newAdmin); + } + + /** + * @notice The function to remove an admin. + * @param _adminToRemove The address of the admin which should be removed. + * @dev Only callable by an Admin. + */ + function removeAdmin(address _adminToRemove) external onlyAdmin { + _removeAdmin(_adminToRemove); + } + + /** + * @notice The function to update the Vesting Registry, Duration and Cliff. + * @param _vestingRegistry The Vesting Registry Address. + */ + function changeVestingRegistry(address _vestingRegistry) public onlyAdmin { + _changeVestingRegistry(_vestingRegistry); + } + + /** + * @notice The function used to update the waitedTS. + * @param _waitedTS The timestamp after which withdrawal is allowed. + */ + function changeWaitedTS(uint256 _waitedTS) public onlyAdmin { + _changeWaitedTS(_waitedTS); + } + + /** + * @notice Adds Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`). + * @param _userAddress The user whose locked balance has to be updated with `_amount`. + * @param _amount The amount of Token to be added to the locked and/or unlocked balance. + * @param _cliff The cliff for vesting. + * @param _duration The duration for vesting. + * @param _basisPoint The % (in Basis Point) which determines how much will be (waited) unlocked immediately. + * @param _unlockedOrWaited Determines if the Basis Point determines the Unlocked or Waited Unlock Balance. + * @dev Future iteration will have choice between waited unlock and immediate unlock. + */ + function depositVested( + address _userAddress, + uint256 _amount, + uint256 _cliff, + uint256 _duration, + uint256 _basisPoint, + uint256 _unlockedOrWaited + ) public onlyAdmin { + _depositVested(_userAddress, _amount, _cliff, _duration, _basisPoint, UnlockType(_unlockedOrWaited)); + } + + /** + * @notice Adds Token to the user balance (Locked and Waited Unlocked Balance based on `_basisPoint`). + * @param _userAddress The user whose locked balance has to be updated with `_amount`. + * @param _amount The amount of Token to be added to the locked and/or unlocked balance. + * @param _cliff The cliff for vesting. + * @param _duration The duration for vesting. + * @param _basisPoint The % (in Basis Point) which determines how much will be (waited) unlocked immediately. + * @param _unlockedOrWaited Determines if the Basis Point determines the Unlocked or Waited Unlock Balance. + * @dev Future iteration will have choice between waited unlock and immediate unlock. + */ + function depositLocked( + address _userAddress, + uint256 _amount, + uint256 _cliff, + uint256 _duration, + uint256 _basisPoint, + uint256 _unlockedOrWaited + ) public onlyAdmin { + // TODO + // _depositLocked(_userAddress, _amount, _cliff, _duration, _basisPoint, UnlockType(_unlockedOrWaited)); + // An array with timestamp and a mapping from timestamp to the amount. + // Array will be unsorted, so there should be two ways to withdraw this to avoid out of gas problem. + // One should be normal one which will loop through all the timestamp in array. + // The other should be which allows certain index to be passed to get the array elements. + // There should also be a check to see if the timestamp is already in array. It can be done through checking the mapping. + // If the mapping already has some amount, then that timestamp will be in array. + // The the mapping has no amount, then the timestamp has to be added to the array. + } + + /** + * @notice Adds Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`). + * @param _userAddress The user whose locked balance has to be updated with `_amount`. + * @param _amount The amount of Token to be added to the locked and/or unlocked balance. + * @param _basisPoint The % (in Basis Point) which determines how much will be unlocked immediately. + * @dev Future iteration will have choice between waited unlock and immediate unlock. + */ + function depositWaitedUnlocked( + address _userAddress, + uint256 _amount, + uint256 _basisPoint + ) public onlyAdmin { + _depositWaitedUnlocked(_userAddress, _amount, _basisPoint); + } + + /** + * @notice A function to withdraw the waited unlocked balance. + * @param _receiverAddress If specified, the unlocked balance will go to this address, else to msg.sender. + */ + function withdrawWaitedUnlockedBalance(address _receiverAddress) external { + _withdrawWaitedUnlockedBalance(msg.sender, _receiverAddress); + } + + /** + * @notice Creates vesting if not already created and Stakes tokens for a user. + * @dev Only use this function if the `duration` is small. + */ + function createVestingAndStake() external { + _createVestingAndStake(msg.sender); + } + + /** + * @notice Creates vesting contract (if it hasn't been created yet) for the calling user. + * @return _vestingAddress The New Vesting Contract Created. + */ + function createVesting() external returns (address _vestingAddress) { + _vestingAddress = _createVesting(msg.sender); + } + + /** + * @notice Stakes tokens for a user who already have a vesting created. + * @dev The user should already have a vesting created, else this function will throw error. + */ + function stakeTokens() external { + IVestingLogic vesting = IVestingLogic(_getVesting(msg.sender)); + + require(cliff[msg.sender] == vesting.cliff() && duration[msg.sender] == vesting.duration(), "LockedFund: Wrong Vesting Schedule."); + + _stakeTokens(msg.sender, address(vesting)); + } + + /** + * @notice Withdraws unlocked tokens and Stakes Vested token balance for a user who already have a vesting created. + * @param _receiverAddress If specified, the unlocked balance will go to this address, else to msg.sender. + */ + function withdrawAndStakeTokens(address _receiverAddress) external { + _withdrawWaitedUnlockedBalance(msg.sender, _receiverAddress); + _createVestingAndStake(msg.sender); + } + + /* Internal Functions */ + + /** + * @notice Internal function to add a new admin. + * @param _newAdmin The address of the new admin. + */ + function _addAdmin(address _newAdmin) internal { + require(_newAdmin != address(0), "LockedFund: Invalid Address."); + require(!isAdmin[_newAdmin], "LockedFund: Address is already admin."); + isAdmin[_newAdmin] = true; + + emit AdminAdded(msg.sender, _newAdmin); + } + + /** + * @notice Internal function to remove an admin. + * @param _adminToRemove The address of the admin which should be removed. + * @dev Only callable by an Admin. + */ + function _removeAdmin(address _adminToRemove) internal { + require(isAdmin[_adminToRemove], "LockedFund: Address is not an admin."); + isAdmin[_adminToRemove] = false; + + emit AdminRemoved(msg.sender, _adminToRemove); + } + + /** + * @notice Internal function to update the Vesting Registry, Duration and Cliff. + * @param _vestingRegistry The Vesting Registry Address. + */ + function _changeVestingRegistry(address _vestingRegistry) internal { + require(_vestingRegistry != address(0), "LockedFund: Vesting registry address is invalid."); + + vestingRegistry = IVestingRegistry(_vestingRegistry); + + emit VestingRegistryUpdated(msg.sender, _vestingRegistry); + } + + /** + * @notice Internal function used to update the waitedTS. + * @param _waitedTS The timestamp after which withdrawal is allowed. + */ + function _changeWaitedTS(uint256 _waitedTS) internal { + require(_waitedTS != 0, "LockedFund: Waited TS cannot be zero."); + + waitedTS = _waitedTS; + + emit WaitedTSUpdated(msg.sender, _waitedTS); + } + + /** + * @notice Internal function to add Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`). + * @param _userAddress The user whose locked balance has to be updated with `_amount`. + * @param _amount The amount of Token to be added to the locked and/or unlocked balance. + * @param _cliff The cliff for vesting. + * @param _duration The duration for vesting. + * @param _basisPoint The % (in Basis Point) which determines how much will be (waited) unlocked immediately. + * @param _unlockedOrWaited Determines if the Basis Point determines the Unlocked or Waited Unlock Balance. + */ + function _depositVested( + address _userAddress, + uint256 _amount, + uint256 _cliff, + uint256 _duration, + uint256 _basisPoint, + UnlockType _unlockedOrWaited + ) internal { + /// If duration is also zero, then it is similar to Unlocked Token. + require(_duration != 0, "LockedFund: Duration cannot be zero."); + require(_duration <= MAX_DURATION, "LockedFund: Duration is too long."); + + // MAX_BASIS_POINT is not included because if 100% is unlocked, then this function is not required to be used. + require(_basisPoint < MAX_BASIS_POINT, "LockedFund: Basis Point has to be less than 10000."); + bool txStatus = token.transferFrom(msg.sender, address(this), _amount); + require(txStatus, "LockedFund: Token transfer was not successful. Check receiver address."); + + uint256 unlockedBal = _amount.mul(_basisPoint).div(MAX_BASIS_POINT); + + if (_unlockedOrWaited == UnlockType.Immediate) { + unlockedBalances[_userAddress] = unlockedBalances[_userAddress].add(unlockedBal); + // TODO emit unlocked deposited event. + } else if (_unlockedOrWaited == UnlockType.Waited) { + waitedUnlockedBalances[_userAddress] = waitedUnlockedBalances[_userAddress].add(unlockedBal); + // TODO emit waited unlocked deposited event. + } else { + unlockedBal = 0; + } + + vestedBalances[_userAddress] = vestedBalances[_userAddress].add(_amount).sub(unlockedBal); + + cliff[_userAddress] = _cliff * INTERVAL; + duration[_userAddress] = _duration * INTERVAL; + + emit VestedDeposited(msg.sender, _userAddress, _amount, _cliff, _duration, _basisPoint); + // TODO Edit the amount subtracted from the amount of waited/unlocked balance, if basis point was higher than zero. + } + + /** + * @notice Internal function to add Token to the user balance (Waited Unlocked and Unlocked Balance based on `_basisPoint`). + * @param _userAddress The user whose waited unlocked balance has to be updated with `_amount`. + * @param _amount The amount of Token to be added to the locked and/or unlocked balance. + * @param _basisPoint The % (in Basis Point)which determines how much will be unlocked immediately. + */ + function _depositWaitedUnlocked( + address _userAddress, + uint256 _amount, + uint256 _basisPoint + ) internal { + // MAX_BASIS_POINT is not included because if 100% is unlocked, then this function is not required to be used. + require(_basisPoint < MAX_BASIS_POINT, "LockedFund: Basis Point has to be less than 10000."); + bool txStatus = token.transferFrom(msg.sender, address(this), _amount); + require(txStatus, "LockedFund: Token transfer was not successful. Check receiver address."); + + uint256 unlockedBal = _amount.mul(_basisPoint).div(MAX_BASIS_POINT); + + if (unlockedBal > 0) { + unlockedBalances[_userAddress] = unlockedBalances[_userAddress].add(unlockedBal); + // TODO emit unlocked deposited event. + } + waitedUnlockedBalances[_userAddress] = waitedUnlockedBalances[_userAddress].add(_amount).sub(unlockedBal); + + emit WaitedUnlockedDeposited(msg.sender, _userAddress, _amount, _basisPoint); + } + + /** + * @notice A function to withdraw the waited unlocked balance. + * @param _sender The one who initiates the call, from this user the balance will be taken. + * @param _receiverAddress If specified, the unlocked balance will go to this address, else to msg.sender. + */ + function _withdrawWaitedUnlockedBalance(address _sender, address _receiverAddress) internal { + require(waitedTS < block.timestamp, "LockedFund: Wait Timestamp not yet passed."); + + address userAddr = _receiverAddress; + if (_receiverAddress == address(0)) { + userAddr = _sender; + } + + uint256 amount = waitedUnlockedBalances[_sender]; + waitedUnlockedBalances[_sender] = 0; + + bool txStatus = token.transfer(userAddr, amount); + require(txStatus, "LockedFund: Token transfer was not successful. Check receiver address."); + + emit Withdrawn(_sender, userAddr, amount); + } + + /** + * @notice Creates a Vesting Contract for a user. + * @param _tokenOwner The owner of the vesting contract. + * @return _vestingAddress The Vesting Contract Address. + * @dev Does not do anything if Vesting Contract was already created. + */ + function _createVesting(address _tokenOwner) internal returns (address _vestingAddress) { + require(cliff[msg.sender] != 0 && duration[msg.sender] != 0, "LockedFund: Cliff and/or Duration not set."); + /// Here zero is given in place of amount, as amount is not really used in `vestingRegistry.createVesting()`. + vestingRegistry.createVesting(_tokenOwner, 0, cliff[_tokenOwner], duration[_tokenOwner]); + _vestingAddress = _getVesting(_tokenOwner); + emit VestingCreated(msg.sender, _tokenOwner, _vestingAddress); + } + + /** + * @notice Returns the Vesting Contract Address. + * @param _tokenOwner The owner of the vesting contract. + * @return _vestingAddress The Vesting Contract Address. + */ + function _getVesting(address _tokenOwner) internal view returns (address _vestingAddress) { + return vestingRegistry.getVesting(_tokenOwner); + } + + /** + * @notice Stakes the tokens in a particular vesting contract. + * @param _sender The user wallet address. + * @param _vesting The Vesting Contract Address. + */ + function _stakeTokens(address _sender, address _vesting) internal { + uint256 amount = vestedBalances[_sender]; + vestedBalances[_sender] = 0; + + require(token.approve(_vesting, amount), "LockedFund: Approve failed."); + IVestingLogic(_vesting).stakeTokens(amount); + + emit TokenStaked(_sender, _vesting, amount); + } + + /** + * @notice Internal function to create vesting if not already created and Stakes tokens for a user. + * @param _sender The user wallet address. + */ + function _createVestingAndStake(address _sender) internal { + address vestingAddr = _getVesting(_sender); + + if (vestingAddr == address(0)) { + vestingAddr = _createVesting(_sender); + } + + _stakeTokens(_sender, vestingAddr); + } + + /* Getter or Read Functions */ + + /** + * @notice Function to read the waited timestamp. + * @return The waited timestamp. + */ + function getWaitedTS() external view returns (uint256) { + return waitedTS; + } + + /** + * @notice Function to read the token on sale. + * @return The Token contract address which is being sold in the contract. + */ + function getToken() public view returns (address) { + return address(token); + } + + /** + * @notice Function to read the vesting registry. + * @return Address of Vesting Registry. + */ + function getVestingDetails() public view returns (address) { + return address(vestingRegistry); + } + + /** + * @notice The function to get the vested balance of a user. + * @param _addr The address of the user to check the vested balance. + * @return _balance The vested balance of the address `_addr`. + */ + function getVestedBalance(address _addr) external view returns (uint256 _balance) { + return vestedBalances[_addr]; + } + + /** + * @notice The function to get the locked balance of a user. + * @param _addr The address of the user to check the locked balance. + * @return _balance The locked balance of the address `_addr`. + */ + function getLockedBalance(address _addr) external view returns (uint256 _balance) { + return lockedBalances[_addr]; + } + + /** + * @notice The function to get the waited unlocked balance of a user. + * @param _addr The address of the user to check the waited unlocked balance. + * @return _balance The waited unlocked balance of the address `_addr`. + */ + function getWaitedUnlockedBalance(address _addr) external view returns (uint256 _balance) { + return waitedUnlockedBalances[_addr]; + } + + /** + * @notice The function to get the unlocked balance of a user. + * @param _addr The address of the user to check the unlocked balance. + * @return _balance The unlocked balance of the address `_addr`. + */ + function getUnlockedBalance(address _addr) external view returns (uint256 _balance) { + return unlockedBalances[_addr]; + } + + /** + * @notice The function to check is an address is admin or not. + * @param _addr The address of the user to check the admin status. + * @return _status True if admin, False otherwise. + */ + function adminStatus(address _addr) external view returns (bool _status) { + return isAdmin[_addr]; + } + + /** + * @notice Function to read the cliff and duration of a user. + * @param _addr The address whose cliff and duration has to be found. + * @return The cliff of the user vesting/lock. + * @return The duration of the user vesting/lock. + */ + function getCliffAndDuration(address _addr) external view returns (uint256, uint256) { + return (cliff[_addr], duration[_addr]); + } +} diff --git a/contracts/Openzeppelin/Address.sol b/contracts/Openzeppelin/Address.sol new file mode 100644 index 0000000..4b03e3a --- /dev/null +++ b/contracts/Openzeppelin/Address.sol @@ -0,0 +1,73 @@ +pragma solidity >=0.5.0 <0.6.0; + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // According to EIP-1052, 0x0 is the value returned for not-yet created accounts + // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned + // for accounts without code, i.e. `keccak256('')` + bytes32 codehash; + bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; + // solhint-disable-next-line no-inline-assembly + assembly { + codehash := extcodehash(account) + } + return (codehash != accountHash && codehash != 0x0); + } + + /** + * @dev Converts an `address` into `address payable`. Note that this is + * simply a type cast: the actual underlying value is not changed. + * + * _Available since v2.4.0._ + */ + function toPayable(address account) internal pure returns (address payable) { + return address(uint160(account)); + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html + * #use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + * + * _Available since v2.4.0._ + */ + function sendValue(address recipient, uint256 amount) internal { + require(address(this).balance >= amount, "Address: insufficient balance"); + + // solhint-disable-next-line avoid-call-value + (bool success, ) = recipient.call.value(amount)(""); + require(success, "Address: unable to send value, recipient may have reverted"); + } +} diff --git a/contracts/Openzeppelin/Context.sol b/contracts/Openzeppelin/Context.sol new file mode 100644 index 0000000..6328c70 --- /dev/null +++ b/contracts/Openzeppelin/Context.sol @@ -0,0 +1,28 @@ +pragma solidity >=0.5.0 <0.6.0; + +/* + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with GSN meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +contract Context { + // Empty internal constructor, to prevent people from mistakenly deploying + // an instance of this contract, which should be used via inheritance. + constructor() internal {} + + // solhint-disable-previous-line no-empty-blocks + + function _msgSender() internal view returns (address payable) { + return msg.sender; + } + + function _msgData() internal view returns (bytes memory) { + this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 + return msg.data; + } +} diff --git a/contracts/Openzeppelin/ERC20.sol b/contracts/Openzeppelin/ERC20.sol new file mode 100644 index 0000000..31255a4 --- /dev/null +++ b/contracts/Openzeppelin/ERC20.sol @@ -0,0 +1,242 @@ +pragma solidity ^0.5.0; + +import "./Context.sol"; +import "./IERC20_.sol"; +import "./SafeMath.sol"; + +/** + * @dev Implementation of the {IERC20} interface. + * + * This implementation is agnostic to the way tokens are created. This means + * that a supply mechanism has to be added in a derived contract using {_mint}. + * For a generic mechanism see {ERC20Mintable}. + * + * TIP: For a detailed writeup see our guide + * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How + * to implement supply mechanisms]. + * + * We have followed general OpenZeppelin guidelines: functions revert instead + * of returning `false` on failure. This behavior is nonetheless conventional + * and does not conflict with the expectations of ERC20 applications. + * + * Additionally, an {Approval} event is emitted on calls to {transferFrom}. + * This allows applications to reconstruct the allowance for all accounts just + * by listening to said events. Other implementations of the EIP may not emit + * these events, as it isn't required by the specification. + * + * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} + * functions have been added to mitigate the well-known issues around setting + * allowances. See {IERC20-approve}. + */ +contract ERC20 is Context, IERC20_ { + using SafeMath for uint256; + + mapping(address => uint256) private _balances; + + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 private _totalSupply; + + /** + * @dev See {IERC20-totalSupply}. + */ + function totalSupply() public view returns (uint256) { + return _totalSupply; + } + + /** + * @dev See {IERC20-balanceOf}. + */ + function balanceOf(address account) public view returns (uint256) { + return _balances[account]; + } + + /** + * @dev See {IERC20-transfer}. + * + * Requirements: + * + * - `recipient` cannot be the zero address. + * - the caller must have a balance of at least `amount`. + */ + function transfer(address recipient, uint256 amount) public returns (bool) { + _transfer(_msgSender(), recipient, amount); + return true; + } + + /** + * @dev See {IERC20-allowance}. + */ + function allowance(address owner, address spender) public view returns (uint256) { + return _allowances[owner][spender]; + } + + /** + * @dev See {IERC20-approve}. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function approve(address spender, uint256 amount) public returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + /** + * @dev 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`. + */ + function transferFrom( + address sender, + address recipient, + uint256 amount + ) public returns (bool) { + _transfer(sender, recipient, amount); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); + return true; + } + + /** + * @dev 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. + */ + function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); + return true; + } + + /** + * @dev 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`. + */ + function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); + return true; + } + + /** + * @dev Moves tokens `amount` from `sender` to `recipient`. + * + * This is internal function is equivalent to {transfer}, and can be used to + * e.g. implement automatic token fees, slashing mechanisms, etc. + * + * Emits a {Transfer} event. + * + * Requirements: + * + * - `sender` cannot be the zero address. + * - `recipient` cannot be the zero address. + * - `sender` must have a balance of at least `amount`. + */ + function _transfer( + address sender, + address recipient, + uint256 amount + ) internal { + require(sender != address(0), "ERC20: transfer from the zero address"); + require(recipient != address(0), "ERC20: transfer to the zero address"); + + _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); + _balances[recipient] = _balances[recipient].add(amount); + emit Transfer(sender, recipient, amount); + } + + /** @dev Creates `amount` tokens and assigns them to `account`, increasing + * the total supply. + * + * Emits a {Transfer} event with `from` set to the zero address. + * + * Requirements + * + * - `to` cannot be the zero address. + */ + function _mint(address account, uint256 amount) internal { + require(account != address(0), "ERC20: mint to the zero address"); + + _totalSupply = _totalSupply.add(amount); + _balances[account] = _balances[account].add(amount); + emit Transfer(address(0), account, amount); + } + + /** + * @dev Destroys `amount` tokens from `account`, reducing the + * total supply. + * + * Emits a {Transfer} event with `to` set to the zero address. + * + * Requirements + * + * - `account` cannot be the zero address. + * - `account` must have at least `amount` tokens. + */ + function _burn(address account, uint256 amount) internal { + require(account != address(0), "ERC20: burn from the zero address"); + + _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); + _totalSupply = _totalSupply.sub(amount); + emit Transfer(account, address(0), amount); + } + + /** + * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. + * + * This is internal function is equivalent to `approve`, and can be used to + * e.g. set automatic allowances for certain subsystems, etc. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `owner` cannot be the zero address. + * - `spender` cannot be the zero address. + */ + function _approve( + address owner, + address spender, + uint256 amount + ) internal { + require(owner != address(0), "ERC20: approve from the zero address"); + require(spender != address(0), "ERC20: approve to the zero address"); + + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @dev Destroys `amount` tokens from `account`.`amount` is then deducted + * from the caller's allowance. + * + * See {_burn} and {_approve}. + */ + function _burnFrom(address account, uint256 amount) internal { + _burn(account, amount); + _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); + } +} diff --git a/contracts/Openzeppelin/ERC20Detailed.sol b/contracts/Openzeppelin/ERC20Detailed.sol new file mode 100644 index 0000000..096ef18 --- /dev/null +++ b/contracts/Openzeppelin/ERC20Detailed.sol @@ -0,0 +1,58 @@ +pragma solidity ^0.5.0; + +import "./ERC20.sol"; + +/** + * @dev Optional functions from the ERC20 standard. + */ +contract ERC20Detailed is ERC20 { + string private _name; + string private _symbol; + uint8 private _decimals; + + /** + * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of + * these values are immutable: they can only be set once during + * construction. + */ + constructor( + string memory name, + string memory symbol, + uint8 decimals + ) public { + _name = name; + _symbol = symbol; + _decimals = decimals; + } + + /** + * @dev Returns the name of the token. + */ + function name() public view returns (string memory) { + return _name; + } + + /** + * @dev Returns the symbol of the token, usually a shorter version of the + * name. + */ + function symbol() public view returns (string memory) { + return _symbol; + } + + /** + * @dev Returns the number of decimals used to get its user representation. + * For example, if `decimals` equals `2`, a balance of `505` tokens should + * be displayed to a user as `5,05` (`505 / 10 ** 2`). + * + * Tokens usually opt for a value of 18, imitating the relationship between + * Ether and Wei. + * + * NOTE: This information is only used for _display_ purposes: it in + * no way affects any of the arithmetic of the contract, including + * {IERC20-balanceOf} and {IERC20-transfer}. + */ + function decimals() public view returns (uint8) { + return _decimals; + } +} diff --git a/contracts/Openzeppelin/IERC20_.sol b/contracts/Openzeppelin/IERC20_.sol new file mode 100644 index 0000000..6f1c85e --- /dev/null +++ b/contracts/Openzeppelin/IERC20_.sol @@ -0,0 +1,80 @@ +pragma solidity ^0.5.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. Does not include + * the optional functions; to access them see {ERC20Detailed}. + */ +interface IERC20_ { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom( + address sender, + address recipient, + uint256 amount + ) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/contracts/Openzeppelin/Ownable.sol b/contracts/Openzeppelin/Ownable.sol new file mode 100644 index 0000000..79f1cc6 --- /dev/null +++ b/contracts/Openzeppelin/Ownable.sol @@ -0,0 +1,66 @@ +pragma solidity >=0.5.0 <0.6.0; + +import "./Context.sol"; + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor() internal { + address msgSender = _msgSender(); + _owner = msgSender; + emit OwnershipTransferred(address(0), msgSender); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(isOwner(), "unauthorized"); + _; + } + + /** + * @dev Returns true if the caller is the current owner. + */ + function isOwner() public view returns (bool) { + return _msgSender() == _owner; + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public onlyOwner { + _transferOwnership(newOwner); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + */ + function _transferOwnership(address newOwner) internal { + require(newOwner != address(0), "Ownable: new owner is the zero address"); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} diff --git a/contracts/Openzeppelin/ReentrancyGuard.sol b/contracts/Openzeppelin/ReentrancyGuard.sol new file mode 100644 index 0000000..1b10584 --- /dev/null +++ b/contracts/Openzeppelin/ReentrancyGuard.sol @@ -0,0 +1,36 @@ +pragma solidity >=0.5.0 <0.6.0; + +/** + * @title Helps contracts guard against reentrancy attacks. + * @author Remco Bloemen , Eenae + * @dev If you mark a function `nonReentrant`, you should also + * mark it `external`. + */ +contract ReentrancyGuard { + /// @dev Constant for unlocked guard state - non-zero to prevent extra gas costs. + /// See: https://github.com/OpenZeppelin/openzeppelin-solidity/issues/1056 + uint256 internal constant REENTRANCY_GUARD_FREE = 1; + + /// @dev Constant for locked guard state + uint256 internal constant REENTRANCY_GUARD_LOCKED = 2; + + /** + * @dev We use a single lock for the whole contract. + */ + uint256 internal reentrancyLock = REENTRANCY_GUARD_FREE; + + /** + * @dev Prevents a contract from calling itself, directly or indirectly. + * If you mark a function `nonReentrant`, you should also + * mark it `external`. Calling one `nonReentrant` function from + * another is not supported. Instead, you can implement a + * `private` function doing the actual work, and an `external` + * wrapper marked as `nonReentrant`. + */ + modifier nonReentrant() { + require(reentrancyLock == REENTRANCY_GUARD_FREE, "nonReentrant"); + reentrancyLock = REENTRANCY_GUARD_LOCKED; + _; + reentrancyLock = REENTRANCY_GUARD_FREE; + } +} diff --git a/contracts/Openzeppelin/SafeERC20.sol b/contracts/Openzeppelin/SafeERC20.sol new file mode 100644 index 0000000..57ad855 --- /dev/null +++ b/contracts/Openzeppelin/SafeERC20.sol @@ -0,0 +1,95 @@ +pragma solidity >=0.5.0 <0.6.0; + +import "./SafeMath.sol"; +import "./Address.sol"; +import "../Interfaces/IERC20.sol"; + +/** + * @title SafeERC20 + * @dev Wrappers around ERC20 operations that throw on failure (when the token + * contract returns false). Tokens that return no value (and instead revert or + * throw on failure) are also supported, non-reverting calls are assumed to be + * successful. + * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, + * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. + */ +library SafeERC20 { + using SafeMath for uint256; + using Address for address; + + function safeTransfer( + IERC20 token, + address to, + uint256 value + ) internal { + callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); + } + + function safeTransferFrom( + IERC20 token, + address from, + address to, + uint256 value + ) internal { + callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); + } + + function safeApprove( + IERC20 token, + address spender, + uint256 value + ) internal { + // safeApprove should only be called when setting an initial allowance, + // or when resetting it to zero. To increase and decrease it, use + // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' + // solhint-disable-next-line max-line-length + require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance"); + callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); + } + + function safeIncreaseAllowance( + IERC20 token, + address spender, + uint256 value + ) internal { + uint256 newAllowance = token.allowance(address(this), spender).add(value); + callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); + } + + function safeDecreaseAllowance( + IERC20 token, + address spender, + uint256 value + ) internal { + uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); + callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); + } + + /** + * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement + * on the return value: the return value is optional (but if data is returned, it must not be false). + * @param token The token targeted by the call. + * @param data The call data (encoded using abi.encode or one of its variants). + */ + function callOptionalReturn(IERC20 token, bytes memory data) private { + // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since + // we're implementing it ourselves. + + // A Solidity high level call has three parts: + // 1. The target address is checked to verify it contains contract code + // 2. The call itself is made, and success asserted + // 3. The return value is decoded, which in turn checks the size of the returned data. + // solhint-disable-next-line max-line-length + require(address(token).isContract(), "SafeERC20: call to non-contract"); + + // solhint-disable-next-line avoid-low-level-calls + (bool success, bytes memory returndata) = address(token).call(data); + require(success, "SafeERC20: low-level call failed"); + + if (returndata.length > 0) { + // Return data is optional + // solhint-disable-next-line max-line-length + require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); + } + } +} diff --git a/contracts/Openzeppelin/SafeMath.sol b/contracts/Openzeppelin/SafeMath.sol new file mode 100644 index 0000000..c94909f --- /dev/null +++ b/contracts/Openzeppelin/SafeMath.sol @@ -0,0 +1,198 @@ +pragma solidity >=0.5.0 <0.6.0; + +/** + * @dev Wrappers over Solidity's arithmetic operations with added overflow + * checks. + * + * Arithmetic operations in Solidity wrap on overflow. This can easily result + * in bugs, because programmers usually assume that an overflow raises an + * error, which is the standard behavior in high level programming languages. + * `SafeMath` restores this intuition by reverting the transaction when an + * operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + */ +library SafeMath { + /** + * @dev Returns the addition of two unsigned integers, reverting on + * overflow. + * + * Counterpart to Solidity's `+` operator. + * + * Requirements: + * - Addition cannot overflow. + */ + function add(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 c = a + b; + require(c >= a, "SafeMath: addition overflow"); + + return c; + } + + /** + * @dev Returns the subtraction of two unsigned integers, reverting on + * overflow (when the result is negative). + * + * Counterpart to Solidity's `-` operator. + * + * Requirements: + * - Subtraction cannot overflow. + */ + function sub(uint256 a, uint256 b) internal pure returns (uint256) { + return sub(a, b, "SafeMath: subtraction overflow"); + } + + /** + * @dev Returns the subtraction of two unsigned integers, reverting with custom message on + * overflow (when the result is negative). + * + * Counterpart to Solidity's `-` operator. + * + * Requirements: + * - Subtraction cannot overflow. + * + * _Available since v2.4.0._ + */ + function sub( + uint256 a, + uint256 b, + string memory errorMessage + ) internal pure returns (uint256) { + require(b <= a, errorMessage); + uint256 c = a - b; + + return c; + } + + /** + * @dev Returns the multiplication of two unsigned integers, reverting on + * overflow. + * + * Counterpart to Solidity's `*` operator. + * + * Requirements: + * - Multiplication cannot overflow. + */ + function mul(uint256 a, uint256 b) internal pure returns (uint256) { + // Gas optimization: this is cheaper than requiring 'a' not being zero, but the + // benefit is lost if 'b' is also tested. + // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 + if (a == 0) { + return 0; + } + + uint256 c = a * b; + require(c / a == b, "SafeMath: multiplication overflow"); + + return c; + } + + /** + * @dev Returns the integer division of two unsigned integers. Reverts on + * division by zero. The result is rounded towards zero. + * + * Counterpart to Solidity's `/` operator. Note: this function uses a + * `revert` opcode (which leaves remaining gas untouched) while Solidity + * uses an invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + */ + function div(uint256 a, uint256 b) internal pure returns (uint256) { + return div(a, b, "SafeMath: division by zero"); + } + + /** + * @dev Returns the integer division of two unsigned integers. Reverts with custom message on + * division by zero. The result is rounded towards zero. + * + * Counterpart to Solidity's `/` operator. Note: this function uses a + * `revert` opcode (which leaves remaining gas untouched) while Solidity + * uses an invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + * + * _Available since v2.4.0._ + */ + function div( + uint256 a, + uint256 b, + string memory errorMessage + ) internal pure returns (uint256) { + // Solidity only automatically asserts when dividing by 0 + require(b != 0, errorMessage); + uint256 c = a / b; + // assert(a == b * c + a % b); // There is no case in which this doesn't hold + + return c; + } + + /** + * @dev Integer division of two numbers, rounding up and truncating the quotient + */ + function divCeil(uint256 a, uint256 b) internal pure returns (uint256) { + return divCeil(a, b, "SafeMath: division by zero"); + } + + /** + * @dev Integer division of two numbers, rounding up and truncating the quotient + */ + function divCeil( + uint256 a, + uint256 b, + string memory errorMessage + ) internal pure returns (uint256) { + // Solidity only automatically asserts when dividing by 0 + require(b != 0, errorMessage); + + if (a == 0) { + return 0; + } + uint256 c = ((a - 1) / b) + 1; + + return c; + } + + /** + * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), + * Reverts when dividing by zero. + * + * Counterpart to Solidity's `%` operator. This function uses a `revert` + * opcode (which leaves remaining gas untouched) while Solidity uses an + * invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + */ + function mod(uint256 a, uint256 b) internal pure returns (uint256) { + return mod(a, b, "SafeMath: modulo by zero"); + } + + /** + * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), + * Reverts with custom message when dividing by zero. + * + * Counterpart to Solidity's `%` operator. This function uses a `revert` + * opcode (which leaves remaining gas untouched) while Solidity uses an + * invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + * + * _Available since v2.4.0._ + */ + function mod( + uint256 a, + uint256 b, + string memory errorMessage + ) internal pure returns (uint256) { + require(b != 0, errorMessage); + return a % b; + } + + function min256(uint256 _a, uint256 _b) internal pure returns (uint256) { + return _a < _b ? _a : _b; + } +} diff --git a/contracts/OriginsAdmin.sol b/contracts/OriginsAdmin.sol new file mode 100644 index 0000000..9c2f2ea --- /dev/null +++ b/contracts/OriginsAdmin.sol @@ -0,0 +1,227 @@ +pragma solidity ^0.5.17; + +import "./OriginsStorage.sol"; + +/** + * @title An owner contract with granular access for multiple parties. + * @author Franklin Richards - powerhousefrank@protonmail.com + * @notice You can use this contract for creating multiple owners with different access. + * @dev To add a new role, add the corresponding array and mapping, along with add, remove and get functions. + */ +contract OriginsAdmin is OriginsStorage { + /* Storage */ + + address[] private owners; + address[] private verifiers; + + mapping(address => bool) private isOwner; + mapping(address => bool) private isVerifier; + /** + * @notice In the future new list can be added based on the required limit. + * When adding a new list, a new array & mapping has to be created. + * Adding/Removing functions, getter for array and mapping. + * Events for Adding/Removing and modifier to check the validity. + */ + + /* Events */ + + /** + * @notice Emitted when a new owner is added. + * @param _initiator The one who initiates this event. + * @param _newOwner The new owner who has been added recently. + */ + event OwnerAdded(address indexed _initiator, address _newOwner); + + /** + * @notice Emitted when an owner is removed. + * @param _initiator The one who initiates this event. + * @param _removedOwner The owner who has been removed. + */ + event OwnerRemoved(address indexed _initiator, address _removedOwner); + + /** + * @notice Emitted when a verifier is added. + * @param _initiator The one who initiates this event. + * @param _newVerifier The new verifier who has been added recently. + */ + event VerifierAdded(address indexed _initiator, address _newVerifier); + + /** + * @notice Emitted when a verifier is removed. + * @param _initiator The one who initiates this event. + * @param _removedVerifier The verifier who has been removed. + */ + event VerifierRemoved(address indexed _initiator, address _removedVerifier); + + /* Modifiers */ + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(isOwner[msg.sender], "OriginsAdmin: Only owner can call this function."); + _; + } + + /** + * @dev Throws if called by any account other than the verifier. + */ + modifier onlyVerifier() { + require(isVerifier[msg.sender], "OriginsAdmin: Only verifier can call this function."); + _; + } + + /* Functions */ + + /** + * @dev Initializes the contract, setting the deployer as the initial owner. + * @param _owners The owners list. + */ + constructor(address[] memory _owners) public { + uint256 len = _owners.length; + for (uint256 index = 0; index < len; index++) { + require(!isOwner[_owners[index]], "OriginsAdmin: Each owner can be added only once."); + isOwner[_owners[index]] = true; + owners.push(_owners[index]); + emit OwnerAdded(msg.sender, _owners[index]); + } + } + + /** + * @notice The function to add a new owner. + * @param _newOwner The address of the new owner. + * @dev Only callable by an Owner. + */ + function addOwner(address _newOwner) public onlyOwner { + _addOwner(_newOwner); + } + + /** + * @notice The function to remove an owner. + * @param _ownerToRemove The address of the owner which should be removed. + * @dev Only callable by an Owner. + */ + function removeOwner(address _ownerToRemove) public onlyOwner { + _removeOwner(_ownerToRemove); + } + + /** + * @notice The function to add a new verifier. + * @param _newVerifier The address of the new verifier. + * @dev Only callable by an Owner. + */ + function addVerifier(address _newVerifier) public onlyOwner { + _addVerifier(_newVerifier); + } + + /** + * @notice The function to remove an verifier. + * @param _verifierToRemove The address of the verifier which should be removed. + * @dev Only callable by an Owner. + */ + function removeVerifier(address _verifierToRemove) public onlyOwner { + _removeVerifier(_verifierToRemove); + } + + /* Internal Functions */ + + /** + * @notice The internal function to add a new owner. + * @param _newOwner The address of the new owner. + */ + function _addOwner(address _newOwner) internal { + require(_newOwner != address(0), "OriginsAdmin: Invalid Address."); + require(!isOwner[_newOwner], "OriginsAdmin: Address is already an owner."); + isOwner[_newOwner] = true; + owners.push(_newOwner); + + emit OwnerAdded(msg.sender, _newOwner); + } + + /** + * @notice The internal function to remove an owner. + * @param _ownerToRemove The address of the owner which should be removed. + */ + function _removeOwner(address _ownerToRemove) internal { + require(isOwner[_ownerToRemove], "OriginsAdmin: Address is not an owner."); + isOwner[_ownerToRemove] = false; + uint256 len = owners.length; + for (uint256 index = 0; index < len; index++) { + if (_ownerToRemove == owners[index]) { + owners[index] = owners[len - 1]; + break; + } + } + owners.pop(); + + emit OwnerRemoved(msg.sender, _ownerToRemove); + } + + /** + * @notice The internal function to add a new verifier. + * @param _newVerifier The address of the new verifier. + */ + function _addVerifier(address _newVerifier) internal { + require(_newVerifier != address(0), "OriginsAdmin: Invalid Address."); + require(!isVerifier[_newVerifier], "OriginsAdmin: Address is already a verifier."); + isVerifier[_newVerifier] = true; + verifiers.push(_newVerifier); + + emit VerifierAdded(msg.sender, _newVerifier); + } + + /** + * @notice The internal function to remove an verifier. + * @param _verifierToRemove The address of the verifier which should be removed. + */ + function _removeVerifier(address _verifierToRemove) internal { + require(isVerifier[_verifierToRemove], "OriginsAdmin: Address is not a verifier."); + isVerifier[_verifierToRemove] = false; + uint256 len = verifiers.length; + for (uint256 index = 0; index < len; index++) { + if (_verifierToRemove == verifiers[index]) { + verifiers[index] = verifiers[len - 1]; + break; + } + } + verifiers.pop(); + + emit VerifierRemoved(msg.sender, _verifierToRemove); + } + + /* Getter Functions */ + + /** + * @notice Checks if the passed address is an owner or not. + * @param _addr The address to check. + * @return True if Owner, False otherwise. + */ + function checkOwner(address _addr) public view returns (bool) { + return isOwner[_addr]; + } + + /** + * @notice Checks if the passed address is a verifier or not. + * @param _addr The address to check. + * @return True if Verifier, False otherwise. + */ + function checkVerifier(address _addr) public view returns (bool) { + return isVerifier[_addr]; + } + + /** + * @dev Returns the address array of the owners. + * @return The list of owners. + */ + function getOwners() public view returns (address[] memory) { + return owners; + } + + /** + * @dev Returns the address array of the verifier. + * @return The list of verifiers. + */ + function getVerifiers() public view returns (address[] memory) { + return verifiers; + } +} diff --git a/contracts/OriginsBase.sol b/contracts/OriginsBase.sol new file mode 100644 index 0000000..44d0bf4 --- /dev/null +++ b/contracts/OriginsBase.sol @@ -0,0 +1,832 @@ +pragma solidity ^0.5.17; + +import "./Interfaces/IOrigins.sol"; +import "./OriginsEvents.sol"; + +/** + * @title A contract for Origins platform. + * @author Franklin Richards - powerhousefrank@protonmail.com + * @notice You can use this contract for creating a sale in the Origins Platform. + * @dev Don't forget to update the Interface: IOrigins, according to the changes in this. + */ +contract OriginsBase is IOrigins, OriginsEvents { + /* Functions */ + + /** + * @notice Setup the required parameters. + * @param _owners The list of owners to be added to the list. + * @param _token The token address. + * @param _depositAddress The address of deposit address where all the raised fund will go. (Optional) + */ + constructor( + address[] memory _owners, + address _token, + address payable _depositAddress + ) public OriginsAdmin(_owners) { + require(_token != address(0), "OriginsBase: Token Address cannot be zero."); + + token = IERC20(_token); + + if (_depositAddress != address(0)) { + depositAddress = _depositAddress; + emit DepositAddressUpdated(msg.sender, address(0), _depositAddress); + } + } + + /* Public & External Functions */ + + /** + * @notice Function to set the deposit address. + * @param _depositAddress The address of deposit address where all the raised fund will go. + * @dev If this is not set, an owner can withdraw the funds. Here owner is supposed to be a multisig. Or a trusted party. + */ + function setDepositAddress(address payable _depositAddress) external onlyOwner { + _setDepositAddress(_depositAddress); + } + + /** + * @notice Function to set the Locked Fund Contract Address. + * @param _lockedFund The address of new the Vesting registry. + */ + function setLockedFund(address _lockedFund) external onlyOwner { + _setLockedFund(_lockedFund); + } + + /** + * @notice Function to create a new tier. + * @param _maxAmount The maximum amount of asset which can be deposited. + * @param _remainingTokens Contains the remaining tokens for sale. + * @param _saleStartTS Contains the timestamp for the sale to start. Before which no user will be able to buy tokens. + * @param _saleEnd Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens. + * @param _unlockedBP Contains the unlock amount in Basis Point for Vesting/Lock. + * @param _vestOrLockCliff Contains the cliff of the vesting/lock for distribution. + * @param _vestOrLockDuration Contains the duration of the vesting/lock for distribution. + * @param _depositRate Contains the rate of the token w.r.t. the depositing asset. + * @param _verificationType Contains the method by which verification happens. + * @param _saleEndDurationOrTS Contains whether end of sale is by Duration or Timestamp. + * @param _transferType Contains the type of token transfer after a user buys to get the tokens. + * @return _tierID The newly created tier ID. + * @dev In the future this should be decoupled. + * Some are currently sent with default value due to Stack Too Deep problem. + */ + function createTier( + uint256 _maxAmount, + uint256 _remainingTokens, + uint256 _saleStartTS, + uint256 _saleEnd, + uint256 _unlockedBP, + uint256 _vestOrLockCliff, + uint256 _vestOrLockDuration, + uint256 _depositRate, + uint256 _depositType, + uint256 _verificationType, + uint256 _saleEndDurationOrTS, + uint256 _transferType + ) external onlyOwner returns (uint256 _tierID) { + /// @notice `tierCount` should always start at 1, because else default value zero will result in verification process. + tierCount++; + + _tierID = tierCount; + + /// @notice This will revert if any of the below fails. But if none fails, this event should fire first. + emit NewTierCreated(msg.sender, _tierID); + + /// @notice Verification Parameter. + _setTierVerification(_tierID, VerificationType(_verificationType)); + + /// @notice Deposit Parameters. (IMPORTANT TODO, change deposit token address here.) + _setTierDeposit(_tierID, _depositRate, address(0), DepositType(_depositType)); + + /// @notice Token Amount Limit Parameters. (IMPORTANT TODO, change minimum amount.) + _setTierTokenLimit(_tierID, 0, _maxAmount); + + /// @notice Tier Token Amount Parameters. + _setTierTokenAmount(_tierID, _remainingTokens); + + /// @notice Vesting or Locking Parameters. + _setTierVestOrLock(_tierID, _vestOrLockCliff, _vestOrLockDuration, _unlockedBP, TransferType(_transferType)); + + /// @notice Time Parameters. + _setTierTime(_tierID, _saleStartTS, _saleEnd, SaleEndDurationOrTS(_saleEndDurationOrTS)); + } + + /** + * @notice Function to set the Tier Verification Method. + * @param _tierID The Tier ID which is being updated. + * @param _verificationType The type of verification for the particular sale. + */ + function setTierVerification(uint256 _tierID, uint256 _verificationType) external onlyOwner { + _setTierVerification(_tierID, VerificationType(_verificationType)); + } + + /** + * @notice Function to set the Tier Deposit Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _depositRate The rate is the, asset * rate = token. + * @param _depositToken The token for that particular Tier Sale. + * @param _depositType The type of deposit for the particular sale. + */ + function setTierDeposit( + uint256 _tierID, + uint256 _depositRate, + address _depositToken, + uint256 _depositType + ) external onlyOwner { + _setTierDeposit(_tierID, _depositRate, _depositToken, DepositType(_depositType)); + } + + /** + * @notice Function to set the Tier Token Limit Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _minAmount The minimum asset amount required to participate in that tier. + * @param _maxAmount The maximum asset amount allowed to participate in that tier. + */ + function setTierTokenLimit( + uint256 _tierID, + uint256 _minAmount, + uint256 _maxAmount + ) external onlyOwner { + _setTierTokenLimit(_tierID, _minAmount, _maxAmount); + } + + /** + * @notice Function to set the Tier Token Amount Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _remainingTokens The maximum number of tokens allowed to be sold in the tier. + */ + function setTierTokenAmount(uint256 _tierID, uint256 _remainingTokens) external onlyOwner { + _setTierTokenAmount(_tierID, _remainingTokens); + } + + /** + * @notice Function to set the Tier Vest/Lock Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _vestOrLockCliff The Vest/Lock Cliff = A * LockedFund.Interval, where A is the cliff. + * @param _vestOrLockDuration The Vest/Lock Duration = A * LockedFund.Interval, where A is the duration. + * @param _unlockedBP The unlocked token amount in BP. + * @param _transferType The Tier Transfer Type for the Tier. + */ + function setTierVestOrLock( + uint256 _tierID, + uint256 _vestOrLockCliff, + uint256 _vestOrLockDuration, + uint256 _unlockedBP, + uint256 _transferType + ) external onlyOwner { + _setTierVestOrLock(_tierID, _vestOrLockCliff, _vestOrLockDuration, _unlockedBP, TransferType(_transferType)); + } + + /** + * @notice Function to set the Tier Time Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _saleStartTS The Tier Sale Start Timestamp. + * @param _saleEnd The Tier Sale End Duration or Timestamp. + * @param _saleEndDurationOrTS The Tier Sale End Type for the Tier. + */ + function setTierTime( + uint256 _tierID, + uint256 _saleStartTS, + uint256 _saleEnd, + uint256 _saleEndDurationOrTS + ) external onlyOwner { + _setTierTime(_tierID, _saleStartTS, _saleEnd, SaleEndDurationOrTS(_saleEndDurationOrTS)); + } + + /** + * @notice Function to verify a single address with a single tier. + * @param _addressToBeVerified The address which has to be veriried for the sale. + * @param _tierID The tier for which the address has to be verified. + */ + function addressVerification(address _addressToBeVerified, uint256 _tierID) external onlyVerifier { + _addressVerification(_addressToBeVerified, _tierID); + } + + /** + * @notice Function to verify a single address with multiple tiers. + * @param _addressToBeVerified The address which has to be veriried for the sale. + * @param _tierID The tiers for which the address has to be verified. + */ + function singleAddressMultipleTierVerification(address _addressToBeVerified, uint256[] calldata _tierID) external onlyVerifier { + for (uint256 index = 0; index < _tierID.length; index++) { + _addressVerification(_addressToBeVerified, _tierID[index]); + } + } + + /** + * @notice Function to verify multiple address with a single tier. + * @param _addressToBeVerified The addresses which has to be veriried for the sale. + * @param _tierID The tier for which the addresses has to be verified. + */ + function multipleAddressSingleTierVerification(address[] calldata _addressToBeVerified, uint256 _tierID) external onlyVerifier { + for (uint256 index = 0; index < _addressToBeVerified.length; index++) { + _addressVerification(_addressToBeVerified[index], _tierID); + } + } + + /** + * @notice Function to verify multiple address with multiple tiers. + * @param _addressToBeVerified The addresses which has to be veriried for the sale. + * @param _tierID The tiers for which the addresses has to be verified. + */ + function multipleAddressAndTierVerification(address[] calldata _addressToBeVerified, uint256[] calldata _tierID) external onlyVerifier { + require(_addressToBeVerified.length == _tierID.length, "OriginsBase: Address and Tier Array length mismatch."); + for (uint256 index = 0; index < _addressToBeVerified.length; index++) { + _addressVerification(_addressToBeVerified[index], _tierID[index]); + } + } + + /** + * @notice Function to buy tokens from sale based on tier. + * @param _tierID The Tier ID from which the token has to be bought. + * @param _amount The amount of token (deposit asset) which will be sent for purchasing. + * @dev If deposit type if RBTC, then _amount can be passed as zero. + */ + function buy(uint256 _tierID, uint256 _amount) external payable { + _buy(_tierID, _amount); + } + + /** + * @notice The function used by the admin or deposit address to withdraw the sale proceedings. + * @dev In the future this could be made to be accessible only to seller, rather than owner. + */ + function withdrawSaleDeposit() external { + _withdrawSaleDeposit(); + } + + /* Internal Functions */ + + /** + * @notice Internal function to set the deposit address. + * @param _depositAddress The address of deposit address where all the raised fund will go. + */ + function _setDepositAddress(address payable _depositAddress) internal { + require(_depositAddress != address(0), "OriginsBase: Deposit Address cannot be zero."); + + emit DepositAddressUpdated(msg.sender, depositAddress, _depositAddress); + + depositAddress = _depositAddress; + } + + /** + * @notice Function to set the Locked Fund Contract Address. + * @param _lockedFund The address of new the Vesting registry. + */ + function _setLockedFund(address _lockedFund) internal { + require(_lockedFund != address(0), "OriginsBase: Locked Fund Address cannot be zero."); + + emit LockedFundUpdated(msg.sender, address(lockedFund), _lockedFund); + + lockedFund = ILockedFund(_lockedFund); + } + + /** + * @notice Internal function to set the Tier Verification Method. + * @param _tierID The Tier ID which is being updated. + * @param _verificationType The type of verification for the particular sale. + */ + function _setTierVerification(uint256 _tierID, VerificationType _verificationType) internal { + tiers[_tierID].verificationType = _verificationType; + + emit TierVerificationUpdated(msg.sender, _tierID, _verificationType); + } + + /** + * @notice Internal function to set the Tier Deposit Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _depositRate The rate is the, asset * rate = token. + * @param _depositToken The token for that particular Tier Sale. + * @param _depositType The type of deposit for the particular sale. + */ + function _setTierDeposit( + uint256 _tierID, + uint256 _depositRate, + address _depositToken, + DepositType _depositType + ) internal { + require(_depositRate > 0, "OriginsBase: Deposit Rate cannot be zero."); + if (DepositType(_depositType) == DepositType.Token) { + require(_depositToken != address(0), "OriginsBase: Deposit Token Address cannot be zero."); + } + + tiers[_tierID].depositRate = _depositRate; + tiers[_tierID].depositToken = IERC20(_depositToken); + tiers[_tierID].depositType = _depositType; + + emit TierDepositUpdated(msg.sender, _tierID, _depositRate, _depositToken, _depositType); + } + + /** + * @notice Internal function to set the Tier Token Limit Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _minAmount The minimum asset amount required to participate in that tier. + * @param _maxAmount The maximum asset amount allowed to participate in that tier. + */ + function _setTierTokenLimit( + uint256 _tierID, + uint256 _minAmount, + uint256 _maxAmount + ) internal { + require(_minAmount <= _maxAmount, "OriginsBase: Min Amount cannot be higher than Max Amount."); + + tiers[_tierID].minAmount = _minAmount; + tiers[_tierID].maxAmount = _maxAmount; + + emit TierTokenLimitUpdated(msg.sender, _tierID, _minAmount, _maxAmount); + } + + /** + @notice Internal Function to returns the total remaining tokens in all tier. + @return _totalBal The total balance of tokens in all tier. + */ + function _getTotalRemainingTokens() internal view returns (uint256 _totalBal) { + /// @notice Starting with 1 as Tier Count always starts from 1. + for (uint256 index = 1; index <= tierCount; index++) { + _totalBal = _totalBal.add(tiers[index].remainingTokens); + } + } + + /** + * @notice Internal function to set the Tier Token Amount Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _remainingTokens The maximum number of tokens allowed to be sold in the tier. + * @dev This function assumes the admin is a trusted party (multisig). + */ + function _setTierTokenAmount(uint256 _tierID, uint256 _remainingTokens) internal { + require(_remainingTokens > 0, "OriginsBase: Total token to sell should be higher than zero."); + require( + tiers[_tierID].maxAmount.mul(tiers[_tierID].depositRate) <= _remainingTokens, + "OriginsBase: Max Amount to buy should not be higher than token availability." + ); + + uint256 currentBal = token.balanceOf(address(this)); + uint256 requiredBal = _getTotalRemainingTokens().add(_remainingTokens).sub(tiers[_tierID].remainingTokens); + + /// @notice Checking if we have enough token for all tiers. If we have more, then we refund the extra. + if (requiredBal > currentBal) { + totalTokenAllocationPerTier[_tierID] = totalTokenAllocationPerTier[_tierID].add(requiredBal.sub(currentBal)); + bool txStatus = token.transferFrom(msg.sender, address(this), requiredBal.sub(currentBal)); + require(txStatus, "OriginsBase: Not enough token supplied for Token Distribution."); + } else { + totalTokenAllocationPerTier[_tierID] = totalTokenAllocationPerTier[_tierID].sub(currentBal.sub(requiredBal)); + bool txStatus = token.transfer(msg.sender, currentBal.sub(requiredBal)); + require(txStatus, "OriginsBase: Admin didn't received the tokens correctly."); + } + + tiers[_tierID].remainingTokens = _remainingTokens; + + emit TierTokenAmountUpdated(msg.sender, _tierID, _remainingTokens); + } + + /** + * @notice Internal function to set the Tier Vest/Lock Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _vestOrLockCliff The Vest/Lock Cliff = A * LockedFund.Interval, where A is the cliff. + * @param _vestOrLockDuration The Vest/Lock Duration = A * LockedFund.Interval, where A is the duration. + * @param _unlockedBP The unlocked token amount in BP. + * @param _transferType The Tier Transfer Type for the Tier. + */ + function _setTierVestOrLock( + uint256 _tierID, + uint256 _vestOrLockCliff, + uint256 _vestOrLockDuration, + uint256 _unlockedBP, + TransferType _transferType + ) internal { + /// @notice The below is mainly for TransferType of Vested and Locked, but should not hinder for other types as well. + require(_vestOrLockCliff <= _vestOrLockDuration, "OriginsBase: Cliff has to be <= duration."); + require(_unlockedBP <= MAX_BASIS_POINT, "OriginsBase: The basis point cannot be higher than 10K."); + + tiers[_tierID].vestOrLockCliff = _vestOrLockCliff; + tiers[_tierID].vestOrLockDuration = _vestOrLockDuration; + /// @notice Zero is also an accepted value, which means the unlock time is not yet decided. + tiers[_tierID].unlockedBP = _unlockedBP; + tiers[_tierID].transferType = _transferType; + + emit TierVestOrLockUpdated(msg.sender, _tierID, _vestOrLockCliff, _vestOrLockDuration, _unlockedBP, _transferType); + } + + /** + * @notice Internal function to set the Tier Time Parameters. + * @param _tierID The Tier ID which is being updated. + * @param _saleStartTS The Tier Sale Start Timestamp. + * @param _saleEnd The Tier Sale End Duration or Timestamp. + * @param _saleEndDurationOrTS The Tier Sale End Type for the Tier. + */ + function _setTierTime( + uint256 _tierID, + uint256 _saleStartTS, + uint256 _saleEnd, + SaleEndDurationOrTS _saleEndDurationOrTS + ) internal { + uint256 saleEndTS = _saleEnd; + if (_saleStartTS != 0 && _saleEnd != 0 && _saleEndDurationOrTS == SaleEndDurationOrTS.Duration) { + saleEndTS = _saleStartTS.add(_saleEnd); + } else if ((_saleStartTS != 0 || _saleEnd != 0) && _saleEndDurationOrTS == SaleEndDurationOrTS.Timestamp) { + require(_saleStartTS < _saleEnd, "OriginsBase: The sale start TS cannot be after sale end TS."); + } + + if (saleEndTS != 0 && _saleEndDurationOrTS != SaleEndDurationOrTS.UntilSupply) { + require(saleEndTS > block.timestamp, "OriginsBase: The sale end duration cannot be past already."); + } + + tiers[_tierID].saleStartTS = _saleStartTS; + tiers[_tierID].saleEnd = saleEndTS; + tiers[_tierID].saleEndDurationOrTS = _saleEndDurationOrTS; + + emit TierTimeUpdated(msg.sender, _tierID, _saleStartTS, saleEndTS, _saleEndDurationOrTS); + } + + /** + * @notice Internal function to verify a single address with a single tier. + * @param _addressToBeVerified The address which has to be veriried for the sale. + * @param _tierID The tier for which the address has to be verified. + * @dev It purposefully doesn't check if it is an already added address to avoid excess gas usage. + * Also to avoid the interuption when adding multiple address at once. + */ + function _addressVerification(address _addressToBeVerified, uint256 _tierID) internal { + require(_addressToBeVerified != address(0), "OriginsBase: Address to be verified cannot be zero."); + + addressApproved[_addressToBeVerified][_tierID] = true; + + emit AddressVerified(msg.sender, _addressToBeVerified, _tierID); + } + + /** + * @notice Function to check whether a sale on a tier is allowed or not. + * @param _id The Tier ID whose sale status has to be checked. + * @return True if the sale is allowed on that tier, False otherwise. + */ + function _saleAllowed(uint256 _id) internal returns (bool) { + require(tiers[_id].saleStartTS != 0, "OriginsBase: Sale has not started yet."); + require(!tierSaleEnded[_id], "OriginsBase: Sale ended."); + if (tiers[_id].saleEndDurationOrTS == SaleEndDurationOrTS.None) { + return false; + } else if (tiers[_id].saleEnd < block.timestamp && tiers[_id].saleEndDurationOrTS != SaleEndDurationOrTS.UntilSupply) { + tierSaleEnded[_id] = true; + return false; + } + /// @notice Here another case of else if could have come based on remaining token. + /// It didn't because on buy, it will check if the remaining amount is higher than but not equal to the deposit. + /// In case it is equal or lesser than deposit amount, then tierSaleEnded should be set there. + return true; + } + + /** + * @notice Internal Function to transfer the token during buying. + * @param _tierDetails The Tier from which the tokens were bought. + * @param _tokensBought The number of tokens bought. + */ + function _tokenTransferOnBuy(Tier memory _tierDetails, uint256 _tokensBought) internal { + require(_tierDetails.transferType != TransferType.None, "OriginsBase: Transfer Type not set by owner."); + + if (_tierDetails.transferType == TransferType.Unlocked) { + bool txStatus = token.transfer(msg.sender, _tokensBought); + require(txStatus, "OriginsBase: User didn't received the tokens correctly."); + } else { + token.approve(address(lockedFund), _tokensBought); + if (_tierDetails.transferType == TransferType.WaitedUnlock) { + lockedFund.depositWaitedUnlocked(msg.sender, _tokensBought, _tierDetails.unlockedBP); + } else if (_tierDetails.transferType == TransferType.Vested) { + lockedFund.depositVested( + msg.sender, + _tokensBought, + _tierDetails.vestOrLockCliff, + _tierDetails.vestOrLockDuration, + _tierDetails.unlockedBP, + uint256(UnlockType.Waited) + ); + } else if (_tierDetails.transferType == TransferType.Locked) { + lockedFund.depositLocked( + msg.sender, + _tokensBought, + _tierDetails.vestOrLockCliff, + _tierDetails.vestOrLockDuration, + _tierDetails.unlockedBP, + uint256(UnlockType.Waited) + ); + } + } + } + + /** + * @notice Internal Function to update the Tier Token Details. + * @param _tierID The Tier ID whose Token Details are updated. + */ + function _updateTierTokenDetailsAfterBuy(uint256 _tierID) internal { + Tier memory _tierDetails = tiers[_tierID]; + if (_tierDetails.remainingTokens < _tierDetails.maxAmount) { + if (_tierDetails.remainingTokens <= _tierDetails.minAmount) { + if (_tierDetails.remainingTokens == 0) { + tierSaleEnded[_tierID] = true; + emit TierSaleEnded(msg.sender, _tierID); + } + tiers[_tierID].minAmount = 0; + emit TierSaleUpdatedMinimum(msg.sender, _tierID); + } + tiers[_tierID].maxAmount = _tierDetails.remainingTokens; + emit TierSaleUpdatedMaximum(msg.sender, _tierID, _tierDetails.remainingTokens); + } + } + + /** + * @notice Internal function to update the wallet count and tier token sold stat. + * @notice _tierID The Tier ID whose stat has to be updated. + * @notice _deposit The amount of asset deposited by the user. + * @notice _tokensBoughtByAddress The amount of tokens bought by the user previously. + * @notice _tokensBought The amount of tokens bought during the current buy. + */ + function _updateWalletCount( + uint256 _tierID, + uint256 _deposit, + uint256 _tokensBoughtByAddress, + uint256 _tokensBought + ) internal { + if (_tokensBoughtByAddress == 0) { + participatingWalletCountPerTier[_tierID]++; + } + tokensSoldPerTier[_tierID] = tokensSoldPerTier[_tierID].add(_tokensBought); + } + + /** + * @notice Internal function to buy tokens from sale based on tier. + * @param _tierID The Tier ID from which the token has to be bought. + * @param _amount The amount of token (deposit asset) which will be sent for purchasing. + */ + function _buy(uint256 _tierID, uint256 _amount) internal { + /// @notice Checking if token sale is allowed or not. + require(_saleAllowed(_tierID), "OriginsBase: Sale not allowed."); + + /// @notice Getting the required information of the Tier to participate. + Tier memory tierDetails = tiers[_tierID]; + + /// @notice Checking if verification is set and if user has permission. + if (tierDetails.verificationType == VerificationType.None) { + revert("OriginsBase: No one is allowed for sale."); + } else if (tierDetails.verificationType == VerificationType.ByAddress) { + /// @notice Checking if user is verified based on address. + require(addressApproved[msg.sender][_tierID], "OriginsBase: User not approved for sale."); + } + + /// @notice If user is verified on address or does not need verification, the following steps will be taken. + uint256 tokensBoughtByAddress = tokensBoughtByAddressOnTier[msg.sender][_tierID]; + uint256 boughtInAsset = tokensBoughtByAddress.div(tierDetails.depositRate); + + /// @notice Checking if the user already reached the maximum amount. + require(boughtInAsset < tierDetails.maxAmount, "OriginsBase: User already bought maximum allowed."); + + /// @notice Checking which deposit type is selected. + uint256 deposit; + if (tierDetails.depositType == DepositType.RBTC) { + deposit = msg.value; + require(deposit != 0, "OriginsBase: Amount cannot be zero."); + } else { + require(_amount != 0, "OriginsBase: Amount cannot be zero."); + require(address(tierDetails.depositToken) != address(0), "OriginsBase: Deposit Token not set by owner."); + bool txStatus = tierDetails.depositToken.transferFrom(msg.sender, address(this), _amount); + require(txStatus, "OriginsBase: Not enough token supplied by user for buying."); + deposit = _amount; + } + require(deposit >= tierDetails.minAmount, "OriginsBase: Deposit is less than minimum allowed."); + + /// @notice Checking what should be the allowed deposit amount. + uint256 refund; + if (tierDetails.maxAmount.sub(boughtInAsset) <= deposit) { + refund = deposit.add(boughtInAsset).sub(tierDetails.maxAmount); + deposit = tierDetails.maxAmount.sub(boughtInAsset); + } + + /// @notice actual buying happens here. + uint256 tokensBought = deposit.mul(tierDetails.depositRate); + tiers[_tierID].remainingTokens = tierDetails.remainingTokens.sub(tokensBought); + tokensBoughtByAddressOnTier[msg.sender][_tierID] = tokensBoughtByAddressOnTier[msg.sender][_tierID].add(tokensBought); + + /// @notice Checking what type of Transfer to do. + _tokenTransferOnBuy(tierDetails, tokensBought); + + /// @notice Updating the tier token parameters. + _updateTierTokenDetailsAfterBuy(_tierID); + + /// @notice Updating the stats. + _updateWalletCount(_tierID, deposit, tokensBoughtByAddress, tokensBought); + + /// @notice Refunding the excess funds. + if (refund > 0) { + if (tierDetails.depositType == DepositType.RBTC) { + msg.sender.transfer(refund); + } else { + bool txStatus = tierDetails.depositToken.transfer(msg.sender, refund); + require(txStatus, "OriginsBase: Token refund not received by user correctly."); + } + } + + emit TokenBuy(msg.sender, _tierID, tokensBought); + } + + /** + * @notice Internal function used by the admin or deposit address to withdraw the sale proceedings. + * @dev In the future this could be made to be accessible only to seller, rather than owner. + */ + function _withdrawSaleDeposit() internal { + require( + checkOwner(msg.sender) || depositAddress == msg.sender, + "OriginsBase: Only owner or deposit address can call this function." + ); + /// @notice Checks if deposit address is set or not. + address payable receiver = msg.sender; + if (depositAddress != address(0)) { + receiver = depositAddress; + } + + /// @notice Only withdraw is allowed where sale is ended. Premature withdraw is not allowed. + for (uint256 index = 1; index <= tierCount; index++) { + if ((tierSaleEnded[index] || !_saleAllowed(index)) && !tierSaleWithdrawn[index]) { + tierSaleWithdrawn[index] = true; + uint256 amount = tokensSoldPerTier[index].div(tiers[index].depositRate); + + if (tiers[index].depositType == DepositType.RBTC) { + receiver.transfer(amount); + emit ProceedingWithdrawn(msg.sender, receiver, index, DepositType.RBTC, amount); + } else { + bool txStatus = tiers[index].depositToken.transfer(receiver, amount); + require(txStatus, "OriginsBase: Admin didn't received the tokens correctly."); + emit ProceedingWithdrawn(msg.sender, receiver, index, DepositType.Token, amount); + } + + uint256 remainingTokens = tiers[index].remainingTokens; + if (remainingTokens > 0) { + tiers[index].remainingTokens = 0; + bool txStatus = token.transfer(receiver, remainingTokens); + require(txStatus, "OriginsBase: User didn't received the tokens correctly."); + emit RemainingTokenWithdrawn(msg.sender, receiver, index, remainingTokens); + } + } + } + } + + /* Getter Functions */ + + /** + * @notice Function to read the tier count. + * @return The number of tiers present in the contract. + */ + function getTierCount() external view returns (uint256) { + return tierCount; + } + + /** + * @notice Function to read the deposit address. + * @return The address of the deposit address. + * @dev If zero is returned, any of the owners can withdraw the raised funds. + */ + function getDepositAddress() external view returns (address) { + return depositAddress; + } + + /** + * @notice Function to read the token on sale. + * @return The Token contract address which is being sold in the contract. + */ + function getToken() external view returns (address) { + return address(token); + } + + /** + * @notice Function to read the locked fund contract address. + * @return Address of Locked Fund Contract. + */ + function getLockDetails() external view returns (address) { + return address(lockedFund); + } + + /** + * @notice Function to read a Tier parameter. + * @param _tierID The Tier whose info is to be read. + * @return _minAmount The minimum amount which can be deposited. + * @return _maxAmount The maximum amount which can be deposited. + * @return _remainingTokens Contains the remaining tokens for sale. + * @return _saleStartTS Contains the timestamp for the sale to start. Before which no user will be able to buy tokens. + * @return _saleEnd Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens. + * @return _unlockedBP Contains the unlock amount in Basis Point for Vesting/Lock. + * @return _vestOrLockCliff Contains the cliff of the vesting/lock for distribution. + * @return _vestOrLockDuration Contains the duration of the vesting/lock for distribution. + * @return _depositRate Contains the rate of the token w.r.t. the depositing asset. + */ + function readTierPartA(uint256 _tierID) + external + view + returns ( + uint256 _minAmount, + uint256 _maxAmount, + uint256 _remainingTokens, + uint256 _saleStartTS, + uint256 _saleEnd, + uint256 _unlockedBP, + uint256 _vestOrLockCliff, + uint256 _vestOrLockDuration, + uint256 _depositRate + ) + { + Tier memory tier = tiers[_tierID]; + return ( + tier.minAmount, + tier.maxAmount, + tier.remainingTokens, + tier.saleStartTS, + tier.saleEnd, + tier.unlockedBP, + tier.vestOrLockCliff, + tier.vestOrLockDuration, + tier.depositRate + ); + } + + /** + * @notice Function to read a Tier parameter. + * @param _tierID The Tier whose info is to be read. + * @return _depositToken Contains the deposit token address if the deposit type is Token. + * @return _depositType The type of deposit for the particular sale. + * @return _verificationType Contains the method by which verification happens. + * @return _saleEndDurationOrTS Contains whether end of sale is by Duration or Timestamp. + * @return _transferType Contains the type of token transfer after a user buys to get the tokens. + */ + function readTierPartB(uint256 _tierID) + external + view + returns ( + address _depositToken, + uint256 _depositType, + uint256 _verificationType, + uint256 _saleEndDurationOrTS, + uint256 _transferType + ) + { + Tier memory tier = tiers[_tierID]; + return ( + address(tier.depositToken), + uint256(tier.depositType), + uint256(tier.verificationType), + uint256(tier.saleEndDurationOrTS), + uint256(tier.transferType) + ); + } + + /** + * @notice Function to read tokens bought by an address on a particular tier. + * @param _addr The address which has to be checked. + * @param _tierID The tier ID for which the address has to be checked. + * @return The amount of tokens bought by the address. + */ + function getTokensBoughtByAddressOnTier(address _addr, uint256 _tierID) external view returns (uint256) { + return tokensBoughtByAddressOnTier[_addr][_tierID]; + } + + /** + * @notice Function to read participating wallet count per tier. + * @param _tierID The tier ID for which the count has to be checked. + * @return The number of wallets who participated in that Tier. + * @dev Total participation of wallets cannot be determined by this. + * A user can participate on one round and not on other. + * In the future maybe a count on that can be created. + */ + function getParticipatingWalletCountPerTier(uint256 _tierID) external view returns (uint256) { + return participatingWalletCountPerTier[_tierID]; + } + + /** + * @notice Function to read total token allocation per tier. + * @param _tierID The tier ID for which the metrics has to be checked. + * @return The amount of tokens allocation on that tier. + */ + function getTotalTokenAllocationPerTier(uint256 _tierID) external view returns (uint256) { + return totalTokenAllocationPerTier[_tierID]; + } + + /** + * @notice Function to read tokens sold per tier. + * @param _tierID The tier ID for which the sold metrics has to be checked. + * @return The amount of tokens sold on that tier. + */ + function getTokensSoldPerTier(uint256 _tierID) external view returns (uint256) { + return tokensSoldPerTier[_tierID]; + } + + /** + * @notice Function to check if a tier sale ended or not. + * @param _tierID The Tier whose info is to be read. + * @return True is sale ended, False otherwise. + * @dev A return of false does not necessary mean the sale is active. It can also be in inactive state. + */ + function checkSaleEnded(uint256 _tierID) external view returns (bool _status) { + return tierSaleEnded[_tierID]; + } + + /** + * @notice Function to read address which are approved for sale in a tier. + * @param _addr The address which has to be checked. + * @param _tierID The tier ID for which the address has to be checked. + * @return True is allowed, False otherwise. + */ + function isAddressApproved(address _addr, uint256 _tierID) external view returns (bool) { + return addressApproved[_addr][_tierID]; + } +} diff --git a/contracts/OriginsEvents.sol b/contracts/OriginsEvents.sol new file mode 100644 index 0000000..1e19fa2 --- /dev/null +++ b/contracts/OriginsEvents.sol @@ -0,0 +1,173 @@ +pragma solidity ^0.5.17; + +import "./OriginsAdmin.sol"; + +/** + * @title A contract containing all the events of Origins Base. + * @author Franklin Richards - powerhousefrank@protonmail.com + * @notice You can use this contract for adding events into Origins Base. + */ +contract OriginsEvents is OriginsAdmin { + /* Events */ + + /** + * @notice Emitted when a new verified address is added. + * @param _initiator The one who initiates this event. + * @param _verifiedAddress The address which was veriried for the sale. + * @param _tierID The tier for which the address was verified. + */ + event AddressVerified(address indexed _initiator, address indexed _verifiedAddress, uint256 _tierID); + + /** + * @notice Emitted when the Deposit Address is updated. + * @param _initiator The one who initiates this event. + * @param _oldDepositAddr The address of the old deposit address. + * @param _newDepositAddr The address of the new deposit address. + */ + event DepositAddressUpdated(address indexed _initiator, address indexed _oldDepositAddr, address indexed _newDepositAddr); + + /** + * @notice Emitted when the Locked Fund is updated. + * @param _initiator The one who initiates this event. + * @param _oldLockedFund The address of the old locked fund address. + * @param _newLockedFund The address of the new locked fund address. + */ + event LockedFundUpdated(address indexed _initiator, address indexed _oldLockedFund, address indexed _newLockedFund); + + /** + * @notice Emitted when a new Tier is created. + * @param _initiator The one who initiates this event. + * @param _tierID The new tier ID which was created. + */ + event NewTierCreated(address indexed _initiator, uint256 _tierID); + + /** + * @notice Emitted when Tier Token Limit Parameters are updated. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + * @param _minAmount The minimum asset amount required to participate in that tier. + * @param _maxAmount The maximum asset amount allowed to participate in that tier. + */ + event TierTokenLimitUpdated(address indexed _initiator, uint256 _tierID, uint256 _minAmount, uint256 _maxAmount); + + /** + * @notice Emitted when Tier Token Amount Parameters are updated. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + * @param _remainingTokens The maximum number of tokens allowed to be sold in the tier. + */ + event TierTokenAmountUpdated(address indexed _initiator, uint256 _tierID, uint256 _remainingTokens); + + /** + * @notice Emitted when Tier Time Parameters are updated. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + * @param _saleStartTS The Tier Sale Start Timestamp. + * @param _saleEnd The Tier Sale End Duration or Timestamp. + * @param _saleEndDurationOrTS The Tier Sale End Type for the Tier. + */ + event TierTimeUpdated( + address indexed _initiator, + uint256 _tierID, + uint256 _saleStartTS, + uint256 _saleEnd, + SaleEndDurationOrTS _saleEndDurationOrTS + ); + + /** + * @notice Emitted when Tier Vesting/Lock Parameters are updated. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + * @param _vestOrLockCliff The Vest/Lock Cliff in Seconds. + * @param _vestOrLockDuration The Vest/Lock Duration in Seconds. + * @param _unlockedBP The unlocked token amount in BP. + * @param _transferType The Tier Transfer Type for the Tier. + */ + event TierVestOrLockUpdated( + address indexed _initiator, + uint256 _tierID, + uint256 _vestOrLockCliff, + uint256 _vestOrLockDuration, + uint256 _unlockedBP, + TransferType _transferType + ); + + /** + * @notice Emitted when Tier Deposit Parameters are updated. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + * @param _depositRate The rate is the, asset * rate = token. + * @param _depositToken The token for that particular Tier Sale. + * @param _depositType The type of deposit for the particular sale. + */ + event TierDepositUpdated( + address indexed _initiator, + uint256 _tierID, + uint256 _depositRate, + address indexed _depositToken, + DepositType _depositType + ); + + /** + * @notice Emitted when the Tier Verification are updated. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + * @param _verificationType The type of verification for the particular sale. + */ + event TierVerificationUpdated(address indexed _initiator, uint256 _tierID, VerificationType _verificationType); + + /** + * @notice Emitted when the Tier Sale Ends. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + */ + event TierSaleEnded(address indexed _initiator, uint256 _tierID); + + /** + * @notice Emitted when the Tier Sale Minimum Deposit Amount is updated. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + */ + event TierSaleUpdatedMinimum(address indexed _initiator, uint256 _tierID); + + /** + * @notice Emitted when the Tier Sale Maximum Deposit Amount is updated. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + * @param _updatedMaxAmount The updated max amount for the Tier. + */ + event TierSaleUpdatedMaximum(address indexed _initiator, uint256 _tierID, uint256 _updatedMaxAmount); + + /** + * @notice Emitted when a user buys. + * @param _initiator The one who initiates this event. + * @param _tierID The Tier ID which is being updated. + * @param _tokensBought The amount of tokens bought. + */ + event TokenBuy(address indexed _initiator, uint256 _tierID, uint256 _tokensBought); + + /** + * @notice Emitted when depositAddress or Owner withdraws a tier proceedings. + * @param _initiator The one who initiates this event. + * @param _receiver The one who receives the proceedings. + * @param _tierID The Tier ID of which the proceeding is withdrawn. + * @param _depositType The type of withdraw (RBTC or Token). + * @param _amount The amount of withdraw. + */ + event ProceedingWithdrawn( + address indexed _initiator, + address indexed _receiver, + uint256 _tierID, + DepositType _depositType, + uint256 _amount + ); + + /** + * @notice Emitted when depositAddress or Owner withdraws a tier remaining token. + * @param _initiator The one who initiates this event. + * @param _receiver The one who receives the remaining tokens. + * @param _tierID The Tier ID of which the proceeding is withdrawn. + * @param _remainingToken The amount of tokens withdrawn. + */ + event RemainingTokenWithdrawn(address indexed _initiator, address indexed _receiver, uint256 _tierID, uint256 _remainingToken); +} diff --git a/contracts/OriginsStorage.sol b/contracts/OriginsStorage.sol new file mode 100644 index 0000000..998444c --- /dev/null +++ b/contracts/OriginsStorage.sol @@ -0,0 +1,142 @@ +pragma solidity ^0.5.17; + +import "./Interfaces/IERC20.sol"; +import "./Openzeppelin/SafeMath.sol"; +import "./Interfaces/ILockedFund.sol"; + +/** + * @title A storage contract for Origins Platform. + * @author Franklin Richards - powerhousefrank@protonmail.com + * @notice This plays as the harddisk for the Origins Platform. + */ +contract OriginsStorage { + using SafeMath for uint256; + + /* Storage */ + + /// @notice This determines the number of tiers in the system. When creating a tier, it should always start at 1. + uint256 internal tierCount; + /// @notice The maximum allowed Basis Point. + uint256 internal constant MAX_BASIS_POINT = 10000; + + /// @notice The address to deposit the raised amount. If not set, will be holded in this contract itself, withdrawable by any owner. + address payable internal depositAddress; + /// @notice The token which is being sold. + IERC20 internal token; + /// @notice The Locked Fund contract. + ILockedFund internal lockedFund; + + /** + * @notice The method by which users will be depositing in each tier. + * RBTC - The deposit will be made in RBTC. + * Token - The deposit will be made in any ERC20 Token set in depositToken in Tier Struct. + */ + enum DepositType { + RBTC, + Token + } + /** + * @notice The method by which we determine whether the sale ended or not. + * None - This type is not set, so no one is allowed for sale yet. + * UntilSupply - This type is set to allow sale until each tier runs out of token. + * Duration - This type is set to allow sale until a particular duration. + * Timestamp - This type is set to allow sale until a particular timestamp. + */ + enum SaleEndDurationOrTS { + None, + UntilSupply, + Duration, + Timestamp + } + /** + * @notice The method by which the verification is happening. + * None - The type is not set, so no one is approved for sale. + * Everyone - This type is set to allow everyone. + * ByAddress - This type is set to allow only verified addresses. + */ + enum VerificationType { + None, + Everyone, + ByAddress + } + /** + * @notice The method by which the distribution is happening. + * None - The distribution is not set yet, so tokens remain in the contract. + * Unlocked - The tokens are distributed right away. + * WaitedUnlock - The tokens are withdrawable from this contract after a certain period. + * Vested - The tokens are vested (based on the contracts from Sovryn) for a certain period. + * Locked - The tokens are locked without any benefit based on cliff and duration. + */ + enum TransferType { + None, + Unlocked, + WaitedUnlock, + Vested, + Locked + } + + /** + * @notice The type of Unlock. + * None - The unlock is not set yet. + * Immediate - The tokens will be unlocked immediately. + * Waited - The tokens will be unlocked only after a particular time period. + */ + enum UnlockType { + None, + Immediate, + Waited + } + + /// @notice The tiers based on the tier id, taken from tier count. + mapping(uint256 => Tier) internal tiers; + + /// @notice The below would have been added to Struct `Tier` if the parameter list was not reaching the higher limits. + /// @notice The address to tier ID to uint mapping which contains the amount of tokens bought by that particular address. + mapping(address => mapping(uint256 => uint256)) internal tokensBoughtByAddressOnTier; + /// @notice Contains the number of unique wallets who participated in the sale in a particular Tier. + mapping(uint256 => uint256) internal participatingWalletCountPerTier; + /// @notice Contains the amount of token allocation provided by the tier. + mapping(uint256 => uint256) internal totalTokenAllocationPerTier; + /// @notice Contains the amount of tokens sold in a particular Tier. + mapping(uint256 => uint256) internal tokensSoldPerTier; + /// @notice Contains if a tier sale ended or not. + mapping(uint256 => bool) internal tierSaleEnded; + /// @notice Contains if a tier asset collected withdrawn or not. + mapping(uint256 => bool) internal tierSaleWithdrawn; + + /// @notice The address to uint to bool mapping to see if the particular address is eligible or not for a tier. + mapping(address => mapping(uint256 => bool)) internal addressApproved; + + /** + * @notice The Tier Structure. + * minAmount - The minimum amount which can be deposited. + * maxAmount - The maximum amount which can be deposited. + * remainingTokens - Contains the remaining tokens for sale. + * saleStartTS - Contains the timestamp for the sale to start. Before which no user will be able to buy tokens. + * saleEnd - Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens. + * unlockBP - Contains the unlock amount in Basis Point for Vesting/Lock. + * vestOrLockCliff - Contains the cliff of the vesting/lock for distribution. + * vestOrLockDuration - Contains the duration of the vesting/lock for distribution. + * depositRate - Contains the rate of the token w.r.t. the depositing asset. + * depositToken - Contains the deposit token address if the deposit type is Token. + * verificationType - Contains the method by which verification happens. + * saleEndDurationOrTS - Contains whether end of sale is by Duration or Timestamp. + * transferType - Contains the type of token transfer after a user buys to get the tokens. + */ + struct Tier { + uint256 minAmount; + uint256 maxAmount; + uint256 remainingTokens; + uint256 saleStartTS; + uint256 saleEnd; + uint256 unlockedBP; + uint256 vestOrLockCliff; + uint256 vestOrLockDuration; + uint256 depositRate; + IERC20 depositToken; + DepositType depositType; + VerificationType verificationType; + SaleEndDurationOrTS saleEndDurationOrTS; + TransferType transferType; + } +} diff --git a/contracts/Sovryn/Governance/FeeSharingProxy.sol b/contracts/Sovryn/Governance/FeeSharingProxy.sol new file mode 100644 index 0000000..dfa336e --- /dev/null +++ b/contracts/Sovryn/Governance/FeeSharingProxy.sol @@ -0,0 +1,353 @@ +pragma solidity ^0.5.17; + +import "../Helper/SafeMath96.sol"; +import "../../Openzeppelin/SafeMath.sol"; +import "../../Openzeppelin/SafeERC20.sol"; +import "../../Interfaces/IFeeSharingProxy.sol"; +import "../../Interfaces/IStaking.sol"; + +/** + * @title The FeeSharingProxy contract. + * @notice Staking is not only granting voting rights, but also access to fee + * sharing according to the own voting power in relation to the total. Whenever + * somebody decides to collect the fees from the protocol, they get transferred + * to a proxy contract which invests the funds in the lending pool and keeps + * the pool tokens. + * + * The fee sharing proxy will be set as feesController of the protocol contract. + * This allows the fee sharing proxy to withdraw the fees. The fee sharing + * proxy holds the pool tokens and keeps track of which user owns how many + * tokens. In order to know how many tokens a user owns, the fee sharing proxy + * needs to know the user’s weighted stake in relation to the total weighted + * stake (aka total voting power). + * + * Because both values are subject to change, they may be different on each fee + * withdrawal. To be able to calculate a user’s share of tokens when he wants + * to withdraw, we need checkpoints. + * + * This contract is intended to be set as the protocol fee collector. + * Anybody can invoke the withdrawFees function which uses + * protocol.withdrawFees to obtain available fees from operations on a + * certain token. These fees are deposited in the corresponding loanPool. + * Also, the staking contract sends slashed tokens to this contract. When a + * user calls the withdraw function, the contract transfers the fee sharing + * rewards in proportion to the user’s weighted stake since the last withdrawal. + * + * The protocol is collecting fees in all sorts of currencies and then automatically + * supplies them to the respective lending pools. Therefore, all fees are + * generating interest for the SOV holders. If one of them withdraws fees, it will + * get pool tokens. It is planned to add the option to convert anything to rBTC + * before withdrawing, but not yet implemented. + * */ +contract FeeSharingProxy is SafeMath96, IFeeSharingProxy { + using SafeMath for uint256; + using SafeERC20 for IERC20; + + /* Storage */ + + /// @dev TODO FEE_WITHDRAWAL_INTERVAL, MAX_CHECKPOINTS + uint256 constant FEE_WITHDRAWAL_INTERVAL = 86400; + + uint32 constant MAX_CHECKPOINTS = 100; + + IProtocol public protocol; + IStaking public staking; + + /// @notice Checkpoints by index per pool token address + mapping(address => mapping(uint256 => Checkpoint)) public tokenCheckpoints; + + /// @notice The number of checkpoints for each pool token address. + mapping(address => uint32) public numTokenCheckpoints; + + /// @notice + /// user => token => processed checkpoint + mapping(address => mapping(address => uint32)) public processedCheckpoints; + + /// @notice Last time fees were withdrawn per pool token address: + /// token => time + mapping(address => uint256) public lastFeeWithdrawalTime; + + /// @notice Amount of tokens that were transferred, but not saved in checkpoints. + /// token => amount + mapping(address => uint96) public unprocessedAmount; + + struct Checkpoint { + uint32 blockNumber; + uint32 timestamp; + uint96 totalWeightedStake; + uint96 numTokens; + } + + /* Events */ + + /// @notice An event emitted when fee get withdrawn. + event FeeWithdrawn(address indexed sender, address indexed token, uint256 amount); + + /// @notice An event emitted when tokens transferred. + event TokensTransferred(address indexed sender, address indexed token, uint256 amount); + + /// @notice An event emitted when checkpoint added. + event CheckpointAdded(address indexed sender, address indexed token, uint256 amount); + + /// @notice An event emitted when user fee get withdrawn. + event UserFeeWithdrawn(address indexed sender, address indexed receiver, address indexed token, uint256 amount); + + /* Functions */ + + constructor(IProtocol _protocol, IStaking _staking) public { + protocol = _protocol; + staking = _staking; + } + + /** + * @notice Withdraw fees for the given token: + * lendingFee + tradingFee + borrowingFee + * @param _token Address of the token + * */ + function withdrawFees(address _token) public { + require(_token != address(0), "FeeSharingProxy::withdrawFees: invalid address"); + + address loanPoolToken = protocol.underlyingToLoanPool(_token); + require(loanPoolToken != address(0), "FeeSharingProxy::withdrawFees: loan token not found"); + + uint256 amount = protocol.withdrawFees(_token, address(this)); + require(amount > 0, "FeeSharingProxy::withdrawFees: no tokens to withdraw"); + + /// @dev TODO can be also used - function addLiquidity(IERC20Token _reserveToken, uint256 _amount, uint256 _minReturn) + IERC20(_token).approve(loanPoolToken, amount); + uint256 poolTokenAmount = ILoanToken(loanPoolToken).mint(address(this), amount); + + /// @notice Update unprocessed amount of tokens + uint96 amount96 = safe96(poolTokenAmount, "FeeSharingProxy::withdrawFees: pool token amount exceeds 96 bits"); + unprocessedAmount[loanPoolToken] = add96( + unprocessedAmount[loanPoolToken], + amount96, + "FeeSharingProxy::withdrawFees: unprocessedAmount exceeds 96 bits" + ); + + _addCheckpoint(loanPoolToken); + + emit FeeWithdrawn(msg.sender, loanPoolToken, poolTokenAmount); + } + + /** + * @notice Transfer tokens to this contract. + * @dev We just update amount of tokens here and write checkpoint in a separate methods + * in order to prevent adding checkpoints too often. + * @param _token Address of the token. + * @param _amount Amount to be transferred. + * */ + function transferTokens(address _token, uint96 _amount) public { + require(_token != address(0), "FeeSharingProxy::transferTokens: invalid address"); + require(_amount > 0, "FeeSharingProxy::transferTokens: invalid amount"); + + /// @notice Transfer tokens from msg.sender + bool success = IERC20(_token).transferFrom(address(msg.sender), address(this), _amount); + require(success, "Staking::transferTokens: token transfer failed"); + + /// @notice Update unprocessed amount of tokens. + unprocessedAmount[_token] = add96(unprocessedAmount[_token], _amount, "FeeSharingProxy::transferTokens: amount exceeds 96 bits"); + + _addCheckpoint(_token); + + emit TokensTransferred(msg.sender, _token, _amount); + } + + /** + * @notice Add checkpoint with accumulated amount by function invocation. + * @param _token Address of the token. + * */ + function _addCheckpoint(address _token) internal { + if (block.timestamp - lastFeeWithdrawalTime[_token] >= FEE_WITHDRAWAL_INTERVAL) { + lastFeeWithdrawalTime[_token] = block.timestamp; + uint96 amount = unprocessedAmount[_token]; + + /// @notice Reset unprocessed amount of tokens to zero. + unprocessedAmount[_token] = 0; + + /// @notice Write a regular checkpoint. + _writeTokenCheckpoint(_token, amount); + } + } + + /** + * @notice Withdraw accumulated fee to the message sender. + * + * The Sovryn protocol collects fees on every trade/swap and loan. + * These fees will be distributed to SOV stakers based on their voting + * power as a percentage of total voting power. Therefore, staking more + * SOV and/or staking for longer will increase your share of the fees + * generated, meaning you will earn more from staking. + * + * @param _loanPoolToken Address of the pool token. + * @param _maxCheckpoints Maximum number of checkpoints to be processed. + * @param _receiver The receiver of tokens or msg.sender + * */ + function withdraw( + address _loanPoolToken, + uint32 _maxCheckpoints, + address _receiver + ) public { + /// @dev Prevents processing all checkpoints because of block gas limit. + require(_maxCheckpoints > 0, "FeeSharingProxy::withdraw: _maxCheckpoints should be positive"); + + address user = msg.sender; + if (_receiver == address(0)) { + _receiver = msg.sender; + } + + uint256 amount; + uint32 end; + (amount, end) = _getAccumulatedFees(user, _loanPoolToken, _maxCheckpoints); + + processedCheckpoints[user][_loanPoolToken] = end; + + require(IERC20(_loanPoolToken).transfer(user, amount), "FeeSharingProxy::withdraw: withdrawal failed"); + + emit UserFeeWithdrawn(msg.sender, _receiver, _loanPoolToken, amount); + } + + /** + * @notice Get the accumulated loan pool fee of the message sender. + * @param _user The address of the user or contract. + * @param _loanPoolToken Address of the pool token. + * @return The accumulated fee for the message sender. + * */ + function getAccumulatedFees(address _user, address _loanPoolToken) public view returns (uint256) { + uint256 amount; + (amount, ) = _getAccumulatedFees(_user, _loanPoolToken, 0); + return amount; + } + + /** + * @notice Whenever fees are withdrawn, the staking contract needs to + * checkpoint the block number, the number of pool tokens and the + * total voting power at that time (read from the staking contract). + * While the total voting power would not necessarily need to be + * checkpointed, it makes sense to save gas cost on withdrawal. + * + * When the user wants to withdraw its share of tokens, we need + * to iterate over all of the checkpoints since the users last + * withdrawal (note: remember last withdrawal block), query the + * user’s balance at the checkpoint blocks from the staking contract, + * compute his share of the checkpointed tokens and add them up. + * The maximum number of checkpoints to process at once should be limited. + * + * @param _user Address of the user's account. + * @param _loanPoolToken Loan pool token address. + * @param _maxCheckpoints Checkpoint index incremental. + * */ + function _getAccumulatedFees( + address _user, + address _loanPoolToken, + uint32 _maxCheckpoints + ) internal view returns (uint256, uint32) { + uint32 start = processedCheckpoints[_user][_loanPoolToken]; + uint32 end; + /// @dev Additional bool param can't be used because of stack too deep error. + if (_maxCheckpoints > 0) { + /// @dev withdraw -> _getAccumulatedFees + require(start < numTokenCheckpoints[_loanPoolToken], "FeeSharingProxy::withdrawFees: no tokens for a withdrawal"); + end = _getEndOfRange(start, _loanPoolToken, _maxCheckpoints); + } else { + /// @dev getAccumulatedFees -> _getAccumulatedFees + /// Don't throw error for getter invocation outside of transaction. + if (start >= numTokenCheckpoints[_loanPoolToken]) { + return (0, numTokenCheckpoints[_loanPoolToken]); + } + end = numTokenCheckpoints[_loanPoolToken]; + } + + uint256 amount = 0; + uint256 cachedLockDate = 0; + uint96 cachedWeightedStake = 0; + for (uint32 i = start; i < end; i++) { + Checkpoint storage checkpoint = tokenCheckpoints[_loanPoolToken][i]; + uint256 lockDate = staking.timestampToLockDate(checkpoint.timestamp); + uint96 weightedStake; + if (lockDate == cachedLockDate) { + weightedStake = cachedWeightedStake; + } else { + /// @dev We need to use "checkpoint.blockNumber - 1" here to calculate weighted stake + /// For the same block like we did for total voting power in _writeTokenCheckpoint + weightedStake = staking.getPriorWeightedStake(_user, checkpoint.blockNumber - 1, checkpoint.timestamp); + cachedWeightedStake = weightedStake; + cachedLockDate = lockDate; + } + uint256 share = uint256(checkpoint.numTokens).mul(weightedStake).div(uint256(checkpoint.totalWeightedStake)); + amount = amount.add(share); + } + return (amount, end); + } + + /** + * @notice Withdrawal should only be possible for blocks which were already + * mined. If the fees are withdrawn in the same block as the user withdrawal + * they are not considered by the withdrawing logic (to avoid inconsistencies). + * + * @param start Start of the range. + * @param _loanPoolToken Loan pool token address. + * @param _maxCheckpoints Checkpoint index incremental. + * */ + function _getEndOfRange( + uint32 start, + address _loanPoolToken, + uint32 _maxCheckpoints + ) internal view returns (uint32) { + uint32 nCheckpoints = numTokenCheckpoints[_loanPoolToken]; + uint32 end; + if (_maxCheckpoints == 0) { + /// @dev All checkpoints will be processed (only for getter outside of a transaction). + end = nCheckpoints; + } else { + if (_maxCheckpoints > MAX_CHECKPOINTS) { + _maxCheckpoints = MAX_CHECKPOINTS; + } + end = safe32(start + _maxCheckpoints, "FeeSharingProxy::withdraw: checkpoint index exceeds 32 bits"); + if (end > nCheckpoints) { + end = nCheckpoints; + } + } + + /// @dev Withdrawal should only be possible for blocks which were already mined. + uint32 lastBlockNumber = tokenCheckpoints[_loanPoolToken][end - 1].blockNumber; + if (block.number == lastBlockNumber) { + end--; + } + return end; + } + + /** + * @notice Write a regular checkpoint w/ the foolowing data: + * block number, block timestamp, total weighted stake and num of tokens. + * @param _token The pool token address. + * @param _numTokens The amount of pool tokens. + * */ + function _writeTokenCheckpoint(address _token, uint96 _numTokens) internal { + uint32 blockNumber = safe32(block.number, "FeeSharingProxy::_writeCheckpoint: block number exceeds 32 bits"); + uint32 blockTimestamp = safe32(block.timestamp, "FeeSharingProxy::_writeCheckpoint: block timestamp exceeds 32 bits"); + uint32 nCheckpoints = numTokenCheckpoints[_token]; + + uint96 totalWeightedStake = staking.getPriorTotalVotingPower(blockNumber - 1, block.timestamp); + if (nCheckpoints > 0 && tokenCheckpoints[_token][nCheckpoints - 1].blockNumber == blockNumber) { + tokenCheckpoints[_token][nCheckpoints - 1].totalWeightedStake = totalWeightedStake; + tokenCheckpoints[_token][nCheckpoints - 1].numTokens = _numTokens; + } else { + tokenCheckpoints[_token][nCheckpoints] = Checkpoint(blockNumber, blockTimestamp, totalWeightedStake, _numTokens); + numTokenCheckpoints[_token] = nCheckpoints + 1; + } + emit CheckpointAdded(msg.sender, _token, _numTokens); + } +} + +/* Interfaces */ + +interface IProtocol { + function withdrawFees(address token, address receiver) external returns (uint256); + + function underlyingToLoanPool(address token) external returns (address); +} + +interface ILoanToken { + function mint(address receiver, uint256 depositAmount) external returns (uint256 mintAmount); +} diff --git a/contracts/Sovryn/Governance/Staking/Checkpoints.sol b/contracts/Sovryn/Governance/Staking/Checkpoints.sol new file mode 100644 index 0000000..f0ead2a --- /dev/null +++ b/contracts/Sovryn/Governance/Staking/Checkpoints.sol @@ -0,0 +1,211 @@ +pragma solidity ^0.5.17; +pragma experimental ABIEncoderV2; + +import "./StakingStorage.sol"; +import "../../Helper/SafeMath96.sol"; + +/** + * @title Checkpoints contract. + * @notice Increases and decreases storage values for users, delegatees and + * total daily stake. + * */ +contract Checkpoints is StakingStorage, SafeMath96 { + /// @notice An event emitted when an account changes its delegate. + event DelegateChanged(address indexed delegator, uint256 lockedUntil, address indexed fromDelegate, address indexed toDelegate); + + /// @notice An event emitted when a delegate account's stake balance changes. + event DelegateStakeChanged(address indexed delegate, uint256 lockedUntil, uint256 previousBalance, uint256 newBalance); + + /// @notice An event emitted when tokens get staked. + event TokensStaked(address indexed staker, uint256 amount, uint256 lockedUntil, uint256 totalStaked); + + /// @notice An event emitted when tokens get withdrawn. + event TokensWithdrawn(address indexed staker, address receiver, uint256 amount); + + /// @notice An event emitted when vesting tokens get withdrawn. + event VestingTokensWithdrawn(address vesting, address receiver); + + /// @notice An event emitted when the owner unlocks all tokens. + event TokensUnlocked(uint256 amount); + + /// @notice An event emitted when a staking period gets extended. + event ExtendedStakingDuration(address indexed staker, uint256 previousDate, uint256 newDate); + + event AdminAdded(address admin); + + event AdminRemoved(address admin); + + event ContractCodeHashAdded(bytes32 hash); + + event ContractCodeHashRemoved(bytes32 hash); + + /** + * @notice Increases the user's stake for a giving lock date and writes a checkpoint. + * @param account The user address. + * @param lockedTS The lock date. + * @param value The value to add to the staked balance. + * */ + function _increaseUserStake( + address account, + uint256 lockedTS, + uint96 value + ) internal { + uint32 nCheckpoints = numUserStakingCheckpoints[account][lockedTS]; + uint96 staked = userStakingCheckpoints[account][lockedTS][nCheckpoints - 1].stake; + uint96 newStake = add96(staked, value, "Staking::_increaseUserStake: staked amount overflow"); + _writeUserCheckpoint(account, lockedTS, nCheckpoints, newStake); + } + + /** + * @notice Decreases the user's stake for a giving lock date and writes a checkpoint. + * @param account The user address. + * @param lockedTS The lock date. + * @param value The value to substract to the staked balance. + * */ + function _decreaseUserStake( + address account, + uint256 lockedTS, + uint96 value + ) internal { + uint32 nCheckpoints = numUserStakingCheckpoints[account][lockedTS]; + uint96 staked = userStakingCheckpoints[account][lockedTS][nCheckpoints - 1].stake; + uint96 newStake = sub96(staked, value, "Staking::_decreaseUserStake: staked amount underflow"); + _writeUserCheckpoint(account, lockedTS, nCheckpoints, newStake); + } + + /** + * @notice Writes on storage the user stake. + * @param account The user address. + * @param lockedTS The lock date. + * @param nCheckpoints The number of checkpoints, to find out the last one index. + * @param newStake The new staked balance. + * */ + function _writeUserCheckpoint( + address account, + uint256 lockedTS, + uint32 nCheckpoints, + uint96 newStake + ) internal { + uint32 blockNumber = safe32(block.number, "Staking::_writeStakingCheckpoint: block number exceeds 32 bits"); + + if (nCheckpoints > 0 && userStakingCheckpoints[account][lockedTS][nCheckpoints - 1].fromBlock == blockNumber) { + userStakingCheckpoints[account][lockedTS][nCheckpoints - 1].stake = newStake; + } else { + userStakingCheckpoints[account][lockedTS][nCheckpoints] = Checkpoint(blockNumber, newStake); + numUserStakingCheckpoints[account][lockedTS] = nCheckpoints + 1; + } + } + + /** + * @notice Increases the delegatee's stake for a giving lock date and writes a checkpoint. + * @param delegatee The delegatee address. + * @param lockedTS The lock date. + * @param value The value to add to the staked balance. + * */ + function _increaseDelegateStake( + address delegatee, + uint256 lockedTS, + uint96 value + ) internal { + uint32 nCheckpoints = numDelegateStakingCheckpoints[delegatee][lockedTS]; + uint96 staked = delegateStakingCheckpoints[delegatee][lockedTS][nCheckpoints - 1].stake; + uint96 newStake = add96(staked, value, "Staking::_increaseDelegateStake: staked amount overflow"); + _writeDelegateCheckpoint(delegatee, lockedTS, nCheckpoints, newStake); + } + + /** + * @notice Decreases the delegatee's stake for a giving lock date and writes a checkpoint. + * @param delegatee The delegatee address. + * @param lockedTS The lock date. + * @param value The value to substract to the staked balance. + * */ + function _decreaseDelegateStake( + address delegatee, + uint256 lockedTS, + uint96 value + ) internal { + uint32 nCheckpoints = numDelegateStakingCheckpoints[delegatee][lockedTS]; + uint96 staked = delegateStakingCheckpoints[delegatee][lockedTS][nCheckpoints - 1].stake; + uint96 newStake = 0; + // @dev We need to check delegate checkpoint value here, + // because we had an issue in `stake` function: + // delegate checkpoint wasn't updating for the second and next stakes for the same date + // if first stake was withdrawn completely and stake was delegated to the staker + // (no delegation to another address). + // @dev It can be greater than 0, but inconsistent after 3 transactions + if (staked > value) { + newStake = sub96(staked, value, "Staking::_decreaseDelegateStake: staked amount underflow"); + } + _writeDelegateCheckpoint(delegatee, lockedTS, nCheckpoints, newStake); + } + + /** + * @notice Writes on storage the delegate stake. + * @param delegatee The delegate address. + * @param lockedTS The lock date. + * @param nCheckpoints The number of checkpoints, to find out the last one index. + * @param newStake The new staked balance. + * */ + function _writeDelegateCheckpoint( + address delegatee, + uint256 lockedTS, + uint32 nCheckpoints, + uint96 newStake + ) internal { + uint32 blockNumber = safe32(block.number, "Staking::_writeStakingCheckpoint: block number exceeds 32 bits"); + uint96 oldStake = delegateStakingCheckpoints[delegatee][lockedTS][nCheckpoints - 1].stake; + + if (nCheckpoints > 0 && delegateStakingCheckpoints[delegatee][lockedTS][nCheckpoints - 1].fromBlock == blockNumber) { + delegateStakingCheckpoints[delegatee][lockedTS][nCheckpoints - 1].stake = newStake; + } else { + delegateStakingCheckpoints[delegatee][lockedTS][nCheckpoints] = Checkpoint(blockNumber, newStake); + numDelegateStakingCheckpoints[delegatee][lockedTS] = nCheckpoints + 1; + } + emit DelegateStakeChanged(delegatee, lockedTS, oldStake, newStake); + } + + /** + * @notice Increases the total stake for a giving lock date and writes a checkpoint. + * @param lockedTS The lock date. + * @param value The value to add to the staked balance. + * */ + function _increaseDailyStake(uint256 lockedTS, uint96 value) internal { + uint32 nCheckpoints = numTotalStakingCheckpoints[lockedTS]; + uint96 staked = totalStakingCheckpoints[lockedTS][nCheckpoints - 1].stake; + uint96 newStake = add96(staked, value, "Staking::_increaseDailyStake: staked amount overflow"); + _writeStakingCheckpoint(lockedTS, nCheckpoints, newStake); + } + + /** + * @notice Decreases the total stake for a giving lock date and writes a checkpoint. + * @param lockedTS The lock date. + * @param value The value to substract to the staked balance. + * */ + function _decreaseDailyStake(uint256 lockedTS, uint96 value) internal { + uint32 nCheckpoints = numTotalStakingCheckpoints[lockedTS]; + uint96 staked = totalStakingCheckpoints[lockedTS][nCheckpoints - 1].stake; + uint96 newStake = sub96(staked, value, "Staking::_decreaseDailyStake: staked amount underflow"); + _writeStakingCheckpoint(lockedTS, nCheckpoints, newStake); + } + + /** + * @notice Writes on storage the total stake. + * @param lockedTS The lock date. + * @param nCheckpoints The number of checkpoints, to find out the last one index. + * @param newStake The new staked balance. + * */ + function _writeStakingCheckpoint( + uint256 lockedTS, + uint32 nCheckpoints, + uint96 newStake + ) internal { + uint32 blockNumber = safe32(block.number, "Staking::_writeStakingCheckpoint: block number exceeds 32 bits"); + + if (nCheckpoints > 0 && totalStakingCheckpoints[lockedTS][nCheckpoints - 1].fromBlock == blockNumber) { + totalStakingCheckpoints[lockedTS][nCheckpoints - 1].stake = newStake; + } else { + totalStakingCheckpoints[lockedTS][nCheckpoints] = Checkpoint(blockNumber, newStake); + numTotalStakingCheckpoints[lockedTS] = nCheckpoints + 1; + } + } +} diff --git a/contracts/Sovryn/Governance/Staking/Staking.sol b/contracts/Sovryn/Governance/Staking/Staking.sol new file mode 100644 index 0000000..71b4db3 --- /dev/null +++ b/contracts/Sovryn/Governance/Staking/Staking.sol @@ -0,0 +1,718 @@ +pragma solidity ^0.5.17; +pragma experimental ABIEncoderV2; + +import "./WeightedStaking.sol"; +import "../../../Interfaces/IStaking.sol"; +import "../../RSK/RSKAddrValidator.sol"; +import "../../../Interfaces/ITeamVesting.sol"; +import "../../../Interfaces/IVesting.sol"; +import "../../Token/ApprovalReceiver.sol"; +import "../../../Openzeppelin/SafeMath.sol"; + +/** + * @title Staking contract. + * @notice Pay-in and pay-out function for staking and withdrawing tokens. + * Staking is delegated and vested: To gain voting power, SOV holders must + * stake their SOV for a given period of time. Aside from Bitocracy + * participation, there's a financially-rewarding reason for staking SOV. + * Tokenholders who stake their SOV receive staking rewards, a pro-rata share + * of the revenue that the platform generates from various transaction fees + * plus revenues from stakers who have a portion of their SOV slashed for + * early unstaking. + * */ +contract Staking is IStaking, WeightedStaking, ApprovalReceiver { + using SafeMath for uint256; + + /// @notice Constant used for computing the vesting dates. + uint256 constant FOUR_WEEKS = 4 weeks; + + /** + * @notice Stake the given amount for the given duration of time. + * @param amount The number of tokens to stake. + * @param until Timestamp indicating the date until which to stake. + * @param stakeFor The address to stake the tokens for or 0x0 if staking for oneself. + * @param delegatee The address of the delegatee or 0x0 if there is none. + * */ + function stake( + uint96 amount, + uint256 until, + address stakeFor, + address delegatee + ) external { + _stake(msg.sender, amount, until, stakeFor, delegatee, false); + } + + /** + * @notice Stake the given amount for the given duration of time. + * @dev This function will be invoked from receiveApproval + * @dev SOV.approveAndCall -> this.receiveApproval -> this.stakeWithApproval + * @param sender The sender of SOV.approveAndCall + * @param amount The number of tokens to stake. + * @param until Timestamp indicating the date until which to stake. + * @param stakeFor The address to stake the tokens for or 0x0 if staking for oneself. + * @param delegatee The address of the delegatee or 0x0 if there is none. + * */ + function stakeWithApproval( + address sender, + uint96 amount, + uint256 until, + address stakeFor, + address delegatee + ) public onlyThisContract { + _stake(sender, amount, until, stakeFor, delegatee, false); + } + + /** + * @notice Send sender's tokens to this contract and update its staked balance. + * @param sender The sender of the tokens. + * @param amount The number of tokens to send. + * @param until The date until which the tokens will be staked. + * @param stakeFor The beneficiary whose stake will be increased. + * @param delegatee The address of the delegatee or stakeFor if default 0x0. + * @param timeAdjusted Whether fixing date to stacking periods or not. + * */ + function _stake( + address sender, + uint96 amount, + uint256 until, + address stakeFor, + address delegatee, + bool timeAdjusted + ) internal { + require(amount > 0, "Staking::stake: amount of tokens to stake needs to be bigger than 0"); + + if (!timeAdjusted) { + until = timestampToLockDate(until); + } + require(until > block.timestamp, "Staking::timestampToLockDate: staking period too short"); + + /// @dev Stake for the sender if not specified otherwise. + if (stakeFor == address(0)) { + stakeFor = sender; + } + + /// @dev Delegate for stakeFor if not specified otherwise. + if (delegatee == address(0)) { + delegatee = stakeFor; + } + + /// @dev Do not stake longer than the max duration. + if (!timeAdjusted) { + uint256 latest = timestampToLockDate(block.timestamp + MAX_DURATION); + if (until > latest) until = latest; + } + + uint96 previousBalance = currentBalance(stakeFor, until); + + /// @dev Increase stake. + _increaseStake(sender, amount, stakeFor, until); + + // @dev Previous version wasn't working properly for the following case: + // delegate checkpoint wasn't updating for the second and next stakes for the same date + // if first stake was withdrawn completely and stake was delegated to the staker + // (no delegation to another address). + address previousDelegatee = delegates[stakeFor][until]; + if (previousDelegatee != delegatee) { + /// @dev Update delegatee. + delegates[stakeFor][until] = delegatee; + + /// @dev Decrease stake on previous balance for previous delegatee. + _decreaseDelegateStake(previousDelegatee, until, previousBalance); + + /// @dev Add previousBalance to amount. + amount = add96(previousBalance, amount, "Staking::stake: balance overflow"); + } + + /// @dev Increase stake. + _increaseDelegateStake(delegatee, until, amount); + emit DelegateChanged(stakeFor, until, previousDelegatee, delegatee); + } + + /** + * @notice Extend the staking duration until the specified date. + * @param previousLock The old unlocking timestamp. + * @param until The new unlocking timestamp in seconds. + * */ + function extendStakingDuration(uint256 previousLock, uint256 until) public { + until = timestampToLockDate(until); + require(previousLock <= until, "Staking::extendStakingDuration: cannot reduce the staking duration"); + + /// @dev Do not exceed the max duration, no overflow possible. + uint256 latest = timestampToLockDate(block.timestamp + MAX_DURATION); + if (until > latest) until = latest; + + /// @dev Update checkpoints. + /// @dev TODO James: Can reading stake at block.number -1 cause trouble with multiple tx in a block? + uint96 amount = _getPriorUserStakeByDate(msg.sender, previousLock, block.number - 1); + require(amount > 0, "Staking::extendStakingDuration: nothing staked until the previous lock date"); + _decreaseUserStake(msg.sender, previousLock, amount); + _increaseUserStake(msg.sender, until, amount); + _decreaseDailyStake(previousLock, amount); + _increaseDailyStake(until, amount); + + /// @dev Delegate might change: if there is already a delegate set for the until date, it will remain the delegate for this position + address delegateFrom = delegates[msg.sender][previousLock]; + address delegateTo = delegates[msg.sender][until]; + if (delegateTo == address(0)) { + delegateTo = delegateFrom; + delegates[msg.sender][until] = delegateFrom; + } + delegates[msg.sender][previousLock] = address(0); + _decreaseDelegateStake(delegateFrom, previousLock, amount); + _increaseDelegateStake(delegateTo, until, amount); + + emit ExtendedStakingDuration(msg.sender, previousLock, until); + } + + /** + * @notice Send sender's tokens to this contract and update its staked balance. + * @param sender The sender of the tokens. + * @param amount The number of tokens to send. + * @param stakeFor The beneficiary whose stake will be increased. + * @param until The date until which the tokens will be staked. + * */ + function _increaseStake( + address sender, + uint96 amount, + address stakeFor, + uint256 until + ) internal { + /// @dev Retrieve the SOV tokens. + bool success = SOVToken.transferFrom(sender, address(this), amount); + require(success); + + /// @dev Increase staked balance. + uint96 balance = currentBalance(stakeFor, until); + balance = add96(balance, amount, "Staking::increaseStake: balance overflow"); + + /// @dev Update checkpoints. + _increaseDailyStake(until, amount); + _increaseUserStake(stakeFor, until, amount); + + emit TokensStaked(stakeFor, amount, until, balance); + } + + /** + * @notice Stake tokens according to the vesting schedule. + * @param amount The amount of tokens to stake. + * @param cliff The time interval to the first withdraw. + * @param duration The staking duration. + * @param intervalLength The length of each staking interval when cliff passed. + * @param stakeFor The address to stake the tokens for or 0x0 if staking for oneself. + * @param delegatee The address of the delegatee or 0x0 if there is none. + * */ + function stakesBySchedule( + uint256 amount, + uint256 cliff, + uint256 duration, + uint256 intervalLength, + address stakeFor, + address delegatee + ) public { + /** + * @dev Stake them until lock dates according to the vesting schedule. + * Note: because staking is only possible in periods of 2 weeks, + * the total duration might end up a bit shorter than specified + * depending on the date of staking. + * */ + uint256 start = timestampToLockDate(block.timestamp + cliff); + if (duration > MAX_DURATION) { + duration = MAX_DURATION; + } + uint256 end = timestampToLockDate(block.timestamp + duration); + uint256 numIntervals = (end - start) / intervalLength + 1; + uint256 stakedPerInterval = amount / numIntervals; + /// @dev stakedPerInterval might lose some dust on rounding. Add it to the first staking date. + if (numIntervals >= 1) { + _stake(msg.sender, uint96(amount - stakedPerInterval * (numIntervals - 1)), start, stakeFor, delegatee, true); + } + /// @dev Stake the rest in 4 week intervals. + for (uint256 i = start + intervalLength; i <= end; i += intervalLength) { + /// @dev Stakes for itself, delegates to the owner. + _stake(msg.sender, uint96(stakedPerInterval), i, stakeFor, delegatee, true); + } + } + + /** + * @notice Withdraw the given amount of tokens if they are unlocked. + * @param amount The number of tokens to withdraw. + * @param until The date until which the tokens were staked. + * @param receiver The receiver of the tokens. If not specified, send to the msg.sender + * */ + function withdraw( + uint96 amount, + uint256 until, + address receiver + ) public { + _withdraw(amount, until, receiver, false); + // @dev withdraws tokens for lock date 2 weeks later than given lock date if sender is a contract + // we need to check block.timestamp here + _withdrawNext(amount, until, receiver, false); + } + + /** + * @notice Withdraw the given amount of tokens. + * @param amount The number of tokens to withdraw. + * @param until The date until which the tokens were staked. + * @param receiver The receiver of the tokens. If not specified, send to the msg.sender + * @dev Can be invoked only by whitelisted contract passed to governanceWithdrawVesting + * */ + function governanceWithdraw( + uint96 amount, + uint256 until, + address receiver + ) public { + require(vestingWhitelist[msg.sender], "unauthorized"); + + _withdraw(amount, until, receiver, true); + // @dev withdraws tokens for lock date 2 weeks later than given lock date if sender is a contract + // we don't need to check block.timestamp here + _withdrawNext(amount, until, receiver, true); + } + + /** + * @notice Withdraw tokens for vesting contract. + * @param vesting The address of Vesting contract. + * @param receiver The receiver of the tokens. If not specified, send to the msg.sender + * @dev Can be invoked only by whitelisted contract passed to governanceWithdrawVesting. + * */ + function governanceWithdrawVesting(address vesting, address receiver) public onlyAuthorized { + vestingWhitelist[vesting] = true; + ITeamVesting(vesting).governanceWithdrawTokens(receiver); + vestingWhitelist[vesting] = false; + + emit VestingTokensWithdrawn(vesting, receiver); + } + + /** + * @notice Send user' staked tokens to a receiver taking into account punishments. + * Sovryn encourages long-term commitment and thinking. When/if you unstake before + * the end of the staking period, a percentage of the original staking amount will + * be slashed. This amount is also added to the reward pool and is distributed + * between all other stakers. + * + * @param amount The number of tokens to withdraw. + * @param until The date until which the tokens were staked. + * @param receiver The receiver of the tokens. If not specified, send to the msg.sender + * @param isGovernance Whether all tokens (true) + * or just unlocked tokens (false). + * */ + function _withdraw( + uint96 amount, + uint256 until, + address receiver, + bool isGovernance + ) internal { + // @dev it's very unlikely some one will have 1/10**18 SOV staked in Vesting contract + // this check is a part of workaround for Vesting.withdrawTokens issue + if (amount == 1 && _isVestingContract()) { + return; + } + until = _adjustDateForOrigin(until); + _validateWithdrawParams(amount, until); + + /// @dev Determine the receiver. + if (receiver == address(0)) receiver = msg.sender; + + /// @dev Update the checkpoints. + _decreaseDailyStake(until, amount); + _decreaseUserStake(msg.sender, until, amount); + _decreaseDelegateStake(delegates[msg.sender][until], until, amount); + + /// @dev Early unstaking should be punished. + if (block.timestamp < until && !allUnlocked && !isGovernance) { + uint96 punishedAmount = _getPunishedAmount(amount, until); + amount -= punishedAmount; + + /// @dev punishedAmount can be 0 if block.timestamp are very close to 'until' + if (punishedAmount > 0) { + require(address(feeSharing) != address(0), "Staking::withdraw: FeeSharing address wasn't set"); + /// @dev Move punished amount to fee sharing. + /// @dev Approve transfer here and let feeSharing do transfer and write checkpoint. + SOVToken.approve(address(feeSharing), punishedAmount); + feeSharing.transferTokens(address(SOVToken), punishedAmount); + } + } + + /// @dev transferFrom + bool success = SOVToken.transfer(receiver, amount); + require(success, "Staking::withdraw: Token transfer failed"); + + emit TokensWithdrawn(msg.sender, receiver, amount); + } + + // @dev withdraws tokens for lock date 2 weeks later than given lock date + function _withdrawNext( + uint96 amount, + uint256 until, + address receiver, + bool isGovernance + ) internal { + if (_isVestingContract()) { + uint256 nextLock = until.add(TWO_WEEKS); + if (isGovernance || block.timestamp >= nextLock) { + uint96 stake = _getPriorUserStakeByDate(msg.sender, nextLock, block.number - 1); + if (stake > 0) { + _withdraw(stake, nextLock, receiver, isGovernance); + } + } + } + } + + /** + * @notice Get available and punished amount for withdrawing. + * @param amount The number of tokens to withdraw. + * @param until The date until which the tokens were staked. + * */ + function getWithdrawAmounts(uint96 amount, uint256 until) public view returns (uint96, uint96) { + _validateWithdrawParams(amount, until); + uint96 punishedAmount = _getPunishedAmount(amount, until); + return (amount - punishedAmount, punishedAmount); + } + + /** + * @notice Get punished amount for withdrawing. + * @param amount The number of tokens to withdraw. + * @param until The date until which the tokens were staked. + * */ + function _getPunishedAmount(uint96 amount, uint256 until) internal view returns (uint96) { + uint256 date = timestampToLockDate(block.timestamp); + uint96 weight = computeWeightByDate(until, date); /// @dev (10 - 1) * WEIGHT_FACTOR + weight = weight * weightScaling; + return (amount * weight) / WEIGHT_FACTOR / 100; + } + + /** + * @notice Validate withdraw parameters. + * @param amount The number of tokens to withdraw. + * @param until The date until which the tokens were staked. + * */ + function _validateWithdrawParams(uint96 amount, uint256 until) internal view { + require(amount > 0, "Staking::withdraw: amount of tokens to be withdrawn needs to be bigger than 0"); + uint96 balance = _getPriorUserStakeByDate(msg.sender, until, block.number - 1); + require(amount <= balance, "Staking::withdraw: not enough balance"); + } + + /** + * @notice Get the current balance of an account locked until a certain date. + * @param account The user address. + * @param lockDate The lock date. + * @return The stake amount. + * */ + function currentBalance(address account, uint256 lockDate) internal view returns (uint96) { + return userStakingCheckpoints[account][lockDate][numUserStakingCheckpoints[account][lockDate] - 1].stake; + } + + /** + * @notice Get the number of staked tokens held by the user account. + * @dev Iterate checkpoints adding up stakes. + * @param account The address of the account to get the balance of. + * @return The number of tokens held. + * */ + function balanceOf(address account) public view returns (uint96 balance) { + for (uint256 i = kickoffTS; i <= block.timestamp + MAX_DURATION; i += TWO_WEEKS) { + balance = add96(balance, currentBalance(account, i), "Staking::balanceOf: overflow"); + } + } + + /** + * @notice Delegate votes from `msg.sender` which are locked until lockDate to `delegatee`. + * @param delegatee The address to delegate votes to. + * @param lockDate the date if the position to delegate. + * */ + function delegate(address delegatee, uint256 lockDate) public { + _delegate(msg.sender, delegatee, lockDate); + // @dev delegates tokens for lock date 2 weeks later than given lock date + // if message sender is a contract + _delegateNext(msg.sender, delegatee, lockDate); + } + + /** + * @notice Delegates votes from signatory to a delegatee account. + * Voting with EIP-712 Signatures. + * + * Voting power can be delegated to any address, and then can be used to + * vote on proposals. A key benefit to users of by-signature functionality + * is that they can create a signed vote transaction for free, and have a + * trusted third-party spend rBTC(or ETH) on gas fees and write it to the + * blockchain for them. + * + * The third party in this scenario, submitting the SOV-holder’s signed + * transaction holds a voting power that is for only a single proposal. + * The signatory still holds the power to vote on their own behalf in + * the proposal if the third party has not yet published the signed + * transaction that was given to them. + * + * @dev The signature needs to be broken up into 3 parameters, known as + * v, r and s: + * const r = '0x' + sig.substring(2).substring(0, 64); + * const s = '0x' + sig.substring(2).substring(64, 128); + * const v = '0x' + sig.substring(2).substring(128, 130); + * + * @param delegatee The address to delegate votes to. + * @param lockDate The date until which the position is locked. + * @param nonce The contract state required to match the signature. + * @param expiry The time at which to expire the signature. + * @param v The recovery byte of the signature. + * @param r Half of the ECDSA signature pair. + * @param s Half of the ECDSA signature pair. + * */ + function delegateBySig( + address delegatee, + uint256 lockDate, + uint256 nonce, + uint256 expiry, + uint8 v, + bytes32 r, + bytes32 s + ) public { + /** + * @dev The DOMAIN_SEPARATOR is a hash that uniquely identifies a + * smart contract. It is built from a string denoting it as an + * EIP712 Domain, the name of the token contract, the version, + * the chainId in case it changes, and the address that the + * contract is deployed at. + * */ + bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this))); + + /// @dev GovernorAlpha uses BALLOT_TYPEHASH, while Staking uses DELEGATION_TYPEHASH + bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, lockDate, nonce, expiry)); + + bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); + address signatory = ecrecover(digest, v, r, s); + + /// @dev Verify address is not null and PK is not null either. + require(RSKAddrValidator.checkPKNotZero(signatory), "Staking::delegateBySig: invalid signature"); + require(nonce == nonces[signatory]++, "Staking::delegateBySig: invalid nonce"); + require(now <= expiry, "Staking::delegateBySig: signature expired"); + _delegate(signatory, delegatee, lockDate); + // @dev delegates tokens for lock date 2 weeks later than given lock date + // if message sender is a contract + _delegateNext(signatory, delegatee, lockDate); + } + + /** + * @notice Get the current votes balance for a user account. + * @param account The address to get votes balance. + * @dev This is a wrapper to simplify arguments. The actual computation is + * performed on WeightedStaking parent contract. + * @return The number of current votes for a user account. + * */ + function getCurrentVotes(address account) external view returns (uint96) { + return getPriorVotes(account, block.number - 1, block.timestamp); + } + + /** + * @notice Get the current number of tokens staked for a day. + * @param lockedTS The timestamp to get the staked tokens for. + * */ + function getCurrentStakedUntil(uint256 lockedTS) external view returns (uint96) { + uint32 nCheckpoints = numTotalStakingCheckpoints[lockedTS]; + return nCheckpoints > 0 ? totalStakingCheckpoints[lockedTS][nCheckpoints - 1].stake : 0; + } + + /** + * @notice Set new delegatee. Move from user's current delegate to a new + * delegatee the stake balance. + * @param delegator The user address to move stake balance from its current delegatee. + * @param delegatee The new delegatee. The address to move stake balance to. + * @param lockedTS The lock date. + * */ + function _delegate( + address delegator, + address delegatee, + uint256 lockedTS + ) internal { + address currentDelegate = delegates[delegator][lockedTS]; + uint96 delegatorBalance = currentBalance(delegator, lockedTS); + delegates[delegator][lockedTS] = delegatee; + + emit DelegateChanged(delegator, lockedTS, currentDelegate, delegatee); + + _moveDelegates(currentDelegate, delegatee, delegatorBalance, lockedTS); + } + + // @dev delegates tokens for lock date 2 weeks later than given lock date + // if message sender is a contract + function _delegateNext( + address delegator, + address delegatee, + uint256 lockedTS + ) internal { + if (_isVestingContract()) { + uint256 nextLock = lockedTS.add(TWO_WEEKS); + address currentDelegate = delegates[delegator][nextLock]; + if (currentDelegate != delegatee) { + _delegate(delegator, delegatee, nextLock); + } + + // @dev workaround for the issue with a delegation of the latest stake + uint256 endDate = IVesting(msg.sender).endDate(); + nextLock = lockedTS.add(FOUR_WEEKS); + if (nextLock == endDate) { + currentDelegate = delegates[delegator][nextLock]; + if (currentDelegate != delegatee) { + _delegate(delegator, delegatee, nextLock); + } + } + } + } + + /** + * @notice Move an amount of delegate stake from a source address to a + * destination address. + * @param srcRep The address to get the staked amount from. + * @param dstRep The address to send the staked amount to. + * @param amount The staked amount to move. + * @param lockedTS The lock date. + * */ + function _moveDelegates( + address srcRep, + address dstRep, + uint96 amount, + uint256 lockedTS + ) internal { + if (srcRep != dstRep && amount > 0) { + if (srcRep != address(0)) _decreaseDelegateStake(srcRep, lockedTS, amount); + + if (dstRep != address(0)) _increaseDelegateStake(dstRep, lockedTS, amount); + } + } + + /** + * @notice Retrieve CHAIN_ID of the executing chain. + * + * Chain identifier (chainID) introduced in EIP-155 protects transaction + * included into one chain from being included into another chain. + * Basically, chain identifier is an integer number being used in the + * processes of signing transactions and verifying transaction signatures. + * + * @dev As of version 0.5.12, Solidity includes an assembly function + * chainid() that provides access to the new CHAINID opcode. + * + * TODO: chainId is included in block. So you can get chain id like + * block timestamp or block number: block.chainid; + * */ + function getChainId() internal pure returns (uint256) { + uint256 chainId; + assembly { + chainId := chainid() + } + return chainId; + } + + /** + * @notice Allow the owner to set a new staking contract. + * As a consequence it allows the stakers to migrate their positions + * to the new contract. + * @dev Doesn't have any influence as long as migrateToNewStakingContract + * is not implemented. + * @param _newStakingContract The address of the new staking contract. + * */ + function setNewStakingContract(address _newStakingContract) public onlyOwner { + require(_newStakingContract != address(0), "can't reset the new staking contract to 0"); + newStakingContract = _newStakingContract; + } + + /** + * @notice Allow the owner to set a fee sharing proxy contract. + * We need it for unstaking with slashing. + * @param _feeSharing The address of FeeSharingProxy contract. + * */ + function setFeeSharing(address _feeSharing) public onlyOwner { + require(_feeSharing != address(0), "FeeSharing address shouldn't be 0"); + feeSharing = IFeeSharingProxy(_feeSharing); + } + + /** + * @notice Allow the owner to set weight scaling. + * We need it for unstaking with slashing. + * @param _weightScaling The weight scaling. + * */ + function setWeightScaling(uint96 _weightScaling) public onlyOwner { + require( + MIN_WEIGHT_SCALING <= _weightScaling && _weightScaling <= MAX_WEIGHT_SCALING, + "weight scaling doesn't belong to range [1, 9]" + ); + weightScaling = _weightScaling; + } + + /** + * @notice Allow a staker to migrate his positions to the new staking contract. + * @dev Staking contract needs to be set before by the owner. + * Currently not implemented, just needed for the interface. + * In case it's needed at some point in the future, + * the implementation needs to be changed first. + * */ + function migrateToNewStakingContract() public { + require(newStakingContract != address(0), "there is no new staking contract set"); + /// @dev implementation: + /// @dev Iterate over all possible lock dates from now until now + MAX_DURATION. + /// @dev Read the stake & delegate of the msg.sender + /// @dev If stake > 0, stake it at the new contract until the lock date with the current delegate. + } + + /** + * @notice Allow the owner to unlock all tokens in case the staking contract + * is going to be replaced + * Note: Not reversible on purpose. once unlocked, everything is unlocked. + * The owner should not be able to just quickly unlock to withdraw his own + * tokens and lock again. + * @dev Last resort. + * */ + function unlockAllTokens() public onlyOwner { + allUnlocked = true; + emit TokensUnlocked(SOVToken.balanceOf(address(this))); + } + + /** + * @notice Get list of stakes for a user account. + * @param account The address to get stakes. + * @return The arrays of dates and stakes. + * */ + function getStakes(address account) public view returns (uint256[] memory dates, uint96[] memory stakes) { + uint256 latest = timestampToLockDate(block.timestamp + MAX_DURATION); + + /// @dev Calculate stakes. + uint256 count = 0; + /// @dev We need to iterate from first possible stake date after deployment to the latest from current time. + for (uint256 i = kickoffTS + TWO_WEEKS; i <= latest; i += TWO_WEEKS) { + if (currentBalance(account, i) > 0) { + count++; + } + } + dates = new uint256[](count); + stakes = new uint96[](count); + + /// @dev We need to iterate from first possible stake date after deployment to the latest from current time. + uint256 j = 0; + for (uint256 i = kickoffTS + TWO_WEEKS; i <= latest; i += TWO_WEEKS) { + uint96 balance = currentBalance(account, i); + if (balance > 0) { + dates[j] = i; + stakes[j] = balance; + j++; + } + } + } + + /** + * @notice Overrides default ApprovalReceiver._getToken function to + * register SOV token on this contract. + * @return The address of SOV token. + * */ + function _getToken() internal view returns (address) { + return address(SOVToken); + } + + /** + * @notice Overrides default ApprovalReceiver._getSelectors function to + * register stakeWithApproval selector on this contract. + * @return The array of registered selectors on this contract. + * */ + function _getSelectors() internal view returns (bytes4[] memory) { + bytes4[] memory selectors = new bytes4[](1); + selectors[0] = this.stakeWithApproval.selector; + return selectors; + } +} diff --git a/contracts/Sovryn/Governance/Staking/StakingProxy.sol b/contracts/Sovryn/Governance/Staking/StakingProxy.sol new file mode 100644 index 0000000..4ea138f --- /dev/null +++ b/contracts/Sovryn/Governance/Staking/StakingProxy.sol @@ -0,0 +1,22 @@ +pragma solidity ^0.5.17; + +import "./StakingStorage.sol"; +import "../../Proxy/UpgradableProxy.sol"; + +/** + * @title Staking Proxy contract. + * @dev Staking contract should be upgradable, use UpgradableProxy. + * StakingStorage is deployed with the upgradable functionality + * by using this contract instead, that inherits from UpgradableProxy + * the possibility of being enhanced and re-deployed. + * */ +contract StakingProxy is StakingStorage, UpgradableProxy { + /** + * @notice Construct a new staking contract. + * @param SOV The address of the SOV token address. + */ + constructor(address SOV) public { + SOVToken = IERC20(SOV); + kickoffTS = block.timestamp; + } +} diff --git a/contracts/Sovryn/Governance/Staking/StakingStorage.sol b/contracts/Sovryn/Governance/Staking/StakingStorage.sol new file mode 100644 index 0000000..a3126d1 --- /dev/null +++ b/contracts/Sovryn/Governance/Staking/StakingStorage.sol @@ -0,0 +1,127 @@ +pragma solidity ^0.5.17; +pragma experimental ABIEncoderV2; + +import "../../../Openzeppelin/Ownable.sol"; +import "../../../Interfaces/IERC20.sol"; +import "../../../Interfaces/IFeeSharingProxy.sol"; + +/** + * @title Staking Storage contact. + * @notice Just the storage part of stacking contract, no functions, + * only constant, variables and required structures (mappings). + * Used by StackingProxy and Checkpoints contracts. + * + * What is SOV staking? + * The purpose of the SOV token is to provide a pseudonymous, + * censorship-resistant mechanism for governing the parameters of the Sovryn + * protocol, while aligning the incentives of protocol governors with the + * long-term success of the protocol. Any SOV token holder can choose to + * stake (lock up) their tokens for a fixed period of time in return for + * voting rights in the Bitocracy. Stakers are further incentivised through + * fee and slashing rewards. + * */ +contract StakingStorage is Ownable { + /// @notice 2 weeks in seconds. + uint256 constant TWO_WEEKS = 1209600; + + /// @notice The maximum possible voting weight before adding +1 (actually 10, but need 9 for computation). + uint96 public constant MAX_VOTING_WEIGHT = 9; + + /// @notice weight is multiplied with this factor (for allowing decimals, like 1.2x). + /// @dev MAX_VOTING_WEIGHT * WEIGHT_FACTOR needs to be < 792, because there are 100,000,000 SOV with 18 decimals + uint96 public constant WEIGHT_FACTOR = 10; + + /// @notice The maximum duration to stake tokens for. + uint256 public constant MAX_DURATION = 1092 days; + + /// @notice The maximum duration ^2 + uint96 constant MAX_DURATION_POW_2 = 1092 * 1092; + + /// @notice Default weight scaling. + uint96 constant DEFAULT_WEIGHT_SCALING = 3; + + /// @notice Range for weight scaling. + uint96 constant MIN_WEIGHT_SCALING = 1; + uint96 constant MAX_WEIGHT_SCALING = 9; + + /// @notice The timestamp of contract creation. Base for the staking period calculation. + uint256 public kickoffTS; + + string name = "SOVStaking"; + + /// @notice The token to be staked. + IERC20 public SOVToken; + + /// @notice A record of each accounts delegate. + mapping(address => mapping(uint256 => address)) public delegates; + + /// @notice If this flag is set to true, all tokens are unlocked immediately. + bool public allUnlocked = false; + + /// @notice The EIP-712 typehash for the contract's domain. + bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); + + /// @notice The EIP-712 typehash for the delegation struct used by the contract. + bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 lockDate,uint256 nonce,uint256 expiry)"); + + /// @notice Used for stake migrations to a new staking contract with a different storage structure. + address public newStakingContract; + + /*************************** Checkpoints *******************************/ + + /// @notice A checkpoint for marking the stakes from a given block + struct Checkpoint { + uint32 fromBlock; + uint96 stake; + } + + /// @notice A record of tokens to be unstaked at a given time in total. + /// For total voting power computation. Voting weights get adjusted bi-weekly. + /// @dev totalStakingCheckpoints[date][index] is a checkpoint. + mapping(uint256 => mapping(uint32 => Checkpoint)) public totalStakingCheckpoints; + + /// @notice The number of total staking checkpoints for each date. + /// @dev numTotalStakingCheckpoints[date] is a number. + mapping(uint256 => uint32) public numTotalStakingCheckpoints; + + /// @notice A record of tokens to be unstaked at a given time which were delegated to a certain address. + /// For delegatee voting power computation. Voting weights get adjusted bi-weekly. + /// @dev delegateStakingCheckpoints[delegatee][date][index] is a checkpoint. + mapping(address => mapping(uint256 => mapping(uint32 => Checkpoint))) public delegateStakingCheckpoints; + + /// @notice The number of total staking checkpoints for each date per delegate. + /// @dev numDelegateStakingCheckpoints[delegatee][date] is a number. + mapping(address => mapping(uint256 => uint32)) public numDelegateStakingCheckpoints; + + /// @notice A record of tokens to be unstaked at a given time which per user address (address -> lockDate -> stake checkpoint) + /// @dev userStakingCheckpoints[user][date][index] is a checkpoint. + mapping(address => mapping(uint256 => mapping(uint32 => Checkpoint))) public userStakingCheckpoints; + + /// @notice The number of total staking checkpoints for each date per user. + /// @dev numUserStakingCheckpoints[user][date] is a number. + mapping(address => mapping(uint256 => uint32)) public numUserStakingCheckpoints; + + /// @notice A record of states for signing / validating signatures + /// @dev nonces[user] is a number. + mapping(address => uint256) public nonces; + + /*************************** Slashing *******************************/ + + /// @notice the address of FeeSharingProxy contract, we need it for unstaking with slashing. + IFeeSharingProxy public feeSharing; + + /// @notice used for weight scaling when unstaking with slashing. + uint96 public weightScaling = DEFAULT_WEIGHT_SCALING; + + /// @notice List of vesting contracts, tokens for these contracts won't be slashed if unstaked by governance. + /// @dev vestingWhitelist[contract] is true/false. + mapping(address => bool) public vestingWhitelist; + + /// @dev user => flag whether user has admin role. + /// @dev multisig should be an admin, admin can invoke only governanceWithdrawVesting function, + /// this function works only with Team Vesting contracts + mapping(address => bool) public admins; + + /// @dev vesting contract code hash => flag whether it's registered code hash + mapping(bytes32 => bool) public vestingCodeHashes; +} diff --git a/contracts/Sovryn/Governance/Staking/WeightedStaking.sol b/contracts/Sovryn/Governance/Staking/WeightedStaking.sol new file mode 100644 index 0000000..d35f4e5 --- /dev/null +++ b/contracts/Sovryn/Governance/Staking/WeightedStaking.sol @@ -0,0 +1,447 @@ +pragma solidity ^0.5.17; +pragma experimental ABIEncoderV2; + +import "./Checkpoints.sol"; +import "../../../Openzeppelin/Address.sol"; + +/** + * @title Weighted Staking contract. + * @notice Computation of power and votes used by FeeSharingProxy and + * GovernorAlpha and Staking contracts w/ mainly 3 public functions: + * + getPriorTotalVotingPower => Total voting power. + * + getPriorVotes => Delegatee voting power. + * + getPriorWeightedStake => User Weighted Stake. + * Staking contract inherits WeightedStaking. + * FeeSharingProxy and GovernorAlpha invoke Staking instance functions. + * */ +contract WeightedStaking is Checkpoints { + using Address for address payable; + + /** + * @dev Throws if called by any account other than the owner or admin. + */ + modifier onlyAuthorized() { + require(isOwner() || admins[msg.sender], "unauthorized"); + _; + } + + /************* TOTAL VOTING POWER COMPUTATION ************************/ + + /** + * @notice Compute the total voting power at a given time. + * @param time The timestamp for which to calculate the total voting power. + * @return The total voting power at the given time. + * */ + function getPriorTotalVotingPower(uint32 blockNumber, uint256 time) public view returns (uint96 totalVotingPower) { + /// @dev Start the computation with the exact or previous unlocking date (voting weight remians the same until the next break point). + uint256 start = timestampToLockDate(time); + uint256 end = start + MAX_DURATION; + + /// @dev Max 78 iterations. + for (uint256 i = start; i <= end; i += TWO_WEEKS) { + totalVotingPower = add96( + totalVotingPower, + _totalPowerByDate(i, start, blockNumber), + "WeightedStaking::getPriorTotalVotingPower: overflow on total voting power computation" + ); + } + } + + /** + * @notice Compute the voting power for a specific date. + * Power = stake * weight + * @param date The staking date to compute the power for. + * @param startDate The date for which we need to know the power of the stake. + * @param blockNumber The block number, needed for checkpointing. + * */ + function _totalPowerByDate( + uint256 date, + uint256 startDate, + uint256 blockNumber + ) internal view returns (uint96 power) { + uint96 weight = computeWeightByDate(date, startDate); + uint96 staked = getPriorTotalStakesForDate(date, blockNumber); + /// @dev weight is multiplied by some factor to allow decimals. + power = mul96(staked, weight, "WeightedStaking::_totalPowerByDate: multiplication overflow") / WEIGHT_FACTOR; + } + + /** + * @notice Determine the prior number of stake for an unlocking date as of a block number. + * @dev Block number must be a finalized block or else this function will + * revert to prevent misinformation. + * TODO: WeightedStaking::getPriorTotalStakesForDate should probably better + * be internal instead of a public function. + * @param date The date to check the stakes for. + * @param blockNumber The block number to get the vote balance at. + * @return The number of votes the account had as of the given block. + * */ + function getPriorTotalStakesForDate(uint256 date, uint256 blockNumber) public view returns (uint96) { + require(blockNumber < block.number, "WeightedStaking::getPriorTotalStakesForDate: not yet determined"); + + uint32 nCheckpoints = numTotalStakingCheckpoints[date]; + if (nCheckpoints == 0) { + return 0; + } + + // First check most recent balance + if (totalStakingCheckpoints[date][nCheckpoints - 1].fromBlock <= blockNumber) { + return totalStakingCheckpoints[date][nCheckpoints - 1].stake; + } + + // Next check implicit zero balance + if (totalStakingCheckpoints[date][0].fromBlock > blockNumber) { + return 0; + } + + uint32 lower = 0; + uint32 upper = nCheckpoints - 1; + while (upper > lower) { + uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow + Checkpoint memory cp = totalStakingCheckpoints[date][center]; + if (cp.fromBlock == blockNumber) { + return cp.stake; + } else if (cp.fromBlock < blockNumber) { + lower = center; + } else { + upper = center - 1; + } + } + return totalStakingCheckpoints[date][lower].stake; + } + + /****************************** DELEGATED VOTING POWER COMPUTATION ************************/ + + /** + * @notice Determine the prior number of votes for a delegatee as of a block number. + * Iterate through checkpoints adding up voting power. + * @dev Block number must be a finalized block or else this function will revert + * to prevent misinformation. + * Used for Voting, not for fee sharing. + * @param account The address of the account to check. + * @param blockNumber The block number to get the vote balance at. + * @return The number of votes the delegatee had as of the given block. + * */ + function getPriorVotes( + address account, + uint256 blockNumber, + uint256 date + ) public view returns (uint96 votes) { + /// @dev If date is not an exact break point, start weight computation from the previous break point (alternative would be the next). + uint256 start = timestampToLockDate(date); + uint256 end = start + MAX_DURATION; + + /// @dev Max 78 iterations. + for (uint256 i = start; i <= end; i += TWO_WEEKS) { + votes = add96( + votes, + _totalPowerByDateForDelegatee(account, i, start, blockNumber), + "WeightedStaking::getPriorVotes: overflow on total voting power computation" + ); + } + } + + /** + * @notice Compute the voting power for a specific date. + * Power = stake * weight + * @param date The staking date to compute the power for. + * @param startDate The date for which we need to know the power of the stake. + * @param blockNumber The block number, needed for checkpointing. + * */ + function _totalPowerByDateForDelegatee( + address account, + uint256 date, + uint256 startDate, + uint256 blockNumber + ) internal view returns (uint96 power) { + uint96 weight = computeWeightByDate(date, startDate); + uint96 staked = getPriorStakeByDateForDelegatee(account, date, blockNumber); + power = mul96(staked, weight, "WeightedStaking::_totalPowerByDateForDelegatee: multiplication overflow") / WEIGHT_FACTOR; + } + + /** + * @notice Determine the prior number of stake for an account as of a block number. + * @dev Block number must be a finalized block or else this function will + * revert to prevent misinformation. + * TODO: WeightedStaking::getPriorStakeByDateForDelegatee should probably better + * be internal instead of a public function. + * @param account The address of the account to check. + * @param blockNumber The block number to get the vote balance at. + * @return The number of votes the account had as of the given block. + * */ + function getPriorStakeByDateForDelegatee( + address account, + uint256 date, + uint256 blockNumber + ) public view returns (uint96) { + require(blockNumber < block.number, "WeightedStaking::getPriorStakeByDateForDelegatee: not yet determined"); + + uint32 nCheckpoints = numDelegateStakingCheckpoints[account][date]; + if (nCheckpoints == 0) { + return 0; + } + + /// @dev First check most recent balance. + if (delegateStakingCheckpoints[account][date][nCheckpoints - 1].fromBlock <= blockNumber) { + return delegateStakingCheckpoints[account][date][nCheckpoints - 1].stake; + } + + /// @dev Next check implicit zero balance. + if (delegateStakingCheckpoints[account][date][0].fromBlock > blockNumber) { + return 0; + } + + uint32 lower = 0; + uint32 upper = nCheckpoints - 1; + while (upper > lower) { + uint32 center = upper - (upper - lower) / 2; /// @dev ceil, avoiding overflow. + Checkpoint memory cp = delegateStakingCheckpoints[account][date][center]; + if (cp.fromBlock == blockNumber) { + return cp.stake; + } else if (cp.fromBlock < blockNumber) { + lower = center; + } else { + upper = center - 1; + } + } + return delegateStakingCheckpoints[account][date][lower].stake; + } + + /*************************** User Weighted Stake computation for fee sharing *******************************/ + + /** + * @notice Determine the prior weighted stake for an account as of a block number. + * Iterate through checkpoints adding up voting power. + * @dev Block number must be a finalized block or else this function will + * revert to prevent misinformation. + * Used for fee sharing, not voting. + * TODO: WeightedStaking::getPriorWeightedStake is using the variable name "votes" + * to add up token stake, and that could be misleading. + * + * @param account The address of the account to check. + * @param blockNumber The block number to get the vote balance at. + * @return The weighted stake the account had as of the given block. + * */ + function getPriorWeightedStake( + address account, + uint256 blockNumber, + uint256 date + ) public view returns (uint96 votes) { + /// @dev If date is not an exact break point, start weight computation from the previous break point (alternative would be the next). + uint256 start = timestampToLockDate(date); + uint256 end = start + MAX_DURATION; + + /// @dev Max 78 iterations. + for (uint256 i = start; i <= end; i += TWO_WEEKS) { + uint96 weightedStake = weightedStakeByDate(account, i, start, blockNumber); + if (weightedStake > 0) { + votes = add96(votes, weightedStake, "WeightedStaking::getPriorWeightedStake: overflow on total weight computation"); + } + } + } + + /** + * @notice Compute the voting power for a specific date. + * Power = stake * weight + * TODO: WeightedStaking::weightedStakeByDate should probably better + * be internal instead of a public function. + * @param date The staking date to compute the power for. + * @param startDate The date for which we need to know the power of the stake. + * @param blockNumber The block number, needed for checkpointing. + * */ + function weightedStakeByDate( + address account, + uint256 date, + uint256 startDate, + uint256 blockNumber + ) public view returns (uint96 power) { + uint96 staked = _getPriorUserStakeByDate(account, date, blockNumber); + if (staked > 0) { + uint96 weight = computeWeightByDate(date, startDate); + power = mul96(staked, weight, "WeightedStaking::weightedStakeByDate: multiplication overflow") / WEIGHT_FACTOR; + } else { + power = 0; + } + } + + /** + * @notice Determine the prior number of stake for an account until a + * certain lock date as of a block number. + * @dev Block number must be a finalized block or else this function + * will revert to prevent misinformation. + * @param account The address of the account to check. + * @param date The lock date. + * @param blockNumber The block number to get the vote balance at. + * @return The number of votes the account had as of the given block. + * */ + function getPriorUserStakeByDate( + address account, + uint256 date, + uint256 blockNumber + ) external view returns (uint96) { + uint96 priorStake = _getPriorUserStakeByDate(account, date, blockNumber); + // @dev we need to modify function in order to workaround issue with Vesting.withdrawTokens: + // return 1 instead of 0 if message sender is a contract. + if (priorStake == 0 && _isVestingContract()) { + priorStake = 1; + } + return priorStake; + } + + /** + * @notice Determine the prior number of stake for an account until a + * certain lock date as of a block number. + * @dev All functions of Staking contract use this internal version, + * we need to modify public function in order to workaround issue with Vesting.withdrawTokens: + * return 1 instead of 0 if message sender is a contract. + * */ + function _getPriorUserStakeByDate( + address account, + uint256 date, + uint256 blockNumber + ) internal view returns (uint96) { + require(blockNumber < block.number, "WeightedStaking::getPriorUserStakeAndDate: not yet determined"); + + date = _adjustDateForOrigin(date); + uint32 nCheckpoints = numUserStakingCheckpoints[account][date]; + if (nCheckpoints == 0) { + return 0; + } + + /// @dev First check most recent balance. + if (userStakingCheckpoints[account][date][nCheckpoints - 1].fromBlock <= blockNumber) { + return userStakingCheckpoints[account][date][nCheckpoints - 1].stake; + } + + /// @dev Next check implicit zero balance. + if (userStakingCheckpoints[account][date][0].fromBlock > blockNumber) { + return 0; + } + + uint32 lower = 0; + uint32 upper = nCheckpoints - 1; + while (upper > lower) { + uint32 center = upper - (upper - lower) / 2; /// @dev ceil, avoiding overflow. + Checkpoint memory cp = userStakingCheckpoints[account][date][center]; + if (cp.fromBlock == blockNumber) { + return cp.stake; + } else if (cp.fromBlock < blockNumber) { + lower = center; + } else { + upper = center - 1; + } + } + return userStakingCheckpoints[account][date][lower].stake; + } + + /**************** SHARED FUNCTIONS *********************/ + + /** + * @notice Compute the weight for a specific date. + * @param date The unlocking date. + * @param startDate We compute the weight for the tokens staked until 'date' on 'startDate'. + * */ + function computeWeightByDate(uint256 date, uint256 startDate) public pure returns (uint96 weight) { + require(date >= startDate, "WeightedStaking::computeWeightByDate: date needs to be bigger than startDate"); + uint256 remainingTime = (date - startDate); + require(MAX_DURATION >= remainingTime, "Staking::computeWeightByDate:remaining time can't be bigger than max duration"); + /// @dev x = max days - remaining days + uint96 x = uint96(MAX_DURATION - remainingTime) / (1 days); + /// @dev w = (m^2 - x^2)/m^2 +1 (multiplied by the weight factor) + weight = add96( + WEIGHT_FACTOR, + mul96( + MAX_VOTING_WEIGHT * WEIGHT_FACTOR, + sub96(MAX_DURATION_POW_2, x * x, "underflow on weight calculation"), + "multiplication overflow on weight computation" + ) / MAX_DURATION_POW_2, + "overflow on weight computation" + ); + } + + /** + * @notice Unstaking is possible every 2 weeks only. This means, to + * calculate the key value for the staking checkpoints, we need to + * map the intended timestamp to the closest available date. + * @param timestamp The unlocking timestamp. + * @return The actual unlocking date (might be up to 2 weeks shorter than intended). + * */ + function timestampToLockDate(uint256 timestamp) public view returns (uint256 lockDate) { + require(timestamp >= kickoffTS, "WeightedStaking::timestampToLockDate: timestamp lies before contract creation"); + /** + * @dev If staking timestamp does not match any of the unstaking dates + * , set the lockDate to the closest one before the timestamp. + * E.g. Passed timestamps lies 7 weeks after kickoff -> only stake for 6 weeks. + * */ + uint256 periodFromKickoff = (timestamp - kickoffTS) / TWO_WEEKS; + lockDate = periodFromKickoff * TWO_WEEKS + kickoffTS; + } + + function _adjustDateForOrigin(uint256 date) internal view returns (uint256) { + uint256 adjustedDate = timestampToLockDate(date); + //origin vesting contracts have different dates + //we need to add 2 weeks to get end of period (by default, it's start) + if (adjustedDate != date) { + date = adjustedDate + TWO_WEEKS; + } + return date; + } + + /** + * @notice Add account to ACL. + * @param _admin The addresses of the account to grant permissions. + * */ + function addAdmin(address _admin) public onlyOwner { + admins[_admin] = true; + emit AdminAdded(_admin); + } + + /** + * @notice Remove account from ACL. + * @param _admin The addresses of the account to revoke permissions. + * */ + function removeAdmin(address _admin) public onlyOwner { + admins[_admin] = false; + emit AdminRemoved(_admin); + } + + /** + * @notice Add vesting contract's code hash to a map of code hashes. + * @param vesting The address of Vesting contract. + * @dev We need it to use _isVestingContract() function instead of isContract() + */ + function addContractCodeHash(address vesting) public onlyAuthorized { + bytes32 codeHash = _getCodeHash(vesting); + vestingCodeHashes[codeHash] = true; + emit ContractCodeHashAdded(codeHash); + } + + /** + * @notice Add vesting contract's code hash to a map of code hashes. + * @param vesting The address of Vesting contract. + * @dev We need it to use _isVestingContract() function instead of isContract() + */ + function removeContractCodeHash(address vesting) public onlyAuthorized { + bytes32 codeHash = _getCodeHash(vesting); + vestingCodeHashes[codeHash] = false; + emit ContractCodeHashRemoved(codeHash); + } + + /** + * @notice Return flag whether message sender is a registered vesting contract. + */ + function _isVestingContract() internal view returns (bool) { + bytes32 codeHash = _getCodeHash(msg.sender); + return vestingCodeHashes[codeHash]; + } + + /** + * @notice Return hash of contract code + */ + function _getCodeHash(address _contract) internal view returns (bytes32) { + bytes32 codeHash; + assembly { + codeHash := extcodehash(_contract) + } + return codeHash; + } +} diff --git a/contracts/Sovryn/Governance/Vesting/TeamVesting.sol b/contracts/Sovryn/Governance/Vesting/TeamVesting.sol new file mode 100644 index 0000000..ccb857c --- /dev/null +++ b/contracts/Sovryn/Governance/Vesting/TeamVesting.sol @@ -0,0 +1,55 @@ +pragma solidity ^0.5.17; +pragma experimental ABIEncoderV2; + +import "../../../Openzeppelin/Ownable.sol"; +import "../../../Interfaces/IERC20.sol"; +import "../Staking/Staking.sol"; +import "../../../Interfaces/IFeeSharingProxy.sol"; +import "../../../Interfaces/IVesting.sol"; +import "../../Token/ApprovalReceiver.sol"; +import "./VestingStorage.sol"; +import "../../Proxy/Proxy.sol"; + +/** + * @title Team Vesting Contract. + * + * @notice A regular vesting contract, but the owner (governance) is able to + * withdraw earlier without a slashing. + * + * @dev Vesting contracts shouldn't be upgradable, + * use Proxy instead of UpgradableProxy. + * */ +contract TeamVesting is VestingStorage, Proxy { + /** + * @notice Setup the vesting schedule. + * @param _logic The address of logic contract. + * @param _SOV The SOV token address. + * @param _tokenOwner The owner of the tokens. + * @param _cliff The time interval to the first withdraw in seconds. + * @param _duration The total duration in seconds. + * */ + constructor( + address _logic, + address _SOV, + address _stakingAddress, + address _tokenOwner, + uint256 _cliff, + uint256 _duration, + address _feeSharingProxy + ) public { + require(_SOV != address(0), "SOV address invalid"); + require(_stakingAddress != address(0), "staking address invalid"); + require(_tokenOwner != address(0), "token owner address invalid"); + require(_duration >= _cliff, "duration must be bigger than or equal to the cliff"); + require(_feeSharingProxy != address(0), "feeSharingProxy address invalid"); + + _setImplementation(_logic); + SOV = IERC20(_SOV); + staking = Staking(_stakingAddress); + require(_duration <= staking.MAX_DURATION(), "duration may not exceed the max duration"); + tokenOwner = _tokenOwner; + cliff = _cliff; + duration = _duration; + feeSharingProxy = IFeeSharingProxy(_feeSharingProxy); + } +} diff --git a/contracts/Sovryn/Governance/Vesting/Vesting.sol b/contracts/Sovryn/Governance/Vesting/Vesting.sol new file mode 100644 index 0000000..cd3573d --- /dev/null +++ b/contracts/Sovryn/Governance/Vesting/Vesting.sol @@ -0,0 +1,39 @@ +pragma solidity ^0.5.17; +pragma experimental ABIEncoderV2; + +import "./TeamVesting.sol"; + +/** + * @title Vesting Contract. + * @notice Team tokens and investor tokens are vested. Therefore, a smart + * contract needs to be developed to enforce the vesting schedule. + * + * @dev TODO add tests for governanceWithdrawTokens. + * */ +contract Vesting is TeamVesting { + /** + * @notice Setup the vesting schedule. + * @param _logic The address of logic contract. + * @param _SOV The SOV token address. + * @param _tokenOwner The owner of the tokens. + * @param _cliff The time interval to the first withdraw in seconds. + * @param _duration The total duration in seconds. + * */ + constructor( + address _logic, + address _SOV, + address _stakingAddress, + address _tokenOwner, + uint256 _cliff, + uint256 _duration, + address _feeSharingProxy + ) public TeamVesting(_logic, _SOV, _stakingAddress, _tokenOwner, _cliff, _duration, _feeSharingProxy) {} + + /** + * @dev We need to add this implementation to prevent proxy call VestingLogic.governanceWithdrawTokens + * @param receiver The receiver of the token withdrawal. + * */ + function governanceWithdrawTokens(address receiver) public { + revert("operation not supported"); + } +} diff --git a/contracts/Sovryn/Governance/Vesting/VestingFactory.sol b/contracts/Sovryn/Governance/Vesting/VestingFactory.sol new file mode 100644 index 0000000..30af066 --- /dev/null +++ b/contracts/Sovryn/Governance/Vesting/VestingFactory.sol @@ -0,0 +1,79 @@ +pragma solidity ^0.5.17; + +import "../../../Openzeppelin/Ownable.sol"; +import "./Vesting.sol"; +import "./TeamVesting.sol"; +import "../../../Interfaces/IVestingFactory.sol"; + +/** + * @title Vesting Factory: Contract to deploy vesting contracts + * of two types: vesting (TokenHolder) and team vesting (Multisig). + * @notice Factory pattern allows to create multiple instances + * of the same contract and keep track of them easier. + * */ +contract VestingFactory is IVestingFactory, Ownable { + address public vestingLogic; + + constructor(address _vestingLogic) public { + require(_vestingLogic != address(0), "invalid vesting logic address"); + vestingLogic = _vestingLogic; + } + + /** + * @notice Deploys Vesting contract. + * @param _SOV the address of SOV token. + * @param _staking The address of staking contract. + * @param _tokenOwner The owner of the tokens. + * @param _cliff The time interval to the first withdraw in seconds. + * @param _duration The total duration in seconds. + * @param _feeSharing The address of fee sharing contract. + * @param _vestingOwner The address of an owner of vesting contract. + * @return The vesting contract address. + * */ + function deployVesting( + address _SOV, + address _staking, + address _tokenOwner, + uint256 _cliff, + uint256 _duration, + address _feeSharing, + address _vestingOwner + ) + external + onlyOwner /// @dev owner - VestingRegistry + returns (address) + { + address vesting = address(new Vesting(vestingLogic, _SOV, _staking, _tokenOwner, _cliff, _duration, _feeSharing)); + Ownable(vesting).transferOwnership(_vestingOwner); + return vesting; + } + + /** + * @notice Deploys Team Vesting contract. + * @param _SOV The address of SOV token. + * @param _staking The address of staking contract. + * @param _tokenOwner The owner of the tokens. + * @param _cliff The time interval to the first withdraw in seconds. + * @param _duration The total duration in seconds. + * @param _feeSharing The address of fee sharing contract. + * @param _vestingOwner The address of an owner of vesting contract. + * @return The vesting contract address. + * */ + function deployTeamVesting( + address _SOV, + address _staking, + address _tokenOwner, + uint256 _cliff, + uint256 _duration, + address _feeSharing, + address _vestingOwner + ) + external + onlyOwner //owner - VestingRegistry + returns (address) + { + address vesting = address(new TeamVesting(vestingLogic, _SOV, _staking, _tokenOwner, _cliff, _duration, _feeSharing)); + Ownable(vesting).transferOwnership(_vestingOwner); + return vesting; + } +} diff --git a/contracts/Sovryn/Governance/Vesting/VestingLogic.sol b/contracts/Sovryn/Governance/Vesting/VestingLogic.sol new file mode 100644 index 0000000..b39f4c5 --- /dev/null +++ b/contracts/Sovryn/Governance/Vesting/VestingLogic.sol @@ -0,0 +1,220 @@ +pragma solidity ^0.5.17; +pragma experimental ABIEncoderV2; + +import "../../../Openzeppelin/Ownable.sol"; +import "../../../Interfaces/IERC20.sol"; +import "../Staking/Staking.sol"; +import "../../../Interfaces/IFeeSharingProxy.sol"; +import "../../../Interfaces/IVesting.sol"; +import "../../Token/ApprovalReceiver.sol"; +import "./VestingStorage.sol"; + +/** + * @title Vesting Logic contract. + * @notice Staking, delegating and withdrawal functionality. + * @dev Deployed by a VestingFactory contract. + * */ +contract VestingLogic is IVesting, VestingStorage, ApprovalReceiver { + /* Events */ + + event TokensStaked(address indexed caller, uint256 amount); + event VotesDelegated(address indexed caller, address delegatee); + event TokensWithdrawn(address indexed caller, address receiver); + event DividendsCollected(address indexed caller, address loanPoolToken, address receiver, uint32 maxCheckpoints); + event MigratedToNewStakingContract(address indexed caller, address newStakingContract); + + /* Modifiers */ + + /** + * @dev Throws if called by any account other than the token owner or the contract owner. + */ + modifier onlyOwners() { + require(msg.sender == tokenOwner || isOwner(), "unauthorized"); + _; + } + + /** + * @dev Throws if called by any account other than the token owner. + */ + modifier onlyTokenOwner() { + require(msg.sender == tokenOwner, "unauthorized"); + _; + } + + /* Functions */ + + /** + * @notice Stakes tokens according to the vesting schedule. + * @param _amount The amount of tokens to stake. + * */ + function stakeTokens(uint256 _amount) public { + _stakeTokens(msg.sender, _amount); + } + + /** + * @notice Stakes tokens according to the vesting schedule. + * @dev This function will be invoked from receiveApproval. + * @dev SOV.approveAndCall -> this.receiveApproval -> this.stakeTokensWithApproval + * @param _sender The sender of SOV.approveAndCall + * @param _amount The amount of tokens to stake. + * */ + function stakeTokensWithApproval(address _sender, uint256 _amount) public onlyThisContract { + _stakeTokens(_sender, _amount); + } + + /** + * @notice Stakes tokens according to the vesting schedule. Low level function. + * @dev Once here the allowance of tokens is taken for granted. + * @param _sender The sender of tokens to stake. + * @param _amount The amount of tokens to stake. + * */ + function _stakeTokens(address _sender, uint256 _amount) internal { + /// @dev Maybe better to allow staking unil the cliff was reached. + if (startDate == 0) { + startDate = staking.timestampToLockDate(block.timestamp); + } + endDate = staking.timestampToLockDate(block.timestamp + duration); + + /// @dev Transfer the tokens to this contract. + bool success = SOV.transferFrom(_sender, address(this), _amount); + require(success); + + /// @dev Allow the staking contract to access them. + SOV.approve(address(staking), _amount); + + staking.stakesBySchedule(_amount, cliff, duration, FOUR_WEEKS, address(this), tokenOwner); + + emit TokensStaked(_sender, _amount); + } + + /** + * @notice Delegate votes from `msg.sender` which are locked until lockDate + * to `delegatee`. + * @param _delegatee The address to delegate votes to. + * */ + function delegate(address _delegatee) public onlyTokenOwner { + require(_delegatee != address(0), "delegatee address invalid"); + + /// @dev Withdraw for each unlocked position. + /// @dev Don't change FOUR_WEEKS to TWO_WEEKS, a lot of vestings already deployed with FOUR_WEEKS + /// workaround found, but it doesn't work with TWO_WEEKS + for (uint256 i = startDate + cliff; i <= endDate; i += FOUR_WEEKS) { + staking.delegate(_delegatee, i); + } + emit VotesDelegated(msg.sender, _delegatee); + } + + /** + * @notice Withdraws all tokens from the staking contract and + * forwards them to an address specified by the token owner. + * @param receiver The receiving address. + * @dev Can be called only by owner. + * */ + function governanceWithdrawTokens(address receiver) public { + require(msg.sender == address(staking), "unauthorized"); + + _withdrawTokens(receiver, true); + } + + /** + * @notice Withdraws unlocked tokens from the staking contract and + * forwards them to an address specified by the token owner. + * @param receiver The receiving address. + * */ + function withdrawTokens(address receiver) public onlyOwners { + _withdrawTokens(receiver, false); + } + + /** + * @notice Withdraws tokens from the staking contract and forwards them + * to an address specified by the token owner. Low level function. + * @dev Once here the caller permission is taken for granted. + * @param receiver The receiving address. + * @param isGovernance Whether all tokens (true) + * or just unlocked tokens (false). + * */ + function _withdrawTokens(address receiver, bool isGovernance) internal { + require(receiver != address(0), "receiver address invalid"); + + uint96 stake; + + /// @dev Usually we just need to iterate over the possible dates until now. + uint256 end; + + /// @dev In the unlikely case that all tokens have been unlocked early, + /// allow to withdraw all of them. + if (staking.allUnlocked() || isGovernance) { + end = endDate; + } else { + end = block.timestamp; + } + + /// @dev Withdraw for each unlocked position. + /// @dev Don't change FOUR_WEEKS to TWO_WEEKS, a lot of vestings already deployed with FOUR_WEEKS + /// workaround found, but it doesn't work with TWO_WEEKS + for (uint256 i = startDate + cliff; i <= end; i += FOUR_WEEKS) { + /// @dev Read amount to withdraw. + stake = staking.getPriorUserStakeByDate(address(this), i, block.number - 1); + + /// @dev Withdraw if > 0 + if (stake > 0) { + if (isGovernance) { + staking.governanceWithdraw(stake, i, receiver); + } else { + staking.withdraw(stake, i, receiver); + } + } + } + + emit TokensWithdrawn(msg.sender, receiver); + } + + /** + * @notice Collect dividends from fee sharing proxy. + * @param _loanPoolToken The loan pool token address. + * @param _maxCheckpoints Maximum number of checkpoints to be processed. + * @param _receiver The receiver of tokens or msg.sender + * */ + function collectDividends( + address _loanPoolToken, + uint32 _maxCheckpoints, + address _receiver + ) public onlyOwners { + require(_receiver != address(0), "receiver address invalid"); + + /// @dev Invokes the fee sharing proxy. + feeSharingProxy.withdraw(_loanPoolToken, _maxCheckpoints, _receiver); + + emit DividendsCollected(msg.sender, _loanPoolToken, _receiver, _maxCheckpoints); + } + + /** + * @notice Allows the owners to migrate the positions + * to a new staking contract. + * */ + function migrateToNewStakingContract() public onlyOwners { + staking.migrateToNewStakingContract(); + staking = Staking(staking.newStakingContract()); + emit MigratedToNewStakingContract(msg.sender, address(staking)); + } + + /** + * @notice Overrides default ApprovalReceiver._getToken function to + * register SOV token on this contract. + * @return The address of SOV token. + * */ + function _getToken() internal view returns (address) { + return address(SOV); + } + + /** + * @notice Overrides default ApprovalReceiver._getSelectors function to + * register stakeTokensWithApproval selector on this contract. + * @return The array of registered selectors on this contract. + * */ + function _getSelectors() internal view returns (bytes4[] memory) { + bytes4[] memory selectors = new bytes4[](1); + selectors[0] = this.stakeTokensWithApproval.selector; + return selectors; + } +} diff --git a/contracts/Sovryn/Governance/Vesting/VestingRegistry3.sol b/contracts/Sovryn/Governance/Vesting/VestingRegistry3.sol new file mode 100644 index 0000000..cc893b4 --- /dev/null +++ b/contracts/Sovryn/Governance/Vesting/VestingRegistry3.sol @@ -0,0 +1,200 @@ +pragma solidity ^0.5.17; + +import "../../../Openzeppelin/Ownable.sol"; +import "../../../Interfaces/IERC20.sol"; +import "../../../Interfaces/IStaking.sol"; +import "../../../Interfaces/IFeeSharingProxy.sol"; +import "../../../Interfaces/IVestingFactory.sol"; +import "../../../Interfaces/IVesting.sol"; +import "../../../Interfaces/ITeamVesting.sol"; +import "../../../Openzeppelin/SafeMath.sol"; + +contract VestingRegistry3 is Ownable { + using SafeMath for uint256; + + IVestingFactory public vestingFactory; + + ///@notice the SOV token contract + address public SOV; + + ///@notice the staking contract address + address public staking; + //@notice fee sharing proxy + address public feeSharingProxy; + //@notice the vesting owner (e.g. governance timelock address) + address public vestingOwner; + + //TODO add to the documentation: address can have only one vesting of each type + //user => vesting type => vesting contract + mapping(address => mapping(uint256 => address)) public vestingContracts; + + //user => flag whether user has admin role + mapping(address => bool) public admins; + + enum VestingType { + TeamVesting, //MultisigVesting + Vesting //TokenHolderVesting + } + + event SOVTransferred(address indexed receiver, uint256 amount); + event VestingCreated(address indexed tokenOwner, address vesting, uint256 cliff, uint256 duration, uint256 amount); + event TeamVestingCreated(address indexed tokenOwner, address vesting, uint256 cliff, uint256 duration, uint256 amount); + event TokensStaked(address indexed vesting, uint256 amount); + event AdminAdded(address admin); + event AdminRemoved(address admin); + + constructor( + address _vestingFactory, + address _SOV, + address _staking, + address _feeSharingProxy, + address _vestingOwner + ) public { + require(_SOV != address(0), "SOV address invalid"); + require(_staking != address(0), "staking address invalid"); + require(_feeSharingProxy != address(0), "feeSharingProxy address invalid"); + require(_vestingOwner != address(0), "vestingOwner address invalid"); + + _setVestingFactory(_vestingFactory); + + SOV = _SOV; + staking = _staking; + feeSharingProxy = _feeSharingProxy; + vestingOwner = _vestingOwner; + } + + /** + * @dev Throws if called by any account other than the owner or admin. + */ + modifier onlyAuthorized() { + require(isOwner() || admins[msg.sender], "unauthorized"); + _; + } + + function addAdmin(address _admin) public onlyOwner { + admins[_admin] = true; + emit AdminAdded(_admin); + } + + function removeAdmin(address _admin) public onlyOwner { + admins[_admin] = false; + emit AdminRemoved(_admin); + } + + /** + * @notice sets vesting factory address + * @param _vestingFactory the address of vesting factory contract + */ + function setVestingFactory(address _vestingFactory) public onlyOwner { + _setVestingFactory(_vestingFactory); + } + + function _setVestingFactory(address _vestingFactory) internal { + require(_vestingFactory != address(0), "vestingFactory address invalid"); + vestingFactory = IVestingFactory(_vestingFactory); + } + + /** + * @notice transfers SOV tokens to given address + * @param _receiver the address of the SOV receiver + * @param _amount the amount to be transferred + */ + function transferSOV(address _receiver, uint256 _amount) public onlyOwner { + require(_receiver != address(0), "receiver address invalid"); + require(_amount != 0, "amount invalid"); + + IERC20(SOV).transfer(_receiver, _amount); + emit SOVTransferred(_receiver, _amount); + } + + /** + * @notice creates Vesting contract + * @param _tokenOwner the owner of the tokens + * @param _amount the amount to be staked + * @param _cliff the cliff in seconds + * @param _duration the total duration in seconds + */ + function createVesting( + address _tokenOwner, + uint256 _amount, + uint256 _cliff, + uint256 _duration + ) public onlyAuthorized { + address vesting = _getOrCreateVesting(_tokenOwner, _cliff, _duration); + emit VestingCreated(_tokenOwner, vesting, _cliff, _duration, _amount); + } + + /** + * @notice creates Team Vesting contract + * @param _tokenOwner the owner of the tokens + * @param _amount the amount to be staked + * @param _cliff the cliff in seconds + * @param _duration the total duration in seconds + */ + function createTeamVesting( + address _tokenOwner, + uint256 _amount, + uint256 _cliff, + uint256 _duration + ) public onlyAuthorized { + address vesting = _getOrCreateTeamVesting(_tokenOwner, _cliff, _duration); + emit TeamVestingCreated(_tokenOwner, vesting, _cliff, _duration, _amount); + } + + /** + * @notice stakes tokens according to the vesting schedule + * @param _vesting the address of Vesting contract + * @param _amount the amount of tokens to stake + */ + function stakeTokens(address _vesting, uint256 _amount) public onlyAuthorized { + require(_vesting != address(0), "vesting address invalid"); + require(_amount > 0, "amount invalid"); + + IERC20(SOV).approve(_vesting, _amount); + IVesting(_vesting).stakeTokens(_amount); + emit TokensStaked(_vesting, _amount); + } + + /** + * @notice returns vesting contract address for the given token owner + * @param _tokenOwner the owner of the tokens + */ + function getVesting(address _tokenOwner) public view returns (address) { + return vestingContracts[_tokenOwner][uint256(VestingType.Vesting)]; + } + + /** + * @notice returns team vesting contract address for the given token owner + * @param _tokenOwner the owner of the tokens + */ + function getTeamVesting(address _tokenOwner) public view returns (address) { + return vestingContracts[_tokenOwner][uint256(VestingType.TeamVesting)]; + } + + function _getOrCreateVesting( + address _tokenOwner, + uint256 _cliff, + uint256 _duration + ) internal returns (address) { + uint256 type_ = uint256(VestingType.Vesting); + if (vestingContracts[_tokenOwner][type_] == address(0)) { + //TODO Owner of OwnerVesting contracts - the same address as tokenOwner + address vesting = vestingFactory.deployVesting(SOV, staking, _tokenOwner, _cliff, _duration, feeSharingProxy, _tokenOwner); + vestingContracts[_tokenOwner][type_] = vesting; + } + return vestingContracts[_tokenOwner][type_]; + } + + function _getOrCreateTeamVesting( + address _tokenOwner, + uint256 _cliff, + uint256 _duration + ) internal returns (address) { + uint256 type_ = uint256(VestingType.TeamVesting); + if (vestingContracts[_tokenOwner][type_] == address(0)) { + address vesting = vestingFactory.deployTeamVesting(SOV, staking, _tokenOwner, _cliff, _duration, feeSharingProxy, vestingOwner); + vestingContracts[_tokenOwner][type_] = vesting; + } + return vestingContracts[_tokenOwner][type_]; + } +} diff --git a/contracts/Sovryn/Governance/Vesting/VestingStorage.sol b/contracts/Sovryn/Governance/Vesting/VestingStorage.sol new file mode 100644 index 0000000..4598133 --- /dev/null +++ b/contracts/Sovryn/Governance/Vesting/VestingStorage.sol @@ -0,0 +1,43 @@ +pragma solidity ^0.5.17; + +import "../../../Openzeppelin/Ownable.sol"; +import "../../../Interfaces/IERC20.sol"; +import "../Staking/Staking.sol"; +import "../../../Interfaces/IFeeSharingProxy.sol"; + +/** + * @title Vesting Storage Contract. + * + * @notice This contract is just the storage required for vesting. + * It is parent of VestingLogic and TeamVesting. + * + * @dev Use Ownable as a parent to align storage structure for Logic and Proxy contracts. + * */ +contract VestingStorage is Ownable { + /// @notice The SOV token contract. + IERC20 public SOV; + + /// @notice The staking contract address. + Staking public staking; + + /// @notice The owner of the vested tokens. + address public tokenOwner; + + /// @notice Fee sharing Proxy. + IFeeSharingProxy public feeSharingProxy; + + /// @notice The cliff. After this time period the tokens begin to unlock. + uint256 public cliff; + + /// @notice The duration. After this period all tokens will have been unlocked. + uint256 public duration; + + /// @notice The start date of the vesting. + uint256 public startDate; + + /// @notice The end date of the vesting. + uint256 public endDate; + + /// @notice Constant used for computing the vesting dates. + uint256 constant FOUR_WEEKS = 4 weeks; +} diff --git a/contracts/Sovryn/Helper/ErrorDecoder.sol b/contracts/Sovryn/Helper/ErrorDecoder.sol new file mode 100644 index 0000000..4602304 --- /dev/null +++ b/contracts/Sovryn/Helper/ErrorDecoder.sol @@ -0,0 +1,53 @@ +pragma solidity ^0.5.17; + +/** + * @title Base contract to properly handle returned data on failed calls + * @dev On EVM if the return data length of a call is less than 68, + * then the transaction fails silently without a revert message! + * + * As described in the Solidity documentation + * https://solidity.readthedocs.io/en/v0.5.17/control-structures.html#revert + * the revert reason is an ABI-encoded string consisting of: + * 0x08c379a0 // Function selector (method id) for "Error(string)" signature + * 0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset + * 0x000000000000000000000000000000000000000000000000000000000000001a // String length + * 0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data + * + * Another example, debug data from test: + * 0x08c379a0 + * 0000000000000000000000000000000000000000000000000000000000000020 + * 0000000000000000000000000000000000000000000000000000000000000034 + * 54696d656c6f636b3a3a73657444656c61793a2044656c6179206d7573742065 + * 7863656564206d696e696d756d2064656c61792e000000000000000000000000 + * + * Parsed into: + * Data offset: 20 + * Length: 34 + * Error message: + * 54696d656c6f636b3a3a73657444656c61793a2044656c6179206d7573742065 + * 7863656564206d696e696d756d2064656c61792e000000000000000000000000 + */ +contract ErrorDecoder { + uint256 constant ERROR_MESSAGE_SHIFT = 68; // EVM silent revert error string length + + /** + * @notice Concats two error strings taking into account ERROR_MESSAGE_SHIFT. + * @param str1 First string, usually a hardcoded context written by dev. + * @param str2 Second string, usually the error message from the reverted call. + * @return The concatenated error string + */ + function _addErrorMessage(string memory str1, string memory str2) internal pure returns (string memory) { + bytes memory bytesStr1 = bytes(str1); + bytes memory bytesStr2 = bytes(str2); + string memory str12 = new string(bytesStr1.length + bytesStr2.length - ERROR_MESSAGE_SHIFT); + bytes memory bytesStr12 = bytes(str12); + uint256 j = 0; + for (uint256 i = 0; i < bytesStr1.length; i++) { + bytesStr12[j++] = bytesStr1[i]; + } + for (uint256 i = ERROR_MESSAGE_SHIFT; i < bytesStr2.length; i++) { + bytesStr12[j++] = bytesStr2[i]; + } + return string(bytesStr12); + } +} diff --git a/contracts/Sovryn/Helper/SafeMath96.sol b/contracts/Sovryn/Helper/SafeMath96.sol new file mode 100644 index 0000000..f6b3827 --- /dev/null +++ b/contracts/Sovryn/Helper/SafeMath96.sol @@ -0,0 +1,113 @@ +pragma solidity ^0.5.17; +pragma experimental ABIEncoderV2; + +/** + * @title SafeMath96 contract. + * @notice Improved Solidity's arithmetic operations with added overflow checks. + * @dev SafeMath96 uses uint96, unsigned integers of 96 bits length, so every + * integer from 0 to 2^96-1 can be operated. + * + * Arithmetic operations in Solidity wrap on overflow. This can easily result + * in bugs, because programmers usually assume that an overflow raises an + * error, which is the standard behavior in high level programming languages. + * SafeMath restores this intuition by reverting the transaction when an + * operation overflows. + * + * Using this contract instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + * */ +contract SafeMath96 { + function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) { + require(n < 2**32, errorMessage); + return uint32(n); + } + + function safe64(uint256 n, string memory errorMessage) internal pure returns (uint64) { + require(n < 2**64, errorMessage); + return uint64(n); + } + + function safe96(uint256 n, string memory errorMessage) internal pure returns (uint96) { + require(n < 2**96, errorMessage); + return uint96(n); + } + + /** + * @notice Adds two unsigned integers, reverting on overflow. + * @dev Counterpart to Solidity's `+` operator. + * @param a First integer. + * @param b Second integer. + * @param errorMessage The revert message on overflow. + * @return The safe addition a+b. + * */ + function add96( + uint96 a, + uint96 b, + string memory errorMessage + ) internal pure returns (uint96) { + uint96 c = a + b; + require(c >= a, errorMessage); + return c; + } + + /** + * @notice Substracts two unsigned integers, reverting on underflow. + * @dev Counterpart to Solidity's `-` operator. + * @param a First integer. + * @param b Second integer. + * @param errorMessage The revert message on underflow. + * @return The safe substraction a-b. + * */ + function sub96( + uint96 a, + uint96 b, + string memory errorMessage + ) internal pure returns (uint96) { + require(b <= a, errorMessage); + return a - b; + } + + /** + * @notice Multiplies two unsigned integers, reverting on overflow. + * @dev Counterpart to Solidity's `*` operator. + * @param a First integer. + * @param b Second integer. + * @param errorMessage The revert message on overflow. + * @return The safe product a*b. + * */ + function mul96( + uint96 a, + uint96 b, + string memory errorMessage + ) internal pure returns (uint96) { + if (a == 0) { + return 0; + } + + uint96 c = a * b; + require(c / a == b, errorMessage); + + return c; + } + + /** + * @notice Divides two unsigned integers, reverting on overflow. + * @dev Counterpart to Solidity's `/` operator. + * @param a First integer. + * @param b Second integer. + * @param errorMessage The revert message on overflow. + * @return The safe division a/b. + * */ + function div96( + uint96 a, + uint96 b, + string memory errorMessage + ) internal pure returns (uint96) { + // Solidity only automatically asserts when dividing by 0 + require(b > 0, errorMessage); + uint96 c = a / b; + // assert(a == b * c + a % b); // There is no case in which this doesn't hold + + return c; + } +} diff --git a/contracts/Sovryn/Mockup/FeeSharingProxyMockup.sol b/contracts/Sovryn/Mockup/FeeSharingProxyMockup.sol new file mode 100644 index 0000000..3f779dc --- /dev/null +++ b/contracts/Sovryn/Mockup/FeeSharingProxyMockup.sol @@ -0,0 +1,23 @@ +pragma solidity ^0.5.17; + +import "../Governance/FeeSharingProxy.sol"; + +contract FeeSharingProxyMockup is FeeSharingProxy { + struct TestData { + address loanPoolToken; + uint32 maxCheckpoints; + address receiver; + } + + TestData public testData; + + constructor(IProtocol _protocol, IStaking _staking) public FeeSharingProxy(_protocol, _staking) {} + + function withdraw( + address _loanPoolToken, + uint32 _maxCheckpoints, + address _receiver + ) public { + testData = TestData(_loanPoolToken, _maxCheckpoints, _receiver); + } +} diff --git a/contracts/Sovryn/Multisig/MultiSigWallet.sol b/contracts/Sovryn/Multisig/MultiSigWallet.sol new file mode 100644 index 0000000..419e81e --- /dev/null +++ b/contracts/Sovryn/Multisig/MultiSigWallet.sol @@ -0,0 +1,404 @@ +pragma solidity ^0.5.17; + +/** + * @title Multisignature wallet - Allows multiple parties to agree on + * transactions before execution. + * + * @author Stefan George - + * */ +contract MultiSigWallet { + /* + * Events + */ + event Confirmation(address indexed sender, uint256 indexed transactionId); + event Revocation(address indexed sender, uint256 indexed transactionId); + event Submission(uint256 indexed transactionId); + event Execution(uint256 indexed transactionId); + event ExecutionFailure(uint256 indexed transactionId); + event Deposit(address indexed sender, uint256 value); + event OwnerAddition(address indexed owner); + event OwnerRemoval(address indexed owner); + event RequirementChange(uint256 required); + + /* + * Constants + */ + uint256 public constant MAX_OWNER_COUNT = 50; + + /* + * Storage + */ + mapping(uint256 => Transaction) public transactions; + mapping(uint256 => mapping(address => bool)) public confirmations; + mapping(address => bool) public isOwner; + address[] public owners; + uint256 public required; + uint256 public transactionCount; + + struct Transaction { + address destination; + uint256 value; + bytes data; + bool executed; + } + + /* + * Modifiers + */ + modifier onlyWallet() { + require(msg.sender == address(this)); + _; + } + + modifier ownerDoesNotExist(address owner) { + require(!isOwner[owner]); + _; + } + + modifier ownerExists(address owner) { + require(isOwner[owner]); + _; + } + + modifier transactionExists(uint256 transactionId) { + require(transactions[transactionId].destination != address(0)); + _; + } + + modifier confirmed(uint256 transactionId, address owner) { + require(confirmations[transactionId][owner]); + _; + } + + modifier notConfirmed(uint256 transactionId, address owner) { + require(!confirmations[transactionId][owner]); + _; + } + + modifier notExecuted(uint256 transactionId) { + require(!transactions[transactionId].executed); + _; + } + + modifier notNull(address _address) { + require(_address != address(0)); + _; + } + + modifier validRequirement(uint256 ownerCount, uint256 _required) { + require(ownerCount <= MAX_OWNER_COUNT && _required <= ownerCount && _required != 0 && ownerCount != 0); + _; + } + + /// @notice Fallback function allows to deposit ether. + function() external payable { + if (msg.value > 0) emit Deposit(msg.sender, msg.value); + } + + /* + * Public functions + */ + + /** + * @notice Contract constructor sets initial owners and required number + * of confirmations. + * + * @param _owners List of initial owners. + * @param _required Number of required confirmations. + * */ + constructor(address[] memory _owners, uint256 _required) public validRequirement(_owners.length, _required) { + for (uint256 i = 0; i < _owners.length; i++) { + require(!isOwner[_owners[i]] && _owners[i] != address(0)); + isOwner[_owners[i]] = true; + } + owners = _owners; + required = _required; + } + + /** + * @notice Allows to add a new owner. Transaction has to be sent by wallet. + * @param owner Address of new owner. + * */ + function addOwner(address owner) + public + onlyWallet + ownerDoesNotExist(owner) + notNull(owner) + validRequirement(owners.length + 1, required) + { + isOwner[owner] = true; + owners.push(owner); + emit OwnerAddition(owner); + } + + /** + * @notice Allows to remove an owner. Transaction has to be sent by wallet. + * @param owner Address of owner. + * */ + function removeOwner(address owner) public onlyWallet ownerExists(owner) { + isOwner[owner] = false; + for (uint256 i = 0; i < owners.length - 1; i++) + if (owners[i] == owner) { + owners[i] = owners[owners.length - 1]; + break; + } + owners.length -= 1; + if (required > owners.length) changeRequirement(owners.length); + emit OwnerRemoval(owner); + } + + /** + * @notice Allows to replace an owner with a new owner. Transaction has + * to be sent by wallet. + * + * @param owner Address of owner to be replaced. + * @param newOwner Address of new owner. + * */ + function replaceOwner(address owner, address newOwner) public onlyWallet ownerExists(owner) ownerDoesNotExist(newOwner) { + for (uint256 i = 0; i < owners.length; i++) + if (owners[i] == owner) { + owners[i] = newOwner; + break; + } + isOwner[owner] = false; + isOwner[newOwner] = true; + emit OwnerRemoval(owner); + emit OwnerAddition(newOwner); + } + + /** + * @notice Allows to change the number of required confirmations. + * Transaction has to be sent by wallet. + * + * @param _required Number of required confirmations. + * */ + function changeRequirement(uint256 _required) public onlyWallet validRequirement(owners.length, _required) { + required = _required; + emit RequirementChange(_required); + } + + /** + * @notice Allows an owner to submit and confirm a transaction. + * + * @param destination Transaction target address. + * @param value Transaction ether value. + * @param data Transaction data payload. + * + * @return Returns transaction ID. + * */ + function submitTransaction( + address destination, + uint256 value, + bytes memory data + ) public returns (uint256 transactionId) { + transactionId = addTransaction(destination, value, data); + confirmTransaction(transactionId); + } + + /** + * @notice Allows an owner to confirm a transaction. + * @param transactionId Transaction ID. + * */ + function confirmTransaction(uint256 transactionId) + public + ownerExists(msg.sender) + transactionExists(transactionId) + notConfirmed(transactionId, msg.sender) + { + confirmations[transactionId][msg.sender] = true; + emit Confirmation(msg.sender, transactionId); + executeTransaction(transactionId); + } + + /** + * @notice Allows an owner to revoke a confirmation for a transaction. + * @param transactionId Transaction ID. + * */ + function revokeConfirmation(uint256 transactionId) + public + ownerExists(msg.sender) + confirmed(transactionId, msg.sender) + notExecuted(transactionId) + { + confirmations[transactionId][msg.sender] = false; + emit Revocation(msg.sender, transactionId); + } + + /** + * @notice Allows anyone to execute a confirmed transaction. + * @param transactionId Transaction ID. + * */ + function executeTransaction(uint256 transactionId) + public + ownerExists(msg.sender) + confirmed(transactionId, msg.sender) + notExecuted(transactionId) + { + if (isConfirmed(transactionId)) { + Transaction storage txn = transactions[transactionId]; + txn.executed = true; + if (external_call(txn.destination, txn.value, txn.data.length, txn.data)) emit Execution(transactionId); + else { + emit ExecutionFailure(transactionId); + txn.executed = false; + } + } + } + + /** + * @notice Low level transaction execution. + * + * @dev Call has been separated into its own function in order to + * take advantage of the Solidity's code generator to produce a + * loop that copies tx.data into memory. + * + * @param destination The address of the Smart Contract to call. + * @param value The amout of rBTC to send w/ the transaction. + * @param dataLength The size of the payload. + * @param data The payload. + * + * @return Success or failure. + * */ + function external_call( + address destination, + uint256 value, + uint256 dataLength, + bytes memory data + ) internal returns (bool) { + bool result; + assembly { + let x := mload(0x40) /// "Allocate" memory for output (0x40 is where "free memory" pointer is stored by convention) + let d := add(data, 32) /// First 32 bytes are the padded length of data, so exclude that + result := call( + sub(gas, 34710), /// 34710 is the value that solidity is currently emitting + /// It includes callGas (700) + callVeryLow (3, to pay for SUB) + callValueTransferGas (9000) + + /// callNewAccountGas (25000, in case the destination address does not exist and needs creating) + destination, + value, + d, + dataLength, /// Size of the input (in bytes) - this is what fixes the padding problem + x, + 0 /// Output is ignored, therefore the output size is zero + ) + } + return result; + } + + /** + * @notice Returns the confirmation status of a transaction. + * @param transactionId Transaction ID. + * @return Confirmation status. + * */ + function isConfirmed(uint256 transactionId) public view returns (bool) { + uint256 count = 0; + for (uint256 i = 0; i < owners.length; i++) { + if (confirmations[transactionId][owners[i]]) count += 1; + if (count == required) return true; + } + + return false; + } + + /* + * Internal functions + */ + + /** + * @notice Adds a new transaction to the transaction mapping, + * if transaction does not exist yet. + * + * @param destination Transaction target address. + * @param value Transaction ether value. + * @param data Transaction data payload. + * + * @return Returns transaction ID. + * */ + function addTransaction( + address destination, + uint256 value, + bytes memory data + ) internal notNull(destination) returns (uint256 transactionId) { + transactionId = transactionCount; + transactions[transactionId] = Transaction({ destination: destination, value: value, data: data, executed: false }); + transactionCount += 1; + emit Submission(transactionId); + } + + /* + * Web3 call functions + */ + + /** + * @notice Get the number of confirmations of a transaction. + * @param transactionId Transaction ID. + * @return Number of confirmations. + * */ + function getConfirmationCount(uint256 transactionId) public view returns (uint256 count) { + for (uint256 i = 0; i < owners.length; i++) if (confirmations[transactionId][owners[i]]) count += 1; + } + + /** + * @notice Get the total number of transactions after filers are applied. + * @param pending Include pending transactions. + * @param executed Include executed transactions. + * @return Total number of transactions after filters are applied. + * */ + function getTransactionCount(bool pending, bool executed) public view returns (uint256 count) { + for (uint256 i = 0; i < transactionCount; i++) + if ((pending && !transactions[i].executed) || (executed && transactions[i].executed)) count += 1; + } + + /** + * @notice Get the list of owners. + * @return List of owner addresses. + * */ + function getOwners() public view returns (address[] memory) { + return owners; + } + + /** + * @notice Get the array with owner addresses, which confirmed transaction. + * @param transactionId Transaction ID. + * @return Returns array of owner addresses. + * */ + function getConfirmations(uint256 transactionId) public view returns (address[] memory _confirmations) { + address[] memory confirmationsTemp = new address[](owners.length); + uint256 count = 0; + uint256 i; + for (i = 0; i < owners.length; i++) + if (confirmations[transactionId][owners[i]]) { + confirmationsTemp[count] = owners[i]; + count += 1; + } + _confirmations = new address[](count); + for (i = 0; i < count; i++) _confirmations[i] = confirmationsTemp[i]; + } + + /** + * @notice Get the list of transaction IDs in defined range. + * + * @param from Index start position of transaction array. + * @param to Index end position of transaction array. + * @param pending Include pending transactions. + * @param executed Include executed transactions. + * + * @return Returns array of transaction IDs. + * */ + function getTransactionIds( + uint256 from, + uint256 to, + bool pending, + bool executed + ) public view returns (uint256[] memory _transactionIds) { + uint256[] memory transactionIdsTemp = new uint256[](transactionCount); + uint256 count = 0; + uint256 i; + for (i = 0; i < transactionCount; i++) + if ((pending && !transactions[i].executed) || (executed && transactions[i].executed)) { + transactionIdsTemp[count] = i; + count += 1; + } + _transactionIds = new uint256[](to - from); + for (i = from; i < to; i++) _transactionIds[i - from] = transactionIdsTemp[i]; + } +} diff --git a/contracts/Sovryn/Proxy/Proxy.sol b/contracts/Sovryn/Proxy/Proxy.sol new file mode 100644 index 0000000..be885c7 --- /dev/null +++ b/contracts/Sovryn/Proxy/Proxy.sol @@ -0,0 +1,125 @@ +pragma solidity ^0.5.17; + +/** + * @title Base Proxy contract. + * @notice The proxy performs delegated calls to the contract implementation + * it is pointing to. This way upgradable contracts are possible on blockchain. + * + * Delegating proxy contracts are widely used for both upgradeability and gas + * savings. These proxies rely on a logic contract (also known as implementation + * contract or master copy) that is called using delegatecall. This allows + * proxies to keep a persistent state (storage and balance) while the code is + * delegated to the logic contract. + * + * Proxy contract is meant to be inherited and its internal functions + * _setImplementation and _setProxyOwner to be called when upgrades become + * neccessary. + * + * The loan token (iToken) contract as well as the protocol contract act as + * proxies, delegating all calls to underlying contracts. Therefore, if you + * want to interact with them using web3, you need to use the ABIs from the + * contracts containing the actual logic or the interface contract. + * ABI for LoanToken contracts: LoanTokenLogicStandard + * ABI for Protocol contract: ISovryn + * + * @dev UpgradableProxy is the contract that inherits Proxy and wraps these + * functions. + * */ +contract Proxy { + bytes32 private constant KEY_IMPLEMENTATION = keccak256("key.implementation"); + bytes32 private constant KEY_OWNER = keccak256("key.proxy.owner"); + + event OwnershipTransferred(address indexed _oldOwner, address indexed _newOwner); + event ImplementationChanged(address indexed _oldImplementation, address indexed _newImplementation); + + /** + * @notice Set sender as an owner. + * */ + constructor() public { + _setProxyOwner(msg.sender); + } + + /** + * @notice Throw error if called not by an owner. + * */ + modifier onlyProxyOwner() { + require(msg.sender == getProxyOwner(), "Proxy:: access denied"); + _; + } + + /** + * @notice Set address of the implementation. + * @param _implementation Address of the implementation. + * */ + function _setImplementation(address _implementation) internal { + require(_implementation != address(0), "Proxy::setImplementation: invalid address"); + emit ImplementationChanged(getImplementation(), _implementation); + + bytes32 key = KEY_IMPLEMENTATION; + assembly { + sstore(key, _implementation) + } + } + + /** + * @notice Return address of the implementation. + * @return Address of the implementation. + * */ + function getImplementation() public view returns (address _implementation) { + bytes32 key = KEY_IMPLEMENTATION; + assembly { + _implementation := sload(key) + } + } + + /** + * @notice Set address of the owner. + * @param _owner Address of the owner. + * */ + function _setProxyOwner(address _owner) internal { + require(_owner != address(0), "Proxy::setProxyOwner: invalid address"); + emit OwnershipTransferred(getProxyOwner(), _owner); + + bytes32 key = KEY_OWNER; + assembly { + sstore(key, _owner) + } + } + + /** + * @notice Return address of the owner. + * @return Address of the owner. + * */ + function getProxyOwner() public view returns (address _owner) { + bytes32 key = KEY_OWNER; + assembly { + _owner := sload(key) + } + } + + /** + * @notice Fallback function performs a delegate call + * to the actual implementation address is pointing this proxy. + * Returns whatever the implementation call returns. + * */ + function() external payable { + address implementation = getImplementation(); + require(implementation != address(0), "Proxy::(): implementation not found"); + + assembly { + let pointer := mload(0x40) + calldatacopy(pointer, 0, calldatasize) + let result := delegatecall(gas, implementation, pointer, calldatasize, 0, 0) + let size := returndatasize + returndatacopy(pointer, 0, size) + + switch result + case 0 { + revert(pointer, size) + } + default { + return(pointer, size) + } + } + } +} diff --git a/contracts/Sovryn/Proxy/UpgradableProxy.sol b/contracts/Sovryn/Proxy/UpgradableProxy.sol new file mode 100644 index 0000000..e875335 --- /dev/null +++ b/contracts/Sovryn/Proxy/UpgradableProxy.sol @@ -0,0 +1,39 @@ +pragma solidity ^0.5.17; + +import "./Proxy.sol"; + +/** + * @title Upgradable Proxy contract. + * @notice A disadvantage of the immutable ledger is that nobody can change the + * source code of a smart contract after it’s been deployed. In order to fix + * bugs or introduce new features, smart contracts need to be upgradable somehow. + * + * Although it is not possible to upgrade the code of an already deployed smart + * contract, it is possible to set-up a proxy contract architecture that will + * allow to use new deployed contracts as if the main logic had been upgraded. + * + * A proxy architecture pattern is such that all message calls go through a + * Proxy contract that will redirect them to the latest deployed contract logic. + * To upgrade, a new version of the contract is deployed, and the Proxy is + * updated to reference the new contract address. + * */ +contract UpgradableProxy is Proxy { + /** + * @notice Set address of the implementation. + * @dev Wrapper for _setImplementation that exposes the function + * as public for owner to be able to set a new version of the + * contract as current pointing implementation. + * @param _implementation Address of the implementation. + * */ + function setImplementation(address _implementation) public onlyProxyOwner { + _setImplementation(_implementation); + } + + /** + * @notice Set address of the owner. + * @param _owner Address of the owner. + * */ + function setProxyOwner(address _owner) public onlyProxyOwner { + _setProxyOwner(_owner); + } +} diff --git a/contracts/Sovryn/RSK/RSKAddrValidator.sol b/contracts/Sovryn/RSK/RSKAddrValidator.sol new file mode 100644 index 0000000..26703d7 --- /dev/null +++ b/contracts/Sovryn/RSK/RSKAddrValidator.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier:MIT +pragma solidity ^0.5.17; + +library RSKAddrValidator { + /* + * @param addr it is an address to check that it does not originates from + * signing with PK = ZERO. RSK has a small difference in which @ZERO_PK_ADDR is + * also an address from PK = ZERO. So we check for both of them. + * */ + function checkPKNotZero(address addr) internal pure returns (bool) { + return (addr != 0xdcc703c0E500B653Ca82273B7BFAd8045D85a470 && addr != address(0)); + } + + /* + * Safely compares two addresses, checking they do not originate from + * a zero private key. + * */ + function safeEquals(address addr1, address addr2) internal pure returns (bool) { + return (addr1 == addr2 && addr1 != 0xdcc703c0E500B653Ca82273B7BFAd8045D85a470 && addr1 != address(0)); + } +} diff --git a/contracts/Sovryn/Token/ApprovalReceiver.sol b/contracts/Sovryn/Token/ApprovalReceiver.sol new file mode 100644 index 0000000..841b09c --- /dev/null +++ b/contracts/Sovryn/Token/ApprovalReceiver.sol @@ -0,0 +1,105 @@ +pragma solidity ^0.5.17; + +import "../Helper/ErrorDecoder.sol"; +import "../../Interfaces/IApproveAndCall.sol"; + +/** + * @title Base contract for receiving approval from SOV token. + */ +contract ApprovalReceiver is ErrorDecoder, IApproveAndCall { + modifier onlyThisContract() { + // Accepts calls only from receiveApproval function. + require(msg.sender == address(this), "unauthorized"); + _; + } + + /** + * @notice Receives approval from SOV token. + * @param _data The data will be used for low level call. + */ + function receiveApproval( + address _sender, + uint256 _amount, + address _token, + bytes calldata _data + ) external { + // Accepts calls only from SOV token. + require(msg.sender == _getToken(), "unauthorized"); + require(msg.sender == _token, "unauthorized"); + + // Only allowed methods. + bool isAllowed = false; + bytes4[] memory selectors = _getSelectors(); + bytes4 sig = _getSig(_data); + for (uint256 i = 0; i < selectors.length; i++) { + if (sig == selectors[i]) { + isAllowed = true; + break; + } + } + require(isAllowed, "method is not allowed"); + + // Check sender and amount. + address sender; + uint256 amount; + (, sender, amount) = abi.decode(abi.encodePacked(bytes28(0), _data), (bytes32, address, uint256)); + require(sender == _sender, "sender mismatch"); + require(amount == _amount, "amount mismatch"); + + _call(_data); + } + + /** + * @notice Returns token address, only this address can be a sender for receiveApproval. + * @dev Should be overridden in child contracts, otherwise error will be thrown. + * @return By default, 0x. When overriden, the token address making the call. + */ + function _getToken() internal view returns (address) { + return address(0); + } + + /** + * @notice Returns list of function selectors allowed to be invoked. + * @dev Should be overridden in child contracts, otherwise error will be thrown. + * @return By default, empty array. When overriden, allowed selectors. + */ + function _getSelectors() internal view returns (bytes4[] memory) { + return new bytes4[](0); + } + + /** + * @notice Makes call and reverts w/ enhanced error message. + * @param _data Error message as bytes. + */ + function _call(bytes memory _data) internal { + (bool success, bytes memory returnData) = address(this).call(_data); + if (!success) { + if (returnData.length <= ERROR_MESSAGE_SHIFT) { + revert("receiveApproval: Transaction execution reverted."); + } else { + revert(_addErrorMessage("receiveApproval: ", string(returnData))); + } + } + } + + /** + * @notice Extracts the called function selector, a hash of the signature. + * @dev The first four bytes of the call data for a function call specifies + * the function to be called. It is the first (left, high-order in big-endian) + * four bytes of the Keccak-256 (SHA-3) hash of the signature of the function. + * Solidity doesn't yet support a casting of byte[4] to bytes4. + * Example: + * msg.data: + * 0xcdcd77c000000000000000000000000000000000000000000000000000000000000 + * 000450000000000000000000000000000000000000000000000000000000000000001 + * selector (or method ID): 0xcdcd77c0 + * signature: baz(uint32,bool) + * @param _data The msg.data from the low level call. + * @return sig First 4 bytes of msg.data i.e. the selector, hash of the signature. + */ + function _getSig(bytes memory _data) internal pure returns (bytes4 sig) { + assembly { + sig := mload(add(_data, 32)) + } + } +} diff --git a/contracts/Sovryn/Token/Token.sol b/contracts/Sovryn/Token/Token.sol new file mode 100644 index 0000000..d87f47d --- /dev/null +++ b/contracts/Sovryn/Token/Token.sol @@ -0,0 +1,68 @@ +pragma solidity ^0.5.17; + +import "../../Openzeppelin/ERC20Detailed.sol"; +import "../../Openzeppelin/ERC20.sol"; +import "../../Openzeppelin/Ownable.sol"; +import "../../Interfaces/IApproveAndCall.sol"; + +/** + * @title Token is an ERC-20 token contract. + * + * @notice This contract accounts for all holders' balances. + * + * @dev This contract represents a token with dynamic supply. + * The owner of the token contract can mint/burn tokens to/from any account + * based upon previous governance voting and approval. + * */ +contract Token is ERC20, ERC20Detailed, Ownable { + string public NAME; + string public SYMBOL; + uint8 public DECIMALS; + + /** + * @notice Constructor called on deployment, initiates the contract. + * @dev On deployment, some amount of tokens will be minted for the owner. + * @param _initialAmount The amount of tokens to be minted on contract creation. + * */ + constructor( + uint256 _initialAmount, + string memory _name, + string memory _symbol, + uint8 _decimals + ) public ERC20Detailed(_name, _symbol, _decimals) { + NAME = _name; + SYMBOL = _symbol; + DECIMALS = _decimals; + if (_initialAmount != 0) { + _mint(msg.sender, _initialAmount); + } + } + + /** + * @notice Creates new tokens and sends them to the recipient. + * @dev Don't create more than 2^96/10 tokens before updating the governance first. + * @param _account The recipient address to get the minted tokens. + * @param _amount The amount of tokens to be minted. + * */ + function mint(address _account, uint256 _amount) public onlyOwner { + _mint(_account, _amount); + } + + /** + * @notice Approves and then calls the receiving contract. + * Useful to encapsulate sending tokens to a contract in one call. + * Solidity has no native way to send tokens to contracts. + * ERC-20 tokens require approval to be spent by third parties, such as a contract in this case. + * @param _spender The contract address to spend the tokens. + * @param _amount The amount of tokens to be sent. + * @param _data Parameters for the contract call, such as endpoint signature. + * */ + function approveAndCall( + address _spender, + uint256 _amount, + bytes memory _data + ) public { + approve(_spender, _amount); + IApproveAndCall(_spender).receiveApproval(msg.sender, _amount, address(this), _data); + } +} diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..d36edc0 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,13 @@ + + + + + Hardhat Docgen + + + + + +
+ + diff --git a/docs/main.js b/docs/main.js new file mode 100644 index 0000000..d6bffb1 --- /dev/null +++ b/docs/main.js @@ -0,0 +1,12 @@ +!function(e){var t={};function n(a){if(t[a])return t[a].exports;var i=t[a]={i:a,l:!1,exports:{}};return e[a].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(a,i,function(t){return e[t]}.bind(null,i));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=10)}([function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";(function(e,n){ +/*! + * Vue.js v2.6.13 + * (c) 2014-2021 Evan You + * Released under the MIT License. + */ +var a=Object.freeze({});function i(e){return null==e}function r(e){return null!=e}function s(e){return!0===e}function o(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function d(e){return null!==e&&"object"==typeof e}var u=Object.prototype.toString;function p(e){return"[object Object]"===u.call(e)}function l(e){return"[object RegExp]"===u.call(e)}function c(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function y(e){return r(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function m(e){return null==e?"":Array.isArray(e)||p(e)&&e.toString===u?JSON.stringify(e,null,2):String(e)}function f(e){var t=parseFloat(e);return isNaN(t)?e:t}function h(e,t){for(var n=Object.create(null),a=e.split(","),i=0;i-1)return e.splice(n,1)}}var g=Object.prototype.hasOwnProperty;function w(e,t){return g.call(e,t)}function k(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var _=/-(\w)/g,x=k((function(e){return e.replace(_,(function(e,t){return t?t.toUpperCase():""}))})),S=k((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),O=/\B([A-Z])/g,A=k((function(e){return e.replace(O,"-$1").toLowerCase()}));var C=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var a=arguments.length;return a?a>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function M(e,t){t=t||0;for(var n=e.length-t,a=new Array(n);n--;)a[n]=e[n+t];return a}function I(e,t){for(var n in t)e[n]=t[n];return e}function D(e){for(var t={},n=0;n0,Q=Y&&Y.indexOf("edge/")>0,ee=(Y&&Y.indexOf("android"),Y&&/iphone|ipad|ipod|ios/.test(Y)||"ios"===K),te=(Y&&/chrome\/\d+/.test(Y),Y&&/phantomjs/.test(Y),Y&&Y.match(/firefox\/(\d+)/)),ne={}.watch,ae=!1;if(q)try{var ie={};Object.defineProperty(ie,"passive",{get:function(){ae=!0}}),window.addEventListener("test-passive",null,ie)}catch(e){}var re=function(){return void 0===G&&(G=!q&&!X&&void 0!==e&&(e.process&&"server"===e.process.env.VUE_ENV)),G},se=q&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function oe(e){return"function"==typeof e&&/native code/.test(e.toString())}var de,ue="undefined"!=typeof Symbol&&oe(Symbol)&&"undefined"!=typeof Reflect&&oe(Reflect.ownKeys);de="undefined"!=typeof Set&&oe(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var pe=V,le=0,ce=function(){this.id=le++,this.subs=[]};ce.prototype.addSub=function(e){this.subs.push(e)},ce.prototype.removeSub=function(e){T(this.subs,e)},ce.prototype.depend=function(){ce.target&&ce.target.addDep(this)},ce.prototype.notify=function(){var e=this.subs.slice();for(var t=0,n=e.length;t-1)if(r&&!w(i,"default"))s=!1;else if(""===s||s===A(e)){var d=He(String,i.type);(d<0||o0&&(yt((d=e(d,(n||"")+"_"+a))[0])&&yt(p)&&(l[u]=Te(p.text+d[0].text),d.shift()),l.push.apply(l,d)):o(d)?yt(p)?l[u]=Te(p.text+d):""!==d&&l.push(Te(d)):yt(d)&&yt(p)?l[u]=Te(p.text+d.text):(s(t._isVList)&&r(d.tag)&&i(d.key)&&r(n)&&(d.key="__vlist"+n+"_"+a+"__"),l.push(d)));return l}(e):void 0}function yt(e){return r(e)&&r(e.text)&&!1===e.isComment}function mt(e,t){if(e){for(var n=Object.create(null),a=ue?Reflect.ownKeys(e):Object.keys(e),i=0;i0,s=e?!!e.$stable:!r,o=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(s&&n&&n!==a&&o===n.$key&&!r&&!n.$hasNormal)return n;for(var d in i={},e)e[d]&&"$"!==d[0]&&(i[d]=Tt(t,d,e[d]))}else i={};for(var u in t)u in i||(i[u]=gt(t,u));return e&&Object.isExtensible(e)&&(e._normalized=i),U(i,"$stable",s),U(i,"$key",o),U(i,"$hasNormal",r),i}function Tt(e,t,n){var a=function(){var e=arguments.length?n.apply(null,arguments):n({}),t=(e=e&&"object"==typeof e&&!Array.isArray(e)?[e]:ct(e))&&e[0];return e&&(!t||t.isComment&&!vt(t))?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:a,enumerable:!0,configurable:!0}),a}function gt(e,t){return function(){return e[t]}}function wt(e,t){var n,a,i,s,o;if(Array.isArray(e)||"string"==typeof e)for(n=new Array(e.length),a=0,i=e.length;adocument.createEvent("Event").timeStamp&&(ln=function(){return cn.now()})}function yn(){var e,t;for(pn=ln(),dn=!0,an.sort((function(e,t){return e.id-t.id})),un=0;unun&&an[n].id>e.id;)n--;an.splice(n+1,0,e)}else an.push(e);on||(on=!0,it(yn))}}(this)},fn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||d(e)||this.deep){var t=this.value;if(this.value=e,this.user){var n='callback for watcher "'+this.expression+'"';ze(this.cb,this.vm,[e,t],this.vm,n)}else this.cb.call(this.vm,e,t)}}},fn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},fn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},fn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||T(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var hn={enumerable:!0,configurable:!0,get:V,set:V};function vn(e,t,n){hn.get=function(){return this[t][n]},hn.set=function(e){this[t][n]=e},Object.defineProperty(e,n,hn)}function bn(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},a=e._props={},i=e.$options._propKeys=[];e.$parent&&Se(!1);var r=function(r){i.push(r);var s=je(r,t,n,e);Ce(a,r,s),r in e||vn(e,"_props",r)};for(var s in t)r(s);Se(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]="function"!=typeof t[n]?V:C(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;p(t=e._data="function"==typeof t?function(e,t){me();try{return e.call(t,t)}catch(e){return Ge(e,t,"data()"),{}}finally{fe()}}(t,e):t||{})||(t={});var n=Object.keys(t),a=e.$options.props,i=(e.$options.methods,n.length);for(;i--;){var r=n[i];0,a&&w(a,r)||W(r)||vn(e,"_data",r)}Ae(t,!0)}(e):Ae(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),a=re();for(var i in t){var r=t[i],s="function"==typeof r?r:r.get;0,a||(n[i]=new fn(e,s||V,V,Tn)),i in e||gn(e,i,r)}}(e,t.computed),t.watch&&t.watch!==ne&&function(e,t){for(var n in t){var a=t[n];if(Array.isArray(a))for(var i=0;i-1:"string"==typeof e?e.split(",").indexOf(t)>-1:!!l(e)&&e.test(t)}function In(e,t){var n=e.cache,a=e.keys,i=e._vnode;for(var r in n){var s=n[r];if(s){var o=s.name;o&&!t(o)&&Dn(n,r,a,i)}}}function Dn(e,t,n,a){var i=e[t];!i||a&&i.tag===a.tag||i.componentInstance.$destroy(),e[t]=null,T(n,t)}!function(e){e.prototype._init=function(e){var t=this;t._uid=xn++,t._isVue=!0,e&&e._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),a=t._parentVnode;n.parent=t.parent,n._parentVnode=a;var i=a.componentOptions;n.propsData=i.propsData,n._parentListeners=i.listeners,n._renderChildren=i.children,n._componentTag=i.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(t,e):t.$options=Le(Sn(t.constructor),e||{},t),t._renderProxy=t,t._self=t,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(t),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&Jt(e,t)}(t),function(e){e._vnode=null,e._staticTrees=null;var t=e.$options,n=e.$vnode=t._parentVnode,i=n&&n.context;e.$slots=ft(t._renderChildren,i),e.$scopedSlots=a,e._c=function(t,n,a,i){return Ut(e,t,n,a,i,!1)},e.$createElement=function(t,n,a,i){return Ut(e,t,n,a,i,!0)};var r=n&&n.data;Ce(e,"$attrs",r&&r.attrs||a,null,!0),Ce(e,"$listeners",t._parentListeners||a,null,!0)}(t),nn(t,"beforeCreate"),function(e){var t=mt(e.$options.inject,e);t&&(Se(!1),Object.keys(t).forEach((function(n){Ce(e,n,t[n])})),Se(!0))}(t),bn(t),function(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}(t),nn(t,"created"),t.$options.el&&t.$mount(t.$options.el)}}(On),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=Me,e.prototype.$delete=Ie,e.prototype.$watch=function(e,t,n){if(p(t))return _n(this,e,t,n);(n=n||{}).user=!0;var a=new fn(this,e,t,n);if(n.immediate){var i='callback for immediate watcher "'+a.expression+'"';me(),ze(t,this,[a.value],this,i),fe()}return function(){a.teardown()}}}(On),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var a=this;if(Array.isArray(e))for(var i=0,r=e.length;i1?M(n):n;for(var a=M(arguments,1),i='event handler for "'+e+'"',r=0,s=n.length;rparseInt(this.max)&&Dn(e,t[0],t,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)Dn(this.cache,e,this.keys)},mounted:function(){var e=this;this.cacheVNode(),this.$watch("include",(function(t){In(e,(function(e){return Mn(t,e)}))})),this.$watch("exclude",(function(t){In(e,(function(e){return!Mn(t,e)}))}))},updated:function(){this.cacheVNode()},render:function(){var e=this.$slots.default,t=qt(e),n=t&&t.componentOptions;if(n){var a=Cn(n),i=this.include,r=this.exclude;if(i&&(!a||!Mn(i,a))||r&&a&&Mn(r,a))return t;var s=this.cache,o=this.keys,d=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;s[d]?(t.componentInstance=s[d].componentInstance,T(o,d),o.push(d)):(this.vnodeToCache=t,this.keyToCache=d),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return j}};Object.defineProperty(e,"config",t),e.util={warn:pe,extend:I,mergeOptions:Le,defineReactive:Ce},e.set=Me,e.delete=Ie,e.nextTick=it,e.observable=function(e){return Ae(e),e},e.options=Object.create(null),L.forEach((function(t){e.options[t+"s"]=Object.create(null)})),e.options._base=e,I(e.options.components,Rn),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=M(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=Le(this.options,e),this}}(e),An(e),function(e){L.forEach((function(t){e[t]=function(e,n){return n?("component"===t&&p(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}}))}(e)}(On),Object.defineProperty(On.prototype,"$isServer",{get:re}),Object.defineProperty(On.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(On,"FunctionalRenderContext",{value:Ft}),On.version="2.6.13";var En=h("style,class"),Pn=h("input,textarea,option,select,progress"),Fn=function(e,t,n){return"value"===n&&Pn(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},$n=h("contenteditable,draggable,spellcheck"),Ln=h("events,caret,typing,plaintext-only"),Bn=h("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),jn="http://www.w3.org/1999/xlink",Nn=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Wn=function(e){return Nn(e)?e.slice(6,e.length):""},Un=function(e){return null==e||!1===e};function Hn(e){for(var t=e.data,n=e,a=e;r(a.componentInstance);)(a=a.componentInstance._vnode)&&a.data&&(t=Gn(a.data,t));for(;r(n=n.parent);)n&&n.data&&(t=Gn(t,n.data));return function(e,t){if(r(e)||r(t))return zn(e,qn(t));return""}(t.staticClass,t.class)}function Gn(e,t){return{staticClass:zn(e.staticClass,t.staticClass),class:r(e.class)?[e.class,t.class]:t.class}}function zn(e,t){return e?t?e+" "+t:e:t||""}function qn(e){return Array.isArray(e)?function(e){for(var t,n="",a=0,i=e.length;a-1?ba(e,t,n):Bn(t)?Un(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):$n(t)?e.setAttribute(t,function(e,t){return Un(t)||"false"===t?"false":"contenteditable"===e&&Ln(t)?t:"true"}(t,n)):Nn(t)?Un(n)?e.removeAttributeNS(jn,Wn(t)):e.setAttributeNS(jn,t,n):ba(e,t,n)}function ba(e,t,n){if(Un(n))e.removeAttribute(t);else{if(J&&!Z&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var a=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",a)};e.addEventListener("input",a),e.__ieph=!0}e.setAttribute(t,n)}}var Ta={create:ha,update:ha};function ga(e,t){var n=t.elm,a=t.data,s=e.data;if(!(i(a.staticClass)&&i(a.class)&&(i(s)||i(s.staticClass)&&i(s.class)))){var o=Hn(t),d=n._transitionClasses;r(d)&&(o=zn(o,qn(d))),o!==n._prevClass&&(n.setAttribute("class",o),n._prevClass=o)}}var wa,ka,_a,xa,Sa,Oa,Aa={create:ga,update:ga},Ca=/[\w).+\-_$\]]/;function Ma(e){var t,n,a,i,r,s=!1,o=!1,d=!1,u=!1,p=0,l=0,c=0,y=0;for(a=0;a=0&&" "===(f=e.charAt(m));m--);f&&Ca.test(f)||(u=!0)}}else void 0===i?(y=a+1,i=e.slice(0,a).trim()):h();function h(){(r||(r=[])).push(e.slice(y,a).trim()),y=a+1}if(void 0===i?i=e.slice(0,a).trim():0!==y&&h(),r)for(a=0;a-1?{exp:e.slice(0,xa),key:'"'+e.slice(xa+1)+'"'}:{exp:e,key:null};ka=e,xa=Sa=Oa=0;for(;!za();)qa(_a=Ga())?Ka(_a):91===_a&&Xa(_a);return{exp:e.slice(0,Sa),key:e.slice(Sa+1,Oa)}}(e);return null===n.key?e+"="+t:"$set("+n.exp+", "+n.key+", "+t+")"}function Ga(){return ka.charCodeAt(++xa)}function za(){return xa>=wa}function qa(e){return 34===e||39===e}function Xa(e){var t=1;for(Sa=xa;!za();)if(qa(e=Ga()))Ka(e);else if(91===e&&t++,93===e&&t--,0===t){Oa=xa;break}}function Ka(e){for(var t=e;!za()&&(e=Ga())!==t;);}var Ya;function Ja(e,t,n){var a=Ya;return function i(){var r=t.apply(null,arguments);null!==r&&ei(e,i,n,a)}}var Za=Ye&&!(te&&Number(te[1])<=53);function Qa(e,t,n,a){if(Za){var i=pn,r=t;t=r._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=i||e.timeStamp<=0||e.target.ownerDocument!==document)return r.apply(this,arguments)}}Ya.addEventListener(e,t,ae?{capture:n,passive:a}:n)}function ei(e,t,n,a){(a||Ya).removeEventListener(e,t._wrapper||t,n)}function ti(e,t){if(!i(e.data.on)||!i(t.data.on)){var n=t.data.on||{},a=e.data.on||{};Ya=t.elm,function(e){if(r(e.__r)){var t=J?"change":"input";e[t]=[].concat(e.__r,e[t]||[]),delete e.__r}r(e.__c)&&(e.change=[].concat(e.__c,e.change||[]),delete e.__c)}(n),ut(n,a,Qa,ei,Ja,t.context),Ya=void 0}}var ni,ai={create:ti,update:ti};function ii(e,t){if(!i(e.data.domProps)||!i(t.data.domProps)){var n,a,s=t.elm,o=e.data.domProps||{},d=t.data.domProps||{};for(n in r(d.__ob__)&&(d=t.data.domProps=I({},d)),o)n in d||(s[n]="");for(n in d){if(a=d[n],"textContent"===n||"innerHTML"===n){if(t.children&&(t.children.length=0),a===o[n])continue;1===s.childNodes.length&&s.removeChild(s.childNodes[0])}if("value"===n&&"PROGRESS"!==s.tagName){s._value=a;var u=i(a)?"":String(a);ri(s,u)&&(s.value=u)}else if("innerHTML"===n&&Yn(s.tagName)&&i(s.innerHTML)){(ni=ni||document.createElement("div")).innerHTML=""+a+"";for(var p=ni.firstChild;s.firstChild;)s.removeChild(s.firstChild);for(;p.firstChild;)s.appendChild(p.firstChild)}else if(a!==o[n])try{s[n]=a}catch(e){}}}}function ri(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var n=e.value,a=e._vModifiers;if(r(a)){if(a.number)return f(n)!==f(t);if(a.trim)return n.trim()!==t.trim()}return n!==t}(e,t))}var si={create:ii,update:ii},oi=k((function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach((function(e){if(e){var a=e.split(n);a.length>1&&(t[a[0].trim()]=a[1].trim())}})),t}));function di(e){var t=ui(e.style);return e.staticStyle?I(e.staticStyle,t):t}function ui(e){return Array.isArray(e)?D(e):"string"==typeof e?oi(e):e}var pi,li=/^--/,ci=/\s*!important$/,yi=function(e,t,n){if(li.test(t))e.style.setProperty(t,n);else if(ci.test(n))e.style.setProperty(A(t),n.replace(ci,""),"important");else{var a=fi(t);if(Array.isArray(n))for(var i=0,r=n.length;i-1?t.split(bi).forEach((function(t){return e.classList.add(t)})):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function gi(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(bi).forEach((function(t){return e.classList.remove(t)})):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" "+(e.getAttribute("class")||"")+" ",a=" "+t+" ";n.indexOf(a)>=0;)n=n.replace(a," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function wi(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&I(t,ki(e.name||"v")),I(t,e),t}return"string"==typeof e?ki(e):void 0}}var ki=k((function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}})),_i=q&&!Z,xi="transition",Si="transitionend",Oi="animation",Ai="animationend";_i&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(xi="WebkitTransition",Si="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Oi="WebkitAnimation",Ai="webkitAnimationEnd"));var Ci=q?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Mi(e){Ci((function(){Ci(e)}))}function Ii(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),Ti(e,t))}function Di(e,t){e._transitionClasses&&T(e._transitionClasses,t),gi(e,t)}function Vi(e,t,n){var a=Ei(e,t),i=a.type,r=a.timeout,s=a.propCount;if(!i)return n();var o="transition"===i?Si:Ai,d=0,u=function(){e.removeEventListener(o,p),n()},p=function(t){t.target===e&&++d>=s&&u()};setTimeout((function(){d0&&(n="transition",p=s,l=r.length):"animation"===t?u>0&&(n="animation",p=u,l=d.length):l=(n=(p=Math.max(s,u))>0?s>u?"transition":"animation":null)?"transition"===n?r.length:d.length:0,{type:n,timeout:p,propCount:l,hasTransform:"transition"===n&&Ri.test(a[xi+"Property"])}}function Pi(e,t){for(;e.length1}function Ni(e,t){!0!==t.data.show&&$i(t)}var Wi=function(e){var t,n,a={},d=e.modules,u=e.nodeOps;for(t=0;tm?T(e,i(n[v+1])?null:n[v+1].elm,n,y,v,a):y>v&&w(t,c,m)}(c,h,v,n,p):r(v)?(r(e.text)&&u.setTextContent(c,""),T(c,null,v,0,v.length-1,n)):r(h)?w(h,0,h.length-1):r(e.text)&&u.setTextContent(c,""):e.text!==t.text&&u.setTextContent(c,t.text),r(m)&&r(y=m.hook)&&r(y=y.postpatch)&&y(e,t)}}}function S(e,t,n){if(s(n)&&r(e.parent))e.parent.data.pendingInsert=t;else for(var a=0;a-1,s.selected!==r&&(s.selected=r);else if(P(qi(s),a))return void(e.selectedIndex!==o&&(e.selectedIndex=o));i||(e.selectedIndex=-1)}}function zi(e,t){return t.every((function(t){return!P(t,e)}))}function qi(e){return"_value"in e?e._value:e.value}function Xi(e){e.target.composing=!0}function Ki(e){e.target.composing&&(e.target.composing=!1,Yi(e.target,"input"))}function Yi(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function Ji(e){return!e.componentInstance||e.data&&e.data.transition?e:Ji(e.componentInstance._vnode)}var Zi={model:Ui,show:{bind:function(e,t,n){var a=t.value,i=(n=Ji(n)).data&&n.data.transition,r=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;a&&i?(n.data.show=!0,$i(n,(function(){e.style.display=r}))):e.style.display=a?r:"none"},update:function(e,t,n){var a=t.value;!a!=!t.oldValue&&((n=Ji(n)).data&&n.data.transition?(n.data.show=!0,a?$i(n,(function(){e.style.display=e.__vOriginalDisplay})):Li(n,(function(){e.style.display="none"}))):e.style.display=a?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,a,i){i||(e.style.display=e.__vOriginalDisplay)}}},Qi={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function er(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?er(qt(t.children)):e}function tr(e){var t={},n=e.$options;for(var a in n.propsData)t[a]=e[a];var i=n._parentListeners;for(var r in i)t[x(r)]=i[r];return t}function nr(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var ar=function(e){return e.tag||vt(e)},ir=function(e){return"show"===e.name},rr={name:"transition",props:Qi,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(ar)).length){0;var a=this.mode;0;var i=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return i;var r=er(i);if(!r)return i;if(this._leaving)return nr(e,i);var s="__transition-"+this._uid+"-";r.key=null==r.key?r.isComment?s+"comment":s+r.tag:o(r.key)?0===String(r.key).indexOf(s)?r.key:s+r.key:r.key;var d=(r.data||(r.data={})).transition=tr(this),u=this._vnode,p=er(u);if(r.data.directives&&r.data.directives.some(ir)&&(r.data.show=!0),p&&p.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(r,p)&&!vt(p)&&(!p.componentInstance||!p.componentInstance._vnode.isComment)){var l=p.data.transition=I({},d);if("out-in"===a)return this._leaving=!0,pt(l,"afterLeave",(function(){t._leaving=!1,t.$forceUpdate()})),nr(e,i);if("in-out"===a){if(vt(r))return u;var c,y=function(){c()};pt(d,"afterEnter",y),pt(d,"enterCancelled",y),pt(l,"delayLeave",(function(e){c=e}))}}return i}}},sr=I({tag:String,moveClass:String},Qi);function or(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function dr(e){e.data.newPos=e.elm.getBoundingClientRect()}function ur(e){var t=e.data.pos,n=e.data.newPos,a=t.left-n.left,i=t.top-n.top;if(a||i){e.data.moved=!0;var r=e.elm.style;r.transform=r.WebkitTransform="translate("+a+"px,"+i+"px)",r.transitionDuration="0s"}}delete sr.mode;var pr={Transition:rr,TransitionGroup:{props:sr,beforeMount:function(){var e=this,t=this._update;this._update=function(n,a){var i=Qt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,i(),t.call(e,n,a)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),a=this.prevChildren=this.children,i=this.$slots.default||[],r=this.children=[],s=tr(this),o=0;o-1?Qn[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Qn[e]=/HTMLUnknownElement/.test(t.toString())},I(On.options.directives,Zi),I(On.options.components,pr),On.prototype.__patch__=q?Wi:V,On.prototype.$mount=function(e,t){return function(e,t,n){var a;return e.$el=t,e.$options.render||(e.$options.render=be),nn(e,"beforeMount"),a=function(){e._update(e._render(),n)},new fn(e,a,V,{before:function(){e._isMounted&&!e._isDestroyed&&nn(e,"beforeUpdate")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,nn(e,"mounted")),e}(this,e=e&&q?ta(e):void 0,t)},q&&setTimeout((function(){j.devtools&&se&&se.emit("init",On)}),0);var lr=/\{\{((?:.|\r?\n)+?)\}\}/g,cr=/[-.*+?^${}()|[\]\/\\]/g,yr=k((function(e){var t=e[0].replace(cr,"\\$&"),n=e[1].replace(cr,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")}));var mr={staticKeys:["staticClass"],transformNode:function(e,t){t.warn;var n=ja(e,"class");n&&(e.staticClass=JSON.stringify(n));var a=Ba(e,"class",!1);a&&(e.classBinding=a)},genData:function(e){var t="";return e.staticClass&&(t+="staticClass:"+e.staticClass+","),e.classBinding&&(t+="class:"+e.classBinding+","),t}};var fr,hr={staticKeys:["staticStyle"],transformNode:function(e,t){t.warn;var n=ja(e,"style");n&&(e.staticStyle=JSON.stringify(oi(n)));var a=Ba(e,"style",!1);a&&(e.styleBinding=a)},genData:function(e){var t="";return e.staticStyle&&(t+="staticStyle:"+e.staticStyle+","),e.styleBinding&&(t+="style:("+e.styleBinding+"),"),t}},vr=function(e){return(fr=fr||document.createElement("div")).innerHTML=e,fr.textContent},br=h("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),Tr=h("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),gr=h("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),wr=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,kr=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+?\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,_r="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+N.source+"]*",xr="((?:"+_r+"\\:)?"+_r+")",Sr=new RegExp("^<"+xr),Or=/^\s*(\/?)>/,Ar=new RegExp("^<\\/"+xr+"[^>]*>"),Cr=/^]+>/i,Mr=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},Er=/&(?:lt|gt|quot|amp|#39);/g,Pr=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,Fr=h("pre,textarea",!0),$r=function(e,t){return e&&Fr(e)&&"\n"===t[0]};function Lr(e,t){var n=t?Pr:Er;return e.replace(n,(function(e){return Rr[e]}))}var Br,jr,Nr,Wr,Ur,Hr,Gr,zr,qr=/^@|^v-on:/,Xr=/^v-|^@|^:|^#/,Kr=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,Yr=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,Jr=/^\(|\)$/g,Zr=/^\[.*\]$/,Qr=/:(.*)$/,es=/^:|^\.|^v-bind:/,ts=/\.[^.\]]+(?=[^\]]*$)/g,ns=/^v-slot(:|$)|^#/,as=/[\r\n]/,is=/[ \f\t\r\n]+/g,rs=k(vr);function ss(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:ys(t),rawAttrsMap:{},parent:n,children:[]}}function os(e,t){Br=t.warn||Da,Hr=t.isPreTag||R,Gr=t.mustUseProp||R,zr=t.getTagNamespace||R;var n=t.isReservedTag||R;(function(e){return!(!(e.component||e.attrsMap[":is"]||e.attrsMap["v-bind:is"])&&(e.attrsMap.is?n(e.attrsMap.is):n(e.tag)))}),Nr=Va(t.modules,"transformNode"),Wr=Va(t.modules,"preTransformNode"),Ur=Va(t.modules,"postTransformNode"),jr=t.delimiters;var a,i,r=[],s=!1!==t.preserveWhitespace,o=t.whitespace,d=!1,u=!1;function p(e){if(l(e),d||e.processed||(e=ds(e,t)),r.length||e===a||a.if&&(e.elseif||e.else)&&ps(a,{exp:e.elseif,block:e}),i&&!e.forbidden)if(e.elseif||e.else)s=e,(o=function(e){for(var t=e.length;t--;){if(1===e[t].type)return e[t];e.pop()}}(i.children))&&o.if&&ps(o,{exp:s.elseif,block:s});else{if(e.slotScope){var n=e.slotTarget||'"default"';(i.scopedSlots||(i.scopedSlots={}))[n]=e}i.children.push(e),e.parent=i}var s,o;e.children=e.children.filter((function(e){return!e.slotScope})),l(e),e.pre&&(d=!1),Hr(e.tag)&&(u=!1);for(var p=0;p]*>)","i")),c=e.replace(l,(function(e,n,a){return u=a.length,Dr(p)||"noscript"===p||(n=n.replace(//g,"$1").replace(//g,"$1")),$r(p,n)&&(n=n.slice(1)),t.chars&&t.chars(n),""}));d+=e.length-c.length,e=c,O(p,d-u,d)}else{var y=e.indexOf("<");if(0===y){if(Mr.test(e)){var m=e.indexOf("--\x3e");if(m>=0){t.shouldKeepComment&&t.comment(e.substring(4,m),d,d+m+3),_(m+3);continue}}if(Ir.test(e)){var f=e.indexOf("]>");if(f>=0){_(f+2);continue}}var h=e.match(Cr);if(h){_(h[0].length);continue}var v=e.match(Ar);if(v){var b=d;_(v[0].length),O(v[1],b,d);continue}var T=x();if(T){S(T),$r(T.tagName,e)&&_(1);continue}}var g=void 0,w=void 0,k=void 0;if(y>=0){for(w=e.slice(y);!(Ar.test(w)||Sr.test(w)||Mr.test(w)||Ir.test(w)||(k=w.indexOf("<",1))<0);)y+=k,w=e.slice(y);g=e.substring(0,y)}y<0&&(g=e),g&&_(g.length),t.chars&&g&&t.chars(g,d-g.length,d)}if(e===n){t.chars&&t.chars(e);break}}function _(t){d+=t,e=e.substring(t)}function x(){var t=e.match(Sr);if(t){var n,a,i={tagName:t[1],attrs:[],start:d};for(_(t[0].length);!(n=e.match(Or))&&(a=e.match(kr)||e.match(wr));)a.start=d,_(a[0].length),a.end=d,i.attrs.push(a);if(n)return i.unarySlash=n[1],_(n[0].length),i.end=d,i}}function S(e){var n=e.tagName,d=e.unarySlash;r&&("p"===a&&gr(n)&&O(a),o(n)&&a===n&&O(n));for(var u=s(n)||!!d,p=e.attrs.length,l=new Array(p),c=0;c=0&&i[s].lowerCasedTag!==o;s--);else s=0;if(s>=0){for(var u=i.length-1;u>=s;u--)t.end&&t.end(i[u].tag,n,r);i.length=s,a=s&&i[s-1].tag}else"br"===o?t.start&&t.start(e,[],!0,n,r):"p"===o&&(t.start&&t.start(e,[],!1,n,r),t.end&&t.end(e,n,r))}O()}(e,{warn:Br,expectHTML:t.expectHTML,isUnaryTag:t.isUnaryTag,canBeLeftOpenTag:t.canBeLeftOpenTag,shouldDecodeNewlines:t.shouldDecodeNewlines,shouldDecodeNewlinesForHref:t.shouldDecodeNewlinesForHref,shouldKeepComment:t.comments,outputSourceRange:t.outputSourceRange,start:function(e,n,s,o,l){var c=i&&i.ns||zr(e);J&&"svg"===c&&(n=function(e){for(var t=[],n=0;nd&&(o.push(r=e.slice(d,i)),s.push(JSON.stringify(r)));var u=Ma(a[1].trim());s.push("_s("+u+")"),o.push({"@binding":u}),d=i+a[0].length}return d-1"+("true"===r?":("+t+")":":_q("+t+","+r+")")),La(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+r+"):("+s+");if(Array.isArray($$a)){var $$v="+(a?"_n("+i+")":i)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+Ha(t,"$$a.concat([$$v])")+")}else{$$i>-1&&("+Ha(t,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+Ha(t,"$$c")+"}",null,!0)}(e,a,i);else if("input"===r&&"radio"===s)!function(e,t,n){var a=n&&n.number,i=Ba(e,"value")||"null";Ra(e,"checked","_q("+t+","+(i=a?"_n("+i+")":i)+")"),La(e,"change",Ha(t,i),null,!0)}(e,a,i);else if("input"===r||"textarea"===r)!function(e,t,n){var a=e.attrsMap.type;0;var i=n||{},r=i.lazy,s=i.number,o=i.trim,d=!r&&"range"!==a,u=r?"change":"range"===a?"__r":"input",p="$event.target.value";o&&(p="$event.target.value.trim()");s&&(p="_n("+p+")");var l=Ha(t,p);d&&(l="if($event.target.composing)return;"+l);Ra(e,"value","("+t+")"),La(e,u,l,null,!0),(o||s)&&La(e,"blur","$forceUpdate()")}(e,a,i);else{if(!j.isReservedTag(r))return Ua(e,a,i),!1}return!0},text:function(e,t){t.value&&Ra(e,"textContent","_s("+t.value+")",t)},html:function(e,t){t.value&&Ra(e,"innerHTML","_s("+t.value+")",t)}},isPreTag:function(e){return"pre"===e},isUnaryTag:br,mustUseProp:Fn,canBeLeftOpenTag:Tr,isReservedTag:Jn,getTagNamespace:Zn,staticKeys:function(e){return e.reduce((function(e,t){return e.concat(t.staticKeys||[])}),[]).join(",")}(vs)},ws=k((function(e){return h("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(e?","+e:""))}));function ks(e,t){e&&(bs=ws(t.staticKeys||""),Ts=t.isReservedTag||R,function e(t){if(t.static=function(e){if(2===e.type)return!1;if(3===e.type)return!0;return!(!e.pre&&(e.hasBindings||e.if||e.for||v(e.tag)||!Ts(e.tag)||function(e){for(;e.parent;){if("template"!==(e=e.parent).tag)return!1;if(e.for)return!0}return!1}(e)||!Object.keys(e).every(bs)))}(t),1===t.type){if(!Ts(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var n=0,a=t.children.length;n|^function(?:\s+[\w$]+)?\s*\(/,xs=/\([^)]*?\);*$/,Ss=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,Os={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},As={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},Cs=function(e){return"if("+e+")return null;"},Ms={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:Cs("$event.target !== $event.currentTarget"),ctrl:Cs("!$event.ctrlKey"),shift:Cs("!$event.shiftKey"),alt:Cs("!$event.altKey"),meta:Cs("!$event.metaKey"),left:Cs("'button' in $event && $event.button !== 0"),middle:Cs("'button' in $event && $event.button !== 1"),right:Cs("'button' in $event && $event.button !== 2")};function Is(e,t){var n=t?"nativeOn:":"on:",a="",i="";for(var r in e){var s=Ds(e[r]);e[r]&&e[r].dynamic?i+=r+","+s+",":a+='"'+r+'":'+s+","}return a="{"+a.slice(0,-1)+"}",i?n+"_d("+a+",["+i.slice(0,-1)+"])":n+a}function Ds(e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map((function(e){return Ds(e)})).join(",")+"]";var t=Ss.test(e.value),n=_s.test(e.value),a=Ss.test(e.value.replace(xs,""));if(e.modifiers){var i="",r="",s=[];for(var o in e.modifiers)if(Ms[o])r+=Ms[o],Os[o]&&s.push(o);else if("exact"===o){var d=e.modifiers;r+=Cs(["ctrl","shift","alt","meta"].filter((function(e){return!d[e]})).map((function(e){return"$event."+e+"Key"})).join("||"))}else s.push(o);return s.length&&(i+=function(e){return"if(!$event.type.indexOf('key')&&"+e.map(Vs).join("&&")+")return null;"}(s)),r&&(i+=r),"function($event){"+i+(t?"return "+e.value+".apply(null, arguments)":n?"return ("+e.value+").apply(null, arguments)":a?"return "+e.value:e.value)+"}"}return t||n?e.value:"function($event){"+(a?"return "+e.value:e.value)+"}"}function Vs(e){var t=parseInt(e,10);if(t)return"$event.keyCode!=="+t;var n=Os[e],a=As[e];return"_k($event.keyCode,"+JSON.stringify(e)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(a)+")"}var Rs={on:function(e,t){e.wrapListeners=function(e){return"_g("+e+","+t.value+")"}},bind:function(e,t){e.wrapData=function(n){return"_b("+n+",'"+e.tag+"',"+t.value+","+(t.modifiers&&t.modifiers.prop?"true":"false")+(t.modifiers&&t.modifiers.sync?",true":"")+")"}},cloak:V},Es=function(e){this.options=e,this.warn=e.warn||Da,this.transforms=Va(e.modules,"transformCode"),this.dataGenFns=Va(e.modules,"genData"),this.directives=I(I({},Rs),e.directives);var t=e.isReservedTag||R;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function Ps(e,t){var n=new Es(t);return{render:"with(this){return "+(e?"script"===e.tag?"null":Fs(e,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function Fs(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return $s(e,t);if(e.once&&!e.onceProcessed)return Ls(e,t);if(e.for&&!e.forProcessed)return js(e,t);if(e.if&&!e.ifProcessed)return Bs(e,t);if("template"!==e.tag||e.slotTarget||t.pre){if("slot"===e.tag)return function(e,t){var n=e.slotName||'"default"',a=Hs(e,t),i="_t("+n+(a?",function(){return "+a+"}":""),r=e.attrs||e.dynamicAttrs?qs((e.attrs||[]).concat(e.dynamicAttrs||[]).map((function(e){return{name:x(e.name),value:e.value,dynamic:e.dynamic}}))):null,s=e.attrsMap["v-bind"];!r&&!s||a||(i+=",null");r&&(i+=","+r);s&&(i+=(r?"":",null")+","+s);return i+")"}(e,t);var n;if(e.component)n=function(e,t,n){var a=t.inlineTemplate?null:Hs(t,n,!0);return"_c("+e+","+Ns(t,n)+(a?","+a:"")+")"}(e.component,e,t);else{var a;(!e.plain||e.pre&&t.maybeComponent(e))&&(a=Ns(e,t));var i=e.inlineTemplate?null:Hs(e,t,!0);n="_c('"+e.tag+"'"+(a?","+a:"")+(i?","+i:"")+")"}for(var r=0;r>>0}(s):"")+")"}(e,e.scopedSlots,t)+","),e.model&&(n+="model:{value:"+e.model.value+",callback:"+e.model.callback+",expression:"+e.model.expression+"},"),e.inlineTemplate){var r=function(e,t){var n=e.children[0];0;if(n&&1===n.type){var a=Ps(n,t.options);return"inlineTemplate:{render:function(){"+a.render+"},staticRenderFns:["+a.staticRenderFns.map((function(e){return"function(){"+e+"}"})).join(",")+"]}"}}(e,t);r&&(n+=r+",")}return n=n.replace(/,$/,"")+"}",e.dynamicAttrs&&(n="_b("+n+',"'+e.tag+'",'+qs(e.dynamicAttrs)+")"),e.wrapData&&(n=e.wrapData(n)),e.wrapListeners&&(n=e.wrapListeners(n)),n}function Ws(e){return 1===e.type&&("slot"===e.tag||e.children.some(Ws))}function Us(e,t){var n=e.attrsMap["slot-scope"];if(e.if&&!e.ifProcessed&&!n)return Bs(e,t,Us,"null");if(e.for&&!e.forProcessed)return js(e,t,Us);var a="_empty_"===e.slotScope?"":String(e.slotScope),i="function("+a+"){return "+("template"===e.tag?e.if&&n?"("+e.if+")?"+(Hs(e,t)||"undefined")+":undefined":Hs(e,t)||"undefined":Fs(e,t))+"}",r=a?"":",proxy:true";return"{key:"+(e.slotTarget||'"default"')+",fn:"+i+r+"}"}function Hs(e,t,n,a,i){var r=e.children;if(r.length){var s=r[0];if(1===r.length&&s.for&&"template"!==s.tag&&"slot"!==s.tag){var o=n?t.maybeComponent(s)?",1":",0":"";return""+(a||Fs)(s,t)+o}var d=n?function(e,t){for(var n=0,a=0;a':'
',Zs.innerHTML.indexOf(" ")>0}var no=!!q&&to(!1),ao=!!q&&to(!0),io=k((function(e){var t=ta(e);return t&&t.innerHTML})),ro=On.prototype.$mount;On.prototype.$mount=function(e,t){if((e=e&&ta(e))===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var a=n.template;if(a)if("string"==typeof a)"#"===a.charAt(0)&&(a=io(a));else{if(!a.nodeType)return this;a=a.innerHTML}else e&&(a=function(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}(e));if(a){0;var i=eo(a,{outputSourceRange:!1,shouldDecodeNewlines:no,shouldDecodeNewlinesForHref:ao,delimiters:n.delimiters,comments:n.comments},this),r=i.render,s=i.staticRenderFns;n.render=r,n.staticRenderFns=s}}return ro.call(this,e,t)},On.compile=eo,t.a=On}).call(this,n(0),n(7).setImmediate)},function(e){e.exports=JSON.parse('{"a":"hardhat-docgen","b":{"type":"git","url":"git+https://github.com/ItsNickBarry/hardhat-docgen.git"}}')},function(e,t,n){var a=n(5);a.__esModule&&(a=a.default),"string"==typeof a&&(a=[[e.i,a,""]]),a.locals&&(e.exports=a.locals);(0,n(11).default)("0b345cf4",a,!1,{})},function(e,t,n){"use strict";n(3)},function(e,t,n){(t=e.exports=n(6)(!1)).push([e.i,"@import url(https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@400;500;600;700&display=swap);",""]),t.push([e.i,"\nhtml,\nbody {\n font-family: 'Source Code Pro', monospace;\n}\n",""])},function(e,t,n){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=function(e,t){var n=e[1]||"",a=e[3];if(!a)return n;if(t&&"function"==typeof btoa){var i=(s=a,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(s))))+" */"),r=a.sources.map((function(e){return"/*# sourceURL="+a.sourceRoot+e+" */"}));return[n].concat(r).concat([i]).join("\n")}var s;return[n].join("\n")}(t,e);return t[2]?"@media "+t[2]+"{"+n+"}":n})).join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var a={},i=0;i=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(8),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(0))},function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var a,i,r,s,o,d=1,u={},p=!1,l=e.document,c=Object.getPrototypeOf&&Object.getPrototypeOf(e);c=c&&c.setTimeout?c:e,"[object process]"==={}.toString.call(e.process)?a=function(){var e=y(arguments);return t.nextTick(m(f,e)),e}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((r=new MessageChannel).port1.onmessage=function(e){f(e.data)},a=function(){var e=y(arguments);return r.port2.postMessage(e),e}):l&&"onreadystatechange"in l.createElement("script")?(i=l.documentElement,a=function(){var e=y(arguments),t=l.createElement("script");return t.onreadystatechange=function(){f(e),t.onreadystatechange=null,i.removeChild(t),t=null},i.appendChild(t),e}):a=function(){var e=y(arguments);return setTimeout(m(f,e),0),e}:(s="setImmediate$"+Math.random()+"$",o=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(s)&&f(+t.data.slice(s.length))},e.addEventListener?e.addEventListener("message",o,!1):e.attachEvent("onmessage",o),a=function(){var t=y(arguments);return e.postMessage(s+t,"*"),t}),c.setImmediate=a,c.clearImmediate=h}function y(e){return u[d]=m.apply(void 0,e),d++}function m(e){var t=[].slice.call(arguments,1);return function(){"function"==typeof e?e.apply(void 0,t):new Function(""+e)()}}function f(e){if(p)setTimeout(m(f,e),0);else{var t=u[e];if(t){p=!0;try{t()}finally{h(e),p=!1}}}}function h(e){delete u[e]}}("undefined"==typeof self?void 0===e?this:e:self)}).call(this,n(0),n(9))},function(e,t){var n,a,i=e.exports={};function r(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function o(e){if(n===setTimeout)return setTimeout(e,0);if((n===r||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:r}catch(e){n=r}try{a="function"==typeof clearTimeout?clearTimeout:s}catch(e){a=s}}();var d,u=[],p=!1,l=-1;function c(){p&&d&&(p=!1,d.length?u=d.concat(u):l=-1,u.length&&y())}function y(){if(!p){var e=o(c);p=!0;for(var t=u.length;t;){for(d=u,u=[];++l1)for(var n=1;n=0&&(t=e.slice(a),e=e.slice(0,a));var i=e.indexOf("?");return i>=0&&(n=e.slice(i+1),e=e.slice(0,i)),{path:e,query:n,hash:t}}(r.path||""),c=t&&t.path||"/",y=u.path?x(u.path,c,n||r.append):c,m=function(e,t,n){void 0===t&&(t={});var a,i=n||l;try{a=i(e||"")}catch(e){a={}}for(var r in t){var s=t[r];a[r]=Array.isArray(s)?s.map(p):p(s)}return a}(u.query,r.query,a&&a.options.parseQuery),f=r.hash||u.hash;return f&&"#"!==f.charAt(0)&&(f="#"+f),{_normalized:!0,path:y,query:m,hash:f}}var G,z=function(){},q={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(e){var t=this,n=this.$router,a=this.$route,r=n.resolve(this.to,a,this.append),s=r.location,o=r.route,d=r.href,u={},p=n.options.linkActiveClass,l=n.options.linkExactActiveClass,c=null==p?"router-link-active":p,f=null==l?"router-link-exact-active":l,h=null==this.activeClass?c:this.activeClass,v=null==this.exactActiveClass?f:this.exactActiveClass,b=o.redirectedFrom?m(null,H(o.redirectedFrom),null,n):o;u[v]=T(a,b,this.exactPath),u[h]=this.exact||this.exactPath?u[v]:function(e,t){return 0===e.path.replace(y,"/").indexOf(t.path.replace(y,"/"))&&(!t.hash||e.hash===t.hash)&&function(e,t){for(var n in t)if(!(n in e))return!1;return!0}(e.query,t.query)}(a,b);var g=u[v]?this.ariaCurrentValue:null,w=function(e){X(e)&&(t.replace?n.replace(s,z):n.push(s,z))},k={click:X};Array.isArray(this.event)?this.event.forEach((function(e){k[e]=w})):k[this.event]=w;var _={class:u},x=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:d,route:o,navigate:w,isActive:u[h],isExactActive:u[v]});if(x){if(1===x.length)return x[0];if(x.length>1||!x.length)return 0===x.length?e():e("span",{},x)}if("a"===this.tag)_.on=k,_.attrs={href:d,"aria-current":g};else{var S=function e(t){var n;if(t)for(var a=0;a-1&&(o.params[c]=n.params[c]);return o.path=U(p.path,o.params),d(p,o,s)}if(o.path){o.params={};for(var y=0;y=e.length?n():e[i]?t(e[i],(function(){a(i+1)})):a(i+1)};a(0)}var ge={redirected:2,aborted:4,cancelled:8,duplicated:16};function we(e,t){return _e(e,t,ge.redirected,'Redirected when going from "'+e.fullPath+'" to "'+function(e){if("string"==typeof e)return e;if("path"in e)return e.path;var t={};return xe.forEach((function(n){n in e&&(t[n]=e[n])})),JSON.stringify(t,null,2)}(t)+'" via a navigation guard.')}function ke(e,t){return _e(e,t,ge.cancelled,'Navigation cancelled from "'+e.fullPath+'" to "'+t.fullPath+'" with a new navigation.')}function _e(e,t,n,a){var i=new Error(a);return i._isRouter=!0,i.from=e,i.to=t,i.type=n,i}var xe=["params","query","hash"];function Se(e){return Object.prototype.toString.call(e).indexOf("Error")>-1}function Oe(e,t){return Se(e)&&e._isRouter&&(null==t||e.type===t)}function Ae(e){return function(t,n,a){var i=!1,r=0,s=null;Ce(e,(function(e,t,n,o){if("function"==typeof e&&void 0===e.cid){i=!0,r++;var d,u=De((function(t){var i;((i=t).__esModule||Ie&&"Module"===i[Symbol.toStringTag])&&(t=t.default),e.resolved="function"==typeof t?t:G.extend(t),n.components[o]=t,--r<=0&&a()})),p=De((function(e){var t="Failed to resolve async component "+o+": "+e;s||(s=Se(e)?e:new Error(t),a(s))}));try{d=e(u,p)}catch(e){p(e)}if(d)if("function"==typeof d.then)d.then(u,p);else{var l=d.component;l&&"function"==typeof l.then&&l.then(u,p)}}})),i||a()}}function Ce(e,t){return Me(e.map((function(e){return Object.keys(e.components).map((function(n){return t(e.components[n],e.instances[n],e,n)}))})))}function Me(e){return Array.prototype.concat.apply([],e)}var Ie="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function De(e){var t=!1;return function(){for(var n=[],a=arguments.length;a--;)n[a]=arguments[a];if(!t)return t=!0,e.apply(this,n)}}var Ve=function(e,t){this.router=e,this.base=function(e){if(!e)if(K){var t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else e="/";"/"!==e.charAt(0)&&(e="/"+e);return e.replace(/\/$/,"")}(t),this.current=h,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Re(e,t,n,a){var i=Ce(e,(function(e,a,i,r){var s=function(e,t){"function"!=typeof e&&(e=G.extend(e));return e.options[t]}(e,t);if(s)return Array.isArray(s)?s.map((function(e){return n(e,a,i,r)})):n(s,a,i,r)}));return Me(a?i.reverse():i)}function Ee(e,t){if(t)return function(){return e.apply(t,arguments)}}Ve.prototype.listen=function(e){this.cb=e},Ve.prototype.onReady=function(e,t){this.ready?e():(this.readyCbs.push(e),t&&this.readyErrorCbs.push(t))},Ve.prototype.onError=function(e){this.errorCbs.push(e)},Ve.prototype.transitionTo=function(e,t,n){var a,i=this;try{a=this.router.match(e,this.current)}catch(e){throw this.errorCbs.forEach((function(t){t(e)})),e}var r=this.current;this.confirmTransition(a,(function(){i.updateRoute(a),t&&t(a),i.ensureURL(),i.router.afterHooks.forEach((function(e){e&&e(a,r)})),i.ready||(i.ready=!0,i.readyCbs.forEach((function(e){e(a)})))}),(function(e){n&&n(e),e&&!i.ready&&(Oe(e,ge.redirected)&&r===h||(i.ready=!0,i.readyErrorCbs.forEach((function(t){t(e)}))))}))},Ve.prototype.confirmTransition=function(e,t,n){var a=this,i=this.current;this.pending=e;var r,s,o=function(e){!Oe(e)&&Se(e)&&(a.errorCbs.length?a.errorCbs.forEach((function(t){t(e)})):console.error(e)),n&&n(e)},d=e.matched.length-1,u=i.matched.length-1;if(T(e,i)&&d===u&&e.matched[d]===i.matched[u])return this.ensureURL(),o(((s=_e(r=i,e,ge.duplicated,'Avoided redundant navigation to current location: "'+r.fullPath+'".')).name="NavigationDuplicated",s));var p=function(e,t){var n,a=Math.max(e.length,t.length);for(n=0;n0)){var t=this.router,n=t.options.scrollBehavior,a=he&&n;a&&this.listeners.push(se());var i=function(){var n=e.current,i=Fe(e.base);e.current===h&&i===e._startLocation||e.transitionTo(i,(function(e){a&&oe(t,e,n,!0)}))};window.addEventListener("popstate",i),this.listeners.push((function(){window.removeEventListener("popstate",i)}))}},t.prototype.go=function(e){window.history.go(e)},t.prototype.push=function(e,t,n){var a=this,i=this.current;this.transitionTo(e,(function(e){ve(S(a.base+e.fullPath)),oe(a.router,e,i,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var a=this,i=this.current;this.transitionTo(e,(function(e){be(S(a.base+e.fullPath)),oe(a.router,e,i,!1),t&&t(e)}),n)},t.prototype.ensureURL=function(e){if(Fe(this.base)!==this.current.fullPath){var t=S(this.base+this.current.fullPath);e?ve(t):be(t)}},t.prototype.getCurrentLocation=function(){return Fe(this.base)},t}(Ve);function Fe(e){var t=window.location.pathname;return e&&0===t.toLowerCase().indexOf(e.toLowerCase())&&(t=t.slice(e.length)),(t||"/")+window.location.search+window.location.hash}var $e=function(e){function t(t,n,a){e.call(this,t,n),a&&function(e){var t=Fe(e);if(!/^\/#/.test(t))return window.location.replace(S(e+"/#"+t)),!0}(this.base)||Le()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.setupListeners=function(){var e=this;if(!(this.listeners.length>0)){var t=this.router.options.scrollBehavior,n=he&&t;n&&this.listeners.push(se());var a=function(){var t=e.current;Le()&&e.transitionTo(Be(),(function(a){n&&oe(e.router,a,t,!0),he||We(a.fullPath)}))},i=he?"popstate":"hashchange";window.addEventListener(i,a),this.listeners.push((function(){window.removeEventListener(i,a)}))}},t.prototype.push=function(e,t,n){var a=this,i=this.current;this.transitionTo(e,(function(e){Ne(e.fullPath),oe(a.router,e,i,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var a=this,i=this.current;this.transitionTo(e,(function(e){We(e.fullPath),oe(a.router,e,i,!1),t&&t(e)}),n)},t.prototype.go=function(e){window.history.go(e)},t.prototype.ensureURL=function(e){var t=this.current.fullPath;Be()!==t&&(e?Ne(t):We(t))},t.prototype.getCurrentLocation=function(){return Be()},t}(Ve);function Le(){var e=Be();return"/"===e.charAt(0)||(We("/"+e),!1)}function Be(){var e=window.location.href,t=e.indexOf("#");return t<0?"":e=e.slice(t+1)}function je(e){var t=window.location.href,n=t.indexOf("#");return(n>=0?t.slice(0,n):t)+"#"+e}function Ne(e){he?ve(je(e)):window.location.hash=e}function We(e){he?be(je(e)):window.location.replace(je(e))}var Ue=function(e){function t(t,n){e.call(this,t,n),this.stack=[],this.index=-1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.push=function(e,t,n){var a=this;this.transitionTo(e,(function(e){a.stack=a.stack.slice(0,a.index+1).concat(e),a.index++,t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var a=this;this.transitionTo(e,(function(e){a.stack=a.stack.slice(0,a.index).concat(e),t&&t(e)}),n)},t.prototype.go=function(e){var t=this,n=this.index+e;if(!(n<0||n>=this.stack.length)){var a=this.stack[n];this.confirmTransition(a,(function(){var e=t.current;t.index=n,t.updateRoute(a),t.router.afterHooks.forEach((function(t){t&&t(a,e)}))}),(function(e){Oe(e,ge.duplicated)&&(t.index=n)}))}},t.prototype.getCurrentLocation=function(){var e=this.stack[this.stack.length-1];return e?e.fullPath:"/"},t.prototype.ensureURL=function(){},t}(Ve),He=function(e){void 0===e&&(e={}),this.app=null,this.apps=[],this.options=e,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Z(e.routes||[],this);var t=e.mode||"hash";switch(this.fallback="history"===t&&!he&&!1!==e.fallback,this.fallback&&(t="hash"),K||(t="abstract"),this.mode=t,t){case"history":this.history=new Pe(this,e.base);break;case"hash":this.history=new $e(this,e.base,this.fallback);break;case"abstract":this.history=new Ue(this,e.base);break;default:0}},Ge={currentRoute:{configurable:!0}};function ze(e,t){return e.push(t),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}He.prototype.match=function(e,t,n){return this.matcher.match(e,t,n)},Ge.currentRoute.get=function(){return this.history&&this.history.current},He.prototype.init=function(e){var t=this;if(this.apps.push(e),e.$once("hook:destroyed",(function(){var n=t.apps.indexOf(e);n>-1&&t.apps.splice(n,1),t.app===e&&(t.app=t.apps[0]||null),t.app||t.history.teardown()})),!this.app){this.app=e;var n=this.history;if(n instanceof Pe||n instanceof $e){var a=function(e){n.setupListeners(),function(e){var a=n.current,i=t.options.scrollBehavior;he&&i&&"fullPath"in e&&oe(t,e,a,!1)}(e)};n.transitionTo(n.getCurrentLocation(),a,a)}n.listen((function(e){t.apps.forEach((function(t){t._route=e}))}))}},He.prototype.beforeEach=function(e){return ze(this.beforeHooks,e)},He.prototype.beforeResolve=function(e){return ze(this.resolveHooks,e)},He.prototype.afterEach=function(e){return ze(this.afterHooks,e)},He.prototype.onReady=function(e,t){this.history.onReady(e,t)},He.prototype.onError=function(e){this.history.onError(e)},He.prototype.push=function(e,t,n){var a=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){a.history.push(e,t,n)}));this.history.push(e,t,n)},He.prototype.replace=function(e,t,n){var a=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){a.history.replace(e,t,n)}));this.history.replace(e,t,n)},He.prototype.go=function(e){this.history.go(e)},He.prototype.back=function(){this.go(-1)},He.prototype.forward=function(){this.go(1)},He.prototype.getMatchedComponents=function(e){var t=e?e.matched?e:this.resolve(e).route:this.currentRoute;return t?[].concat.apply([],t.matched.map((function(e){return Object.keys(e.components).map((function(t){return e.components[t]}))}))):[]},He.prototype.resolve=function(e,t,n){var a=H(e,t=t||this.history.current,n,this),i=this.match(a,t),r=i.redirectedFrom||i.fullPath;return{location:a,route:i,href:function(e,t,n){var a="hash"===n?"#"+t:t;return e?S(e+"/"+a):a}(this.history.base,r,this.mode),normalizedTo:a,resolved:i}},He.prototype.getRoutes=function(){return this.matcher.getRoutes()},He.prototype.addRoute=function(e,t){this.matcher.addRoute(e,t),this.history.current!==h&&this.history.transitionTo(this.history.getCurrentLocation())},He.prototype.addRoutes=function(e){this.matcher.addRoutes(e),this.history.current!==h&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(He.prototype,Ge),He.install=function e(t){if(!e.installed||G!==t){e.installed=!0,G=t;var n=function(e){return void 0!==e},a=function(e,t){var a=e.$options._parentVnode;n(a)&&n(a=a.data)&&n(a=a.registerRouteInstance)&&a(e,t)};t.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),t.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,a(this,this)},destroyed:function(){a(this)}}),Object.defineProperty(t.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(t.prototype,"$route",{get:function(){return this._routerRoot._route}}),t.component("RouterView",k),t.component("RouterLink",q);var i=t.config.optionMergeStrategies;i.beforeRouteEnter=i.beforeRouteLeave=i.beforeRouteUpdate=i.created}},He.version="3.5.1",He.isNavigationFailure=Oe,He.NavigationFailureType=ge,He.START_LOCATION=h,K&&window.Vue&&window.Vue.use(He);var qe=He,Xe=function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"min-h-screen bg-gray-100 px-4 pt-6"},[t("router-view")],1)};Xe._withStripped=!0;n(4);function Ke(e,t,n,a,i,r,s,o){var d,u="function"==typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),a&&(u.functional=!0),r&&(u._scopeId="data-v-"+r),s?(d=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),i&&i.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(s)},u._ssrRegister=d):i&&(d=o?function(){i.call(this,(u.functional?this.parent:this).$root.$options.shadowRoot)}:i),d)if(u.functional){u._injectStyles=d;var p=u.render;u.render=function(e,t){return d.call(t),p(e,t)}}else{var l=u.beforeCreate;u.beforeCreate=l?[].concat(l,d):[d]}return{exports:e,options:u}}var Ye=Ke({},Xe,[],!1,null,null,null);Ye.options.__file="node_modules/hardhat-docgen/src/App.vue";var Je=Ye.exports,Ze=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"w-full space-y-10 md:max-w-screen-sm lg:max-w-screen-md mx-auto"},[n("HeaderBar"),e._v(" "),n("div",{staticClass:"pb-32"},[n("div",{staticClass:"space-y-4"},[n("span",{staticClass:"text-lg"},[e._v("\n "+e._s(e.json.source)+"\n ")]),e._v(" "),n("h1",{staticClass:"text-xl"},[e._v("\n "+e._s(e.json.name)+"\n ")]),e._v(" "),n("h2",{staticClass:"text-lg"},[e._v("\n "+e._s(e.json.title)+"\n ")]),e._v(" "),n("h2",{staticClass:"text-lg"},[e._v("\n "+e._s(e.json.author)+"\n ")]),e._v(" "),n("p",[e._v(e._s(e.json.notice))]),e._v(" "),n("p",[e._v(e._s(e.json.details))])]),e._v(" "),n("div",{staticClass:"mt-8"},[e.json.hasOwnProperty("constructor")?n("Member",{attrs:{json:e.json.constructor}}):e._e()],1),e._v(" "),n("div",{staticClass:"mt-8"},[e.json.receive?n("Member",{attrs:{json:e.json.receive}}):e._e()],1),e._v(" "),n("div",{staticClass:"mt-8"},[e.json.fallback?n("Member",{attrs:{json:e.json.fallback}}):e._e()],1),e._v(" "),e.json.events?n("MemberSet",{attrs:{title:"Events",json:e.json.events}}):e._e(),e._v(" "),e.json.stateVariables?n("MemberSet",{attrs:{title:"State Variables",json:e.json.stateVariables}}):e._e(),e._v(" "),e.json.methods?n("MemberSet",{attrs:{title:"Methods",json:e.json.methods}}):e._e()],1),e._v(" "),n("FooterBar")],1)};Ze._withStripped=!0;var Qe=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"bg-gray-100 fixed bottom-0 right-0 w-full border-t border-dashed border-gray-300"},[n("div",{staticClass:"w-full text-center py-2 md:max-w-screen-sm lg:max-w-screen-md mx-auto"},[n("button",{staticClass:"py-1 px-2 text-gray-500",on:{click:function(t){return e.openLink(e.repository)}}},[e._v("\n built with "+e._s(e.name)+"\n ")])])])};Qe._withStripped=!0;var et=n(2),tt=Ke({data:function(){return{repository:et.b,name:et.a}},methods:{openLink(e){window.open(e,"_blank")}}},Qe,[],!1,null,null,null);tt.options.__file="node_modules/hardhat-docgen/src/components/FooterBar.vue";var nt=tt.exports,at=function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"w-full border-b border-dashed py-2 border-gray-300"},[t("router-link",{staticClass:"py-2 text-gray-500",attrs:{to:"/"}},[this._v("\n <- Go back\n ")])],1)};at._withStripped=!0;var it=Ke({},at,[],!1,null,null,null);it.options.__file="node_modules/hardhat-docgen/src/components/HeaderBar.vue";var rt=it.exports,st=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"border-2 border-gray-400 border-dashed w-full p-2"},[n("h3",{staticClass:"text-lg pb-2 mb-2 border-b-2 border-gray-400 border-dashed"},[e._v("\n "+e._s(e.name)+" "+e._s(e.keywords)+" "+e._s(e.inputSignature)+"\n ")]),e._v(" "),n("div",{staticClass:"space-y-3"},[n("p",[e._v(e._s(e.json.notice))]),e._v(" "),n("p",[e._v(e._s(e.json.details))]),e._v(" "),n("MemberSection",{attrs:{name:"Parameters",items:e.inputs}}),e._v(" "),n("MemberSection",{attrs:{name:"Return Values",items:e.outputs}})],1)])};st._withStripped=!0;var ot=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.items.length>0?n("ul",[n("h4",{staticClass:"text-lg"},[e._v("\n "+e._s(e.name)+"\n ")]),e._v(" "),e._l(e.items,(function(t,a){return n("li",{key:a},[n("span",{staticClass:"bg-gray-300"},[e._v(e._s(t.type))]),e._v(" "),n("b",[e._v(e._s(t.name||"_"+a))]),t.desc?n("span",[e._v(": "),n("i",[e._v(e._s(t.desc))])]):e._e()])}))],2):e._e()};ot._withStripped=!0;var dt=Ke({props:{name:{type:String,default:""},items:{type:Array,default:()=>new Array}}},ot,[],!1,null,null,null);dt.options.__file="node_modules/hardhat-docgen/src/components/MemberSection.vue";var ut=Ke({components:{MemberSection:dt.exports},props:{json:{type:Object,default:()=>new Object}},computed:{name:function(){return this.json.name||this.json.type},keywords:function(){let e=[];return this.json.stateMutability&&e.push(this.json.stateMutability),"true"===this.json.anonymous&&e.push("anonymous"),e.join(" ")},params:function(){return this.json.params||{}},returns:function(){return this.json.returns||{}},inputs:function(){return(this.json.inputs||[]).map(e=>({...e,desc:this.params[e.name]}))},inputSignature:function(){return`(${this.inputs.map(e=>e.type).join(",")})`},outputs:function(){return(this.json.outputs||[]).map((e,t)=>({...e,desc:this.returns[e.name||"_"+t]}))},outputSignature:function(){return`(${this.outputs.map(e=>e.type).join(",")})`}}},st,[],!1,null,null,null);ut.options.__file="node_modules/hardhat-docgen/src/components/Member.vue";var pt=ut.exports,lt=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"w-full mt-8"},[n("h2",{staticClass:"text-lg"},[e._v(e._s(e.title))]),e._v(" "),e._l(Object.keys(e.json),(function(t){return n("Member",{key:t,staticClass:"mt-3",attrs:{json:e.json[t]}})}))],2)};lt._withStripped=!0;var ct=Ke({components:{Member:pt},props:{title:{type:String,default:""},json:{type:Object,default:()=>new Object}}},lt,[],!1,null,null,null);ct.options.__file="node_modules/hardhat-docgen/src/components/MemberSet.vue";var yt=Ke({components:{Member:pt,MemberSet:ct.exports,HeaderBar:rt,FooterBar:nt},props:{json:{type:Object,default:()=>new Object}}},Ze,[],!1,null,null,null);yt.options.__file="node_modules/hardhat-docgen/src/components/Contract.vue";var mt=yt.exports,ft=function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"w-full space-y-10 md:max-w-screen-sm lg:max-w-screen-md mx-auto pb-32"},[t("Branch",{attrs:{json:this.trees,name:"Sources:"}}),this._v(" "),t("FooterBar",{staticClass:"mt-20"})],1)};ft._withStripped=!0;var ht=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[e._v("\n "+e._s(e.name)+"\n "),Array.isArray(e.json)?n("div",{staticClass:"pl-5"},e._l(e.json,(function(t,a){return n("div",{key:a},[n("router-link",{attrs:{to:t.source+":"+t.name}},[e._v("\n "+e._s(t.name)+"\n ")])],1)})),0):n("div",{staticClass:"pl-5"},e._l(Object.keys(e.json),(function(t){return n("div",{key:t},[n("Branch",{attrs:{json:e.json[t],name:t}})],1)})),0)])};ht._withStripped=!0;var vt=Ke({name:"Branch",props:{name:{type:String,default:null},json:{type:[Object,Array],default:()=>new Object}}},ht,[],!1,null,null,null);vt.options.__file="node_modules/hardhat-docgen/src/components/Branch.vue";var bt=Ke({components:{Branch:vt.exports,FooterBar:nt},props:{json:{type:Object,default:()=>new Object}},computed:{trees:function(){let e={};for(let t in this.json)t.split(/(?<=\/)/).reduce(function(e,n){if(!n.includes(":"))return e[n]=e[n]||{},e[n];{let[a]=n.split(":");e[a]=e[a]||[],e[a].push(this.json[t])}}.bind(this),e);return e}}},ft,[],!1,null,null,null);bt.options.__file="node_modules/hardhat-docgen/src/components/Index.vue";var Tt=bt.exports;a.a.use(qe);const gt={"contracts/Interfaces/IApproveAndCall.sol:IApproveAndCall":{source:"contracts/Interfaces/IApproveAndCall.sol",name:"IApproveAndCall",title:"Interface for contract governance/ApprovalReceiver.sol",details:"Interfaces are used to cast a contract address into a callable instance.",methods:{"receiveApproval(address,uint256,address,bytes)":{constant:!1,inputs:[{internalType:"address",name:"_sender",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"address",name:"_token",type:"address"},{internalType:"bytes",name:"_data",type:"bytes"}],name:"receiveApproval",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"The amount was approved.",_data:"The data will be used for low level call.",_sender:"The sender of SOV.approveAndCall function.",_token:"The address of token."},notice:"Receives approval from SOV token."}}},"contracts/Interfaces/IERC20.sol:IERC20":{source:"contracts/Interfaces/IERC20.sol",name:"IERC20",events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"_owner",type:"address"},{internalType:"address",name:"_spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_spender",type:"address"},{internalType:"uint256",name:"_value",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"_who",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"decimals()":{constant:!0,inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function"},"name()":{constant:!0,inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},"symbol()":{constant:!0,inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_to",type:"address"},{internalType:"uint256",name:"_value",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},"transferFrom(address,address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_from",type:"address"},{internalType:"address",name:"_to",type:"address"},{internalType:"uint256",name:"_value",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"}}},"contracts/Interfaces/IFeeSharingProxy.sol:IFeeSharingProxy":{source:"contracts/Interfaces/IFeeSharingProxy.sol",name:"IFeeSharingProxy",title:"Interface for contract governance/FeeSharingProxy.sol",details:"Interfaces are used to cast a contract address into a callable instance.",methods:{"transferTokens(address,uint96)":{constant:!1,inputs:[{internalType:"address",name:"_token",type:"address"},{internalType:"uint96",name:"_amount",type:"uint96"}],name:"transferTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},"withdraw(address,uint32,address)":{constant:!1,inputs:[{internalType:"address",name:"_loanPoolToken",type:"address"},{internalType:"uint32",name:"_maxCheckpoints",type:"uint32"},{internalType:"address",name:"_receiver",type:"address"}],name:"withdraw",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},"withdrawFees(address)":{constant:!1,inputs:[{internalType:"address",name:"_token",type:"address"}],name:"withdrawFees",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"}}},"contracts/Interfaces/ILockedFund.sol:ILockedFund":{source:"contracts/Interfaces/ILockedFund.sol",name:"ILockedFund",title:"An interface of Locked Fund Contract.",author:"Franklin Richards - powerhousefrank@protonmail.com",methods:{"addAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_newAdmin",type:"address"}],name:"addAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_newAdmin:"The address of the new admin."},notice:"The function to add a new admin."},"changeVestingRegistry(address)":{constant:!1,inputs:[{internalType:"address",name:"_vestingRegistry",type:"address"}],name:"changeVestingRegistry",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_vestingRegistry:"The Vesting Registry Address."},notice:"The function to update the Vesting Registry, Duration and Cliff."},"changeWaitedTS(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_waitedTS",type:"uint256"}],name:"changeWaitedTS",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_waitedTS:"The timestamp after which withdrawal is allowed."},notice:"The function used to update the waitedTS."},"createVesting()":{constant:!1,inputs:[],name:"createVesting",outputs:[{internalType:"address",name:"_vestingAddress",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"function",return:"_vestingAddress The New Vesting Contract Created.",notice:"Creates vesting contract (if it hasn't been created yet) for the calling user."},"createVestingAndStake()":{constant:!1,inputs:[],name:"createVestingAndStake",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only use this function if the `duration` is small.",notice:"Creates vesting if not already created and Stakes tokens for a user."},"depositLocked(address,uint256,uint256,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"},{internalType:"uint256",name:"_basisPoint",type:"uint256"},{internalType:"uint256",name:"_unlockedOrWaited",type:"uint256"}],name:"depositLocked",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Future iteration will have choice between waited unlock and immediate unlock.",params:{_amount:"The amount of Token to be added to the locked and/or unlocked balance.",_basisPoint:"The % (in Basis Point) which determines how much will be (waited) unlocked immediately.",_cliff:"The cliff for vesting.",_duration:"The duration for vesting.",_unlockedOrWaited:"Determines if the Basis Point determines the Unlocked or Waited Unlock Balance.",_userAddress:"The user whose locked balance has to be updated with `_amount`."},notice:"Adds Token to the user balance (Locked and Waited Unlocked Balance based on `_basisPoint`)."},"depositVested(address,uint256,uint256,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"},{internalType:"uint256",name:"_basisPoint",type:"uint256"},{internalType:"uint256",name:"_unlockedOrWaited",type:"uint256"}],name:"depositVested",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Future iteration will have choice between waited unlock and immediate unlock.",params:{_amount:"The amount of Token to be added to the locked and/or unlocked balance.",_basisPoint:"The % (in Basis Point) which determines how much will be (waited) unlocked immediately.",_cliff:"The cliff for vesting.",_duration:"The duration for vesting.",_unlockedOrWaited:"Determines if the Basis Point determines the Unlocked or Waited Unlock Balance.",_userAddress:"The user whose locked balance has to be updated with `_amount`."},notice:"Adds Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`)."},"depositWaitedUnlocked(address,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_basisPoint",type:"uint256"}],name:"depositWaitedUnlocked",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Future iteration will have choice between waited unlock and immediate unlock.",params:{_amount:"The amount of Token to be added to the locked and/or unlocked balance.",_basisPoint:"The % (in Basis Point) which determines how much will be unlocked immediately.",_userAddress:"The user whose locked balance has to be updated with `_amount`."},notice:"Adds Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`)."},"removeAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_adminToRemove",type:"address"}],name:"removeAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_adminToRemove:"The address of the admin which should be removed."},notice:"The function to remove an admin."},"stakeTokens()":{constant:!1,inputs:[],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"The user should already have a vesting created, else this function will throw error.",notice:"Stakes tokens for a user who already have a vesting created."},"withdrawAndStakeTokens(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawAndStakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"Withdraws unlocked tokens and Stakes Locked tokens for a user who already have a vesting created."},"withdrawWaitedUnlockedBalance(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawWaitedUnlockedBalance",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"A function to withdraw the waited unlocked balance."}}},"contracts/Interfaces/IOrigins.sol:IOrigins":{source:"contracts/Interfaces/IOrigins.sol",name:"IOrigins",title:"Interface of the Origins Platform.",author:"Franklin Richards - powerhousefrank@protonmail.com",methods:{"addressVerification(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_addressToBeVerified",type:"address"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"addressVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The address which has to be veriried for the sale.",_tierID:"The tier for which the address has to be verified."},notice:"Function to verify a single address with a single tier."},"buy(uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_amount",type:"uint256"}],name:"buy",outputs:[],payable:!0,stateMutability:"payable",type:"function",details:"If deposit type if RBTC, then _amount can be passed as zero.",params:{_amount:"The amount of token (deposit asset) which will be sent for purchasing.",_tierID:"The Tier ID from which the token has to be bought."},notice:"Function to buy tokens from sale based on tier."},"checkSaleEnded(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"checkSaleEnded",outputs:[{internalType:"bool",name:"_status",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"A return of false does not necessary mean the sale is active. It can also be in inactive state.",params:{_tierID:"The Tier whose info is to be read."},return:"True is sale ended, False otherwise.",notice:"Function to check if a tier sale ended or not."},"createTier(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_maxAmount",type:"uint256"},{internalType:"uint256",name:"_remainingTokens",type:"uint256"},{internalType:"uint256",name:"_saleStartTS",type:"uint256"},{internalType:"uint256",name:"_saleEnd",type:"uint256"},{internalType:"uint256",name:"_unlockedBP",type:"uint256"},{internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{internalType:"uint256",name:"_depositRate",type:"uint256"},{internalType:"uint256",name:"_depositType",type:"uint256"},{internalType:"uint256",name:"_verificationType",type:"uint256"},{internalType:"uint256",name:"_saleEndDurationOrTS",type:"uint256"},{internalType:"uint256",name:"_transferType",type:"uint256"}],name:"createTier",outputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"In the future this should be decoupled. Some are currently sent with default value due to Stack Too Deep problem.",params:{_depositRate:"Contains the rate of the token w.r.t. the depositing asset.",_maxAmount:"The maximum amount of asset which can be deposited.",_remainingTokens:"Contains the remaining tokens for sale.",_saleEnd:"Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens.",_saleEndDurationOrTS:"Contains whether end of sale is by Duration or Timestamp.",_saleStartTS:"Contains the timestamp for the sale to start. Before which no user will be able to buy tokens.",_transferType:"Contains the type of token transfer after a user buys to get the tokens.",_unlockedBP:"Contains the unlock amount in Basis Point for Vesting/Lock.",_verificationType:"Contains the method by which verification happens.",_vestOrLockCliff:"Contains the cliff of the vesting/lock for distribution.",_vestOrLockDuration:"Contains the duration of the vesting/lock for distribution."},return:"_tierID The newly created tier ID.",notice:"Function to create a new tier."},"getDepositAddress()":{constant:!0,inputs:[],name:"getDepositAddress",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"If zero is returned, any of the owners can withdraw the raised funds.",return:"The address of the deposit address.",notice:"Function to read the deposit address."},"getLockDetails()":{constant:!0,inputs:[],name:"getLockDetails",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of Locked Fund Contract.",notice:"Function to read the locked fund contract address."},"getParticipatingWalletCountPerTier(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getParticipatingWalletCountPerTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Total participation of wallets cannot be determined by this. A user can participate on one round and not on other. In the future maybe a count on that can be created.",params:{_tierID:"The tier ID for which the count has to be checked."},return:"The number of wallets who participated in that Tier.",notice:"Function to read participating wallet count per tier."},"getTierCount()":{constant:!0,inputs:[],name:"getTierCount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",return:"The number of tiers present in the contract.",notice:"Function to read the tier count."},"getToken()":{constant:!0,inputs:[],name:"getToken",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"The Token contract address which is being sold in the contract.",notice:"Function to read the token on sale."},"getTokensBoughtByAddressOnTier(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getTokensBoughtByAddressOnTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address which has to be checked.",_tierID:"The tier ID for which the address has to be checked."},return:"The amount of tokens bought by the address.",notice:"Function to read tokens bought by an address on a particular tier."},"getTokensSoldPerTier(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getTokensSoldPerTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The tier ID for which the sold metrics has to be checked."},return:"The amount of tokens sold on that tier.",notice:"Function to read tokens sold per tier."},"getTotalTokenAllocationPerTier(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getTotalTokenAllocationPerTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The tier ID for which the metrics has to be checked."},return:"The amount of tokens allocation on that tier.",notice:"Function to read total token allocation per tier."},"isAddressApproved(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"isAddressApproved",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address which has to be checked.",_tierID:"The tier ID for which the address has to be checked."},return:"True is allowed, False otherwise.",notice:"Function to read address which are approved for sale in a tier."},"multipleAddressAndTierVerification(address[],uint256[])":{constant:!1,inputs:[{internalType:"address[]",name:"_addressToBeVerified",type:"address[]"},{internalType:"uint256[]",name:"_tierID",type:"uint256[]"}],name:"multipleAddressAndTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The addresses which has to be veriried for the sale.",_tierID:"The tiers for which the addresses has to be verified."},notice:"Function to verify multiple address with multiple tiers."},"multipleAddressSingleTierVerification(address[],uint256)":{constant:!1,inputs:[{internalType:"address[]",name:"_addressToBeVerified",type:"address[]"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"multipleAddressSingleTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The addresses which has to be veriried for the sale.",_tierID:"The tier for which the addresses has to be verified."},notice:"Function to verify multiple address with a single tier."},"readTierPartA(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"readTierPartA",outputs:[{internalType:"uint256",name:"_minAmount",type:"uint256"},{internalType:"uint256",name:"_maxAmount",type:"uint256"},{internalType:"uint256",name:"_remainingTokens",type:"uint256"},{internalType:"uint256",name:"_saleStartTS",type:"uint256"},{internalType:"uint256",name:"_saleEnd",type:"uint256"},{internalType:"uint256",name:"_unlockedBP",type:"uint256"},{internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{internalType:"uint256",name:"_depositRate",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The Tier whose info is to be read."},return:"_minAmount The minimum amount which can be deposited._maxAmount The maximum amount which can be deposited._remainingTokens Contains the remaining tokens for sale._saleStartTS Contains the timestamp for the sale to start. Before which no user will be able to buy tokens._saleEnd Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens._unlockedBP Contains the unlock amount in Basis Point for Vesting/Lock._vestOrLockCliff Contains the cliff of the vesting/lock for distribution._vestOrLockDuration Contains the duration of the vesting/lock for distribution._depositRate Contains the rate of the token w.r.t. the depositing asset.",notice:"Function to read a Tier parameter."},"readTierPartB(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"readTierPartB",outputs:[{internalType:"address",name:"_depositToken",type:"address"},{internalType:"uint256",name:"_depositType",type:"uint256"},{internalType:"uint256",name:"_verificationType",type:"uint256"},{internalType:"uint256",name:"_saleEndDurationOrTS",type:"uint256"},{internalType:"uint256",name:"_transferType",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The Tier whose info is to be read."},return:"_depositToken Contains the deposit token address if the deposit type is Token._depositType The type of deposit for the particular sale._verificationType Contains the method by which verification happens._saleEndDurationOrTS Contains whether end of sale is by Duration or Timestamp._transferType Contains the type of token transfer after a user buys to get the tokens.",notice:"Function to read a Tier parameter."},"setDepositAddress(address)":{constant:!1,inputs:[{internalType:"address payable",name:"_depositAddress",type:"address"}],name:"setDepositAddress",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"If this is not set, an owner can withdraw the funds. Here owner is supposed to be a multisig. Or a trusted party.",params:{_depositAddress:"The address of deposit address where all the raised fund will go."},notice:"Function to set the deposit address."},"setLockedFund(address)":{constant:!1,inputs:[{internalType:"address",name:"_lockedFund",type:"address"}],name:"setLockedFund",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_lockedFund:"The address of new the Vesting registry."},notice:"Function to set the Locked Fund Contract Address."},"setTierDeposit(uint256,uint256,address,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_depositRate",type:"uint256"},{internalType:"address",name:"_depositToken",type:"address"},{internalType:"uint256",name:"_depositType",type:"uint256"}],name:"setTierDeposit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_depositRate:"The rate is the, asset * rate = token.",_depositToken:"The token for that particular Tier Sale.",_depositType:"The type of deposit for the particular sale.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Deposit Parameters."},"setTierTime(uint256,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_saleStartTS",type:"uint256"},{internalType:"uint256",name:"_saleEnd",type:"uint256"},{internalType:"uint256",name:"_saleEndDurationOrTS",type:"uint256"}],name:"setTierTime",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_saleEnd:"The Tier Sale End Duration or Timestamp.",_saleEndDurationOrTS:"The Tier Sale End Type for the Tier.",_saleStartTS:"The Tier Sale Start Timestamp.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Time Parameters."},"setTierTokenAmount(uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_remainingTokens",type:"uint256"}],name:"setTierTokenAmount",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_remainingTokens:"The maximum number of tokens allowed to be sold in the tier.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Token Amount Parameters."},"setTierTokenLimit(uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_minAmount",type:"uint256"},{internalType:"uint256",name:"_maxAmount",type:"uint256"}],name:"setTierTokenLimit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_maxAmount:"The maximum asset amount allowed to participate in that tier.",_minAmount:"The minimum asset amount required to participate in that tier.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Token Limit Parameters."},"setTierVerification(uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_verificationType",type:"uint256"}],name:"setTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_tierID:"The Tier ID which is being updated.",_verificationType:"The type of verification for the particular sale."},notice:"Function to set the Tier Verification Method."},"setTierVestOrLock(uint256,uint256,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{internalType:"uint256",name:"_unlockedBP",type:"uint256"},{internalType:"uint256",name:"_transferType",type:"uint256"}],name:"setTierVestOrLock",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_tierID:"The Tier ID which is being updated.",_transferType:"The Tier Transfer Type for the Tier.",_unlockedBP:"The unlocked token amount in BP.",_vestOrLockCliff:"The Vest/Lock Cliff = A * LockedFund.Interval, where A is the cliff.",_vestOrLockDuration:"The Vest/Lock Duration = A * LockedFund.Interval, where A is the duration."},notice:"Function to set the Tier Vest/Lock Parameters."},"singleAddressMultipleTierVerification(address,uint256[])":{constant:!1,inputs:[{internalType:"address",name:"_addressToBeVerified",type:"address"},{internalType:"uint256[]",name:"_tierID",type:"uint256[]"}],name:"singleAddressMultipleTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The address which has to be veriried for the sale.",_tierID:"The tiers for which the address has to be verified."},notice:"Function to verify a single address with multiple tiers."},"withdrawSaleDeposit()":{constant:!1,inputs:[],name:"withdrawSaleDeposit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"In the future this could be made to be accessible only to seller, rather than owner.",notice:"The function used by the admin or deposit address to withdraw the sale proceedings."}}},"contracts/Interfaces/IStaking.sol:IStaking":{source:"contracts/Interfaces/IStaking.sol",name:"IStaking",title:"Interface for contract governance/Staking/Staking.sol",details:"Interfaces are used to cast a contract address into a callable instance.",methods:{"getPriorTotalVotingPower(uint32,uint256)":{constant:!0,inputs:[{internalType:"uint32",name:"blockNumber",type:"uint32"},{internalType:"uint256",name:"time",type:"uint256"}],name:"getPriorTotalVotingPower",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"getPriorVotes(address,uint256,uint256)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"blockNumber",type:"uint256"},{internalType:"uint256",name:"date",type:"uint256"}],name:"getPriorVotes",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"getPriorWeightedStake(address,uint256,uint256)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"blockNumber",type:"uint256"},{internalType:"uint256",name:"date",type:"uint256"}],name:"getPriorWeightedStake",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"stake(uint96,uint256,address,address)":{constant:!1,inputs:[{internalType:"uint96",name:"amount",type:"uint96"},{internalType:"uint256",name:"until",type:"uint256"},{internalType:"address",name:"stakeFor",type:"address"},{internalType:"address",name:"delegatee",type:"address"}],name:"stake",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},"stakesBySchedule(uint256,uint256,uint256,uint256,address,address)":{constant:!1,inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"cliff",type:"uint256"},{internalType:"uint256",name:"duration",type:"uint256"},{internalType:"uint256",name:"intervalLength",type:"uint256"},{internalType:"address",name:"stakeFor",type:"address"},{internalType:"address",name:"delegatee",type:"address"}],name:"stakesBySchedule",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},"timestampToLockDate(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"timestamp",type:"uint256"}],name:"timestampToLockDate",outputs:[{internalType:"uint256",name:"lockDate",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}}},"contracts/Interfaces/ITeamVesting.sol:ITeamVesting":{source:"contracts/Interfaces/ITeamVesting.sol",name:"ITeamVesting",title:"Interface for TeamVesting contract.",details:"Interfaces are used to cast a contract address into a callable instance. This interface is used by Staking contract to call governanceWithdrawTokens function having the vesting contract instance address.",methods:{"governanceWithdrawTokens(address)":{constant:!1,inputs:[{internalType:"address",name:"receiver",type:"address"}],name:"governanceWithdrawTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"}}},"contracts/Interfaces/IVesting.sol:IVesting":{source:"contracts/Interfaces/IVesting.sol",name:"IVesting",title:"Interface for Vesting contract.",details:"Interfaces are used to cast a contract address into a callable instance. This interface is used by VestingLogic contract to implement stakeTokens function and on VestingRegistry contract to call IVesting(vesting).stakeTokens function at a vesting instance.",methods:{"duration()":{constant:!1,inputs:[],name:"duration",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"nonpayable",type:"function"},"endDate()":{constant:!1,inputs:[],name:"endDate",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"nonpayable",type:"function"},"stakeTokens(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"amount",type:"uint256"}],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"}}},"contracts/Interfaces/IVestingFactory.sol:IVestingFactory":{source:"contracts/Interfaces/IVestingFactory.sol",name:"IVestingFactory",title:"Interface for Vesting Factory contract.",details:"Interfaces are used to cast a contract address into a callable instance. This interface is used by VestingFactory contract to override empty implemention of deployVesting and deployTeamVesting functions and on VestingRegistry contract to use an instance of VestingFactory.",methods:{"deployTeamVesting(address,address,address,uint256,uint256,address,address)":{constant:!1,inputs:[{internalType:"address",name:"_SOV",type:"address"},{internalType:"address",name:"_staking",type:"address"},{internalType:"address",name:"_tokenOwner",type:"address"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"},{internalType:"address",name:"_feeSharing",type:"address"},{internalType:"address",name:"_owner",type:"address"}],name:"deployTeamVesting",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"function"},"deployVesting(address,address,address,uint256,uint256,address,address)":{constant:!1,inputs:[{internalType:"address",name:"_SOV",type:"address"},{internalType:"address",name:"_staking",type:"address"},{internalType:"address",name:"_tokenOwner",type:"address"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"},{internalType:"address",name:"_feeSharing",type:"address"},{internalType:"address",name:"_owner",type:"address"}],name:"deployVesting",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"function"}}},"contracts/Interfaces/IVestingLogic.sol:IVestingLogic":{source:"contracts/Interfaces/IVestingLogic.sol",name:"IVestingLogic",title:"Vesting Logic Interface",events:{"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"}},methods:{"SOV()":{constant:!0,inputs:[],name:"SOV",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"cliff()":{constant:!0,inputs:[],name:"cliff",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"duration()":{constant:!0,inputs:[],name:"duration",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"endDate()":{constant:!0,inputs:[],name:"endDate",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"feeSharingProxy()":{constant:!0,inputs:[],name:"feeSharingProxy",outputs:[{internalType:"contract IFeeSharingProxy",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"isOwner()":{constant:!0,inputs:[],name:"isOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"Returns true if the caller is the current owner."},"owner()":{constant:!0,inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address of the current owner."},"stakeTokens(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_amount",type:"uint256"}],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"The amount of tokens to stake."},notice:"Stakes tokens according to the vesting schedule."},"staking()":{constant:!0,inputs:[],name:"staking",outputs:[{internalType:"contract Staking",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"startDate()":{constant:!0,inputs:[],name:"startDate",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"tokenOwner()":{constant:!0,inputs:[],name:"tokenOwner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"transferOwnership(address)":{constant:!1,inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"withdrawTokens(address)":{constant:!1,inputs:[{internalType:"address",name:"receiver",type:"address"}],name:"withdrawTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{receiver:"The receiving address."},notice:"Withdraws unlocked tokens from the staking contract and forwards them to an address specified by the token owner."}}},"contracts/Interfaces/IVestingRegistry.sol:IVestingRegistry":{source:"contracts/Interfaces/IVestingRegistry.sol",name:"IVestingRegistry",title:"Vesting Registry Interface",methods:{"createVesting(address,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_tokenOwner",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"}],name:"createVesting",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"the amount to be staked",_cliff:"the cliff in seconds",_duration:"the total duration in seconds",_tokenOwner:"the owner of the tokens"},notice:"creates Vesting contract"},"getVesting(address)":{constant:!0,inputs:[{internalType:"address",name:"_tokenOwner",type:"address"}],name:"getVesting",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",params:{_tokenOwner:"the owner of the tokens"},notice:"returns vesting contract address for the given token owner"},"stakeTokens(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_vesting",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"}],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"the amount of tokens to stake",_vesting:"the address of Vesting contract"},notice:"stakes tokens according to the vesting schedule"}}},"contracts/LockedFund.sol:LockedFund":{source:"contracts/LockedFund.sol",name:"LockedFund",title:"A holding contract for Locked Fund.",author:"Franklin Richards - powerhousefrank@protonmail.com",details:"This is not the final form of this contract.",notice:"You can use this contract for timed token release from Locked Fund.",constructor:{inputs:[{internalType:"uint256",name:"_waitedTS",type:"uint256"},{internalType:"address",name:"_token",type:"address"},{internalType:"address",name:"_vestingRegistry",type:"address"},{internalType:"address[]",name:"_admins",type:"address[]"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"AdminAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_newAdmin",type:"address"}],name:"AdminAdded",type:"event"},"AdminRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_removedAdmin",type:"address"}],name:"AdminRemoved",type:"event"},"TokenStaked(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_vesting",type:"address"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"TokenStaked",type:"event"},"VestedDeposited(address,address,uint256,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_userAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_cliff",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_duration",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_basisPoint",type:"uint256"}],name:"VestedDeposited",type:"event"},"VestingCreated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_userAddress",type:"address"},{indexed:!0,internalType:"address",name:"_vesting",type:"address"}],name:"VestingCreated",type:"event"},"VestingRegistryUpdated(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_vestingRegistry",type:"address"}],name:"VestingRegistryUpdated",type:"event"},"WaitedTSUpdated(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_waitedTS",type:"uint256"}],name:"WaitedTSUpdated",type:"event"},"WaitedUnlockedDeposited(address,address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_userAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_basisPoint",type:"uint256"}],name:"WaitedUnlockedDeposited",type:"event"},"Withdrawn(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_userAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"Withdrawn",type:"event"}},methods:{"INTERVAL()":{constant:!0,inputs:[],name:"INTERVAL",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"addAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_newAdmin",type:"address"}],name:"addAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_newAdmin:"The address of the new admin."},notice:"The function to add a new admin."},"adminStatus(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"adminStatus",outputs:[{internalType:"bool",name:"_status",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the admin status."},return:"_status True if admin, False otherwise.",notice:"The function to check is an address is admin or not."},"c_0x8dbef84a(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x8dbef84a",type:"bytes32"}],name:"c_0x8dbef84a",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"changeVestingRegistry(address)":{constant:!1,inputs:[{internalType:"address",name:"_vestingRegistry",type:"address"}],name:"changeVestingRegistry",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_vestingRegistry:"The Vesting Registry Address."},notice:"The function to update the Vesting Registry, Duration and Cliff."},"changeWaitedTS(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_waitedTS",type:"uint256"}],name:"changeWaitedTS",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_waitedTS:"The timestamp after which withdrawal is allowed."},notice:"The function used to update the waitedTS."},"cliff(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"cliff",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"createVesting()":{constant:!1,inputs:[],name:"createVesting",outputs:[{internalType:"address",name:"_vestingAddress",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"function",return:"_vestingAddress The New Vesting Contract Created.",notice:"Creates vesting contract (if it hasn't been created yet) for the calling user."},"createVestingAndStake()":{constant:!1,inputs:[],name:"createVestingAndStake",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only use this function if the `duration` is small.",notice:"Creates vesting if not already created and Stakes tokens for a user."},"depositLocked(address,uint256,uint256,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"},{internalType:"uint256",name:"_basisPoint",type:"uint256"},{internalType:"uint256",name:"_unlockedOrWaited",type:"uint256"}],name:"depositLocked",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Future iteration will have choice between waited unlock and immediate unlock.",params:{_amount:"The amount of Token to be added to the locked and/or unlocked balance.",_basisPoint:"The % (in Basis Point) which determines how much will be (waited) unlocked immediately.",_cliff:"The cliff for vesting.",_duration:"The duration for vesting.",_unlockedOrWaited:"Determines if the Basis Point determines the Unlocked or Waited Unlock Balance.",_userAddress:"The user whose locked balance has to be updated with `_amount`."},notice:"Adds Token to the user balance (Locked and Waited Unlocked Balance based on `_basisPoint`)."},"depositVested(address,uint256,uint256,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"},{internalType:"uint256",name:"_basisPoint",type:"uint256"},{internalType:"uint256",name:"_unlockedOrWaited",type:"uint256"}],name:"depositVested",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Future iteration will have choice between waited unlock and immediate unlock.",params:{_amount:"The amount of Token to be added to the locked and/or unlocked balance.",_basisPoint:"The % (in Basis Point) which determines how much will be (waited) unlocked immediately.",_cliff:"The cliff for vesting.",_duration:"The duration for vesting.",_unlockedOrWaited:"Determines if the Basis Point determines the Unlocked or Waited Unlock Balance.",_userAddress:"The user whose locked balance has to be updated with `_amount`."},notice:"Adds Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`)."},"depositWaitedUnlocked(address,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_userAddress",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_basisPoint",type:"uint256"}],name:"depositWaitedUnlocked",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Future iteration will have choice between waited unlock and immediate unlock.",params:{_amount:"The amount of Token to be added to the locked and/or unlocked balance.",_basisPoint:"The % (in Basis Point) which determines how much will be unlocked immediately.",_userAddress:"The user whose locked balance has to be updated with `_amount`."},notice:"Adds Token to the user balance (Vested and Waited Unlocked Balance based on `_basisPoint`)."},"duration(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"duration",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"getCliffAndDuration(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getCliffAndDuration",outputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address whose cliff and duration has to be found."},return:"The cliff of the user vesting/lock.The duration of the user vesting/lock.",notice:"Function to read the cliff and duration of a user."},"getLockedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getLockedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the locked balance."},return:"_balance The locked balance of the address `_addr`.",notice:"The function to get the locked balance of a user."},"getToken()":{constant:!0,inputs:[],name:"getToken",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"The Token contract address which is being sold in the contract.",notice:"Function to read the token on sale."},"getUnlockedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getUnlockedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the unlocked balance."},return:"_balance The unlocked balance of the address `_addr`.",notice:"The function to get the unlocked balance of a user."},"getVestedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getVestedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the vested balance."},return:"_balance The vested balance of the address `_addr`.",notice:"The function to get the vested balance of a user."},"getVestingDetails()":{constant:!0,inputs:[],name:"getVestingDetails",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of Vesting Registry.",notice:"Function to read the vesting registry."},"getWaitedTS()":{constant:!0,inputs:[],name:"getWaitedTS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",return:"The waited timestamp.",notice:"Function to read the waited timestamp."},"getWaitedUnlockedBalance(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"getWaitedUnlockedBalance",outputs:[{internalType:"uint256",name:"_balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address of the user to check the waited unlocked balance."},return:"_balance The waited unlocked balance of the address `_addr`.",notice:"The function to get the waited unlocked balance of a user."},"isAdmin(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"isAdmin",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"lockedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"lockedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"removeAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_adminToRemove",type:"address"}],name:"removeAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Admin.",params:{_adminToRemove:"The address of the admin which should be removed."},notice:"The function to remove an admin."},"stakeTokens()":{constant:!1,inputs:[],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"The user should already have a vesting created, else this function will throw error.",notice:"Stakes tokens for a user who already have a vesting created."},"token()":{constant:!0,inputs:[],name:"token",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"unlockedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"unlockedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"vestedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"vestedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"vestingRegistry()":{constant:!0,inputs:[],name:"vestingRegistry",outputs:[{internalType:"contract IVestingRegistry",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"waitedTS()":{constant:!0,inputs:[],name:"waitedTS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"waitedUnlockedBalances(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"waitedUnlockedBalances",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"withdrawAndStakeTokens(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawAndStakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"Withdraws unlocked tokens and Stakes Vested token balance for a user who already have a vesting created."},"withdrawWaitedUnlockedBalance(address)":{constant:!1,inputs:[{internalType:"address",name:"_receiverAddress",type:"address"}],name:"withdrawWaitedUnlockedBalance",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_receiverAddress:"If specified, the unlocked balance will go to this address, else to msg.sender."},notice:"A function to withdraw the waited unlocked balance."}}},"contracts/Openzeppelin/Address.sol:Address":{source:"contracts/Openzeppelin/Address.sol",name:"Address",details:"Collection of functions related to the address type"},"contracts/Openzeppelin/Context.sol:Context":{source:"contracts/Openzeppelin/Context.sol",name:"Context",constructor:{inputs:[],payable:!1,stateMutability:"nonpayable",type:"constructor"}},"contracts/Openzeppelin/ERC20.sol:ERC20":{source:"contracts/Openzeppelin/ERC20.sol",name:"ERC20",details:"Implementation of the {IERC20} interface. * This implementation is agnostic to the way tokens are created. This means that a supply mechanism has to be added in a derived contract using {_mint}. For a generic mechanism see {ERC20Mintable}. * TIP: For a detailed writeup see our guide https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How to implement supply mechanisms]. * We have followed general OpenZeppelin guidelines: functions revert instead of returning `false` on failure. This behavior is nonetheless conventional and does not conflict with the expectations of ERC20 applications. * Additionally, an {Approval} event is emitted on calls to {transferFrom}. This allows applications to reconstruct the allowance for all accounts just by listening to said events. Other implementations of the EIP may not emit these events, as it isn't required by the specification. * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} functions have been added to mitigate the well-known issues around setting allowances. See {IERC20-approve}.",events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-allowance}."},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-approve}.\t * Requirements:\t * - `spender` cannot be the zero address."},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-balanceOf}."},"decreaseAllowance(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Atomically decreases the allowance granted to `spender` by the caller.\t * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.\t * Emits an {Approval} event indicating the updated allowance.\t * Requirements:\t * - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."},"increaseAllowance(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Atomically increases the allowance granted to `spender` by the caller.\t * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.\t * Emits an {Approval} event indicating the updated allowance.\t * Requirements:\t * - `spender` cannot be the zero address."},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-totalSupply}."},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-transfer}.\t * Requirements:\t * - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."},"transferFrom(address,address,uint256)":{constant:!1,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:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-transferFrom}.\t * Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20};\t * 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`."}}},"contracts/Openzeppelin/ERC20Detailed.sol:ERC20Detailed":{source:"contracts/Openzeppelin/ERC20Detailed.sol",name:"ERC20Detailed",details:"Optional functions from the ERC20 standard.",constructor:{inputs:[{internalType:"string",name:"name",type:"string"},{internalType:"string",name:"symbol",type:"string"},{internalType:"uint8",name:"decimals",type:"uint8"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-allowance}."},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-approve}.\t * Requirements:\t * - `spender` cannot be the zero address."},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-balanceOf}."},"decimals()":{constant:!0,inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\t * Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\t * NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"decreaseAllowance(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Atomically decreases the allowance granted to `spender` by the caller.\t * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.\t * Emits an {Approval} event indicating the updated allowance.\t * Requirements:\t * - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."},"increaseAllowance(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Atomically increases the allowance granted to `spender` by the caller.\t * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.\t * Emits an {Approval} event indicating the updated allowance.\t * Requirements:\t * - `spender` cannot be the zero address."},"name()":{constant:!0,inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the name of the token."},"symbol()":{constant:!0,inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-totalSupply}."},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-transfer}.\t * Requirements:\t * - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."},"transferFrom(address,address,uint256)":{constant:!1,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:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-transferFrom}.\t * Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20};\t * 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`."}}},"contracts/Openzeppelin/IERC20_.sol:IERC20_":{source:"contracts/Openzeppelin/IERC20_.sol",name:"IERC20_",details:"Interface of the ERC20 standard as defined in the EIP. Does not include the optional functions; to access them see {ERC20Detailed}.",events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default.\t * This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Sets `amount` as the allowance of `spender` over the caller's tokens.\t * Returns a boolean value indicating whether the operation succeeded.\t * IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\t * Emits an {Approval} event."},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the amount of tokens owned by `account`."},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the amount of tokens in existence."},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Moves `amount` tokens from the caller's account to `recipient`.\t * Returns a boolean value indicating whether the operation succeeded.\t * Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{constant:!1,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:!1,stateMutability:"nonpayable",type:"function",details:"Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance.\t * Returns a boolean value indicating whether the operation succeeded.\t * Emits a {Transfer} event."}}},"contracts/Openzeppelin/Ownable.sol:Ownable":{source:"contracts/Openzeppelin/Ownable.sol",name:"Ownable",details:"Contract module which provides a basic access control mechanism, where there is an account (an owner) that can be granted exclusive access to specific functions. * This module is used through inheritance. It will make available the modifier `onlyOwner`, which can be applied to your functions to restrict their use to the owner.",constructor:{inputs:[],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"}},methods:{"isOwner()":{constant:!0,inputs:[],name:"isOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"Returns true if the caller is the current owner."},"owner()":{constant:!0,inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address of the current owner."},"transferOwnership(address)":{constant:!1,inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}}},"contracts/Openzeppelin/ReentrancyGuard.sol:ReentrancyGuard":{source:"contracts/Openzeppelin/ReentrancyGuard.sol",name:"ReentrancyGuard",title:"Helps contracts guard against reentrancy attacks.",author:"Remco Bloemen , Eenae ",details:"If you mark a function `nonReentrant`, you should also mark it `external`."},"contracts/Openzeppelin/SafeERC20.sol:SafeERC20":{source:"contracts/Openzeppelin/SafeERC20.sol",name:"SafeERC20",title:"SafeERC20",details:"Wrappers around ERC20 operations that throw on failure (when the token contract returns false). Tokens that return no value (and instead revert or throw on failure) are also supported, non-reverting calls are assumed to be successful. To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, which allows you to call the safe operations as `token.safeTransfer(...)`, etc."},"contracts/Openzeppelin/SafeMath.sol:SafeMath":{source:"contracts/Openzeppelin/SafeMath.sol",name:"SafeMath",details:"Wrappers over Solidity's arithmetic operations with added overflow checks. * Arithmetic operations in Solidity wrap on overflow. This can easily result in bugs, because programmers usually assume that an overflow raises an error, which is the standard behavior in high level programming languages. `SafeMath` restores this intuition by reverting the transaction when an operation overflows. * Using this library instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always."},"contracts/OriginsAdmin.sol:OriginsAdmin":{source:"contracts/OriginsAdmin.sol",name:"OriginsAdmin",title:"An owner contract with granular access for multiple parties.",author:"Franklin Richards - powerhousefrank@protonmail.com",details:"To add a new role, add the corresponding array and mapping, along with add, remove and get functions.",notice:"You can use this contract for creating multiple owners with different access.",constructor:{inputs:[{internalType:"address[]",name:"_owners",type:"address[]"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"OwnerAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnerAdded",type:"event"},"OwnerRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedOwner",type:"address"}],name:"OwnerRemoved",type:"event"},"VerifierAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newVerifier",type:"address"}],name:"VerifierAdded",type:"event"},"VerifierRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedVerifier",type:"address"}],name:"VerifierRemoved",type:"event"}},methods:{"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_newOwner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newOwner:"The address of the new owner."},notice:"The function to add a new owner."},"addVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_newVerifier",type:"address"}],name:"addVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newVerifier:"The address of the new verifier."},notice:"The function to add a new verifier."},"c_0x55aecb26(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x55aecb26",type:"bytes32"}],name:"c_0x55aecb26",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x8209a966(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x8209a966",type:"bytes32"}],name:"c_0x8209a966",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"checkOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Owner, False otherwise.",notice:"Checks if the passed address is an owner or not."},"checkVerifier(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkVerifier",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Verifier, False otherwise.",notice:"Checks if the passed address is a verifier or not."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the owners.",return:"The list of owners."},"getVerifiers()":{constant:!0,inputs:[],name:"getVerifiers",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the verifier.",return:"The list of verifiers."},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_ownerToRemove",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_ownerToRemove:"The address of the owner which should be removed."},notice:"The function to remove an owner."},"removeVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_verifierToRemove",type:"address"}],name:"removeVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_verifierToRemove:"The address of the verifier which should be removed."},notice:"The function to remove an verifier."}}},"contracts/OriginsBase.sol:OriginsBase":{source:"contracts/OriginsBase.sol",name:"OriginsBase",title:"A contract for Origins platform.",author:"Franklin Richards - powerhousefrank@protonmail.com",details:"Don't forget to update the Interface: IOrigins, according to the changes in this.",notice:"You can use this contract for creating a sale in the Origins Platform.",constructor:{inputs:[{internalType:"address[]",name:"_owners",type:"address[]"},{internalType:"address",name:"_token",type:"address"},{internalType:"address payable",name:"_depositAddress",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"AddressVerified(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_verifiedAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"AddressVerified",type:"event"},"DepositAddressUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldDepositAddr",type:"address"},{indexed:!0,internalType:"address",name:"_newDepositAddr",type:"address"}],name:"DepositAddressUpdated",type:"event"},"LockedFundUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldLockedFund",type:"address"},{indexed:!0,internalType:"address",name:"_newLockedFund",type:"address"}],name:"LockedFundUpdated",type:"event"},"NewTierCreated(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"NewTierCreated",type:"event"},"OwnerAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnerAdded",type:"event"},"OwnerRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedOwner",type:"address"}],name:"OwnerRemoved",type:"event"},"ProceedingWithdrawn(address,address,uint256,uint8,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_receiver",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"ProceedingWithdrawn",type:"event"},"RemainingTokenWithdrawn(address,address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_receiver",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_remainingToken",type:"uint256"}],name:"RemainingTokenWithdrawn",type:"event"},"TierDepositUpdated(address,uint256,uint256,address,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_depositRate",type:"uint256"},{indexed:!0,internalType:"address",name:"_depositToken",type:"address"},{indexed:!1,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"}],name:"TierDepositUpdated",type:"event"},"TierSaleEnded(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleEnded",type:"event"},"TierSaleUpdatedMaximum(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_updatedMaxAmount",type:"uint256"}],name:"TierSaleUpdatedMaximum",type:"event"},"TierSaleUpdatedMinimum(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleUpdatedMinimum",type:"event"},"TierTimeUpdated(address,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleStartTS",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleEnd",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"}],name:"TierTimeUpdated",type:"event"},"TierTokenAmountUpdated(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_remainingTokens",type:"uint256"}],name:"TierTokenAmountUpdated",type:"event"},"TierTokenLimitUpdated(address,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_minAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_maxAmount",type:"uint256"}],name:"TierTokenLimitUpdated",type:"event"},"TierVerificationUpdated(address,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"}],name:"TierVerificationUpdated",type:"event"},"TierVestOrLockUpdated(address,uint256,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_unlockedBP",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],name:"TierVestOrLockUpdated",type:"event"},"TokenBuy(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_tokensBought",type:"uint256"}],name:"TokenBuy",type:"event"},"VerifierAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newVerifier",type:"address"}],name:"VerifierAdded",type:"event"},"VerifierRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedVerifier",type:"address"}],name:"VerifierRemoved",type:"event"}},methods:{"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_newOwner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newOwner:"The address of the new owner."},notice:"The function to add a new owner."},"addVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_newVerifier",type:"address"}],name:"addVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newVerifier:"The address of the new verifier."},notice:"The function to add a new verifier."},"addressVerification(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_addressToBeVerified",type:"address"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"addressVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The address which has to be veriried for the sale.",_tierID:"The tier for which the address has to be verified."},notice:"Function to verify a single address with a single tier."},"buy(uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_amount",type:"uint256"}],name:"buy",outputs:[],payable:!0,stateMutability:"payable",type:"function",details:"If deposit type if RBTC, then _amount can be passed as zero.",params:{_amount:"The amount of token (deposit asset) which will be sent for purchasing.",_tierID:"The Tier ID from which the token has to be bought."},notice:"Function to buy tokens from sale based on tier."},"c_0x4ad0f1fc(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x4ad0f1fc",type:"bytes32"}],name:"c_0x4ad0f1fc",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x55aecb26(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x55aecb26",type:"bytes32"}],name:"c_0x55aecb26",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x7d365384(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x7d365384",type:"bytes32"}],name:"c_0x7d365384",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x8209a966(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x8209a966",type:"bytes32"}],name:"c_0x8209a966",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"checkOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Owner, False otherwise.",notice:"Checks if the passed address is an owner or not."},"checkSaleEnded(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"checkSaleEnded",outputs:[{internalType:"bool",name:"_status",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"A return of false does not necessary mean the sale is active. It can also be in inactive state.",params:{_tierID:"The Tier whose info is to be read."},return:"True is sale ended, False otherwise.",notice:"Function to check if a tier sale ended or not."},"checkVerifier(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkVerifier",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Verifier, False otherwise.",notice:"Checks if the passed address is a verifier or not."},"createTier(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_maxAmount",type:"uint256"},{internalType:"uint256",name:"_remainingTokens",type:"uint256"},{internalType:"uint256",name:"_saleStartTS",type:"uint256"},{internalType:"uint256",name:"_saleEnd",type:"uint256"},{internalType:"uint256",name:"_unlockedBP",type:"uint256"},{internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{internalType:"uint256",name:"_depositRate",type:"uint256"},{internalType:"uint256",name:"_depositType",type:"uint256"},{internalType:"uint256",name:"_verificationType",type:"uint256"},{internalType:"uint256",name:"_saleEndDurationOrTS",type:"uint256"},{internalType:"uint256",name:"_transferType",type:"uint256"}],name:"createTier",outputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"In the future this should be decoupled. Some are currently sent with default value due to Stack Too Deep problem.",params:{_depositRate:"Contains the rate of the token w.r.t. the depositing asset.",_maxAmount:"The maximum amount of asset which can be deposited.",_remainingTokens:"Contains the remaining tokens for sale.",_saleEnd:"Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens.",_saleEndDurationOrTS:"Contains whether end of sale is by Duration or Timestamp.",_saleStartTS:"Contains the timestamp for the sale to start. Before which no user will be able to buy tokens.",_transferType:"Contains the type of token transfer after a user buys to get the tokens.",_unlockedBP:"Contains the unlock amount in Basis Point for Vesting/Lock.",_verificationType:"Contains the method by which verification happens.",_vestOrLockCliff:"Contains the cliff of the vesting/lock for distribution.",_vestOrLockDuration:"Contains the duration of the vesting/lock for distribution."},return:"_tierID The newly created tier ID.",notice:"Function to create a new tier."},"getDepositAddress()":{constant:!0,inputs:[],name:"getDepositAddress",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"If zero is returned, any of the owners can withdraw the raised funds.",return:"The address of the deposit address.",notice:"Function to read the deposit address."},"getLockDetails()":{constant:!0,inputs:[],name:"getLockDetails",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of Locked Fund Contract.",notice:"Function to read the locked fund contract address."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the owners.",return:"The list of owners."},"getParticipatingWalletCountPerTier(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getParticipatingWalletCountPerTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"Total participation of wallets cannot be determined by this. A user can participate on one round and not on other. In the future maybe a count on that can be created.",params:{_tierID:"The tier ID for which the count has to be checked."},return:"The number of wallets who participated in that Tier.",notice:"Function to read participating wallet count per tier."},"getTierCount()":{constant:!0,inputs:[],name:"getTierCount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",return:"The number of tiers present in the contract.",notice:"Function to read the tier count."},"getToken()":{constant:!0,inputs:[],name:"getToken",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"The Token contract address which is being sold in the contract.",notice:"Function to read the token on sale."},"getTokensBoughtByAddressOnTier(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getTokensBoughtByAddressOnTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address which has to be checked.",_tierID:"The tier ID for which the address has to be checked."},return:"The amount of tokens bought by the address.",notice:"Function to read tokens bought by an address on a particular tier."},"getTokensSoldPerTier(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getTokensSoldPerTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The tier ID for which the sold metrics has to be checked."},return:"The amount of tokens sold on that tier.",notice:"Function to read tokens sold per tier."},"getTotalTokenAllocationPerTier(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"getTotalTokenAllocationPerTier",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The tier ID for which the metrics has to be checked."},return:"The amount of tokens allocation on that tier.",notice:"Function to read total token allocation per tier."},"getVerifiers()":{constant:!0,inputs:[],name:"getVerifiers",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the verifier.",return:"The list of verifiers."},"isAddressApproved(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"isAddressApproved",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address which has to be checked.",_tierID:"The tier ID for which the address has to be checked."},return:"True is allowed, False otherwise.",notice:"Function to read address which are approved for sale in a tier."},"multipleAddressAndTierVerification(address[],uint256[])":{constant:!1,inputs:[{internalType:"address[]",name:"_addressToBeVerified",type:"address[]"},{internalType:"uint256[]",name:"_tierID",type:"uint256[]"}],name:"multipleAddressAndTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The addresses which has to be veriried for the sale.",_tierID:"The tiers for which the addresses has to be verified."},notice:"Function to verify multiple address with multiple tiers."},"multipleAddressSingleTierVerification(address[],uint256)":{constant:!1,inputs:[{internalType:"address[]",name:"_addressToBeVerified",type:"address[]"},{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"multipleAddressSingleTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The addresses which has to be veriried for the sale.",_tierID:"The tier for which the addresses has to be verified."},notice:"Function to verify multiple address with a single tier."},"readTierPartA(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"readTierPartA",outputs:[{internalType:"uint256",name:"_minAmount",type:"uint256"},{internalType:"uint256",name:"_maxAmount",type:"uint256"},{internalType:"uint256",name:"_remainingTokens",type:"uint256"},{internalType:"uint256",name:"_saleStartTS",type:"uint256"},{internalType:"uint256",name:"_saleEnd",type:"uint256"},{internalType:"uint256",name:"_unlockedBP",type:"uint256"},{internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{internalType:"uint256",name:"_depositRate",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The Tier whose info is to be read."},return:"_minAmount The minimum amount which can be deposited._maxAmount The maximum amount which can be deposited._remainingTokens Contains the remaining tokens for sale._saleStartTS Contains the timestamp for the sale to start. Before which no user will be able to buy tokens._saleEnd Contains the duration or timestamp for the sale to end. After which no user will be able to buy tokens._unlockedBP Contains the unlock amount in Basis Point for Vesting/Lock._vestOrLockCliff Contains the cliff of the vesting/lock for distribution._vestOrLockDuration Contains the duration of the vesting/lock for distribution._depositRate Contains the rate of the token w.r.t. the depositing asset.",notice:"Function to read a Tier parameter."},"readTierPartB(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"}],name:"readTierPartB",outputs:[{internalType:"address",name:"_depositToken",type:"address"},{internalType:"uint256",name:"_depositType",type:"uint256"},{internalType:"uint256",name:"_verificationType",type:"uint256"},{internalType:"uint256",name:"_saleEndDurationOrTS",type:"uint256"},{internalType:"uint256",name:"_transferType",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_tierID:"The Tier whose info is to be read."},return:"_depositToken Contains the deposit token address if the deposit type is Token._depositType The type of deposit for the particular sale._verificationType Contains the method by which verification happens._saleEndDurationOrTS Contains whether end of sale is by Duration or Timestamp._transferType Contains the type of token transfer after a user buys to get the tokens.",notice:"Function to read a Tier parameter."},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_ownerToRemove",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_ownerToRemove:"The address of the owner which should be removed."},notice:"The function to remove an owner."},"removeVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_verifierToRemove",type:"address"}],name:"removeVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_verifierToRemove:"The address of the verifier which should be removed."},notice:"The function to remove an verifier."},"setDepositAddress(address)":{constant:!1,inputs:[{internalType:"address payable",name:"_depositAddress",type:"address"}],name:"setDepositAddress",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"If this is not set, an owner can withdraw the funds. Here owner is supposed to be a multisig. Or a trusted party.",params:{_depositAddress:"The address of deposit address where all the raised fund will go."},notice:"Function to set the deposit address."},"setLockedFund(address)":{constant:!1,inputs:[{internalType:"address",name:"_lockedFund",type:"address"}],name:"setLockedFund",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_lockedFund:"The address of new the Vesting registry."},notice:"Function to set the Locked Fund Contract Address."},"setTierDeposit(uint256,uint256,address,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_depositRate",type:"uint256"},{internalType:"address",name:"_depositToken",type:"address"},{internalType:"uint256",name:"_depositType",type:"uint256"}],name:"setTierDeposit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_depositRate:"The rate is the, asset * rate = token.",_depositToken:"The token for that particular Tier Sale.",_depositType:"The type of deposit for the particular sale.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Deposit Parameters."},"setTierTime(uint256,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_saleStartTS",type:"uint256"},{internalType:"uint256",name:"_saleEnd",type:"uint256"},{internalType:"uint256",name:"_saleEndDurationOrTS",type:"uint256"}],name:"setTierTime",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_saleEnd:"The Tier Sale End Duration or Timestamp.",_saleEndDurationOrTS:"The Tier Sale End Type for the Tier.",_saleStartTS:"The Tier Sale Start Timestamp.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Time Parameters."},"setTierTokenAmount(uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_remainingTokens",type:"uint256"}],name:"setTierTokenAmount",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_remainingTokens:"The maximum number of tokens allowed to be sold in the tier.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Token Amount Parameters."},"setTierTokenLimit(uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_minAmount",type:"uint256"},{internalType:"uint256",name:"_maxAmount",type:"uint256"}],name:"setTierTokenLimit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_maxAmount:"The maximum asset amount allowed to participate in that tier.",_minAmount:"The minimum asset amount required to participate in that tier.",_tierID:"The Tier ID which is being updated."},notice:"Function to set the Tier Token Limit Parameters."},"setTierVerification(uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_verificationType",type:"uint256"}],name:"setTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_tierID:"The Tier ID which is being updated.",_verificationType:"The type of verification for the particular sale."},notice:"Function to set the Tier Verification Method."},"setTierVestOrLock(uint256,uint256,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_tierID",type:"uint256"},{internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{internalType:"uint256",name:"_unlockedBP",type:"uint256"},{internalType:"uint256",name:"_transferType",type:"uint256"}],name:"setTierVestOrLock",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_tierID:"The Tier ID which is being updated.",_transferType:"The Tier Transfer Type for the Tier.",_unlockedBP:"The unlocked token amount in BP.",_vestOrLockCliff:"The Vest/Lock Cliff = A * LockedFund.Interval, where A is the cliff.",_vestOrLockDuration:"The Vest/Lock Duration = A * LockedFund.Interval, where A is the duration."},notice:"Function to set the Tier Vest/Lock Parameters."},"singleAddressMultipleTierVerification(address,uint256[])":{constant:!1,inputs:[{internalType:"address",name:"_addressToBeVerified",type:"address"},{internalType:"uint256[]",name:"_tierID",type:"uint256[]"}],name:"singleAddressMultipleTierVerification",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_addressToBeVerified:"The address which has to be veriried for the sale.",_tierID:"The tiers for which the address has to be verified."},notice:"Function to verify a single address with multiple tiers."},"withdrawSaleDeposit()":{constant:!1,inputs:[],name:"withdrawSaleDeposit",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"In the future this could be made to be accessible only to seller, rather than owner.",notice:"The function used by the admin or deposit address to withdraw the sale proceedings."}}},"contracts/OriginsEvents.sol:OriginsEvents":{source:"contracts/OriginsEvents.sol",name:"OriginsEvents",title:"A contract containing all the events of Origins Base.",author:"Franklin Richards - powerhousefrank@protonmail.com",notice:"You can use this contract for adding events into Origins Base.",events:{"AddressVerified(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_verifiedAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"AddressVerified",type:"event"},"DepositAddressUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldDepositAddr",type:"address"},{indexed:!0,internalType:"address",name:"_newDepositAddr",type:"address"}],name:"DepositAddressUpdated",type:"event"},"LockedFundUpdated(address,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_oldLockedFund",type:"address"},{indexed:!0,internalType:"address",name:"_newLockedFund",type:"address"}],name:"LockedFundUpdated",type:"event"},"NewTierCreated(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"NewTierCreated",type:"event"},"OwnerAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnerAdded",type:"event"},"OwnerRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedOwner",type:"address"}],name:"OwnerRemoved",type:"event"},"ProceedingWithdrawn(address,address,uint256,uint8,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_receiver",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"},{indexed:!1,internalType:"uint256",name:"_amount",type:"uint256"}],name:"ProceedingWithdrawn",type:"event"},"RemainingTokenWithdrawn(address,address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!0,internalType:"address",name:"_receiver",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_remainingToken",type:"uint256"}],name:"RemainingTokenWithdrawn",type:"event"},"TierDepositUpdated(address,uint256,uint256,address,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_depositRate",type:"uint256"},{indexed:!0,internalType:"address",name:"_depositToken",type:"address"},{indexed:!1,internalType:"enum OriginsStorage.DepositType",name:"_depositType",type:"uint8"}],name:"TierDepositUpdated",type:"event"},"TierSaleEnded(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleEnded",type:"event"},"TierSaleUpdatedMaximum(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_updatedMaxAmount",type:"uint256"}],name:"TierSaleUpdatedMaximum",type:"event"},"TierSaleUpdatedMinimum(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"}],name:"TierSaleUpdatedMinimum",type:"event"},"TierTimeUpdated(address,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleStartTS",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_saleEnd",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.SaleEndDurationOrTS",name:"_saleEndDurationOrTS",type:"uint8"}],name:"TierTimeUpdated",type:"event"},"TierTokenAmountUpdated(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_remainingTokens",type:"uint256"}],name:"TierTokenAmountUpdated",type:"event"},"TierTokenLimitUpdated(address,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_minAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_maxAmount",type:"uint256"}],name:"TierTokenLimitUpdated",type:"event"},"TierVerificationUpdated(address,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.VerificationType",name:"_verificationType",type:"uint8"}],name:"TierVerificationUpdated",type:"event"},"TierVestOrLockUpdated(address,uint256,uint256,uint256,uint256,uint8)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockCliff",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_vestOrLockDuration",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_unlockedBP",type:"uint256"},{indexed:!1,internalType:"enum OriginsStorage.TransferType",name:"_transferType",type:"uint8"}],name:"TierVestOrLockUpdated",type:"event"},"TokenBuy(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"uint256",name:"_tierID",type:"uint256"},{indexed:!1,internalType:"uint256",name:"_tokensBought",type:"uint256"}],name:"TokenBuy",type:"event"},"VerifierAdded(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_newVerifier",type:"address"}],name:"VerifierAdded",type:"event"},"VerifierRemoved(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_initiator",type:"address"},{indexed:!1,internalType:"address",name:"_removedVerifier",type:"address"}],name:"VerifierRemoved",type:"event"}},methods:{"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_newOwner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newOwner:"The address of the new owner."},notice:"The function to add a new owner."},"addVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_newVerifier",type:"address"}],name:"addVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_newVerifier:"The address of the new verifier."},notice:"The function to add a new verifier."},"c_0x55aecb26(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x55aecb26",type:"bytes32"}],name:"c_0x55aecb26",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x7d365384(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x7d365384",type:"bytes32"}],name:"c_0x7d365384",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"c_0x8209a966(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x8209a966",type:"bytes32"}],name:"c_0x8209a966",outputs:[],payable:!1,stateMutability:"pure",type:"function"},"checkOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Owner, False otherwise.",notice:"Checks if the passed address is an owner or not."},"checkVerifier(address)":{constant:!0,inputs:[{internalType:"address",name:"_addr",type:"address"}],name:"checkVerifier",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{_addr:"The address to check."},return:"True if Verifier, False otherwise.",notice:"Checks if the passed address is a verifier or not."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the owners.",return:"The list of owners."},"getVerifiers()":{constant:!0,inputs:[],name:"getVerifiers",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address array of the verifier.",return:"The list of verifiers."},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_ownerToRemove",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_ownerToRemove:"The address of the owner which should be removed."},notice:"The function to remove an owner."},"removeVerifier(address)":{constant:!1,inputs:[{internalType:"address",name:"_verifierToRemove",type:"address"}],name:"removeVerifier",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Only callable by an Owner.",params:{_verifierToRemove:"The address of the verifier which should be removed."},notice:"The function to remove an verifier."}}},"contracts/OriginsStorage.sol:OriginsStorage":{source:"contracts/OriginsStorage.sol",name:"OriginsStorage",title:"A storage contract for Origins Platform.",author:"Franklin Richards - powerhousefrank@protonmail.com",notice:"This plays as the harddisk for the Origins Platform.",methods:{"c_0x8209a966(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"c__0x8209a966",type:"bytes32"}],name:"c_0x8209a966",outputs:[],payable:!1,stateMutability:"pure",type:"function"}}},"contracts/Sovryn/Governance/FeeSharingProxy.sol:FeeSharingProxy":{source:"contracts/Sovryn/Governance/FeeSharingProxy.sol",name:"FeeSharingProxy",title:"The FeeSharingProxy contract.",notice:"Staking is not only granting voting rights, but also access to fee sharing according to the own voting power in relation to the total. Whenever somebody decides to collect the fees from the protocol, they get transferred to a proxy contract which invests the funds in the lending pool and keeps the pool tokens. * The fee sharing proxy will be set as feesController of the protocol contract. This allows the fee sharing proxy to withdraw the fees. The fee sharing proxy holds the pool tokens and keeps track of which user owns how many tokens. In order to know how many tokens a user owns, the fee sharing proxy needs to know the user’s weighted stake in relation to the total weighted stake (aka total voting power). * Because both values are subject to change, they may be different on each fee withdrawal. To be able to calculate a user’s share of tokens when he wants to withdraw, we need checkpoints. * This contract is intended to be set as the protocol fee collector. Anybody can invoke the withdrawFees function which uses protocol.withdrawFees to obtain available fees from operations on a certain token. These fees are deposited in the corresponding loanPool. Also, the staking contract sends slashed tokens to this contract. When a user calls the withdraw function, the contract transfers the fee sharing rewards in proportion to the user’s weighted stake since the last withdrawal. * The protocol is collecting fees in all sorts of currencies and then automatically supplies them to the respective lending pools. Therefore, all fees are generating interest for the SOV holders. If one of them withdraws fees, it will get pool tokens. It is planned to add the option to convert anything to rBTC before withdrawing, but not yet implemented.",constructor:{inputs:[{internalType:"contract IProtocol",name:"_protocol",type:"address"},{internalType:"contract IStaking",name:"_staking",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"CheckpointAdded(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"sender",type:"address"},{indexed:!0,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"CheckpointAdded",type:"event"},"FeeWithdrawn(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"sender",type:"address"},{indexed:!0,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"FeeWithdrawn",type:"event"},"TokensTransferred(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"sender",type:"address"},{indexed:!0,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"TokensTransferred",type:"event"},"UserFeeWithdrawn(address,address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"sender",type:"address"},{indexed:!0,internalType:"address",name:"receiver",type:"address"},{indexed:!0,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"UserFeeWithdrawn",type:"event"}},methods:{"getAccumulatedFees(address,address)":{constant:!0,inputs:[{internalType:"address",name:"_user",type:"address"},{internalType:"address",name:"_loanPoolToken",type:"address"}],name:"getAccumulatedFees",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_loanPoolToken:"Address of the pool token.",_user:"The address of the user or contract."},return:"The accumulated fee for the message sender.",notice:"Get the accumulated loan pool fee of the message sender."},"lastFeeWithdrawalTime(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"lastFeeWithdrawalTime",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"numTokenCheckpoints(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"numTokenCheckpoints",outputs:[{internalType:"uint32",name:"",type:"uint32"}],payable:!1,stateMutability:"view",type:"function"},"processedCheckpoints(address,address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"address",name:"",type:"address"}],name:"processedCheckpoints",outputs:[{internalType:"uint32",name:"",type:"uint32"}],payable:!1,stateMutability:"view",type:"function"},"protocol()":{constant:!0,inputs:[],name:"protocol",outputs:[{internalType:"contract IProtocol",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"staking()":{constant:!0,inputs:[],name:"staking",outputs:[{internalType:"contract IStaking",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"tokenCheckpoints(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],name:"tokenCheckpoints",outputs:[{internalType:"uint32",name:"blockNumber",type:"uint32"},{internalType:"uint32",name:"timestamp",type:"uint32"},{internalType:"uint96",name:"totalWeightedStake",type:"uint96"},{internalType:"uint96",name:"numTokens",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"transferTokens(address,uint96)":{constant:!1,inputs:[{internalType:"address",name:"_token",type:"address"},{internalType:"uint96",name:"_amount",type:"uint96"}],name:"transferTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"We just update amount of tokens here and write checkpoint in a separate methods in order to prevent adding checkpoints too often.",params:{_amount:"Amount to be transferred.",_token:"Address of the token."},notice:"Transfer tokens to this contract."},"unprocessedAmount(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"unprocessedAmount",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"withdraw(address,uint32,address)":{constant:!1,inputs:[{internalType:"address",name:"_loanPoolToken",type:"address"},{internalType:"uint32",name:"_maxCheckpoints",type:"uint32"},{internalType:"address",name:"_receiver",type:"address"}],name:"withdraw",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_loanPoolToken:"Address of the pool token.",_maxCheckpoints:"Maximum number of checkpoints to be processed.",_receiver:"The receiver of tokens or msg.sender"},notice:"Withdraw accumulated fee to the message sender.\t * The Sovryn protocol collects fees on every trade/swap and loan. These fees will be distributed to SOV stakers based on their voting power as a percentage of total voting power. Therefore, staking more SOV and/or staking for longer will increase your share of the fees generated, meaning you will earn more from staking."},"withdrawFees(address)":{constant:!1,inputs:[{internalType:"address",name:"_token",type:"address"}],name:"withdrawFees",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_token:"Address of the token"},notice:"Withdraw fees for the given token: lendingFee + tradingFee + borrowingFee"}}},"contracts/Sovryn/Governance/FeeSharingProxy.sol:ILoanToken":{source:"contracts/Sovryn/Governance/FeeSharingProxy.sol",name:"ILoanToken",methods:{"mint(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"receiver",type:"address"},{internalType:"uint256",name:"depositAmount",type:"uint256"}],name:"mint",outputs:[{internalType:"uint256",name:"mintAmount",type:"uint256"}],payable:!1,stateMutability:"nonpayable",type:"function"}}},"contracts/Sovryn/Governance/FeeSharingProxy.sol:IProtocol":{source:"contracts/Sovryn/Governance/FeeSharingProxy.sol",name:"IProtocol",methods:{"underlyingToLoanPool(address)":{constant:!1,inputs:[{internalType:"address",name:"token",type:"address"}],name:"underlyingToLoanPool",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"function"},"withdrawFees(address,address)":{constant:!1,inputs:[{internalType:"address",name:"token",type:"address"},{internalType:"address",name:"receiver",type:"address"}],name:"withdrawFees",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"nonpayable",type:"function"}}},"contracts/Sovryn/Governance/Staking/Checkpoints.sol:Checkpoints":{source:"contracts/Sovryn/Governance/Staking/Checkpoints.sol",name:"Checkpoints",title:"Checkpoints contract.",notice:"Increases and decreases storage values for users, delegatees and total daily stake.",events:{"AdminAdded(address)":{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"admin",type:"address"}],name:"AdminAdded",type:"event"},"AdminRemoved(address)":{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"admin",type:"address"}],name:"AdminRemoved",type:"event"},"ContractCodeHashAdded(bytes32)":{anonymous:!1,inputs:[{indexed:!1,internalType:"bytes32",name:"hash",type:"bytes32"}],name:"ContractCodeHashAdded",type:"event"},"ContractCodeHashRemoved(bytes32)":{anonymous:!1,inputs:[{indexed:!1,internalType:"bytes32",name:"hash",type:"bytes32"}],name:"ContractCodeHashRemoved",type:"event"},"DelegateChanged(address,uint256,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"delegator",type:"address"},{indexed:!1,internalType:"uint256",name:"lockedUntil",type:"uint256"},{indexed:!0,internalType:"address",name:"fromDelegate",type:"address"},{indexed:!0,internalType:"address",name:"toDelegate",type:"address"}],name:"DelegateChanged",type:"event"},"DelegateStakeChanged(address,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"delegate",type:"address"},{indexed:!1,internalType:"uint256",name:"lockedUntil",type:"uint256"},{indexed:!1,internalType:"uint256",name:"previousBalance",type:"uint256"},{indexed:!1,internalType:"uint256",name:"newBalance",type:"uint256"}],name:"DelegateStakeChanged",type:"event"},"ExtendedStakingDuration(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"staker",type:"address"},{indexed:!1,internalType:"uint256",name:"previousDate",type:"uint256"},{indexed:!1,internalType:"uint256",name:"newDate",type:"uint256"}],name:"ExtendedStakingDuration",type:"event"},"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},"TokensStaked(address,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"staker",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"lockedUntil",type:"uint256"},{indexed:!1,internalType:"uint256",name:"totalStaked",type:"uint256"}],name:"TokensStaked",type:"event"},"TokensUnlocked(uint256)":{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"TokensUnlocked",type:"event"},"TokensWithdrawn(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"staker",type:"address"},{indexed:!1,internalType:"address",name:"receiver",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"TokensWithdrawn",type:"event"},"VestingTokensWithdrawn(address,address)":{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"vesting",type:"address"},{indexed:!1,internalType:"address",name:"receiver",type:"address"}],name:"VestingTokensWithdrawn",type:"event"}},methods:{"DELEGATION_TYPEHASH()":{constant:!0,inputs:[],name:"DELEGATION_TYPEHASH",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],payable:!1,stateMutability:"view",type:"function"},"DOMAIN_TYPEHASH()":{constant:!0,inputs:[],name:"DOMAIN_TYPEHASH",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],payable:!1,stateMutability:"view",type:"function"},"MAX_DURATION()":{constant:!0,inputs:[],name:"MAX_DURATION",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"MAX_VOTING_WEIGHT()":{constant:!0,inputs:[],name:"MAX_VOTING_WEIGHT",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"SOVToken()":{constant:!0,inputs:[],name:"SOVToken",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"WEIGHT_FACTOR()":{constant:!0,inputs:[],name:"WEIGHT_FACTOR",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"admins(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"admins",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"allUnlocked()":{constant:!0,inputs:[],name:"allUnlocked",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"delegateStakingCheckpoints(address,uint256,uint32)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint32",name:"",type:"uint32"}],name:"delegateStakingCheckpoints",outputs:[{internalType:"uint32",name:"fromBlock",type:"uint32"},{internalType:"uint96",name:"stake",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"delegates(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],name:"delegates",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"feeSharing()":{constant:!0,inputs:[],name:"feeSharing",outputs:[{internalType:"contract IFeeSharingProxy",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"isOwner()":{constant:!0,inputs:[],name:"isOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"Returns true if the caller is the current owner."},"kickoffTS()":{constant:!0,inputs:[],name:"kickoffTS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"newStakingContract()":{constant:!0,inputs:[],name:"newStakingContract",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"nonces(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"nonces",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"numDelegateStakingCheckpoints(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],name:"numDelegateStakingCheckpoints",outputs:[{internalType:"uint32",name:"",type:"uint32"}],payable:!1,stateMutability:"view",type:"function"},"numTotalStakingCheckpoints(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"numTotalStakingCheckpoints",outputs:[{internalType:"uint32",name:"",type:"uint32"}],payable:!1,stateMutability:"view",type:"function"},"numUserStakingCheckpoints(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],name:"numUserStakingCheckpoints",outputs:[{internalType:"uint32",name:"",type:"uint32"}],payable:!1,stateMutability:"view",type:"function"},"owner()":{constant:!0,inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address of the current owner."},"totalStakingCheckpoints(uint256,uint32)":{constant:!0,inputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint32",name:"",type:"uint32"}],name:"totalStakingCheckpoints",outputs:[{internalType:"uint32",name:"fromBlock",type:"uint32"},{internalType:"uint96",name:"stake",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"transferOwnership(address)":{constant:!1,inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"userStakingCheckpoints(address,uint256,uint32)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint32",name:"",type:"uint32"}],name:"userStakingCheckpoints",outputs:[{internalType:"uint32",name:"fromBlock",type:"uint32"},{internalType:"uint96",name:"stake",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"vestingCodeHashes(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"",type:"bytes32"}],name:"vestingCodeHashes",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"vestingWhitelist(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"vestingWhitelist",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"weightScaling()":{constant:!0,inputs:[],name:"weightScaling",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"}}},"contracts/Sovryn/Governance/Staking/Staking.sol:Staking":{source:"contracts/Sovryn/Governance/Staking/Staking.sol",name:"Staking",title:"Staking contract.",notice:"Pay-in and pay-out function for staking and withdrawing tokens. Staking is delegated and vested: To gain voting power, SOV holders must stake their SOV for a given period of time. Aside from Bitocracy participation, there's a financially-rewarding reason for staking SOV. Tokenholders who stake their SOV receive staking rewards, a pro-rata share of the revenue that the platform generates from various transaction fees plus revenues from stakers who have a portion of their SOV slashed for early unstaking.",events:{"AdminAdded(address)":{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"admin",type:"address"}],name:"AdminAdded",type:"event"},"AdminRemoved(address)":{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"admin",type:"address"}],name:"AdminRemoved",type:"event"},"ContractCodeHashAdded(bytes32)":{anonymous:!1,inputs:[{indexed:!1,internalType:"bytes32",name:"hash",type:"bytes32"}],name:"ContractCodeHashAdded",type:"event"},"ContractCodeHashRemoved(bytes32)":{anonymous:!1,inputs:[{indexed:!1,internalType:"bytes32",name:"hash",type:"bytes32"}],name:"ContractCodeHashRemoved",type:"event"},"DelegateChanged(address,uint256,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"delegator",type:"address"},{indexed:!1,internalType:"uint256",name:"lockedUntil",type:"uint256"},{indexed:!0,internalType:"address",name:"fromDelegate",type:"address"},{indexed:!0,internalType:"address",name:"toDelegate",type:"address"}],name:"DelegateChanged",type:"event"},"DelegateStakeChanged(address,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"delegate",type:"address"},{indexed:!1,internalType:"uint256",name:"lockedUntil",type:"uint256"},{indexed:!1,internalType:"uint256",name:"previousBalance",type:"uint256"},{indexed:!1,internalType:"uint256",name:"newBalance",type:"uint256"}],name:"DelegateStakeChanged",type:"event"},"ExtendedStakingDuration(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"staker",type:"address"},{indexed:!1,internalType:"uint256",name:"previousDate",type:"uint256"},{indexed:!1,internalType:"uint256",name:"newDate",type:"uint256"}],name:"ExtendedStakingDuration",type:"event"},"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},"TokensStaked(address,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"staker",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"lockedUntil",type:"uint256"},{indexed:!1,internalType:"uint256",name:"totalStaked",type:"uint256"}],name:"TokensStaked",type:"event"},"TokensUnlocked(uint256)":{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"TokensUnlocked",type:"event"},"TokensWithdrawn(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"staker",type:"address"},{indexed:!1,internalType:"address",name:"receiver",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"TokensWithdrawn",type:"event"},"VestingTokensWithdrawn(address,address)":{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"vesting",type:"address"},{indexed:!1,internalType:"address",name:"receiver",type:"address"}],name:"VestingTokensWithdrawn",type:"event"}},methods:{"DELEGATION_TYPEHASH()":{constant:!0,inputs:[],name:"DELEGATION_TYPEHASH",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],payable:!1,stateMutability:"view",type:"function"},"DOMAIN_TYPEHASH()":{constant:!0,inputs:[],name:"DOMAIN_TYPEHASH",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],payable:!1,stateMutability:"view",type:"function"},"MAX_DURATION()":{constant:!0,inputs:[],name:"MAX_DURATION",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"MAX_VOTING_WEIGHT()":{constant:!0,inputs:[],name:"MAX_VOTING_WEIGHT",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"SOVToken()":{constant:!0,inputs:[],name:"SOVToken",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"WEIGHT_FACTOR()":{constant:!0,inputs:[],name:"WEIGHT_FACTOR",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"addAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_admin",type:"address"}],name:"addAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_admin:"The addresses of the account to grant permissions."},notice:"Add account to ACL."},"addContractCodeHash(address)":{constant:!1,inputs:[{internalType:"address",name:"vesting",type:"address"}],name:"addContractCodeHash",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"We need it to use _isVestingContract() function instead of isContract()",params:{vesting:"The address of Vesting contract."},notice:"Add vesting contract's code hash to a map of code hashes."},"admins(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"admins",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"allUnlocked()":{constant:!0,inputs:[],name:"allUnlocked",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint96",name:"balance",type:"uint96"}],payable:!1,stateMutability:"view",type:"function",details:"Iterate checkpoints adding up stakes.",params:{account:"The address of the account to get the balance of."},return:"The number of tokens held.",notice:"Get the number of staked tokens held by the user account."},"computeWeightByDate(uint256,uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"date",type:"uint256"},{internalType:"uint256",name:"startDate",type:"uint256"}],name:"computeWeightByDate",outputs:[{internalType:"uint96",name:"weight",type:"uint96"}],payable:!1,stateMutability:"pure",type:"function",params:{date:"The unlocking date.",startDate:"We compute the weight for the tokens staked until 'date' on 'startDate'."},notice:"Compute the weight for a specific date."},"delegate(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"delegatee",type:"address"},{internalType:"uint256",name:"lockDate",type:"uint256"}],name:"delegate",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{delegatee:"The address to delegate votes to.",lockDate:"the date if the position to delegate."},notice:"Delegate votes from `msg.sender` which are locked until lockDate to `delegatee`."},"delegateBySig(address,uint256,uint256,uint256,uint8,bytes32,bytes32)":{constant:!1,inputs:[{internalType:"address",name:"delegatee",type:"address"},{internalType:"uint256",name:"lockDate",type:"uint256"},{internalType:"uint256",name:"nonce",type:"uint256"},{internalType:"uint256",name:"expiry",type:"uint256"},{internalType:"uint8",name:"v",type:"uint8"},{internalType:"bytes32",name:"r",type:"bytes32"},{internalType:"bytes32",name:"s",type:"bytes32"}],name:"delegateBySig",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"The signature needs to be broken up into 3 parameters, known as v, r and s: const r = '0x' + sig.substring(2).substring(0, 64); const s = '0x' + sig.substring(2).substring(64, 128); const v = '0x' + sig.substring(2).substring(128, 130);",params:{delegatee:"The address to delegate votes to.",expiry:"The time at which to expire the signature.",lockDate:"The date until which the position is locked.",nonce:"The contract state required to match the signature.",r:"Half of the ECDSA signature pair.",s:"Half of the ECDSA signature pair.",v:"The recovery byte of the signature."},notice:"Delegates votes from signatory to a delegatee account. Voting with EIP-712 Signatures.\t * Voting power can be delegated to any address, and then can be used to vote on proposals. A key benefit to users of by-signature functionality is that they can create a signed vote transaction for free, and have a trusted third-party spend rBTC(or ETH) on gas fees and write it to the blockchain for them.\t * The third party in this scenario, submitting the SOV-holder’s signed transaction holds a voting power that is for only a single proposal. The signatory still holds the power to vote on their own behalf in the proposal if the third party has not yet published the signed transaction that was given to them."},"delegateStakingCheckpoints(address,uint256,uint32)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint32",name:"",type:"uint32"}],name:"delegateStakingCheckpoints",outputs:[{internalType:"uint32",name:"fromBlock",type:"uint32"},{internalType:"uint96",name:"stake",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"delegates(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],name:"delegates",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"extendStakingDuration(uint256,uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"previousLock",type:"uint256"},{internalType:"uint256",name:"until",type:"uint256"}],name:"extendStakingDuration",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{previousLock:"The old unlocking timestamp.",until:"The new unlocking timestamp in seconds."},notice:"Extend the staking duration until the specified date."},"feeSharing()":{constant:!0,inputs:[],name:"feeSharing",outputs:[{internalType:"contract IFeeSharingProxy",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"getCurrentStakedUntil(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"lockedTS",type:"uint256"}],name:"getCurrentStakedUntil",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function",params:{lockedTS:"The timestamp to get the staked tokens for."},notice:"Get the current number of tokens staked for a day."},"getCurrentVotes(address)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"}],name:"getCurrentVotes",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function",details:"This is a wrapper to simplify arguments. The actual computation is performed on WeightedStaking parent contract.",params:{account:"The address to get votes balance."},return:"The number of current votes for a user account.",notice:"Get the current votes balance for a user account."},"getPriorStakeByDateForDelegatee(address,uint256,uint256)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"date",type:"uint256"},{internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"getPriorStakeByDateForDelegatee",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function",details:"Block number must be a finalized block or else this function will revert to prevent misinformation. TODO: WeightedStaking::getPriorStakeByDateForDelegatee should probably better be internal instead of a public function.",params:{account:"The address of the account to check.",blockNumber:"The block number to get the vote balance at."},return:"The number of votes the account had as of the given block.",notice:"Determine the prior number of stake for an account as of a block number."},"getPriorTotalStakesForDate(uint256,uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"date",type:"uint256"},{internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"getPriorTotalStakesForDate",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function",details:"Block number must be a finalized block or else this function will revert to prevent misinformation. TODO: WeightedStaking::getPriorTotalStakesForDate should probably better be internal instead of a public function.",params:{blockNumber:"The block number to get the vote balance at.",date:"The date to check the stakes for."},return:"The number of votes the account had as of the given block.",notice:"Determine the prior number of stake for an unlocking date as of a block number."},"getPriorTotalVotingPower(uint32,uint256)":{constant:!0,inputs:[{internalType:"uint32",name:"blockNumber",type:"uint32"},{internalType:"uint256",name:"time",type:"uint256"}],name:"getPriorTotalVotingPower",outputs:[{internalType:"uint96",name:"totalVotingPower",type:"uint96"}],payable:!1,stateMutability:"view",type:"function",params:{time:"The timestamp for which to calculate the total voting power."},return:"The total voting power at the given time.",notice:"Compute the total voting power at a given time."},"getPriorUserStakeByDate(address,uint256,uint256)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"date",type:"uint256"},{internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"getPriorUserStakeByDate",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function",details:"Block number must be a finalized block or else this function will revert to prevent misinformation.",params:{account:"The address of the account to check.",blockNumber:"The block number to get the vote balance at.",date:"The lock date."},return:"The number of votes the account had as of the given block.",notice:"Determine the prior number of stake for an account until a certain lock date as of a block number."},"getPriorVotes(address,uint256,uint256)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"blockNumber",type:"uint256"},{internalType:"uint256",name:"date",type:"uint256"}],name:"getPriorVotes",outputs:[{internalType:"uint96",name:"votes",type:"uint96"}],payable:!1,stateMutability:"view",type:"function",details:"Block number must be a finalized block or else this function will revert to prevent misinformation. Used for Voting, not for fee sharing.",params:{account:"The address of the account to check.",blockNumber:"The block number to get the vote balance at."},return:"The number of votes the delegatee had as of the given block.",notice:"Determine the prior number of votes for a delegatee as of a block number. Iterate through checkpoints adding up voting power."},"getPriorWeightedStake(address,uint256,uint256)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"blockNumber",type:"uint256"},{internalType:"uint256",name:"date",type:"uint256"}],name:"getPriorWeightedStake",outputs:[{internalType:"uint96",name:"votes",type:"uint96"}],payable:!1,stateMutability:"view",type:"function",details:'Block number must be a finalized block or else this function will revert to prevent misinformation. Used for fee sharing, not voting. TODO: WeightedStaking::getPriorWeightedStake is using the variable name "votes" to add up token stake, and that could be misleading.',params:{account:"The address of the account to check.",blockNumber:"The block number to get the vote balance at."},return:"The weighted stake the account had as of the given block.",notice:"Determine the prior weighted stake for an account as of a block number. Iterate through checkpoints adding up voting power."},"getStakes(address)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"}],name:"getStakes",outputs:[{internalType:"uint256[]",name:"dates",type:"uint256[]"},{internalType:"uint96[]",name:"stakes",type:"uint96[]"}],payable:!1,stateMutability:"view",type:"function",params:{account:"The address to get stakes."},return:"The arrays of dates and stakes.",notice:"Get list of stakes for a user account."},"getWithdrawAmounts(uint96,uint256)":{constant:!0,inputs:[{internalType:"uint96",name:"amount",type:"uint96"},{internalType:"uint256",name:"until",type:"uint256"}],name:"getWithdrawAmounts",outputs:[{internalType:"uint96",name:"",type:"uint96"},{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function",params:{amount:"The number of tokens to withdraw.",until:"The date until which the tokens were staked."},notice:"Get available and punished amount for withdrawing."},"governanceWithdraw(uint96,uint256,address)":{constant:!1,inputs:[{internalType:"uint96",name:"amount",type:"uint96"},{internalType:"uint256",name:"until",type:"uint256"},{internalType:"address",name:"receiver",type:"address"}],name:"governanceWithdraw",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Can be invoked only by whitelisted contract passed to governanceWithdrawVesting",params:{amount:"The number of tokens to withdraw.",receiver:"The receiver of the tokens. If not specified, send to the msg.sender",until:"The date until which the tokens were staked."},notice:"Withdraw the given amount of tokens."},"governanceWithdrawVesting(address,address)":{constant:!1,inputs:[{internalType:"address",name:"vesting",type:"address"},{internalType:"address",name:"receiver",type:"address"}],name:"governanceWithdrawVesting",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Can be invoked only by whitelisted contract passed to governanceWithdrawVesting.",params:{receiver:"The receiver of the tokens. If not specified, send to the msg.sender",vesting:"The address of Vesting contract."},notice:"Withdraw tokens for vesting contract."},"isOwner()":{constant:!0,inputs:[],name:"isOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"Returns true if the caller is the current owner."},"kickoffTS()":{constant:!0,inputs:[],name:"kickoffTS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"migrateToNewStakingContract()":{constant:!1,inputs:[],name:"migrateToNewStakingContract",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Staking contract needs to be set before by the owner. Currently not implemented, just needed for the interface. In case it's needed at some point in the future, the implementation needs to be changed first.",notice:"Allow a staker to migrate his positions to the new staking contract."},"newStakingContract()":{constant:!0,inputs:[],name:"newStakingContract",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"nonces(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"nonces",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"numDelegateStakingCheckpoints(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],name:"numDelegateStakingCheckpoints",outputs:[{internalType:"uint32",name:"",type:"uint32"}],payable:!1,stateMutability:"view",type:"function"},"numTotalStakingCheckpoints(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"numTotalStakingCheckpoints",outputs:[{internalType:"uint32",name:"",type:"uint32"}],payable:!1,stateMutability:"view",type:"function"},"numUserStakingCheckpoints(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],name:"numUserStakingCheckpoints",outputs:[{internalType:"uint32",name:"",type:"uint32"}],payable:!1,stateMutability:"view",type:"function"},"owner()":{constant:!0,inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address of the current owner."},"receiveApproval(address,uint256,address,bytes)":{constant:!1,inputs:[{internalType:"address",name:"_sender",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"address",name:"_token",type:"address"},{internalType:"bytes",name:"_data",type:"bytes"}],name:"receiveApproval",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_data:"The data will be used for low level call."},notice:"Receives approval from SOV token."},"removeAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_admin",type:"address"}],name:"removeAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_admin:"The addresses of the account to revoke permissions."},notice:"Remove account from ACL."},"removeContractCodeHash(address)":{constant:!1,inputs:[{internalType:"address",name:"vesting",type:"address"}],name:"removeContractCodeHash",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"We need it to use _isVestingContract() function instead of isContract()",params:{vesting:"The address of Vesting contract."},notice:"Add vesting contract's code hash to a map of code hashes."},"setFeeSharing(address)":{constant:!1,inputs:[{internalType:"address",name:"_feeSharing",type:"address"}],name:"setFeeSharing",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_feeSharing:"The address of FeeSharingProxy contract."},notice:"Allow the owner to set a fee sharing proxy contract. We need it for unstaking with slashing."},"setNewStakingContract(address)":{constant:!1,inputs:[{internalType:"address",name:"_newStakingContract",type:"address"}],name:"setNewStakingContract",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Doesn't have any influence as long as migrateToNewStakingContract is not implemented.",params:{_newStakingContract:"The address of the new staking contract."},notice:"Allow the owner to set a new staking contract. As a consequence it allows the stakers to migrate their positions to the new contract."},"setWeightScaling(uint96)":{constant:!1,inputs:[{internalType:"uint96",name:"_weightScaling",type:"uint96"}],name:"setWeightScaling",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_weightScaling:"The weight scaling."},notice:"Allow the owner to set weight scaling. We need it for unstaking with slashing."},"stake(uint96,uint256,address,address)":{constant:!1,inputs:[{internalType:"uint96",name:"amount",type:"uint96"},{internalType:"uint256",name:"until",type:"uint256"},{internalType:"address",name:"stakeFor",type:"address"},{internalType:"address",name:"delegatee",type:"address"}],name:"stake",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{amount:"The number of tokens to stake.",delegatee:"The address of the delegatee or 0x0 if there is none.",stakeFor:"The address to stake the tokens for or 0x0 if staking for oneself.",until:"Timestamp indicating the date until which to stake."},notice:"Stake the given amount for the given duration of time."},"stakeWithApproval(address,uint96,uint256,address,address)":{constant:!1,inputs:[{internalType:"address",name:"sender",type:"address"},{internalType:"uint96",name:"amount",type:"uint96"},{internalType:"uint256",name:"until",type:"uint256"},{internalType:"address",name:"stakeFor",type:"address"},{internalType:"address",name:"delegatee",type:"address"}],name:"stakeWithApproval",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"This function will be invoked from receiveApprovalSOV.approveAndCall -> this.receiveApproval -> this.stakeWithApproval",params:{amount:"The number of tokens to stake.",delegatee:"The address of the delegatee or 0x0 if there is none.",sender:"The sender of SOV.approveAndCall",stakeFor:"The address to stake the tokens for or 0x0 if staking for oneself.",until:"Timestamp indicating the date until which to stake."},notice:"Stake the given amount for the given duration of time."},"stakesBySchedule(uint256,uint256,uint256,uint256,address,address)":{constant:!1,inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"cliff",type:"uint256"},{internalType:"uint256",name:"duration",type:"uint256"},{internalType:"uint256",name:"intervalLength",type:"uint256"},{internalType:"address",name:"stakeFor",type:"address"},{internalType:"address",name:"delegatee",type:"address"}],name:"stakesBySchedule",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{amount:"The amount of tokens to stake.",cliff:"The time interval to the first withdraw.",delegatee:"The address of the delegatee or 0x0 if there is none.",duration:"The staking duration.",intervalLength:"The length of each staking interval when cliff passed.",stakeFor:"The address to stake the tokens for or 0x0 if staking for oneself."},notice:"Stake tokens according to the vesting schedule."},"timestampToLockDate(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"timestamp",type:"uint256"}],name:"timestampToLockDate",outputs:[{internalType:"uint256",name:"lockDate",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{timestamp:"The unlocking timestamp."},return:"The actual unlocking date (might be up to 2 weeks shorter than intended).",notice:"Unstaking is possible every 2 weeks only. This means, to calculate the key value for the staking checkpoints, we need to map the intended timestamp to the closest available date."},"totalStakingCheckpoints(uint256,uint32)":{constant:!0,inputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint32",name:"",type:"uint32"}],name:"totalStakingCheckpoints",outputs:[{internalType:"uint32",name:"fromBlock",type:"uint32"},{internalType:"uint96",name:"stake",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"transferOwnership(address)":{constant:!1,inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"unlockAllTokens()":{constant:!1,inputs:[],name:"unlockAllTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Last resort.",notice:"Allow the owner to unlock all tokens in case the staking contract is going to be replaced Note: Not reversible on purpose. once unlocked, everything is unlocked. The owner should not be able to just quickly unlock to withdraw his own tokens and lock again."},"userStakingCheckpoints(address,uint256,uint32)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint32",name:"",type:"uint32"}],name:"userStakingCheckpoints",outputs:[{internalType:"uint32",name:"fromBlock",type:"uint32"},{internalType:"uint96",name:"stake",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"vestingCodeHashes(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"",type:"bytes32"}],name:"vestingCodeHashes",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"vestingWhitelist(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"vestingWhitelist",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"weightScaling()":{constant:!0,inputs:[],name:"weightScaling",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"weightedStakeByDate(address,uint256,uint256,uint256)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"date",type:"uint256"},{internalType:"uint256",name:"startDate",type:"uint256"},{internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"weightedStakeByDate",outputs:[{internalType:"uint96",name:"power",type:"uint96"}],payable:!1,stateMutability:"view",type:"function",params:{blockNumber:"The block number, needed for checkpointing.",date:"The staking date to compute the power for.",startDate:"The date for which we need to know the power of the stake."},notice:"Compute the voting power for a specific date. Power = stake * weight TODO: WeightedStaking::weightedStakeByDate should probably better be internal instead of a public function."},"withdraw(uint96,uint256,address)":{constant:!1,inputs:[{internalType:"uint96",name:"amount",type:"uint96"},{internalType:"uint256",name:"until",type:"uint256"},{internalType:"address",name:"receiver",type:"address"}],name:"withdraw",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{amount:"The number of tokens to withdraw.",receiver:"The receiver of the tokens. If not specified, send to the msg.sender",until:"The date until which the tokens were staked."},notice:"Withdraw the given amount of tokens if they are unlocked."}}},"contracts/Sovryn/Governance/Staking/StakingProxy.sol:StakingProxy":{source:"contracts/Sovryn/Governance/Staking/StakingProxy.sol",name:"StakingProxy",title:"Staking Proxy contract.",details:"Staking contract should be upgradable, use UpgradableProxy. StakingStorage is deployed with the upgradable functionality by using this contract instead, that inherits from UpgradableProxy the possibility of being enhanced and re-deployed.",constructor:{inputs:[{internalType:"address",name:"SOV",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},fallback:{payable:!0,stateMutability:"payable",type:"fallback"},events:{"ImplementationChanged(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_oldImplementation",type:"address"},{indexed:!0,internalType:"address",name:"_newImplementation",type:"address"}],name:"ImplementationChanged",type:"event"},"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_oldOwner",type:"address"},{indexed:!0,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"}},methods:{"DELEGATION_TYPEHASH()":{constant:!0,inputs:[],name:"DELEGATION_TYPEHASH",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],payable:!1,stateMutability:"view",type:"function"},"DOMAIN_TYPEHASH()":{constant:!0,inputs:[],name:"DOMAIN_TYPEHASH",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],payable:!1,stateMutability:"view",type:"function"},"MAX_DURATION()":{constant:!0,inputs:[],name:"MAX_DURATION",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"MAX_VOTING_WEIGHT()":{constant:!0,inputs:[],name:"MAX_VOTING_WEIGHT",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"SOVToken()":{constant:!0,inputs:[],name:"SOVToken",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"WEIGHT_FACTOR()":{constant:!0,inputs:[],name:"WEIGHT_FACTOR",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"admins(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"admins",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"allUnlocked()":{constant:!0,inputs:[],name:"allUnlocked",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"delegateStakingCheckpoints(address,uint256,uint32)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint32",name:"",type:"uint32"}],name:"delegateStakingCheckpoints",outputs:[{internalType:"uint32",name:"fromBlock",type:"uint32"},{internalType:"uint96",name:"stake",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"delegates(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],name:"delegates",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"feeSharing()":{constant:!0,inputs:[],name:"feeSharing",outputs:[{internalType:"contract IFeeSharingProxy",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"getImplementation()":{constant:!0,inputs:[],name:"getImplementation",outputs:[{internalType:"address",name:"_implementation",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of the implementation.",notice:"Return address of the implementation."},"getProxyOwner()":{constant:!0,inputs:[],name:"getProxyOwner",outputs:[{internalType:"address",name:"_owner",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of the owner.",notice:"Return address of the owner."},"isOwner()":{constant:!0,inputs:[],name:"isOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"Returns true if the caller is the current owner."},"kickoffTS()":{constant:!0,inputs:[],name:"kickoffTS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"newStakingContract()":{constant:!0,inputs:[],name:"newStakingContract",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"nonces(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"nonces",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"numDelegateStakingCheckpoints(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],name:"numDelegateStakingCheckpoints",outputs:[{internalType:"uint32",name:"",type:"uint32"}],payable:!1,stateMutability:"view",type:"function"},"numTotalStakingCheckpoints(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"numTotalStakingCheckpoints",outputs:[{internalType:"uint32",name:"",type:"uint32"}],payable:!1,stateMutability:"view",type:"function"},"numUserStakingCheckpoints(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],name:"numUserStakingCheckpoints",outputs:[{internalType:"uint32",name:"",type:"uint32"}],payable:!1,stateMutability:"view",type:"function"},"owner()":{constant:!0,inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address of the current owner."},"setImplementation(address)":{constant:!1,inputs:[{internalType:"address",name:"_implementation",type:"address"}],name:"setImplementation",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Wrapper for _setImplementation that exposes the function as public for owner to be able to set a new version of the contract as current pointing implementation.",params:{_implementation:"Address of the implementation."},notice:"Set address of the implementation."},"setProxyOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_owner",type:"address"}],name:"setProxyOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_owner:"Address of the owner."},notice:"Set address of the owner."},"totalStakingCheckpoints(uint256,uint32)":{constant:!0,inputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint32",name:"",type:"uint32"}],name:"totalStakingCheckpoints",outputs:[{internalType:"uint32",name:"fromBlock",type:"uint32"},{internalType:"uint96",name:"stake",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"transferOwnership(address)":{constant:!1,inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"userStakingCheckpoints(address,uint256,uint32)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint32",name:"",type:"uint32"}],name:"userStakingCheckpoints",outputs:[{internalType:"uint32",name:"fromBlock",type:"uint32"},{internalType:"uint96",name:"stake",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"vestingCodeHashes(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"",type:"bytes32"}],name:"vestingCodeHashes",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"vestingWhitelist(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"vestingWhitelist",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"weightScaling()":{constant:!0,inputs:[],name:"weightScaling",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"}}},"contracts/Sovryn/Governance/Staking/StakingStorage.sol:StakingStorage":{source:"contracts/Sovryn/Governance/Staking/StakingStorage.sol",name:"StakingStorage",title:"Staking Storage contact.",notice:"Just the storage part of stacking contract, no functions, only constant, variables and required structures (mappings). Used by StackingProxy and Checkpoints contracts. * What is SOV staking? The purpose of the SOV token is to provide a pseudonymous, censorship-resistant mechanism for governing the parameters of the Sovryn protocol, while aligning the incentives of protocol governors with the long-term success of the protocol. Any SOV token holder can choose to stake (lock up) their tokens for a fixed period of time in return for voting rights in the Bitocracy. Stakers are further incentivised through fee and slashing rewards.",events:{"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"}},methods:{"DELEGATION_TYPEHASH()":{constant:!0,inputs:[],name:"DELEGATION_TYPEHASH",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],payable:!1,stateMutability:"view",type:"function"},"DOMAIN_TYPEHASH()":{constant:!0,inputs:[],name:"DOMAIN_TYPEHASH",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],payable:!1,stateMutability:"view",type:"function"},"MAX_DURATION()":{constant:!0,inputs:[],name:"MAX_DURATION",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"MAX_VOTING_WEIGHT()":{constant:!0,inputs:[],name:"MAX_VOTING_WEIGHT",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"SOVToken()":{constant:!0,inputs:[],name:"SOVToken",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"WEIGHT_FACTOR()":{constant:!0,inputs:[],name:"WEIGHT_FACTOR",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"admins(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"admins",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"allUnlocked()":{constant:!0,inputs:[],name:"allUnlocked",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"delegateStakingCheckpoints(address,uint256,uint32)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint32",name:"",type:"uint32"}],name:"delegateStakingCheckpoints",outputs:[{internalType:"uint32",name:"fromBlock",type:"uint32"},{internalType:"uint96",name:"stake",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"delegates(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],name:"delegates",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"feeSharing()":{constant:!0,inputs:[],name:"feeSharing",outputs:[{internalType:"contract IFeeSharingProxy",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"isOwner()":{constant:!0,inputs:[],name:"isOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"Returns true if the caller is the current owner."},"kickoffTS()":{constant:!0,inputs:[],name:"kickoffTS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"newStakingContract()":{constant:!0,inputs:[],name:"newStakingContract",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"nonces(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"nonces",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"numDelegateStakingCheckpoints(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],name:"numDelegateStakingCheckpoints",outputs:[{internalType:"uint32",name:"",type:"uint32"}],payable:!1,stateMutability:"view",type:"function"},"numTotalStakingCheckpoints(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"numTotalStakingCheckpoints",outputs:[{internalType:"uint32",name:"",type:"uint32"}],payable:!1,stateMutability:"view",type:"function"},"numUserStakingCheckpoints(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],name:"numUserStakingCheckpoints",outputs:[{internalType:"uint32",name:"",type:"uint32"}],payable:!1,stateMutability:"view",type:"function"},"owner()":{constant:!0,inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address of the current owner."},"totalStakingCheckpoints(uint256,uint32)":{constant:!0,inputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint32",name:"",type:"uint32"}],name:"totalStakingCheckpoints",outputs:[{internalType:"uint32",name:"fromBlock",type:"uint32"},{internalType:"uint96",name:"stake",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"transferOwnership(address)":{constant:!1,inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"userStakingCheckpoints(address,uint256,uint32)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint32",name:"",type:"uint32"}],name:"userStakingCheckpoints",outputs:[{internalType:"uint32",name:"fromBlock",type:"uint32"},{internalType:"uint96",name:"stake",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"vestingCodeHashes(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"",type:"bytes32"}],name:"vestingCodeHashes",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"vestingWhitelist(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"vestingWhitelist",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"weightScaling()":{constant:!0,inputs:[],name:"weightScaling",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"}}},"contracts/Sovryn/Governance/Staking/WeightedStaking.sol:WeightedStaking":{source:"contracts/Sovryn/Governance/Staking/WeightedStaking.sol",name:"WeightedStaking",title:"Weighted Staking contract.",notice:"Computation of power and votes used by FeeSharingProxy and GovernorAlpha and Staking contracts w/ mainly 3 public functions: + getPriorTotalVotingPower => Total voting power. + getPriorVotes => Delegatee voting power. + getPriorWeightedStake => User Weighted Stake. Staking contract inherits WeightedStaking. FeeSharingProxy and GovernorAlpha invoke Staking instance functions.",events:{"AdminAdded(address)":{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"admin",type:"address"}],name:"AdminAdded",type:"event"},"AdminRemoved(address)":{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"admin",type:"address"}],name:"AdminRemoved",type:"event"},"ContractCodeHashAdded(bytes32)":{anonymous:!1,inputs:[{indexed:!1,internalType:"bytes32",name:"hash",type:"bytes32"}],name:"ContractCodeHashAdded",type:"event"},"ContractCodeHashRemoved(bytes32)":{anonymous:!1,inputs:[{indexed:!1,internalType:"bytes32",name:"hash",type:"bytes32"}],name:"ContractCodeHashRemoved",type:"event"},"DelegateChanged(address,uint256,address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"delegator",type:"address"},{indexed:!1,internalType:"uint256",name:"lockedUntil",type:"uint256"},{indexed:!0,internalType:"address",name:"fromDelegate",type:"address"},{indexed:!0,internalType:"address",name:"toDelegate",type:"address"}],name:"DelegateChanged",type:"event"},"DelegateStakeChanged(address,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"delegate",type:"address"},{indexed:!1,internalType:"uint256",name:"lockedUntil",type:"uint256"},{indexed:!1,internalType:"uint256",name:"previousBalance",type:"uint256"},{indexed:!1,internalType:"uint256",name:"newBalance",type:"uint256"}],name:"DelegateStakeChanged",type:"event"},"ExtendedStakingDuration(address,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"staker",type:"address"},{indexed:!1,internalType:"uint256",name:"previousDate",type:"uint256"},{indexed:!1,internalType:"uint256",name:"newDate",type:"uint256"}],name:"ExtendedStakingDuration",type:"event"},"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},"TokensStaked(address,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"staker",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"lockedUntil",type:"uint256"},{indexed:!1,internalType:"uint256",name:"totalStaked",type:"uint256"}],name:"TokensStaked",type:"event"},"TokensUnlocked(uint256)":{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"TokensUnlocked",type:"event"},"TokensWithdrawn(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"staker",type:"address"},{indexed:!1,internalType:"address",name:"receiver",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"TokensWithdrawn",type:"event"},"VestingTokensWithdrawn(address,address)":{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"vesting",type:"address"},{indexed:!1,internalType:"address",name:"receiver",type:"address"}],name:"VestingTokensWithdrawn",type:"event"}},methods:{"DELEGATION_TYPEHASH()":{constant:!0,inputs:[],name:"DELEGATION_TYPEHASH",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],payable:!1,stateMutability:"view",type:"function"},"DOMAIN_TYPEHASH()":{constant:!0,inputs:[],name:"DOMAIN_TYPEHASH",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],payable:!1,stateMutability:"view",type:"function"},"MAX_DURATION()":{constant:!0,inputs:[],name:"MAX_DURATION",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"MAX_VOTING_WEIGHT()":{constant:!0,inputs:[],name:"MAX_VOTING_WEIGHT",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"SOVToken()":{constant:!0,inputs:[],name:"SOVToken",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"WEIGHT_FACTOR()":{constant:!0,inputs:[],name:"WEIGHT_FACTOR",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"addAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_admin",type:"address"}],name:"addAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_admin:"The addresses of the account to grant permissions."},notice:"Add account to ACL."},"addContractCodeHash(address)":{constant:!1,inputs:[{internalType:"address",name:"vesting",type:"address"}],name:"addContractCodeHash",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"We need it to use _isVestingContract() function instead of isContract()",params:{vesting:"The address of Vesting contract."},notice:"Add vesting contract's code hash to a map of code hashes."},"admins(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"admins",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"allUnlocked()":{constant:!0,inputs:[],name:"allUnlocked",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"computeWeightByDate(uint256,uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"date",type:"uint256"},{internalType:"uint256",name:"startDate",type:"uint256"}],name:"computeWeightByDate",outputs:[{internalType:"uint96",name:"weight",type:"uint96"}],payable:!1,stateMutability:"pure",type:"function",params:{date:"The unlocking date.",startDate:"We compute the weight for the tokens staked until 'date' on 'startDate'."},notice:"Compute the weight for a specific date."},"delegateStakingCheckpoints(address,uint256,uint32)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint32",name:"",type:"uint32"}],name:"delegateStakingCheckpoints",outputs:[{internalType:"uint32",name:"fromBlock",type:"uint32"},{internalType:"uint96",name:"stake",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"delegates(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],name:"delegates",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"feeSharing()":{constant:!0,inputs:[],name:"feeSharing",outputs:[{internalType:"contract IFeeSharingProxy",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"getPriorStakeByDateForDelegatee(address,uint256,uint256)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"date",type:"uint256"},{internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"getPriorStakeByDateForDelegatee",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function",details:"Block number must be a finalized block or else this function will revert to prevent misinformation. TODO: WeightedStaking::getPriorStakeByDateForDelegatee should probably better be internal instead of a public function.",params:{account:"The address of the account to check.",blockNumber:"The block number to get the vote balance at."},return:"The number of votes the account had as of the given block.",notice:"Determine the prior number of stake for an account as of a block number."},"getPriorTotalStakesForDate(uint256,uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"date",type:"uint256"},{internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"getPriorTotalStakesForDate",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function",details:"Block number must be a finalized block or else this function will revert to prevent misinformation. TODO: WeightedStaking::getPriorTotalStakesForDate should probably better be internal instead of a public function.",params:{blockNumber:"The block number to get the vote balance at.",date:"The date to check the stakes for."},return:"The number of votes the account had as of the given block.",notice:"Determine the prior number of stake for an unlocking date as of a block number."},"getPriorTotalVotingPower(uint32,uint256)":{constant:!0,inputs:[{internalType:"uint32",name:"blockNumber",type:"uint32"},{internalType:"uint256",name:"time",type:"uint256"}],name:"getPriorTotalVotingPower",outputs:[{internalType:"uint96",name:"totalVotingPower",type:"uint96"}],payable:!1,stateMutability:"view",type:"function",params:{time:"The timestamp for which to calculate the total voting power."},return:"The total voting power at the given time.",notice:"Compute the total voting power at a given time."},"getPriorUserStakeByDate(address,uint256,uint256)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"date",type:"uint256"},{internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"getPriorUserStakeByDate",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function",details:"Block number must be a finalized block or else this function will revert to prevent misinformation.",params:{account:"The address of the account to check.",blockNumber:"The block number to get the vote balance at.",date:"The lock date."},return:"The number of votes the account had as of the given block.",notice:"Determine the prior number of stake for an account until a certain lock date as of a block number."},"getPriorVotes(address,uint256,uint256)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"blockNumber",type:"uint256"},{internalType:"uint256",name:"date",type:"uint256"}],name:"getPriorVotes",outputs:[{internalType:"uint96",name:"votes",type:"uint96"}],payable:!1,stateMutability:"view",type:"function",details:"Block number must be a finalized block or else this function will revert to prevent misinformation. Used for Voting, not for fee sharing.",params:{account:"The address of the account to check.",blockNumber:"The block number to get the vote balance at."},return:"The number of votes the delegatee had as of the given block.",notice:"Determine the prior number of votes for a delegatee as of a block number. Iterate through checkpoints adding up voting power."},"getPriorWeightedStake(address,uint256,uint256)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"blockNumber",type:"uint256"},{internalType:"uint256",name:"date",type:"uint256"}],name:"getPriorWeightedStake",outputs:[{internalType:"uint96",name:"votes",type:"uint96"}],payable:!1,stateMutability:"view",type:"function",details:'Block number must be a finalized block or else this function will revert to prevent misinformation. Used for fee sharing, not voting. TODO: WeightedStaking::getPriorWeightedStake is using the variable name "votes" to add up token stake, and that could be misleading.',params:{account:"The address of the account to check.",blockNumber:"The block number to get the vote balance at."},return:"The weighted stake the account had as of the given block.",notice:"Determine the prior weighted stake for an account as of a block number. Iterate through checkpoints adding up voting power."},"isOwner()":{constant:!0,inputs:[],name:"isOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"Returns true if the caller is the current owner."},"kickoffTS()":{constant:!0,inputs:[],name:"kickoffTS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"newStakingContract()":{constant:!0,inputs:[],name:"newStakingContract",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"nonces(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"nonces",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"numDelegateStakingCheckpoints(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],name:"numDelegateStakingCheckpoints",outputs:[{internalType:"uint32",name:"",type:"uint32"}],payable:!1,stateMutability:"view",type:"function"},"numTotalStakingCheckpoints(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"numTotalStakingCheckpoints",outputs:[{internalType:"uint32",name:"",type:"uint32"}],payable:!1,stateMutability:"view",type:"function"},"numUserStakingCheckpoints(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],name:"numUserStakingCheckpoints",outputs:[{internalType:"uint32",name:"",type:"uint32"}],payable:!1,stateMutability:"view",type:"function"},"owner()":{constant:!0,inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address of the current owner."},"removeAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_admin",type:"address"}],name:"removeAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_admin:"The addresses of the account to revoke permissions."},notice:"Remove account from ACL."},"removeContractCodeHash(address)":{constant:!1,inputs:[{internalType:"address",name:"vesting",type:"address"}],name:"removeContractCodeHash",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"We need it to use _isVestingContract() function instead of isContract()",params:{vesting:"The address of Vesting contract."},notice:"Add vesting contract's code hash to a map of code hashes."},"timestampToLockDate(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"timestamp",type:"uint256"}],name:"timestampToLockDate",outputs:[{internalType:"uint256",name:"lockDate",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{timestamp:"The unlocking timestamp."},return:"The actual unlocking date (might be up to 2 weeks shorter than intended).",notice:"Unstaking is possible every 2 weeks only. This means, to calculate the key value for the staking checkpoints, we need to map the intended timestamp to the closest available date."},"totalStakingCheckpoints(uint256,uint32)":{constant:!0,inputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint32",name:"",type:"uint32"}],name:"totalStakingCheckpoints",outputs:[{internalType:"uint32",name:"fromBlock",type:"uint32"},{internalType:"uint96",name:"stake",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"transferOwnership(address)":{constant:!1,inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"userStakingCheckpoints(address,uint256,uint32)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint32",name:"",type:"uint32"}],name:"userStakingCheckpoints",outputs:[{internalType:"uint32",name:"fromBlock",type:"uint32"},{internalType:"uint96",name:"stake",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"vestingCodeHashes(bytes32)":{constant:!0,inputs:[{internalType:"bytes32",name:"",type:"bytes32"}],name:"vestingCodeHashes",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"vestingWhitelist(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"vestingWhitelist",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"weightScaling()":{constant:!0,inputs:[],name:"weightScaling",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"weightedStakeByDate(address,uint256,uint256,uint256)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"date",type:"uint256"},{internalType:"uint256",name:"startDate",type:"uint256"},{internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"weightedStakeByDate",outputs:[{internalType:"uint96",name:"power",type:"uint96"}],payable:!1,stateMutability:"view",type:"function",params:{blockNumber:"The block number, needed for checkpointing.",date:"The staking date to compute the power for.",startDate:"The date for which we need to know the power of the stake."},notice:"Compute the voting power for a specific date. Power = stake * weight TODO: WeightedStaking::weightedStakeByDate should probably better be internal instead of a public function."}}},"contracts/Sovryn/Governance/Vesting/TeamVesting.sol:TeamVesting":{source:"contracts/Sovryn/Governance/Vesting/TeamVesting.sol",name:"TeamVesting",title:"Team Vesting Contract.",details:"Vesting contracts shouldn't be upgradable, use Proxy instead of UpgradableProxy.",notice:"A regular vesting contract, but the owner (governance) is able to withdraw earlier without a slashing.",constructor:{inputs:[{internalType:"address",name:"_logic",type:"address"},{internalType:"address",name:"_SOV",type:"address"},{internalType:"address",name:"_stakingAddress",type:"address"},{internalType:"address",name:"_tokenOwner",type:"address"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"},{internalType:"address",name:"_feeSharingProxy",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},fallback:{payable:!0,stateMutability:"payable",type:"fallback"},events:{"ImplementationChanged(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_oldImplementation",type:"address"},{indexed:!0,internalType:"address",name:"_newImplementation",type:"address"}],name:"ImplementationChanged",type:"event"},"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_oldOwner",type:"address"},{indexed:!0,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"}},methods:{"SOV()":{constant:!0,inputs:[],name:"SOV",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"cliff()":{constant:!0,inputs:[],name:"cliff",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"duration()":{constant:!0,inputs:[],name:"duration",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"endDate()":{constant:!0,inputs:[],name:"endDate",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"feeSharingProxy()":{constant:!0,inputs:[],name:"feeSharingProxy",outputs:[{internalType:"contract IFeeSharingProxy",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"getImplementation()":{constant:!0,inputs:[],name:"getImplementation",outputs:[{internalType:"address",name:"_implementation",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of the implementation.",notice:"Return address of the implementation."},"getProxyOwner()":{constant:!0,inputs:[],name:"getProxyOwner",outputs:[{internalType:"address",name:"_owner",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of the owner.",notice:"Return address of the owner."},"isOwner()":{constant:!0,inputs:[],name:"isOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"Returns true if the caller is the current owner."},"owner()":{constant:!0,inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address of the current owner."},"staking()":{constant:!0,inputs:[],name:"staking",outputs:[{internalType:"contract Staking",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"startDate()":{constant:!0,inputs:[],name:"startDate",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"tokenOwner()":{constant:!0,inputs:[],name:"tokenOwner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"transferOwnership(address)":{constant:!1,inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}}},"contracts/Sovryn/Governance/Vesting/Vesting.sol:Vesting":{source:"contracts/Sovryn/Governance/Vesting/Vesting.sol",name:"Vesting",title:"Vesting Contract.",details:"TODO add tests for governanceWithdrawTokens.",notice:"Team tokens and investor tokens are vested. Therefore, a smart contract needs to be developed to enforce the vesting schedule.",constructor:{inputs:[{internalType:"address",name:"_logic",type:"address"},{internalType:"address",name:"_SOV",type:"address"},{internalType:"address",name:"_stakingAddress",type:"address"},{internalType:"address",name:"_tokenOwner",type:"address"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"},{internalType:"address",name:"_feeSharingProxy",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},fallback:{payable:!0,stateMutability:"payable",type:"fallback"},events:{"ImplementationChanged(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_oldImplementation",type:"address"},{indexed:!0,internalType:"address",name:"_newImplementation",type:"address"}],name:"ImplementationChanged",type:"event"},"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_oldOwner",type:"address"},{indexed:!0,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"}},methods:{"SOV()":{constant:!0,inputs:[],name:"SOV",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"cliff()":{constant:!0,inputs:[],name:"cliff",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"duration()":{constant:!0,inputs:[],name:"duration",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"endDate()":{constant:!0,inputs:[],name:"endDate",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"feeSharingProxy()":{constant:!0,inputs:[],name:"feeSharingProxy",outputs:[{internalType:"contract IFeeSharingProxy",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"getImplementation()":{constant:!0,inputs:[],name:"getImplementation",outputs:[{internalType:"address",name:"_implementation",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of the implementation.",notice:"Return address of the implementation."},"getProxyOwner()":{constant:!0,inputs:[],name:"getProxyOwner",outputs:[{internalType:"address",name:"_owner",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of the owner.",notice:"Return address of the owner."},"governanceWithdrawTokens(address)":{constant:!1,inputs:[{internalType:"address",name:"receiver",type:"address"}],name:"governanceWithdrawTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"We need to add this implementation to prevent proxy call VestingLogic.governanceWithdrawTokens",params:{receiver:"The receiver of the token withdrawal."}},"isOwner()":{constant:!0,inputs:[],name:"isOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"Returns true if the caller is the current owner."},"owner()":{constant:!0,inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address of the current owner."},"staking()":{constant:!0,inputs:[],name:"staking",outputs:[{internalType:"contract Staking",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"startDate()":{constant:!0,inputs:[],name:"startDate",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"tokenOwner()":{constant:!0,inputs:[],name:"tokenOwner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"transferOwnership(address)":{constant:!1,inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}}},"contracts/Sovryn/Governance/Vesting/VestingFactory.sol:VestingFactory":{source:"contracts/Sovryn/Governance/Vesting/VestingFactory.sol",name:"VestingFactory",title:"Vesting Factory: Contract to deploy vesting contracts of two types: vesting (TokenHolder) and team vesting (Multisig).",notice:"Factory pattern allows to create multiple instances of the same contract and keep track of them easier.",constructor:{inputs:[{internalType:"address",name:"_vestingLogic",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"}},methods:{"deployTeamVesting(address,address,address,uint256,uint256,address,address)":{constant:!1,inputs:[{internalType:"address",name:"_SOV",type:"address"},{internalType:"address",name:"_staking",type:"address"},{internalType:"address",name:"_tokenOwner",type:"address"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"},{internalType:"address",name:"_feeSharing",type:"address"},{internalType:"address",name:"_vestingOwner",type:"address"}],name:"deployTeamVesting",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"function",params:{_SOV:"The address of SOV token.",_cliff:"The time interval to the first withdraw in seconds.",_duration:"The total duration in seconds.",_feeSharing:"The address of fee sharing contract.",_staking:"The address of staking contract.",_tokenOwner:"The owner of the tokens.",_vestingOwner:"The address of an owner of vesting contract."},return:"The vesting contract address.",notice:"Deploys Team Vesting contract."},"deployVesting(address,address,address,uint256,uint256,address,address)":{constant:!1,inputs:[{internalType:"address",name:"_SOV",type:"address"},{internalType:"address",name:"_staking",type:"address"},{internalType:"address",name:"_tokenOwner",type:"address"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"},{internalType:"address",name:"_feeSharing",type:"address"},{internalType:"address",name:"_vestingOwner",type:"address"}],name:"deployVesting",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"function",params:{_SOV:"the address of SOV token.",_cliff:"The time interval to the first withdraw in seconds.",_duration:"The total duration in seconds.",_feeSharing:"The address of fee sharing contract.",_staking:"The address of staking contract.",_tokenOwner:"The owner of the tokens.",_vestingOwner:"The address of an owner of vesting contract."},return:"The vesting contract address.",notice:"Deploys Vesting contract."},"isOwner()":{constant:!0,inputs:[],name:"isOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"Returns true if the caller is the current owner."},"owner()":{constant:!0,inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address of the current owner."},"transferOwnership(address)":{constant:!1,inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"vestingLogic()":{constant:!0,inputs:[],name:"vestingLogic",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"}}},"contracts/Sovryn/Governance/Vesting/VestingLogic.sol:VestingLogic":{source:"contracts/Sovryn/Governance/Vesting/VestingLogic.sol",name:"VestingLogic",title:"Vesting Logic contract.",details:"Deployed by a VestingFactory contract.",notice:"Staking, delegating and withdrawal functionality.",events:{"DividendsCollected(address,address,address,uint32)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"caller",type:"address"},{indexed:!1,internalType:"address",name:"loanPoolToken",type:"address"},{indexed:!1,internalType:"address",name:"receiver",type:"address"},{indexed:!1,internalType:"uint32",name:"maxCheckpoints",type:"uint32"}],name:"DividendsCollected",type:"event"},"MigratedToNewStakingContract(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"caller",type:"address"},{indexed:!1,internalType:"address",name:"newStakingContract",type:"address"}],name:"MigratedToNewStakingContract",type:"event"},"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},"TokensStaked(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"caller",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"TokensStaked",type:"event"},"TokensWithdrawn(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"caller",type:"address"},{indexed:!1,internalType:"address",name:"receiver",type:"address"}],name:"TokensWithdrawn",type:"event"},"VotesDelegated(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"caller",type:"address"},{indexed:!1,internalType:"address",name:"delegatee",type:"address"}],name:"VotesDelegated",type:"event"}},methods:{"SOV()":{constant:!0,inputs:[],name:"SOV",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"cliff()":{constant:!0,inputs:[],name:"cliff",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"collectDividends(address,uint32,address)":{constant:!1,inputs:[{internalType:"address",name:"_loanPoolToken",type:"address"},{internalType:"uint32",name:"_maxCheckpoints",type:"uint32"},{internalType:"address",name:"_receiver",type:"address"}],name:"collectDividends",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_loanPoolToken:"The loan pool token address.",_maxCheckpoints:"Maximum number of checkpoints to be processed.",_receiver:"The receiver of tokens or msg.sender"},notice:"Collect dividends from fee sharing proxy."},"delegate(address)":{constant:!1,inputs:[{internalType:"address",name:"_delegatee",type:"address"}],name:"delegate",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_delegatee:"The address to delegate votes to."},notice:"Delegate votes from `msg.sender` which are locked until lockDate to `delegatee`."},"duration()":{constant:!0,inputs:[],name:"duration",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"endDate()":{constant:!0,inputs:[],name:"endDate",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"feeSharingProxy()":{constant:!0,inputs:[],name:"feeSharingProxy",outputs:[{internalType:"contract IFeeSharingProxy",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"governanceWithdrawTokens(address)":{constant:!1,inputs:[{internalType:"address",name:"receiver",type:"address"}],name:"governanceWithdrawTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Can be called only by owner.",params:{receiver:"The receiving address."},notice:"Withdraws all tokens from the staking contract and forwards them to an address specified by the token owner."},"isOwner()":{constant:!0,inputs:[],name:"isOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"Returns true if the caller is the current owner."},"migrateToNewStakingContract()":{constant:!1,inputs:[],name:"migrateToNewStakingContract",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",notice:"Allows the owners to migrate the positions to a new staking contract."},"owner()":{constant:!0,inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address of the current owner."},"receiveApproval(address,uint256,address,bytes)":{constant:!1,inputs:[{internalType:"address",name:"_sender",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"address",name:"_token",type:"address"},{internalType:"bytes",name:"_data",type:"bytes"}],name:"receiveApproval",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_data:"The data will be used for low level call."},notice:"Receives approval from SOV token."},"stakeTokens(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_amount",type:"uint256"}],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"The amount of tokens to stake."},notice:"Stakes tokens according to the vesting schedule."},"stakeTokensWithApproval(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_sender",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"}],name:"stakeTokensWithApproval",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"This function will be invoked from receiveApproval.SOV.approveAndCall -> this.receiveApproval -> this.stakeTokensWithApproval",params:{_amount:"The amount of tokens to stake.",_sender:"The sender of SOV.approveAndCall"},notice:"Stakes tokens according to the vesting schedule."},"staking()":{constant:!0,inputs:[],name:"staking",outputs:[{internalType:"contract Staking",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"startDate()":{constant:!0,inputs:[],name:"startDate",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"tokenOwner()":{constant:!0,inputs:[],name:"tokenOwner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"transferOwnership(address)":{constant:!1,inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"withdrawTokens(address)":{constant:!1,inputs:[{internalType:"address",name:"receiver",type:"address"}],name:"withdrawTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{receiver:"The receiving address."},notice:"Withdraws unlocked tokens from the staking contract and forwards them to an address specified by the token owner."}}},"contracts/Sovryn/Governance/Vesting/VestingRegistry3.sol:VestingRegistry3":{source:"contracts/Sovryn/Governance/Vesting/VestingRegistry3.sol",name:"VestingRegistry3",constructor:{inputs:[{internalType:"address",name:"_vestingFactory",type:"address"},{internalType:"address",name:"_SOV",type:"address"},{internalType:"address",name:"_staking",type:"address"},{internalType:"address",name:"_feeSharingProxy",type:"address"},{internalType:"address",name:"_vestingOwner",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"AdminAdded(address)":{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"admin",type:"address"}],name:"AdminAdded",type:"event"},"AdminRemoved(address)":{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"admin",type:"address"}],name:"AdminRemoved",type:"event"},"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},"SOVTransferred(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"receiver",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"SOVTransferred",type:"event"},"TeamVestingCreated(address,address,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"tokenOwner",type:"address"},{indexed:!1,internalType:"address",name:"vesting",type:"address"},{indexed:!1,internalType:"uint256",name:"cliff",type:"uint256"},{indexed:!1,internalType:"uint256",name:"duration",type:"uint256"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"TeamVestingCreated",type:"event"},"TokensStaked(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"vesting",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"TokensStaked",type:"event"},"VestingCreated(address,address,uint256,uint256,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"tokenOwner",type:"address"},{indexed:!1,internalType:"address",name:"vesting",type:"address"},{indexed:!1,internalType:"uint256",name:"cliff",type:"uint256"},{indexed:!1,internalType:"uint256",name:"duration",type:"uint256"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"VestingCreated",type:"event"}},methods:{"SOV()":{constant:!0,inputs:[],name:"SOV",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"addAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_admin",type:"address"}],name:"addAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},"admins(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"admins",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"createTeamVesting(address,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_tokenOwner",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"}],name:"createTeamVesting",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"the amount to be staked",_cliff:"the cliff in seconds",_duration:"the total duration in seconds",_tokenOwner:"the owner of the tokens"},notice:"creates Team Vesting contract"},"createVesting(address,uint256,uint256,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_tokenOwner",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"uint256",name:"_cliff",type:"uint256"},{internalType:"uint256",name:"_duration",type:"uint256"}],name:"createVesting",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"the amount to be staked",_cliff:"the cliff in seconds",_duration:"the total duration in seconds",_tokenOwner:"the owner of the tokens"},notice:"creates Vesting contract"},"feeSharingProxy()":{constant:!0,inputs:[],name:"feeSharingProxy",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"getTeamVesting(address)":{constant:!0,inputs:[{internalType:"address",name:"_tokenOwner",type:"address"}],name:"getTeamVesting",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",params:{_tokenOwner:"the owner of the tokens"},notice:"returns team vesting contract address for the given token owner"},"getVesting(address)":{constant:!0,inputs:[{internalType:"address",name:"_tokenOwner",type:"address"}],name:"getVesting",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",params:{_tokenOwner:"the owner of the tokens"},notice:"returns vesting contract address for the given token owner"},"isOwner()":{constant:!0,inputs:[],name:"isOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"Returns true if the caller is the current owner."},"owner()":{constant:!0,inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address of the current owner."},"removeAdmin(address)":{constant:!1,inputs:[{internalType:"address",name:"_admin",type:"address"}],name:"removeAdmin",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},"setVestingFactory(address)":{constant:!1,inputs:[{internalType:"address",name:"_vestingFactory",type:"address"}],name:"setVestingFactory",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_vestingFactory:"the address of vesting factory contract"},notice:"sets vesting factory address"},"stakeTokens(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_vesting",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"}],name:"stakeTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"the amount of tokens to stake",_vesting:"the address of Vesting contract"},notice:"stakes tokens according to the vesting schedule"},"staking()":{constant:!0,inputs:[],name:"staking",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"transferOwnership(address)":{constant:!1,inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"transferSOV(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_receiver",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"}],name:"transferSOV",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"the amount to be transferred",_receiver:"the address of the SOV receiver"},notice:"transfers SOV tokens to given address"},"vestingContracts(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],name:"vestingContracts",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"vestingFactory()":{constant:!0,inputs:[],name:"vestingFactory",outputs:[{internalType:"contract IVestingFactory",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"vestingOwner()":{constant:!0,inputs:[],name:"vestingOwner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"}}},"contracts/Sovryn/Governance/Vesting/VestingStorage.sol:VestingStorage":{source:"contracts/Sovryn/Governance/Vesting/VestingStorage.sol",name:"VestingStorage",title:"Vesting Storage Contract.",details:"Use Ownable as a parent to align storage structure for Logic and Proxy contracts.",notice:"This contract is just the storage required for vesting. It is parent of VestingLogic and TeamVesting.",events:{"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"}},methods:{"SOV()":{constant:!0,inputs:[],name:"SOV",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"cliff()":{constant:!0,inputs:[],name:"cliff",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"duration()":{constant:!0,inputs:[],name:"duration",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"endDate()":{constant:!0,inputs:[],name:"endDate",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"feeSharingProxy()":{constant:!0,inputs:[],name:"feeSharingProxy",outputs:[{internalType:"contract IFeeSharingProxy",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"isOwner()":{constant:!0,inputs:[],name:"isOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"Returns true if the caller is the current owner."},"owner()":{constant:!0,inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address of the current owner."},"staking()":{constant:!0,inputs:[],name:"staking",outputs:[{internalType:"contract Staking",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"startDate()":{constant:!0,inputs:[],name:"startDate",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"tokenOwner()":{constant:!0,inputs:[],name:"tokenOwner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"transferOwnership(address)":{constant:!1,inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}}},"contracts/Sovryn/Helper/ErrorDecoder.sol:ErrorDecoder":{source:"contracts/Sovryn/Helper/ErrorDecoder.sol",name:"ErrorDecoder",title:"Base contract to properly handle returned data on failed calls",details:'On EVM if the return data length of a call is less than 68, then the transaction fails silently without a revert message! * As described in the Solidity documentation https://solidity.readthedocs.io/en/v0.5.17/control-structures.html#revert the revert reason is an ABI-encoded string consisting of: 0x08c379a0 // Function selector (method id) for "Error(string)" signature 0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset 0x000000000000000000000000000000000000000000000000000000000000001a // String length 0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data * Another example, debug data from test: 0x08c379a0 0000000000000000000000000000000000000000000000000000000000000020 0000000000000000000000000000000000000000000000000000000000000034 54696d656c6f636b3a3a73657444656c61793a2044656c6179206d7573742065 7863656564206d696e696d756d2064656c61792e000000000000000000000000 * Parsed into: Data offset: 20 Length: 34 Error message: 54696d656c6f636b3a3a73657444656c61793a2044656c6179206d7573742065 7863656564206d696e696d756d2064656c61792e000000000000000000000000'},"contracts/Sovryn/Helper/SafeMath96.sol:SafeMath96":{source:"contracts/Sovryn/Helper/SafeMath96.sol",name:"SafeMath96",title:"SafeMath96 contract.",details:"SafeMath96 uses uint96, unsigned integers of 96 bits length, so every integer from 0 to 2^96-1 can be operated. * Arithmetic operations in Solidity wrap on overflow. This can easily result in bugs, because programmers usually assume that an overflow raises an error, which is the standard behavior in high level programming languages. SafeMath restores this intuition by reverting the transaction when an operation overflows. * Using this contract instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always.",notice:"Improved Solidity's arithmetic operations with added overflow checks."},"contracts/Sovryn/Mockup/FeeSharingProxyMockup.sol:FeeSharingProxyMockup":{source:"contracts/Sovryn/Mockup/FeeSharingProxyMockup.sol",name:"FeeSharingProxyMockup",constructor:{inputs:[{internalType:"contract IProtocol",name:"_protocol",type:"address"},{internalType:"contract IStaking",name:"_staking",type:"address"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"CheckpointAdded(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"sender",type:"address"},{indexed:!0,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"CheckpointAdded",type:"event"},"FeeWithdrawn(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"sender",type:"address"},{indexed:!0,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"FeeWithdrawn",type:"event"},"TokensTransferred(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"sender",type:"address"},{indexed:!0,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"TokensTransferred",type:"event"},"UserFeeWithdrawn(address,address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"sender",type:"address"},{indexed:!0,internalType:"address",name:"receiver",type:"address"},{indexed:!0,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"UserFeeWithdrawn",type:"event"}},methods:{"getAccumulatedFees(address,address)":{constant:!0,inputs:[{internalType:"address",name:"_user",type:"address"},{internalType:"address",name:"_loanPoolToken",type:"address"}],name:"getAccumulatedFees",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{_loanPoolToken:"Address of the pool token.",_user:"The address of the user or contract."},return:"The accumulated fee for the message sender.",notice:"Get the accumulated loan pool fee of the message sender."},"lastFeeWithdrawalTime(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"lastFeeWithdrawalTime",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"numTokenCheckpoints(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"numTokenCheckpoints",outputs:[{internalType:"uint32",name:"",type:"uint32"}],payable:!1,stateMutability:"view",type:"function"},"processedCheckpoints(address,address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"address",name:"",type:"address"}],name:"processedCheckpoints",outputs:[{internalType:"uint32",name:"",type:"uint32"}],payable:!1,stateMutability:"view",type:"function"},"protocol()":{constant:!0,inputs:[],name:"protocol",outputs:[{internalType:"contract IProtocol",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"staking()":{constant:!0,inputs:[],name:"staking",outputs:[{internalType:"contract IStaking",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"testData()":{constant:!0,inputs:[],name:"testData",outputs:[{internalType:"address",name:"loanPoolToken",type:"address"},{internalType:"uint32",name:"maxCheckpoints",type:"uint32"},{internalType:"address",name:"receiver",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"tokenCheckpoints(address,uint256)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"}],name:"tokenCheckpoints",outputs:[{internalType:"uint32",name:"blockNumber",type:"uint32"},{internalType:"uint32",name:"timestamp",type:"uint32"},{internalType:"uint96",name:"totalWeightedStake",type:"uint96"},{internalType:"uint96",name:"numTokens",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"transferTokens(address,uint96)":{constant:!1,inputs:[{internalType:"address",name:"_token",type:"address"},{internalType:"uint96",name:"_amount",type:"uint96"}],name:"transferTokens",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"We just update amount of tokens here and write checkpoint in a separate methods in order to prevent adding checkpoints too often.",params:{_amount:"Amount to be transferred.",_token:"Address of the token."},notice:"Transfer tokens to this contract."},"unprocessedAmount(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"unprocessedAmount",outputs:[{internalType:"uint96",name:"",type:"uint96"}],payable:!1,stateMutability:"view",type:"function"},"withdraw(address,uint32,address)":{constant:!1,inputs:[{internalType:"address",name:"_loanPoolToken",type:"address"},{internalType:"uint32",name:"_maxCheckpoints",type:"uint32"},{internalType:"address",name:"_receiver",type:"address"}],name:"withdraw",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},"withdrawFees(address)":{constant:!1,inputs:[{internalType:"address",name:"_token",type:"address"}],name:"withdrawFees",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_token:"Address of the token"},notice:"Withdraw fees for the given token: lendingFee + tradingFee + borrowingFee"}}},"contracts/Sovryn/Multisig/MultiSigWallet.sol:MultiSigWallet":{source:"contracts/Sovryn/Multisig/MultiSigWallet.sol",name:"MultiSigWallet",title:"Multisignature wallet - Allows multiple parties to agree on transactions before execution.",author:"Stefan George - ",constructor:{inputs:[{internalType:"address[]",name:"_owners",type:"address[]"},{internalType:"uint256",name:"_required",type:"uint256"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},fallback:{payable:!0,stateMutability:"payable",type:"fallback"},events:{"Confirmation(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"sender",type:"address"},{indexed:!0,internalType:"uint256",name:"transactionId",type:"uint256"}],name:"Confirmation",type:"event"},"Deposit(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Deposit",type:"event"},"Execution(uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"uint256",name:"transactionId",type:"uint256"}],name:"Execution",type:"event"},"ExecutionFailure(uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"uint256",name:"transactionId",type:"uint256"}],name:"ExecutionFailure",type:"event"},"OwnerAddition(address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"}],name:"OwnerAddition",type:"event"},"OwnerRemoval(address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"}],name:"OwnerRemoval",type:"event"},"RequirementChange(uint256)":{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"required",type:"uint256"}],name:"RequirementChange",type:"event"},"Revocation(address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"sender",type:"address"},{indexed:!0,internalType:"uint256",name:"transactionId",type:"uint256"}],name:"Revocation",type:"event"},"Submission(uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"uint256",name:"transactionId",type:"uint256"}],name:"Submission",type:"event"}},methods:{"MAX_OWNER_COUNT()":{constant:!0,inputs:[],name:"MAX_OWNER_COUNT",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"addOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"owner",type:"address"}],name:"addOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{owner:"Address of new owner."},notice:"Allows to add a new owner. Transaction has to be sent by wallet."},"changeRequirement(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"_required",type:"uint256"}],name:"changeRequirement",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_required:"Number of required confirmations."},notice:"Allows to change the number of required confirmations. Transaction has to be sent by wallet."},"confirmTransaction(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"transactionId",type:"uint256"}],name:"confirmTransaction",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{transactionId:"Transaction ID."},notice:"Allows an owner to confirm a transaction."},"confirmations(uint256,address)":{constant:!0,inputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"address",name:"",type:"address"}],name:"confirmations",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"executeTransaction(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"transactionId",type:"uint256"}],name:"executeTransaction",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{transactionId:"Transaction ID."},notice:"Allows anyone to execute a confirmed transaction."},"getConfirmationCount(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"transactionId",type:"uint256"}],name:"getConfirmationCount",outputs:[{internalType:"uint256",name:"count",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{transactionId:"Transaction ID."},return:"Number of confirmations.",notice:"Get the number of confirmations of a transaction."},"getConfirmations(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"transactionId",type:"uint256"}],name:"getConfirmations",outputs:[{internalType:"address[]",name:"_confirmations",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",params:{transactionId:"Transaction ID."},return:"Returns array of owner addresses.",notice:"Get the array with owner addresses, which confirmed transaction."},"getOwners()":{constant:!0,inputs:[],name:"getOwners",outputs:[{internalType:"address[]",name:"",type:"address[]"}],payable:!1,stateMutability:"view",type:"function",return:"List of owner addresses.",notice:"Get the list of owners."},"getTransactionCount(bool,bool)":{constant:!0,inputs:[{internalType:"bool",name:"pending",type:"bool"},{internalType:"bool",name:"executed",type:"bool"}],name:"getTransactionCount",outputs:[{internalType:"uint256",name:"count",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",params:{executed:"Include executed transactions.",pending:"Include pending transactions."},return:"Total number of transactions after filters are applied.",notice:"Get the total number of transactions after filers are applied."},"getTransactionIds(uint256,uint256,bool,bool)":{constant:!0,inputs:[{internalType:"uint256",name:"from",type:"uint256"},{internalType:"uint256",name:"to",type:"uint256"},{internalType:"bool",name:"pending",type:"bool"},{internalType:"bool",name:"executed",type:"bool"}],name:"getTransactionIds",outputs:[{internalType:"uint256[]",name:"_transactionIds",type:"uint256[]"}],payable:!1,stateMutability:"view",type:"function",params:{executed:"Include executed transactions.",from:"Index start position of transaction array.",pending:"Include pending transactions.",to:"Index end position of transaction array."},return:"Returns array of transaction IDs.",notice:"Get the list of transaction IDs in defined range."},"isConfirmed(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"transactionId",type:"uint256"}],name:"isConfirmed",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",params:{transactionId:"Transaction ID."},return:"Confirmation status.",notice:"Returns the confirmation status of a transaction."},"isOwner(address)":{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"isOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},"owners(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"owners",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},"removeOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"owner",type:"address"}],name:"removeOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{owner:"Address of owner."},notice:"Allows to remove an owner. Transaction has to be sent by wallet."},"replaceOwner(address,address)":{constant:!1,inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"newOwner",type:"address"}],name:"replaceOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{newOwner:"Address of new owner.",owner:"Address of owner to be replaced."},notice:"Allows to replace an owner with a new owner. Transaction has to be sent by wallet."},"required()":{constant:!0,inputs:[],name:"required",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"revokeConfirmation(uint256)":{constant:!1,inputs:[{internalType:"uint256",name:"transactionId",type:"uint256"}],name:"revokeConfirmation",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{transactionId:"Transaction ID."},notice:"Allows an owner to revoke a confirmation for a transaction."},"submitTransaction(address,uint256,bytes)":{constant:!1,inputs:[{internalType:"address",name:"destination",type:"address"},{internalType:"uint256",name:"value",type:"uint256"},{internalType:"bytes",name:"data",type:"bytes"}],name:"submitTransaction",outputs:[{internalType:"uint256",name:"transactionId",type:"uint256"}],payable:!1,stateMutability:"nonpayable",type:"function",params:{data:"Transaction data payload.",destination:"Transaction target address.",value:"Transaction ether value."},return:"Returns transaction ID.",notice:"Allows an owner to submit and confirm a transaction."},"transactionCount()":{constant:!0,inputs:[],name:"transactionCount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},"transactions(uint256)":{constant:!0,inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"transactions",outputs:[{internalType:"address",name:"destination",type:"address"},{internalType:"uint256",name:"value",type:"uint256"},{internalType:"bytes",name:"data",type:"bytes"},{internalType:"bool",name:"executed",type:"bool"}],payable:!1,stateMutability:"view",type:"function"}}},"contracts/Sovryn/Proxy/Proxy.sol:Proxy":{source:"contracts/Sovryn/Proxy/Proxy.sol",name:"Proxy",title:"Base Proxy contract.",details:"UpgradableProxy is the contract that inherits Proxy and wraps these functions.",notice:"The proxy performs delegated calls to the contract implementation it is pointing to. This way upgradable contracts are possible on blockchain. * Delegating proxy contracts are widely used for both upgradeability and gas savings. These proxies rely on a logic contract (also known as implementation contract or master copy) that is called using delegatecall. This allows proxies to keep a persistent state (storage and balance) while the code is delegated to the logic contract. * Proxy contract is meant to be inherited and its internal functions _setImplementation and _setProxyOwner to be called when upgrades become neccessary. * The loan token (iToken) contract as well as the protocol contract act as proxies, delegating all calls to underlying contracts. Therefore, if you want to interact with them using web3, you need to use the ABIs from the contracts containing the actual logic or the interface contract. ABI for LoanToken contracts: LoanTokenLogicStandard ABI for Protocol contract: ISovryn",constructor:{inputs:[],payable:!1,stateMutability:"nonpayable",type:"constructor"},fallback:{payable:!0,stateMutability:"payable",type:"fallback"},events:{"ImplementationChanged(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_oldImplementation",type:"address"},{indexed:!0,internalType:"address",name:"_newImplementation",type:"address"}],name:"ImplementationChanged",type:"event"},"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_oldOwner",type:"address"},{indexed:!0,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"}},methods:{"getImplementation()":{constant:!0,inputs:[],name:"getImplementation",outputs:[{internalType:"address",name:"_implementation",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of the implementation.",notice:"Return address of the implementation."},"getProxyOwner()":{constant:!0,inputs:[],name:"getProxyOwner",outputs:[{internalType:"address",name:"_owner",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of the owner.",notice:"Return address of the owner."}}},"contracts/Sovryn/Proxy/UpgradableProxy.sol:UpgradableProxy":{source:"contracts/Sovryn/Proxy/UpgradableProxy.sol",name:"UpgradableProxy",title:"Upgradable Proxy contract.",notice:"A disadvantage of the immutable ledger is that nobody can change the source code of a smart contract after it’s been deployed. In order to fix bugs or introduce new features, smart contracts need to be upgradable somehow. * Although it is not possible to upgrade the code of an already deployed smart contract, it is possible to set-up a proxy contract architecture that will allow to use new deployed contracts as if the main logic had been upgraded. * A proxy architecture pattern is such that all message calls go through a Proxy contract that will redirect them to the latest deployed contract logic. To upgrade, a new version of the contract is deployed, and the Proxy is updated to reference the new contract address.",fallback:{payable:!0,stateMutability:"payable",type:"fallback"},events:{"ImplementationChanged(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_oldImplementation",type:"address"},{indexed:!0,internalType:"address",name:"_newImplementation",type:"address"}],name:"ImplementationChanged",type:"event"},"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"_oldOwner",type:"address"},{indexed:!0,internalType:"address",name:"_newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"}},methods:{"getImplementation()":{constant:!0,inputs:[],name:"getImplementation",outputs:[{internalType:"address",name:"_implementation",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of the implementation.",notice:"Return address of the implementation."},"getProxyOwner()":{constant:!0,inputs:[],name:"getProxyOwner",outputs:[{internalType:"address",name:"_owner",type:"address"}],payable:!1,stateMutability:"view",type:"function",return:"Address of the owner.",notice:"Return address of the owner."},"setImplementation(address)":{constant:!1,inputs:[{internalType:"address",name:"_implementation",type:"address"}],name:"setImplementation",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Wrapper for _setImplementation that exposes the function as public for owner to be able to set a new version of the contract as current pointing implementation.",params:{_implementation:"Address of the implementation."},notice:"Set address of the implementation."},"setProxyOwner(address)":{constant:!1,inputs:[{internalType:"address",name:"_owner",type:"address"}],name:"setProxyOwner",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_owner:"Address of the owner."},notice:"Set address of the owner."}}},"contracts/Sovryn/RSK/RSKAddrValidator.sol:RSKAddrValidator":{source:"contracts/Sovryn/RSK/RSKAddrValidator.sol",name:"RSKAddrValidator"},"contracts/Sovryn/Token/ApprovalReceiver.sol:ApprovalReceiver":{source:"contracts/Sovryn/Token/ApprovalReceiver.sol",name:"ApprovalReceiver",title:"Base contract for receiving approval from SOV token.",methods:{"receiveApproval(address,uint256,address,bytes)":{constant:!1,inputs:[{internalType:"address",name:"_sender",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"address",name:"_token",type:"address"},{internalType:"bytes",name:"_data",type:"bytes"}],name:"receiveApproval",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_data:"The data will be used for low level call."},notice:"Receives approval from SOV token."}}},"contracts/Sovryn/Token/Token.sol:Token":{source:"contracts/Sovryn/Token/Token.sol",name:"Token",title:"Token is an ERC-20 token contract.",details:"This contract represents a token with dynamic supply. The owner of the token contract can mint/burn tokens to/from any account based upon previous governance voting and approval.",notice:"This contract accounts for all holders' balances.",constructor:{inputs:[{internalType:"uint256",name:"_initialAmount",type:"uint256"},{internalType:"string",name:"_name",type:"string"},{internalType:"string",name:"_symbol",type:"string"},{internalType:"uint8",name:"_decimals",type:"uint8"}],payable:!1,stateMutability:"nonpayable",type:"constructor"},events:{"Approval(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},"OwnershipTransferred(address,address)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},"Transfer(address,address,uint256)":{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"}},methods:{"DECIMALS()":{constant:!0,inputs:[],name:"DECIMALS",outputs:[{internalType:"uint8",name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function"},"NAME()":{constant:!0,inputs:[],name:"NAME",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},"SYMBOL()":{constant:!0,inputs:[],name:"SYMBOL",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},"allowance(address,address)":{constant:!0,inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-allowance}."},"approve(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-approve}.\t * Requirements:\t * - `spender` cannot be the zero address."},"approveAndCall(address,uint256,bytes)":{constant:!1,inputs:[{internalType:"address",name:"_spender",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"bytes",name:"_data",type:"bytes"}],name:"approveAndCall",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",params:{_amount:"The amount of tokens to be sent.",_data:"Parameters for the contract call, such as endpoint signature.",_spender:"The contract address to spend the tokens."},notice:"Approves and then calls the receiving contract. Useful to encapsulate sending tokens to a contract in one call. Solidity has no native way to send tokens to contracts. ERC-20 tokens require approval to be spent by third parties, such as a contract in this case."},"balanceOf(address)":{constant:!0,inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-balanceOf}."},"decimals()":{constant:!0,inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`).\t * Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei.\t * NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."},"decreaseAllowance(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Atomically decreases the allowance granted to `spender` by the caller.\t * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.\t * Emits an {Approval} event indicating the updated allowance.\t * Requirements:\t * - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."},"increaseAllowance(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"Atomically increases the allowance granted to `spender` by the caller.\t * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.\t * Emits an {Approval} event indicating the updated allowance.\t * Requirements:\t * - `spender` cannot be the zero address."},"isOwner()":{constant:!0,inputs:[],name:"isOwner",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function",details:"Returns true if the caller is the current owner."},"mint(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"_account",type:"address"},{internalType:"uint256",name:"_amount",type:"uint256"}],name:"mint",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Don't create more than 2^96/10 tokens before updating the governance first.",params:{_account:"The recipient address to get the minted tokens.",_amount:"The amount of tokens to be minted."},notice:"Creates new tokens and sends them to the recipient."},"name()":{constant:!0,inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the name of the token."},"owner()":{constant:!0,inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the address of the current owner."},"symbol()":{constant:!0,inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function",details:"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{constant:!0,inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function",details:"See {IERC20-totalSupply}."},"transfer(address,uint256)":{constant:!1,inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-transfer}.\t * Requirements:\t * - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."},"transferFrom(address,address,uint256)":{constant:!1,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:!1,stateMutability:"nonpayable",type:"function",details:"See {IERC20-transferFrom}.\t * Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20};\t * 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`."},"transferOwnership(address)":{constant:!1,inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function",details:"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}}}},wt=new qe({routes:[{path:"/",component:Tt,props:()=>({json:gt})},{path:"*",component:mt,props:e=>({json:gt[e.path.slice(1)]})}]});new a.a({el:"#app",router:wt,mounted(){document.dispatchEvent(new Event("render-event"))},render:e=>e(Je)})},function(e,t,n){"use strict";function a(e,t){for(var n=[],a={},i=0;in.parts.length&&(a.parts.length=n.parts.length)}else{var s=[];for(i=0;i= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "optional": true + } + } + }, + "@ardatan/aggregate-error": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@ardatan/aggregate-error/-/aggregate-error-0.0.6.tgz", + "integrity": "sha512-vyrkEHG1jrukmzTPtyWB4NLPauUw5bQeg4uhn8f+1SSynmrOcyvlb1GKQjjgoBzElLdfXCRYX8UnBlhklOHYRQ==", + "dev": true, + "optional": true, + "requires": { + "tslib": "~2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.4.tgz", + "integrity": "sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ==", + "dev": true, + "optional": true + }, + "@babel/core": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz", + "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==", + "dev": true, + "optional": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.3", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-module-transforms": "^7.14.2", + "@babel/helpers": "^7.14.0", + "@babel/parser": "^7.14.3", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.2", + "@babel/types": "^7.14.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "optional": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/parser": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.4.tgz", + "integrity": "sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==", + "dev": true, + "optional": true + }, + "@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "optional": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": 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, + "optional": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "optional": 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, + "optional": true + } + } + }, + "@babel/generator": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz", + "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==", + "dev": true, + "optional": true, + "requires": { + "@babel/types": "^7.14.2", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "dev": true, + "optional": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz", + "integrity": "sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA==", + "dev": true, + "optional": true, + "requires": { + "@babel/compat-data": "^7.14.4", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.4.tgz", + "integrity": "sha512-idr3pthFlDCpV+p/rMgGLGYIVtazeatrSOQk8YzO2pAepIjQhCN3myeihVg58ax2bbbGK9PUE1reFi7axOYIOw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.14.4", + "@babel/helper-split-export-declaration": "^7.12.13" + } + }, + "@babel/helper-function-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", + "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.14.2" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "optional": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "optional": true, + "requires": { + "@babel/types": "^7.13.12" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "optional": true, + "requires": { + "@babel/types": "^7.13.12" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz", + "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.14.0", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.2", + "@babel/types": "^7.14.2" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "optional": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/parser": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.4.tgz", + "integrity": "sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==", + "dev": true, + "optional": true + }, + "@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "optional": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": 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, + "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 + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "optional": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true, + "optional": true + }, + "@babel/helper-replace-supers": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz", + "integrity": "sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.14.2", + "@babel/types": "^7.14.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "optional": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/parser": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.4.tgz", + "integrity": "sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==", + "dev": true, + "optional": true + }, + "@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "optional": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": 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, + "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 + } + } + }, + "@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "optional": true, + "requires": { + "@babel/types": "^7.13.12" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "optional": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "optional": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "dev": true, + "optional": true + }, + "@babel/helpers": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", + "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", + "dev": true, + "optional": true, + "requires": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "optional": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/parser": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.4.tgz", + "integrity": "sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==", + "dev": true, + "optional": true + }, + "@babel/traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", + "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "dev": true, + "optional": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.2", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.2", + "@babel/types": "^7.14.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": 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, + "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 + } + } + }, + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", + "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", + "dev": true, + "optional": true + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.4.tgz", + "integrity": "sha512-AYosOWBlyyXEagrPRfLJ1enStufsr7D1+ddpj8OLi9k7B6+NdZ0t/9V7Fh+wJ4g2Jol8z2JkgczYqtWrZd4vbA==", + "dev": true, + "optional": true, + "requires": { + "@babel/compat-data": "^7.14.4", + "@babel/helper-compilation-targets": "^7.14.4", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.14.2" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz", + "integrity": "sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", + "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.4.tgz", + "integrity": "sha512-5KdpkGxsZlTk+fPleDtGKsA+pon28+ptYmMO8GBSa5fHERCJWAzj50uAfCKBqq42HO+Zot6JF1x37CRprwmN4g==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.4.tgz", + "integrity": "sha512-p73t31SIj6y94RDVX57rafVjttNr8MvKEgs5YFatNB/xC68zM3pyosuOEcQmYsYlyQaGY9R7rAULVRcat5FKJQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.14.2", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.14.4", + "@babel/helper-split-export-declaration": "^7.12.13", + "globals": "^11.1.0" + }, + "dependencies": { + "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, + "optional": true + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.4.tgz", + "integrity": "sha512-JyywKreTCGTUsL1OKu1A3ms/R1sTP0WxbpXlALeGzF53eB3bxtNkYdMj9SDgK7g6ImPy76J5oYYKoTtQImlhQA==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.13.0.tgz", + "integrity": "sha512-EXAGFMJgSX8gxWD7PZtW/P6M+z74jpx3wm/+9pn+c2dOawPpBkUX7BrfyPvo6ZpXbgRIEuwgwDb/MGlKvu2pOg==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-flow": "^7.12.13" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz", + "integrity": "sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-simple-access": "^7.13.12", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz", + "integrity": "sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.2.tgz", + "integrity": "sha512-zCubvP+jjahpnFJvPaHPiGVfuVUjXHhFvJKQdNnsmSsiU9kR/rCZ41jHc++tERD2zV+p7Hr6is+t5b6iWTCqSw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.3.tgz", + "integrity": "sha512-uuxuoUNVhdgYzERiHHFkE4dWoJx+UFVyuAl0aqN8P2/AKFHwqgUC5w2+4/PjpKXJsFgBlYAFXlUmDQ3k3DUkXw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/types": "^7.14.2" + }, + "dependencies": { + "@babel/types": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", + "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/runtime": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", + "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "optional": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "optional": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + } + } + }, + "@babel/traverse": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "dev": true, + "optional": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "optional": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": 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, + "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 + } + } + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@consento/sync-randombytes": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@consento/sync-randombytes/-/sync-randombytes-1.0.5.tgz", + "integrity": "sha512-mPJ2XvrTLQGEdhleDuSIkWtVWnvmhREOC1FjorV1nlK49t/52Z9X1d618gTj6nlQghRLiYvcd8oL4vZ2YZuDIQ==", + "dev": true, + "optional": true, + "requires": { + "buffer": "^5.4.3", + "seedrandom": "^3.0.5" + } + }, + "@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "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" + } + }, + "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 + }, + "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 + } + } + }, + "@ethereumjs/block": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/block/-/block-3.3.0.tgz", + "integrity": "sha512-WoefY9Rs4W8vZTxG9qwntAlV61xsSv0NPoXmHO7x3SH16dwJQtU15YvahPCz4HEEXbu7GgGgNgu0pv8JY7VauA==", + "dev": true, + "requires": { + "@ethereumjs/common": "^2.3.0", + "@ethereumjs/tx": "^3.2.0", + "ethereumjs-util": "^7.0.10", + "merkle-patricia-tree": "^4.2.0" + }, + "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": "*" + } + }, + "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" + } + } + } + }, + "@ethereumjs/blockchain": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.3.0.tgz", + "integrity": "sha512-B0Y5QDZcRDQISPilv3m8nzk97QmC98DnSE9WxzGpCxfef22Mw7xhwGipci5Iy0dVC2Np2Cr5d3F6bHAR7+yVmQ==", + "dev": true, + "requires": { + "@ethereumjs/block": "^3.3.0", + "@ethereumjs/common": "^2.3.0", + "@ethereumjs/ethash": "^1.0.0", + "debug": "^2.2.0", + "ethereumjs-util": "^7.0.10", + "level-mem": "^5.0.1", + "lru-cache": "^5.1.1", + "rlp": "^2.2.4", + "semaphore-async-await": "^1.5.1" + }, + "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": "*" + } + }, + "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" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + } + } + }, + "@ethereumjs/common": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.3.0.tgz", + "integrity": "sha512-Fmi15MdVptsC85n6NcUXIFiiXCXWEfZNgPWP+OGAQOC6ZtdzoNawtxH/cYpIgEgSuIzfOeX3VKQP/qVI1wISHg==", + "dev": true, + "requires": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.0.10" + }, + "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": "*" + } + }, + "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" + } + } + } + }, + "@ethereumjs/ethash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.0.0.tgz", + "integrity": "sha512-iIqnGG6NMKesyOxv2YctB2guOVX18qMAWlj3QlZyrc+GqfzLqoihti+cVNQnyNxr7eYuPdqwLQOFuPe6g/uKjw==", + "dev": true, + "requires": { + "@types/levelup": "^4.3.0", + "buffer-xor": "^2.0.1", + "ethereumjs-util": "^7.0.7", + "miller-rabin": "^4.0.0" + }, + "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": "*" + } + }, + "buffer-xor": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz", + "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "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" + } + } + } + }, + "@ethereumjs/tx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.2.0.tgz", + "integrity": "sha512-D3X/XtZ3ldUg34hr99Jvj7NxW3NxVKdUKrwQnEWlAp4CmCQpvYoyn7NF4lk34rHEt7ScS+Agu01pcDHoOcd19A==", + "dev": true, + "requires": { + "@ethereumjs/common": "^2.3.0", + "ethereumjs-util": "^7.0.10" + }, + "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": "*" + } + }, + "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" + } + } + } + }, + "@ethereumjs/vm": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/vm/-/vm-5.4.0.tgz", + "integrity": "sha512-0Mv51inp5S/mh+fKP0H90byT/5DdFirChUFUMhEjDlIBnHK55o/liKZ+0iNSLm6ZxX8iPs7urp11/UCoxPJfLA==", + "dev": true, + "requires": { + "@ethereumjs/block": "^3.3.0", + "@ethereumjs/blockchain": "^5.3.0", + "@ethereumjs/common": "^2.3.0", + "@ethereumjs/tx": "^3.2.0", + "async-eventemitter": "^0.2.4", + "core-js-pure": "^3.0.1", + "debug": "^2.2.0", + "ethereumjs-util": "^7.0.10", + "functional-red-black-tree": "^1.0.1", + "mcl-wasm": "^0.7.1", + "merkle-patricia-tree": "^4.2.0", + "rustbn.js": "~0.2.0", + "util.promisify": "^1.0.1" + }, + "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": "*" + } + }, + "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" + } + } + } + }, + "@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" + } + }, + "@ethersproject/abstract-provider": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.3.0.tgz", + "integrity": "sha512-1+MLhGP1GwxBDBNwMWVmhCsvKwh4gK7oIfOrmlmePNeskg1NhIrYssraJBieaFNHUYfKEd/1DjiVZMw8Qu5Cxw==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/networks": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/transactions": "^5.3.0", + "@ethersproject/web": "^5.3.0" + } + }, + "@ethersproject/abstract-signer": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.3.0.tgz", + "integrity": "sha512-w8IFwOYqiPrtvosPuArZ3+QPR2nmdVTRrVY8uJYL3NNfMmQfTy3V3l2wbzX47UUlNbPJY+gKvzJAyvK1onZxJg==", + "dev": true, + "requires": { + "@ethersproject/abstract-provider": "^5.3.0", + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0" + } + }, + "@ethersproject/address": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.3.0.tgz", + "integrity": "sha512-29TgjzEBK+gUEUAOfWCG7s9IxLNLCqvr+oDSk6L9TXD0VLvZJKhJV479tKQqheVA81OeGxfpdxYtUVH8hqlCvA==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/keccak256": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/rlp": "^5.3.0" + } + }, + "@ethersproject/base64": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.3.0.tgz", + "integrity": "sha512-JIqgtOmgKcbc2sjGWTXyXktqUhvFUDte8fPVsAaOrcPiJf6YotNF+nsrOYGC9pbHBEGSuSBp3QR0varkO8JHEw==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0" + } + }, + "@ethersproject/basex": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.3.0.tgz", + "integrity": "sha512-8J4nS6t/SOnoCgr3DF5WCSRLC5YwTKYpZWJqeyYQLX+86TwPhtzvHXacODzcDII9tWKhVg6g0Bka8JCBWXsCiQ==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/properties": "^5.3.0" + } + }, + "@ethersproject/bignumber": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.3.0.tgz", + "integrity": "sha512-5xguJ+Q1/zRMgHgDCaqAexx/8DwDVLRemw2i6uR8KyGjwGdXI8f32QZZ1cKGucBN6ekJvpUpHy6XAuQnTv0mPA==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "bn.js": "^4.11.9" + }, + "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 + } + } + }, + "@ethersproject/bytes": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.3.0.tgz", + "integrity": "sha512-rqLJjdVqCcn7glPer7Fxh87PRqlnRScVAoxcIP3PmOUNApMWJ6yRdOFfo2KvPAdO7Le3yEI1o0YW+Yvr7XCYvw==", + "dev": true, + "requires": { + "@ethersproject/logger": "^5.3.0" + } + }, + "@ethersproject/constants": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.3.0.tgz", + "integrity": "sha512-4y1feNOwEpgjAfiCFWOHznvv6qUF/H6uI0UKp8xdhftb+H+FbKflXg1pOgH5qs4Sr7EYBL+zPyPb+YD5g1aEyw==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.3.0" + } + }, + "@ethersproject/contracts": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.3.0.tgz", + "integrity": "sha512-eDyQ8ltykvyQqnGZxb/c1e0OnEtzqXhNNC4BX8nhYBCaoBrYYuK/1fLmyEvc5+XUMoxNhwpYkoSSwvPLci7/Zg==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.3.0", + "@ethersproject/abstract-provider": "^5.3.0", + "@ethersproject/abstract-signer": "^5.3.0", + "@ethersproject/address": "^5.3.0", + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/constants": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/transactions": "^5.3.0" + }, + "dependencies": { + "@ethersproject/abi": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.3.0.tgz", + "integrity": "sha512-NaT4UacjOwca8qCG/gv8k+DgTcWu49xlrvdhr/p8PTFnoS8e3aMWqjI3znFME5Txa/QWXDrg2/heufIUue9rtw==", + "dev": true, + "requires": { + "@ethersproject/address": "^5.3.0", + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/constants": "^5.3.0", + "@ethersproject/hash": "^5.3.0", + "@ethersproject/keccak256": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/strings": "^5.3.0" + } + } + } + }, + "@ethersproject/hash": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.3.0.tgz", + "integrity": "sha512-gAFZSjUPQ32CIfoKSMtMEQ+IO0kQxqhwz9fCIFt2DtAq2u4pWt8mL9Z5P0r6KkLcQU8LE9FmuPPyd+JvBzmr1w==", + "dev": true, + "requires": { + "@ethersproject/abstract-signer": "^5.3.0", + "@ethersproject/address": "^5.3.0", + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/keccak256": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/strings": "^5.3.0" + } + }, + "@ethersproject/hdnode": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.3.0.tgz", + "integrity": "sha512-zLmmtLNoDMGoYRdjOab01Zqkvp+TmZyCGDAMQF1Bs3yZyBs/kzTNi1qJjR1jVUcPP5CWGtjFwY8iNG8oNV9J8g==", + "dev": true, + "requires": { + "@ethersproject/abstract-signer": "^5.3.0", + "@ethersproject/basex": "^5.3.0", + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/pbkdf2": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/sha2": "^5.3.0", + "@ethersproject/signing-key": "^5.3.0", + "@ethersproject/strings": "^5.3.0", + "@ethersproject/transactions": "^5.3.0", + "@ethersproject/wordlists": "^5.3.0" + } + }, + "@ethersproject/json-wallets": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.3.0.tgz", + "integrity": "sha512-/xwbqaIb5grUIGNmeEaz8GdcpmDr++X8WT4Jqcclnxow8PXCUHFeDxjf3O+nSuoqOYG/Ds0+BI5xuQKbva6Xkw==", + "dev": true, + "requires": { + "@ethersproject/abstract-signer": "^5.3.0", + "@ethersproject/address": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/hdnode": "^5.3.0", + "@ethersproject/keccak256": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/pbkdf2": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/random": "^5.3.0", + "@ethersproject/strings": "^5.3.0", + "@ethersproject/transactions": "^5.3.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + }, + "dependencies": { + "scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "dev": true + } + } + }, + "@ethersproject/keccak256": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.3.0.tgz", + "integrity": "sha512-Gv2YqgIUmRbYVNIibafT0qGaeGYLIA/EdWHJ7JcVxVSs2vyxafGxOJ5VpSBHWeOIsE6OOaCelYowhuuTicgdFQ==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "js-sha3": "0.5.7" + }, + "dependencies": { + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", + "dev": true + } + } + }, + "@ethersproject/logger": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.3.0.tgz", + "integrity": "sha512-8bwJ2gxJGkZZnpQSq5uSiZSJjyVTWmlGft4oH8vxHdvO1Asy4TwVepAhPgxIQIMxXZFUNMych1YjIV4oQ4I7dA==", + "dev": true + }, + "@ethersproject/networks": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.3.0.tgz", + "integrity": "sha512-XGbD9MMgqrR7SYz8o6xVgdG+25v7YT5vQG8ZdlcLj2I7elOBM7VNeQrnxfSN7rWQNcqu2z80OM29gGbQz+4Low==", + "dev": true, + "requires": { + "@ethersproject/logger": "^5.3.0" + } + }, + "@ethersproject/pbkdf2": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.3.0.tgz", + "integrity": "sha512-Q9ChVU6gBFiex0FSdtzo4b0SAKz3ZYcYVFLrEWHL0FnHvNk3J3WgAtRNtBQGQYn/T5wkoTdZttMbfBkFlaiWcA==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/sha2": "^5.3.0" + } + }, + "@ethersproject/properties": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.3.0.tgz", + "integrity": "sha512-PaHxJyM5/bfusk6vr3yP//JMnm4UEojpzuWGTmtL5X4uNhNnFNvlYilZLyDr4I9cTkIbipCMsAuIcXWsmdRnEw==", + "dev": true, + "requires": { + "@ethersproject/logger": "^5.3.0" + } + }, + "@ethersproject/providers": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.3.0.tgz", + "integrity": "sha512-HtL+DEbzPcRyfrkrMay7Rk/4he+NbUpzI/wHXP4Cqtra82nQOnqqCgTQc4HbdDrl75WVxG/JRMFhyneIPIMZaA==", + "dev": true, + "requires": { + "@ethersproject/abstract-provider": "^5.3.0", + "@ethersproject/abstract-signer": "^5.3.0", + "@ethersproject/address": "^5.3.0", + "@ethersproject/basex": "^5.3.0", + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/constants": "^5.3.0", + "@ethersproject/hash": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/networks": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/random": "^5.3.0", + "@ethersproject/rlp": "^5.3.0", + "@ethersproject/sha2": "^5.3.0", + "@ethersproject/strings": "^5.3.0", + "@ethersproject/transactions": "^5.3.0", + "@ethersproject/web": "^5.3.0", + "bech32": "1.1.4", + "ws": "7.4.6" + }, + "dependencies": { + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true + } + } + }, + "@ethersproject/random": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.3.0.tgz", + "integrity": "sha512-A5SL/4inutSwt3Fh2OD0x2gz+x6GHmuUnIPkR7zAiTidMD2N8F6tZdMF1hlQKWVCcVMWhEQg8mWijhEzm6BBYw==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/logger": "^5.3.0" + } + }, + "@ethersproject/rlp": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.3.0.tgz", + "integrity": "sha512-oI0joYpsRanl9guDubaW+1NbcpK0vJ3F/6Wpcanzcnqq+oaW9O5E98liwkEDPcb16BUTLIJ+ZF8GPIHYxJ/5Pw==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/logger": "^5.3.0" + } + }, + "@ethersproject/sha2": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.3.0.tgz", + "integrity": "sha512-r5ftlwKcocYEuFz2JbeKOT5SAsCV4m1RJDsTOEfQ5L67ZC7NFDK5i7maPdn1bx4nPhylF9VAwxSrQ1esmwzylg==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "hash.js": "1.1.7" + } + }, + "@ethersproject/signing-key": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.3.0.tgz", + "integrity": "sha512-+DX/GwHAd0ok1bgedV1cKO0zfK7P/9aEyNoaYiRsGHpCecN7mhLqcdoUiUzE7Uz86LBsxm5ssK0qA1kBB47fbQ==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + }, + "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 + } + } + }, + "@ethersproject/solidity": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.3.0.tgz", + "integrity": "sha512-uLRBaNUiISHbut94XKewJgQh6UmydWTBp71I7I21pkjVXfZO2dJ5EOo3jCnumJc01M4LOm79dlNNmF3oGIvweQ==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/keccak256": "^5.3.0", + "@ethersproject/sha2": "^5.3.0", + "@ethersproject/strings": "^5.3.0" + } + }, + "@ethersproject/strings": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.3.0.tgz", + "integrity": "sha512-j/AzIGZ503cvhuF2ldRSjB0BrKzpsBMtCieDtn4TYMMZMQ9zScJn9wLzTQl/bRNvJbBE6TOspK0r8/Ngae/f2Q==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/constants": "^5.3.0", + "@ethersproject/logger": "^5.3.0" + } + }, + "@ethersproject/transactions": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.3.0.tgz", + "integrity": "sha512-cdfK8VVyW2oEBCXhURG0WQ6AICL/r6Gmjh0e4Bvbv6MCn/GBd8FeBH3rtl7ho+AW50csMKeGv3m3K1HSHB2jMQ==", + "dev": true, + "requires": { + "@ethersproject/address": "^5.3.0", + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/constants": "^5.3.0", + "@ethersproject/keccak256": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/rlp": "^5.3.0", + "@ethersproject/signing-key": "^5.3.0" + } + }, + "@ethersproject/units": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.3.0.tgz", + "integrity": "sha512-BkfccZGwfJ6Ob+AelpIrgAzuNhrN2VLp3AILnkqTOv+yBdsc83V4AYf25XC/u0rHnWl6f4POaietPwlMqP2vUg==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/constants": "^5.3.0", + "@ethersproject/logger": "^5.3.0" + } + }, + "@ethersproject/wallet": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.3.0.tgz", + "integrity": "sha512-boYBLydG6671p9QoG6EinNnNzbm7DNOjVT20eV8J6HQEq4aUaGiA2CytF2vK+2rOEWbzhZqoNDt6AlkE1LlsTg==", + "dev": true, + "requires": { + "@ethersproject/abstract-provider": "^5.3.0", + "@ethersproject/abstract-signer": "^5.3.0", + "@ethersproject/address": "^5.3.0", + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/hash": "^5.3.0", + "@ethersproject/hdnode": "^5.3.0", + "@ethersproject/json-wallets": "^5.3.0", + "@ethersproject/keccak256": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/random": "^5.3.0", + "@ethersproject/signing-key": "^5.3.0", + "@ethersproject/transactions": "^5.3.0", + "@ethersproject/wordlists": "^5.3.0" + } + }, + "@ethersproject/web": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.3.0.tgz", + "integrity": "sha512-Ni6/DHnY6k/TD41LEkv0RQDx4jqWz5e/RZvrSecsxGYycF+MFy2z++T/yGc2peRunLOTIFwEksgEGGlbwfYmhQ==", + "dev": true, + "requires": { + "@ethersproject/base64": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/strings": "^5.3.0" + } + }, + "@ethersproject/wordlists": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.3.0.tgz", + "integrity": "sha512-JcwumCZcsUxgWpiFU/BRy6b4KlTRdOmYvOKZcAw/3sdF93/pZyPW5Od2hFkHS8oWp4xS06YQ+qHqQhdcxdHafQ==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/hash": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/strings": "^5.3.0" + } + }, + "@graphql-tools/batch-delegate": { + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-delegate/-/batch-delegate-6.2.6.tgz", + "integrity": "sha512-QUoE9pQtkdNPFdJHSnBhZtUfr3M7pIRoXoMR+TG7DK2Y62ISKbT/bKtZEUU1/2v5uqd5WVIvw9dF8gHDSJAsSA==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/delegate": "^6.2.4", + "dataloader": "2.0.0", + "tslib": "~2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/batch-execute": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-7.1.2.tgz", + "integrity": "sha512-IuR2SB2MnC2ztA/XeTMTfWcA0Wy7ZH5u+nDkDNLAdX+AaSyDnsQS35sCmHqG0VOGTl7rzoyBWLCKGwSJplgtwg==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/utils": "^7.7.0", + "dataloader": "2.0.0", + "tslib": "~2.2.0", + "value-or-promise": "1.0.6" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + } + } + }, + "@graphql-tools/code-file-loader": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-6.3.1.tgz", + "integrity": "sha512-ZJimcm2ig+avgsEOWWVvAaxZrXXhiiSZyYYOJi0hk9wh5BxZcLUNKkTp6EFnZE/jmGUwuos3pIjUD3Hwi3Bwhg==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/graphql-tag-pluck": "^6.5.1", + "@graphql-tools/utils": "^7.0.0", + "tslib": "~2.1.0" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/delegate": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-6.2.4.tgz", + "integrity": "sha512-mXe6DfoWmq49kPcDrpKHgC2DSWcD5q0YCaHHoXYPAOlnLH8VMTY8BxcE8y/Do2eyg+GLcwAcrpffVszWMwqw0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "@graphql-tools/schema": "^6.2.4", + "@graphql-tools/utils": "^6.2.4", + "dataloader": "2.0.0", + "is-promise": "4.0.0", + "tslib": "~2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/git-loader": { + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-6.2.6.tgz", + "integrity": "sha512-ooQTt2CaG47vEYPP3CPD+nbA0F+FYQXfzrB1Y1ABN9K3d3O2RK3g8qwslzZaI8VJQthvKwt0A95ZeE4XxteYfw==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/graphql-tag-pluck": "^6.2.6", + "@graphql-tools/utils": "^7.0.0", + "tslib": "~2.1.0" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/github-loader": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-6.2.5.tgz", + "integrity": "sha512-DLuQmYeNNdPo8oWus8EePxWCfCAyUXPZ/p1PWqjrX/NGPyH2ZObdqtDAfRHztljt0F/qkBHbGHCEk2TKbRZTRw==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/graphql-tag-pluck": "^6.2.6", + "@graphql-tools/utils": "^7.0.0", + "cross-fetch": "3.0.6", + "tslib": "~2.0.1" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/graphql-file-loader": { + "version": "6.2.7", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-6.2.7.tgz", + "integrity": "sha512-5k2SNz0W87tDcymhEMZMkd6/vs6QawDyjQXWtqkuLTBF3vxjxPD1I4dwHoxgWPIjjANhXybvulD7E+St/7s9TQ==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/import": "^6.2.6", + "@graphql-tools/utils": "^7.0.0", + "tslib": "~2.1.0" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/graphql-tag-pluck": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-6.5.1.tgz", + "integrity": "sha512-7qkm82iFmcpb8M6/yRgzjShtW6Qu2OlCSZp8uatA3J0eMl87TxyJoUmL3M3UMMOSundAK8GmoyNVFUrueueV5Q==", + "dev": true, + "optional": true, + "requires": { + "@babel/parser": "7.12.16", + "@babel/traverse": "7.12.13", + "@babel/types": "7.12.13", + "@graphql-tools/utils": "^7.0.0", + "tslib": "~2.1.0" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/import": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-6.3.1.tgz", + "integrity": "sha512-1szR19JI6WPibjYurMLdadHKZoG9C//8I/FZ0Dt4vJSbrMdVNp8WFxg4QnZrDeMG4MzZc90etsyF5ofKjcC+jw==", + "dev": true, + "optional": true, + "requires": { + "resolve-from": "5.0.0", + "tslib": "~2.2.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/json-file-loader": { + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-6.2.6.tgz", + "integrity": "sha512-CnfwBSY5926zyb6fkDBHnlTblHnHI4hoBALFYXnrg0Ev4yWU8B04DZl/pBRUc459VNgO2x8/mxGIZj2hPJG1EA==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/utils": "^7.0.0", + "tslib": "~2.0.1" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/links": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/links/-/links-6.2.5.tgz", + "integrity": "sha512-XeGDioW7F+HK6HHD/zCeF0HRC9s12NfOXAKv1HC0J7D50F4qqMvhdS/OkjzLoBqsgh/Gm8icRc36B5s0rOA9ig==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/utils": "^7.0.0", + "apollo-link": "1.2.14", + "apollo-upload-client": "14.1.2", + "cross-fetch": "3.0.6", + "form-data": "3.0.0", + "is-promise": "4.0.0", + "tslib": "~2.0.1" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/load": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-6.2.8.tgz", + "integrity": "sha512-JpbyXOXd8fJXdBh2ta0Q4w8ia6uK5FHzrTNmcvYBvflFuWly2LDTk2abbSl81zKkzswQMEd2UIYghXELRg8eTA==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/merge": "^6.2.12", + "@graphql-tools/utils": "^7.5.0", + "globby": "11.0.3", + "import-from": "3.0.0", + "is-glob": "4.0.1", + "p-limit": "3.1.0", + "tslib": "~2.2.0", + "unixify": "1.0.0", + "valid-url": "1.0.9" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "optional": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "optional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "optional": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "optional": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "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, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "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, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", + "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "dev": true, + "optional": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "optional": 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, + "optional": true + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "optional": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "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, + "optional": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "optional": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "optional": true + }, + "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, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "@graphql-tools/load-files": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/load-files/-/load-files-6.3.2.tgz", + "integrity": "sha512-3mgwEKZ8yy7CD/uVs9yeXR3r+GwjlTKRG5bC75xdJFN8WbzbcHjIJiTXfWSAYqbfSTam0hWnRdWghagzFSo5kQ==", + "dev": true, + "optional": true, + "requires": { + "globby": "11.0.3", + "tslib": "~2.1.0", + "unixify": "1.0.0" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "optional": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "optional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "optional": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "optional": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "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, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "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, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", + "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "dev": true, + "optional": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "optional": 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, + "optional": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "optional": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "optional": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "optional": true + }, + "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, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/merge": { + "version": "6.2.14", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-6.2.14.tgz", + "integrity": "sha512-RWT4Td0ROJai2eR66NHejgf8UwnXJqZxXgDWDI+7hua5vNA2OW8Mf9K1Wav1ZkjWnuRp4ztNtkZGie5ISw55ow==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/schema": "^7.0.0", + "@graphql-tools/utils": "^7.7.0", + "tslib": "~2.2.0" + }, + "dependencies": { + "@graphql-tools/schema": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-7.1.5.tgz", + "integrity": "sha512-uyn3HSNSckf4mvQSq0Q07CPaVZMNFCYEVxroApOaw802m9DcZPgf9XVPy/gda5GWj9AhbijfRYVTZQgHnJ4CXA==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/utils": "^7.1.2", + "tslib": "~2.2.0", + "value-or-promise": "1.0.6" + } + }, + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + } + } + }, + "@graphql-tools/mock": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/mock/-/mock-6.2.4.tgz", + "integrity": "sha512-O5Zvq/mcDZ7Ptky0IZ4EK9USmxV6FEVYq0Jxv2TI80kvxbCjt0tbEpZ+r1vIt1gZOXlAvadSHYyzWnUPh+1vkQ==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/schema": "^6.2.4", + "@graphql-tools/utils": "^6.2.4", + "tslib": "~2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/module-loader": { + "version": "6.2.7", + "resolved": "https://registry.npmjs.org/@graphql-tools/module-loader/-/module-loader-6.2.7.tgz", + "integrity": "sha512-ItAAbHvwfznY9h1H9FwHYDstTcm22Dr5R9GZtrWlpwqj0jaJGcBxsMB9jnK9kFqkbtFYEe4E/NsSnxsS4/vViQ==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/utils": "^7.5.0", + "tslib": "~2.1.0" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/relay-operation-optimizer": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.3.0.tgz", + "integrity": "sha512-Or3UgRvkY9Fq1AAx7q38oPqFmTepLz7kp6wDHKyR0ceG7AvHv5En22R12mAeISInbhff4Rpwgf6cE8zHRu6bCw==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/utils": "^7.1.0", + "relay-compiler": "10.1.0", + "tslib": "~2.0.1" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true, + "optional": true + } + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/resolvers-composition": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/resolvers-composition/-/resolvers-composition-6.2.8.tgz", + "integrity": "sha512-/2xedRZYhvts88x9Rv/VWrk69wpl84M7cuYZ4aAacqxnXNm7zxT+MqeL54lsRhq2Kb2yjEhtfguEiqOn+kV8Xg==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/utils": "^7.9.1", + "lodash": "4.17.21", + "tslib": "~2.2.0" + }, + "dependencies": { + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + } + } + }, + "@graphql-tools/schema": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-6.2.4.tgz", + "integrity": "sha512-rh+14lSY1q8IPbEv2J9x8UBFJ5NrDX9W5asXEUlPp+7vraLp/Tiox4GXdgyA92JhwpYco3nTf5Bo2JDMt1KnAQ==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/utils": "^6.2.4", + "tslib": "~2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/stitch": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/stitch/-/stitch-6.2.4.tgz", + "integrity": "sha512-0C7PNkS7v7iAc001m7c1LPm5FUB0/DYw+s3OyCii6YYYHY8NwdI0roeOyeDGFJkFubWBQfjc3hoSyueKtU73mw==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/batch-delegate": "^6.2.4", + "@graphql-tools/delegate": "^6.2.4", + "@graphql-tools/merge": "^6.2.4", + "@graphql-tools/schema": "^6.2.4", + "@graphql-tools/utils": "^6.2.4", + "@graphql-tools/wrap": "^6.2.4", + "is-promise": "4.0.0", + "tslib": "~2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/url-loader": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-6.10.1.tgz", + "integrity": "sha512-DSDrbhQIv7fheQ60pfDpGD256ixUQIR6Hhf9Z5bRjVkXOCvO5XrkwoWLiU7iHL81GB1r0Ba31bf+sl+D4nyyfw==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/delegate": "^7.0.1", + "@graphql-tools/utils": "^7.9.0", + "@graphql-tools/wrap": "^7.0.4", + "@microsoft/fetch-event-source": "2.0.1", + "@types/websocket": "1.0.2", + "abort-controller": "3.0.0", + "cross-fetch": "3.1.4", + "extract-files": "9.0.0", + "form-data": "4.0.0", + "graphql-ws": "^4.4.1", + "is-promise": "4.0.0", + "isomorphic-ws": "4.0.1", + "lodash": "4.17.21", + "meros": "1.1.4", + "subscriptions-transport-ws": "^0.9.18", + "sync-fetch": "0.3.0", + "tslib": "~2.2.0", + "valid-url": "1.0.9", + "ws": "7.4.5" + }, + "dependencies": { + "@graphql-tools/delegate": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-7.1.5.tgz", + "integrity": "sha512-bQu+hDd37e+FZ0CQGEEczmRSfQRnnXeUxI/0miDV+NV/zCbEdIJj5tYFNrKT03W6wgdqx8U06d8L23LxvGri/g==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "@graphql-tools/batch-execute": "^7.1.2", + "@graphql-tools/schema": "^7.1.5", + "@graphql-tools/utils": "^7.7.1", + "dataloader": "2.0.0", + "tslib": "~2.2.0", + "value-or-promise": "1.0.6" + } + }, + "@graphql-tools/schema": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-7.1.5.tgz", + "integrity": "sha512-uyn3HSNSckf4mvQSq0Q07CPaVZMNFCYEVxroApOaw802m9DcZPgf9XVPy/gda5GWj9AhbijfRYVTZQgHnJ4CXA==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/utils": "^7.1.2", + "tslib": "~2.2.0", + "value-or-promise": "1.0.6" + } + }, + "@graphql-tools/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.2", + "tslib": "~2.2.0" + } + }, + "@graphql-tools/wrap": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-7.0.8.tgz", + "integrity": "sha512-1NDUymworsOlb53Qfh7fonDi2STvqCtbeE68ntKY9K/Ju/be2ZNxrFSbrBHwnxWcN9PjISNnLcAyJ1L5tCUyhg==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/delegate": "^7.1.5", + "@graphql-tools/schema": "^7.1.5", + "@graphql-tools/utils": "^7.8.1", + "tslib": "~2.2.0", + "value-or-promise": "1.0.6" + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "cross-fetch": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", + "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "dev": true, + "optional": true, + "requires": { + "node-fetch": "2.6.1" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "ws": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", + "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/utils": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-6.2.4.tgz", + "integrity": "sha512-ybgZ9EIJE3JMOtTrTd2VcIpTXtDrn2q6eiYkeYMKRVh3K41+LZa6YnR2zKERTXqTWqhobROwLt4BZbw2O3Aeeg==", + "dev": true, + "optional": true, + "requires": { + "@ardatan/aggregate-error": "0.0.6", + "camel-case": "4.1.1", + "tslib": "~2.0.1" + }, + "dependencies": { + "camel-case": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", + "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", + "dev": true, + "optional": true, + "requires": { + "pascal-case": "^3.1.1", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "optional": true + } + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "optional": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "optional": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-tools/wrap": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-6.2.4.tgz", + "integrity": "sha512-cyQgpybolF9DjL2QNOvTS1WDCT/epgYoiA8/8b3nwv5xmMBQ6/6nYnZwityCZ7njb7MMyk7HBEDNNlP9qNJDcA==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/delegate": "^6.2.4", + "@graphql-tools/schema": "^6.2.4", + "@graphql-tools/utils": "^6.2.4", + "is-promise": "4.0.0", + "tslib": "~2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "@graphql-typed-document-node/core": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.0.tgz", + "integrity": "sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg==", + "dev": true, + "optional": true + }, + "@gulp-sourcemaps/map-sources": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", + "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^2.0.1", + "through2": "^2.0.3" + }, + "dependencies": { + "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, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "@improbable-eng/grpc-web": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.13.0.tgz", + "integrity": "sha512-vaxxT+Qwb7GPqDQrBV4vAAfH0HywgOLw6xGIKXd9Q8hcV63CQhmS3p4+pZ9/wVvt4Ph3ZDK9fdC983b9aGMUFg==", + "dev": true, + "optional": true, + "requires": { + "browser-headers": "^0.4.0" + } + }, + "@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 + }, + "@ledgerhq/devices": { + "version": "5.51.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-5.51.1.tgz", + "integrity": "sha512-4w+P0VkbjzEXC7kv8T1GJ/9AVaP9I6uasMZ/JcdwZBS3qwvKo5A5z9uGhP5c7TvItzcmPb44b5Mw2kT+WjUuAA==", + "dev": true, + "optional": true, + "requires": { + "@ledgerhq/errors": "^5.50.0", + "@ledgerhq/logs": "^5.50.0", + "rxjs": "6", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@ledgerhq/errors": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-5.50.0.tgz", + "integrity": "sha512-gu6aJ/BHuRlpU7kgVpy2vcYk6atjB4iauP2ymF7Gk0ez0Y/6VSMVSJvubeEQN+IV60+OBK0JgeIZG7OiHaw8ow==", + "dev": true, + "optional": true + }, + "@ledgerhq/hw-transport": { + "version": "5.51.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-5.51.1.tgz", + "integrity": "sha512-6wDYdbWrw9VwHIcoDnqWBaDFyviyjZWv6H9vz9Vyhe4Qd7TIFmbTl/eWs6hZvtZBza9K8y7zD8ChHwRI4s9tSw==", + "dev": true, + "optional": true, + "requires": { + "@ledgerhq/devices": "^5.51.1", + "@ledgerhq/errors": "^5.50.0", + "events": "^3.3.0" + } + }, + "@ledgerhq/hw-transport-webusb": { + "version": "5.53.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-webusb/-/hw-transport-webusb-5.53.1.tgz", + "integrity": "sha512-A/f+xcrkIAZiJrvPpDvsrjxQX4cI2kbdiunQkwsYmOG3Bp4z89ZnsBiC7YBst4n2/g+QgTg0/KPVtODU5djooQ==", + "dev": true, + "optional": true, + "requires": { + "@ledgerhq/devices": "^5.51.1", + "@ledgerhq/errors": "^5.50.0", + "@ledgerhq/hw-transport": "^5.51.1", + "@ledgerhq/logs": "^5.50.0" + } + }, + "@ledgerhq/logs": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/logs/-/logs-5.50.0.tgz", + "integrity": "sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA==", + "dev": true, + "optional": true + }, + "@microsoft/fetch-event-source": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz", + "integrity": "sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA==", + "dev": true, + "optional": true + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@multiformats/base-x": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz", + "integrity": "sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==", + "dev": true, + "optional": true + }, + "@nodefactory/filsnap-adapter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@nodefactory/filsnap-adapter/-/filsnap-adapter-0.2.2.tgz", + "integrity": "sha512-nbaYMwVopOXN2bWOdDY3il6gGL9qMuCmMN4WPuoxzJjSnAMJNqEeSe6MNNJ/fYBLipZcJfAtirNXRrFLFN+Tvw==", + "dev": true, + "optional": true + }, + "@nodefactory/filsnap-types": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@nodefactory/filsnap-types/-/filsnap-types-0.2.2.tgz", + "integrity": "sha512-XT1tE2vrYF2D0tSNNekgjqKRpqPQn4W72eKul9dDCul/8ykouhqnVTyjFHYvBhlBWE0PK3nmG7i83QvhgGSiMw==", + "dev": true, + "optional": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + } + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", + "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@nomiclabs/hardhat-ethers": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.2.tgz", + "integrity": "sha512-6quxWe8wwS4X5v3Au8q1jOvXYEPkS1Fh+cME5u6AwNdnI4uERvPlVjlgRWzpnb+Rrt1l/cEqiNRH9GlsBMSDQg==", + "dev": true + }, + "@nomiclabs/hardhat-ganache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ganache/-/hardhat-ganache-2.0.0.tgz", + "integrity": "sha512-JJI4+5bHZUoeuIZL42usxp+0i/krYnoApzzA2Xii1P7DwrZHwFBa2OCtR1sUq5z3VTSTvQKrJ1d2/Y6CoQGTKQ==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "ganache-core": "^2.7.0", + "ts-interface-checker": "^0.1.9" + }, + "dependencies": { + "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 + } + } + }, + "@nomiclabs/hardhat-truffle5": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.0.tgz", + "integrity": "sha512-JLjyfeXTiSqa0oLHcN3i8kD4coJa4Gx6uAXybGv3aBiliEbHddLSzmBWx0EU69a1/Ad5YDdGSqVnjB8mkUCr/g==", + "dev": true, + "requires": { + "@nomiclabs/truffle-contract": "^4.2.23", + "@types/chai": "^4.2.0", + "chai": "^4.2.0", + "ethereumjs-util": "^6.1.0", + "fs-extra": "^7.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "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" + } + } + } + }, + "@nomiclabs/hardhat-web3": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz", + "integrity": "sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==", + "dev": true, + "requires": { + "@types/bignumber.js": "^5.0.0" + } + }, + "@nomiclabs/truffle-contract": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@nomiclabs/truffle-contract/-/truffle-contract-4.2.23.tgz", + "integrity": "sha512-Khj/Ts9r0LqEpGYhISbc+8WTOd6qJ4aFnDR+Ew+neqcjGnhwrIvuihNwPFWU6hDepW3Xod6Y+rTo90N8sLRDjw==", + "dev": true, + "requires": { + "@truffle/blockchain-utils": "^0.0.25", + "@truffle/contract-schema": "^3.2.5", + "@truffle/debug-utils": "^4.2.9", + "@truffle/error": "^0.0.11", + "@truffle/interface-adapter": "^0.4.16", + "bignumber.js": "^7.2.1", + "ethereum-ens": "^0.8.0", + "ethers": "^4.0.0-beta.1", + "source-map-support": "^0.5.19" + }, + "dependencies": { + "bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", + "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 + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "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" + } + }, + "ethers": { + "version": "4.0.48", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.48.tgz", + "integrity": "sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g==", + "dev": true, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", + "dev": true + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", + "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": { + "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" + } + }, + "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" + } + } + } + }, + "@openzeppelin/test-helpers": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@openzeppelin/test-helpers/-/test-helpers-0.5.11.tgz", + "integrity": "sha512-HkFpCjtTD8dk+wdYhsT07YbMGCE+Z4Wp5sBKXvPDF3Lynoc0H2KqZgCWV+qr2YZ0WW1oX/sXkKFrrKJ0caBTjw==", + "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": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", + "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": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", + "dev": true, + "optional": true + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "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": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", + "dev": true, + "optional": true + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", + "dev": true, + "optional": true + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", + "dev": true, + "optional": true + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", + "dev": true, + "optional": true + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", + "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.1.0", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.0.tgz", + "integrity": "sha512-uI2dQN43zqLWCt6B/BMGRMY6db7TTY4qeHHfGeKb3EOhmOKjU3KdWvNLJyqaHRksv/ErdNH7cFZWg9jXtewy4g==", + "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 + }, + "@repeaterjs/repeater": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.4.tgz", + "integrity": "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==", + "dev": true, + "optional": true + }, + "@sentry/core": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", + "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "dev": true, + "requires": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@sentry/hub": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "dev": true, + "requires": { + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@sentry/minimal": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", + "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "dev": true, + "requires": { + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@sentry/node": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", + "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", + "dev": true, + "requires": { + "@sentry/core": "5.30.0", + "@sentry/hub": "5.30.0", + "@sentry/tracing": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@sentry/tracing": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", + "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", + "dev": true, + "requires": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@sentry/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", + "dev": true + }, + "@sentry/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "dev": true, + "requires": { + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@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 + }, + "@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==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@textile/buckets": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@textile/buckets/-/buckets-6.0.5.tgz", + "integrity": "sha512-MJum/qLGPE13Ew0uhoNI4Wp2SdDCdmfp35JFEBHU4Uisna0PZ4lfOFXZVA/cVVgw5g94NOm1KS0FXQKu0x8prw==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@repeaterjs/repeater": "^3.0.4", + "@textile/buckets-grpc": "2.6.5", + "@textile/context": "^0.11.1", + "@textile/crypto": "^4.1.1", + "@textile/grpc-authentication": "^3.3.4", + "@textile/grpc-connection": "^2.4.1", + "@textile/grpc-transport": "^0.4.0", + "@textile/hub-grpc": "2.6.5", + "@textile/hub-threads-client": "^5.3.4", + "@textile/security": "^0.8.1", + "@textile/threads-id": "^0.5.1", + "abort-controller": "^3.0.0", + "cids": "^1.1.4", + "it-drain": "^1.0.3", + "loglevel": "^1.6.8", + "paramap-it": "^0.1.1" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "@textile/buckets-grpc": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@textile/buckets-grpc/-/buckets-grpc-2.6.5.tgz", + "integrity": "sha512-jySQPKJvqeyeVJZIx4BUlgi3MHxKvVpyV1NtoZXserItLbNNPURaFuCeLi7ujAXjGWIcMMJMbcFfSsetDVvrOQ==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@types/google-protobuf": "^3.7.4", + "google-protobuf": "^3.13.0" + } + }, + "@textile/context": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@textile/context/-/context-0.11.1.tgz", + "integrity": "sha512-XP1cBT5OaJVt8LrTCzE/OffnmE4ImwDXiGG7kzU5gCRSx5ftafEwgOOjbQA3HRPl7nWW1YdBsiZf35xSM1KmoQ==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@textile/security": "^0.8.1" + } + }, + "@textile/crypto": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@textile/crypto/-/crypto-4.1.1.tgz", + "integrity": "sha512-n/SxZyNvAD4FEyfX1HXtyNDcK+stUYur0vgwIoi5NzT6jP6gwhFVzf8NI3TBNIP2rInCAuF3Qks8hWS+LWL/YA==", + "dev": true, + "optional": true, + "requires": { + "@types/ed2curve": "^0.2.2", + "ed2curve": "^0.3.0", + "fastestsmallesttextencoderdecoder": "^1.0.22", + "multibase": "^3.1.0", + "tweetnacl": "^1.0.3" + }, + "dependencies": { + "multibase": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-3.1.2.tgz", + "integrity": "sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1", + "web-encoding": "^1.0.6" + } + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true, + "optional": true + } + } + }, + "@textile/grpc-authentication": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@textile/grpc-authentication/-/grpc-authentication-3.3.4.tgz", + "integrity": "sha512-E7pw+MDNu7oWFWiTqDuLZncei+GIwnlSXlRlrRUXITZrf9vBiY+QHKkDrhLyhBpaLGazqB0PERzOFx8a0BYlbw==", + "dev": true, + "optional": true, + "requires": { + "@textile/context": "^0.11.1", + "@textile/crypto": "^4.1.1", + "@textile/grpc-connection": "^2.4.1", + "@textile/hub-threads-client": "^5.3.4", + "@textile/security": "^0.8.1" + } + }, + "@textile/grpc-connection": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@textile/grpc-connection/-/grpc-connection-2.4.1.tgz", + "integrity": "sha512-8+y9PFcl9VBCludEpXvzputIis3lKYAzExdm8+zvtrr9uv0dCovIS0bu2GJoqU6DJkQSVBP9PA4V6T9THuQpjQ==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.12.0", + "@textile/context": "^0.11.1", + "@textile/grpc-transport": "^0.4.0" + }, + "dependencies": { + "@improbable-eng/grpc-web": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.12.0.tgz", + "integrity": "sha512-uJjgMPngreRTYPBuo6gswMj1gK39Wbqre/RgE0XnSDXJRg6ST7ZhuS53dFE6Vc2CX4jxgl+cO+0B3op8LA4Q0Q==", + "dev": true, + "optional": true, + "requires": { + "browser-headers": "^0.4.0" + } + } + } + }, + "@textile/grpc-powergate-client": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@textile/grpc-powergate-client/-/grpc-powergate-client-2.6.0.tgz", + "integrity": "sha512-5QkU3aClcuqsxPd9Ej2TTYjFUJhXzZzcZ/tSDlZ5jerFnRp09SaL4U+yjnBSe+Dc1k/jv6MUnfjte2vq3YX3Nw==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.14.0", + "@types/google-protobuf": "^3.15.2", + "google-protobuf": "^3.17.2" + }, + "dependencies": { + "@improbable-eng/grpc-web": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.14.0.tgz", + "integrity": "sha512-ag1PTMWpBZKGi6GrEcZ4lkU5Qag23Xjo10BmnK9qyx4TMmSVcWmQ3rECirfQzm2uogrM9n1M6xfOpFsJP62ivA==", + "dev": true, + "optional": true, + "requires": { + "browser-headers": "^0.4.1" + } + } + } + }, + "@textile/grpc-transport": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@textile/grpc-transport/-/grpc-transport-0.4.0.tgz", + "integrity": "sha512-OyHyv963Y0y1qlMkuIp7urWCKbCL0Tjn06ffFo+u82yy6G1YprjTQDE980dUGQMZfK1EF2/OTjqZb04PxHa5zQ==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@types/ws": "^7.2.6", + "isomorphic-ws": "^4.0.1", + "loglevel": "^1.6.6", + "ws": "^7.2.1" + }, + "dependencies": { + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "optional": true + } + } + }, + "@textile/hub": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@textile/hub/-/hub-6.1.2.tgz", + "integrity": "sha512-BnmF1539+/939BmmHt+X7TzSrDgD3vkP5tBHZKksjppJn6q+6BJOPYdmWapt6S9YOTQAoCcYkkcr+xUdN8z3mA==", + "dev": true, + "optional": true, + "requires": { + "@textile/buckets": "^6.0.5", + "@textile/crypto": "^4.1.1", + "@textile/grpc-authentication": "^3.3.4", + "@textile/hub-filecoin": "^2.0.5", + "@textile/hub-grpc": "2.6.5", + "@textile/hub-threads-client": "^5.3.4", + "@textile/security": "^0.8.1", + "@textile/threads-id": "^0.5.1", + "@textile/users": "^6.0.4", + "loglevel": "^1.6.8", + "multihashes": "3.1.2" + }, + "dependencies": { + "multibase": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-3.1.2.tgz", + "integrity": "sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1", + "web-encoding": "^1.0.6" + } + }, + "multihashes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-3.1.2.tgz", + "integrity": "sha512-AP4IoV/YzkNrfbQKZE3OMPibrmy350OmCd6cJkwyM8oExaXIlOY4UnOOVSQtAEuq/LR01XfXKCESidzZvSwHCQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^3.1.0", + "uint8arrays": "^2.0.5", + "varint": "^6.0.0" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + }, + "dependencies": { + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + } + } + }, + "varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "optional": true + } + } + }, + "@textile/hub-filecoin": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@textile/hub-filecoin/-/hub-filecoin-2.0.5.tgz", + "integrity": "sha512-5qwm3aMeR5q6KBbY1tVagUynMDw/Irh6jijgtlv66kQ+CbV4TgQjLsIH14UQkgcAW5hj1CMfqPIabLaBXFtDlA==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.12.0", + "@textile/context": "^0.11.1", + "@textile/crypto": "^4.1.1", + "@textile/grpc-authentication": "^3.3.4", + "@textile/grpc-connection": "^2.4.1", + "@textile/grpc-powergate-client": "^2.3.0", + "@textile/hub-grpc": "2.6.5", + "@textile/security": "^0.8.1", + "event-iterator": "^2.0.0", + "loglevel": "^1.6.8" + }, + "dependencies": { + "@improbable-eng/grpc-web": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.12.0.tgz", + "integrity": "sha512-uJjgMPngreRTYPBuo6gswMj1gK39Wbqre/RgE0XnSDXJRg6ST7ZhuS53dFE6Vc2CX4jxgl+cO+0B3op8LA4Q0Q==", + "dev": true, + "optional": true, + "requires": { + "browser-headers": "^0.4.0" + } + }, + "event-iterator": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/event-iterator/-/event-iterator-2.0.0.tgz", + "integrity": "sha512-KGft0ldl31BZVV//jj+IAIGCxkvvUkkON+ScH6zfoX+l+omX6001ggyRSpI0Io2Hlro0ThXotswCtfzS8UkIiQ==", + "dev": true, + "optional": true + } + } + }, + "@textile/hub-grpc": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@textile/hub-grpc/-/hub-grpc-2.6.5.tgz", + "integrity": "sha512-BFjhkBOQD1CebGjP4Hys/6Z5OlzepZTbC11kUSuLG6mt4rb2JiDNw25/UUzylsJCkpyAusob2sttJ9GUh/lv+g==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@types/google-protobuf": "^3.7.4", + "google-protobuf": "^3.13.0" + } + }, + "@textile/hub-threads-client": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/@textile/hub-threads-client/-/hub-threads-client-5.3.4.tgz", + "integrity": "sha512-bKbpavWOg2bH9Zuf/aSmg7YOfKzx9yL7xmvPYo1FBaVcos8XeZvsN2gA80oFzTfm88e6xvotNNcRy7GktGDWIQ==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@textile/context": "^0.11.1", + "@textile/hub-grpc": "2.6.5", + "@textile/security": "^0.8.1", + "@textile/threads-client": "^2.1.2", + "@textile/threads-id": "^0.5.1", + "@textile/users-grpc": "2.6.5", + "loglevel": "^1.7.0" + } + }, + "@textile/multiaddr": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@textile/multiaddr/-/multiaddr-0.5.1.tgz", + "integrity": "sha512-i/lBZ9j+MgxqcjLl+4lbOCbw5dU3Vbn39aGKma8yBILLPbmCAWWUDGzk5+Rbcnk3giuPBM/nNhJLLSeKzK+rhA==", + "dev": true, + "optional": true, + "requires": { + "@textile/threads-id": "^0.5.1", + "multiaddr": "^8.1.2", + "varint": "^6.0.0" + }, + "dependencies": { + "varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "optional": true + } + } + }, + "@textile/security": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@textile/security/-/security-0.8.1.tgz", + "integrity": "sha512-FVoBRP7DAL+lh1+CyUQPE3ceG8HO3LMClTPYuNjW+2BAOR+KiKf5vFbeSpe29l6p+A9LF5/r2KWz7bN5cqCs8w==", + "dev": true, + "optional": true, + "requires": { + "@consento/sync-randombytes": "^1.0.5", + "fast-sha256": "^1.3.0", + "fastestsmallesttextencoderdecoder": "^1.0.22", + "multibase": "^3.1.0" + }, + "dependencies": { + "multibase": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-3.1.2.tgz", + "integrity": "sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1", + "web-encoding": "^1.0.6" + } + } + } + }, + "@textile/threads-client": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@textile/threads-client/-/threads-client-2.1.2.tgz", + "integrity": "sha512-N4ItF3hxKmdC3oA1dAENw9uA7Q89q86/foYiNaXLPq5KJ1B3IYP3GdXjxe56wkT6dRRniCIREkRnqDdwVpRtQA==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@textile/context": "^0.11.1", + "@textile/crypto": "^4.1.1", + "@textile/grpc-transport": "^0.4.0", + "@textile/multiaddr": "^0.5.1", + "@textile/security": "^0.8.1", + "@textile/threads-client-grpc": "^1.0.2", + "@textile/threads-id": "^0.5.1", + "@types/to-json-schema": "^0.2.0", + "fastestsmallesttextencoderdecoder": "^1.0.22", + "to-json-schema": "^0.2.5" + } + }, + "@textile/threads-client-grpc": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@textile/threads-client-grpc/-/threads-client-grpc-1.0.2.tgz", + "integrity": "sha512-yrgdUb3VLGW18HKmbzAU8L7NElhnPYKWG9cHZG6EnV3ITS9zOiDydfVSNSkojEDfoFSel5x3eAUiOQbXUrkKng==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@types/google-protobuf": "^3.7.3", + "google-protobuf": "^3.13.0" + } + }, + "@textile/threads-id": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@textile/threads-id/-/threads-id-0.5.1.tgz", + "integrity": "sha512-Nyvp24RsHarLBT3JxEI5akshcKKXA4Yx851bAooReE5G/40cijMuxTeVK4hDM0HdTex4PZRYozpPRXIDFDA96Q==", + "dev": true, + "optional": true, + "requires": { + "@consento/sync-randombytes": "^1.0.4", + "multibase": "^3.1.0", + "varint": "^6.0.0" + }, + "dependencies": { + "multibase": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-3.1.2.tgz", + "integrity": "sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1", + "web-encoding": "^1.0.6" + } + }, + "varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "optional": true + } + } + }, + "@textile/users": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@textile/users/-/users-6.0.4.tgz", + "integrity": "sha512-/aDwdcsvpW0QrUuXmRAAg41oGjGebwMUGK5czY0gcI/+Av6W8PicHJk4O9ft5ByfwXWzUMyz3ODWH45OYi0TVQ==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@textile/buckets-grpc": "2.6.5", + "@textile/context": "^0.11.1", + "@textile/crypto": "^4.1.1", + "@textile/grpc-authentication": "^3.3.4", + "@textile/grpc-connection": "^2.4.1", + "@textile/grpc-transport": "^0.4.0", + "@textile/hub-grpc": "2.6.5", + "@textile/hub-threads-client": "^5.3.4", + "@textile/security": "^0.8.1", + "@textile/threads-id": "^0.5.1", + "@textile/users-grpc": "2.6.5", + "event-iterator": "^2.0.0", + "loglevel": "^1.7.0" + }, + "dependencies": { + "event-iterator": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/event-iterator/-/event-iterator-2.0.0.tgz", + "integrity": "sha512-KGft0ldl31BZVV//jj+IAIGCxkvvUkkON+ScH6zfoX+l+omX6001ggyRSpI0Io2Hlro0ThXotswCtfzS8UkIiQ==", + "dev": true, + "optional": true + } + } + }, + "@textile/users-grpc": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@textile/users-grpc/-/users-grpc-2.6.5.tgz", + "integrity": "sha512-JMxkze3eyxyuxhbuMrqdbVTqp5wQmv1YoXAq1gJdAYYpcOX5S4ov6arI5NPy3weF3+KP3U+BX/HdR8dIvkFAcw==", + "dev": true, + "optional": true, + "requires": { + "@improbable-eng/grpc-web": "^0.13.0", + "@types/google-protobuf": "^3.7.4", + "google-protobuf": "^3.13.0" + } + }, + "@truffle/abi-utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.2.1.tgz", + "integrity": "sha512-Ba05gGBzTqjzgpQ8Fpfny47HD3aMn7+LWZ44A0HXdMgn1d5bxjR8SPYlXV5jo5fpOOvsghfQTvSUk0G9fg2fIg==", + "dev": true, + "requires": { + "change-case": "3.0.2", + "faker": "^5.3.1", + "fast-check": "^2.12.1" + } + }, + "@truffle/blockchain-utils": { + "version": "0.0.25", + "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.0.25.tgz", + "integrity": "sha512-XA5m0BfAWtysy5ChHyiAf1fXbJxJXphKk+eZ9Rb9Twi6fn3Jg4gnHNwYXJacYFEydqT5vr2s4Ou812JHlautpw==", + "dev": true, + "requires": { + "source-map-support": "^0.5.19" + } + }, + "@truffle/code-utils": { + "version": "1.2.27", + "resolved": "https://registry.npmjs.org/@truffle/code-utils/-/code-utils-1.2.27.tgz", + "integrity": "sha512-1vnJYup1KDlXWsDbEinMFhWN1VyqRWxWzDN4UhdfqCUXrEWDBpGmKeEPLwwKYuUBY43TDPpnwq1/cGGN0PjOeA==", + "dev": true, + "requires": { + "cbor": "^5.1.0" + } + }, + "@truffle/codec": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.7.1.tgz", + "integrity": "sha512-mNd6KnW6J0UB1zafGBXDlTEbCMvWpmPAJmzv7aF/nAIaN/F8UePSCiQ1OTQP39Rprj6GFiCCaWVnBAwum6UGSg==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "bn.js": "^4.11.8", + "borc": "^2.1.2", + "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.9" + }, + "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 + }, + "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 + } + } + }, + "@truffle/config": { + "version": "1.2.42", + "resolved": "https://registry.npmjs.org/@truffle/config/-/config-1.2.42.tgz", + "integrity": "sha512-Nfn0tR3Wuj3PoC46AskNa8MOPU1M51NNXZConY11eWJtkalXielZPOtTLRKX3W45M2M7b7maT7L/aWl7lrsIow==", + "dev": true, + "optional": true, + "requires": { + "@truffle/error": "^0.0.14", + "@truffle/events": "^0.0.12", + "@truffle/provider": "^0.2.32", + "configstore": "^4.0.0", + "find-up": "^2.1.0", + "lodash.assignin": "^4.2.0", + "lodash.merge": "^4.6.2", + "module": "^1.2.5", + "original-require": "^1.0.1" + }, + "dependencies": { + "@truffle/error": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.0.14.tgz", + "integrity": "sha512-utJx+SZYoMqk8wldQG4gCVKhV8GwMJbWY7sLXFT/D8wWZTnE2peX7URFJh/cxkjTRCO328z1s2qewkhyVsu2HA==", + "dev": true, + "optional": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "optional": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "optional": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "optional": true, + "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=", + "dev": true, + "optional": true, + "requires": { + "p-limit": "^1.1.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=", + "dev": true, + "optional": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "optional": true + } + } + }, + "@truffle/contract": { + "version": "4.3.19", + "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.3.19.tgz", + "integrity": "sha512-asBwoxUePLwNAuYfHO/SvyZyqFQ9QMeUieJ6PXD9DBrUdNpjgJvk+WHYnXH4bWHgHakbTpL1MEBa1qmcAL+LMw==", + "dev": true, + "requires": { + "@truffle/blockchain-utils": "^0.0.30", + "@truffle/contract-schema": "^3.4.1", + "@truffle/debug-utils": "^5.0.19", + "@truffle/error": "^0.0.14", + "@truffle/interface-adapter": "^0.5.0", + "bignumber.js": "^7.2.1", + "ethereum-ens": "^0.8.0", + "ethers": "^4.0.32", + "web3": "1.3.6", + "web3-core-helpers": "1.3.6", + "web3-core-promievent": "1.3.6", + "web3-eth-abi": "1.3.6", + "web3-utils": "1.3.6" + }, + "dependencies": { + "@truffle/blockchain-utils": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.0.30.tgz", + "integrity": "sha512-3hkHSHxVavoALcxpBqD4YwHuCmkBrvjq6PAGw93i6WCB+pnejBD5sFjVCiZZKCogh4kGObxxcwu53+3dyT/6IQ==", + "dev": true + }, + "@truffle/codec": { + "version": "0.10.9", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.10.9.tgz", + "integrity": "sha512-+xBcn1mTAqBhVaFULkMC+pJnUp3prL9QZtE5I4XhlCar3QLkSGR9Oy+Bm5qZwH72rctBRD/lGp2ezUo/oFc2MQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "bn.js": "^5.1.3", + "cbor": "^5.1.0", + "debug": "^4.3.1", + "lodash.clonedeep": "^4.5.0", + "lodash.escaperegexp": "^4.1.2", + "lodash.partition": "^4.6.0", + "lodash.sum": "^4.0.2", + "semver": "^7.3.4", + "utf8": "^3.0.0", + "web3-utils": "1.3.6" + } + }, + "@truffle/debug-utils": { + "version": "5.0.19", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-5.0.19.tgz", + "integrity": "sha512-wCF5fwyJTHGBwQD+m8npRCrUIgSPw9jRiZlvyuE+TDcVNBpV4A1NcdsTJR/E5lAViLDTp9lpelsgA/Mw65kU+w==", + "dev": true, + "requires": { + "@truffle/codec": "^0.10.9", + "@trufflesuite/chromafi": "^2.2.2", + "bn.js": "^5.1.3", + "chalk": "^2.4.2", + "debug": "^4.3.1", + "highlight.js": "^10.4.0", + "highlightjs-solidity": "^1.1.0" + } + }, + "@truffle/error": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.0.14.tgz", + "integrity": "sha512-utJx+SZYoMqk8wldQG4gCVKhV8GwMJbWY7sLXFT/D8wWZTnE2peX7URFJh/cxkjTRCO328z1s2qewkhyVsu2HA==", + "dev": true + }, + "@truffle/interface-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.0.tgz", + "integrity": "sha512-0MRt9orgQqo0knyKDy0fGRqnI+alkuK0BUAvHB1/VUJgCKyWBNAUUZO5gPjuj75qCjV4Rw+W6SKDQpn2xOWsXw==", + "dev": true, + "requires": { + "bn.js": "^5.1.3", + "ethers": "^4.0.32", + "web3": "1.3.6" + } + }, + "bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", + "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" + }, + "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 + } + } + }, + "ethers": { + "version": "4.0.48", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.48.tgz", + "integrity": "sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g==", + "dev": true, + "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": { + "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 + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "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" + } + } + } + }, + "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==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", + "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 + }, + "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" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", + "dev": true + }, + "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": { + "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 + } + } + } + } + }, + "@truffle/contract-schema": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.1.tgz", + "integrity": "sha512-2gvu6gxJtbbI67H2Bwh2rBuej+1uCV3z4zKFzQZP00hjNoL+QfybrmBcOVB88PflBeEB+oUXuwQfDoKX3TXlnQ==", + "dev": true, + "requires": { + "ajv": "^6.10.0", + "crypto-js": "^3.1.9-1", + "debug": "^4.3.1" + }, + "dependencies": { + "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 + } + } + }, + "@truffle/db": { + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/@truffle/db/-/db-0.5.14.tgz", + "integrity": "sha512-rTRhRqPsG03Lv6y43n5CAZF9q40NK1D2VwqTI9xD7lU/klYYHtKklgWAIgqn4TmVS5tP2MGVNzgdr0tMzJQE0Q==", + "dev": true, + "optional": true, + "requires": { + "@truffle/abi-utils": "^0.2.1", + "@truffle/code-utils": "^1.2.27", + "@truffle/config": "^1.2.42", + "apollo-server": "^2.18.2", + "debug": "^4.3.1", + "fs-extra": "^9.1.0", + "graphql": "^15.3.0", + "graphql-tag": "^2.11.0", + "graphql-tools": "^6.2.4", + "json-stable-stringify": "^1.0.1", + "jsondown": "^1.0.0", + "pascal-case": "^2.0.1", + "pluralize": "^8.0.0", + "pouchdb": "7.1.1", + "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.3.6" + }, + "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 + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": 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, + "optional": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "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 + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "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.3.6", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.6.tgz", + "integrity": "sha512-hHatFaQpkQgjGVER17gNx8u1qMyaXFZtM0y0XLGH1bzsjMPlkMPLRcYOrZ00rOPfTEuYFOdrpGOqZXVmGrMZRg==", + "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.12.1", + "utf8": "3.0.0" + } + } + } + }, + "@truffle/debug-utils": { + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-4.2.14.tgz", + "integrity": "sha512-g5UTX2DPTzrjRjBJkviGI2IrQRTTSvqjmNWCNZNXP+vgQKNxL9maLZhQ6oA3BuuByVW/kusgYeXt8+W1zynC8g==", + "dev": true, + "requires": { + "@truffle/codec": "^0.7.1", + "@trufflesuite/chromafi": "^2.2.1", + "chalk": "^2.4.2", + "debug": "^4.1.0", + "highlight.js": "^9.15.8", + "highlightjs-solidity": "^1.0.18" + }, + "dependencies": { + "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 + } + } + }, + "@truffle/debugger": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@truffle/debugger/-/debugger-9.0.1.tgz", + "integrity": "sha512-1Om8f6LhHOYaYi3oV7+OoP4ZPZ9mkO+sHIsBvSU57Jptc3FnL3gYHV/fAhIih/dMWFDpywOTWKVMiK6vYq3bWw==", + "dev": true, + "requires": { + "@truffle/abi-utils": "^0.2.1", + "@truffle/codec": "^0.10.9", + "@truffle/source-map-utils": "^1.3.43", + "bn.js": "^5.1.3", + "debug": "^4.3.1", + "json-pointer": "^0.6.0", + "json-stable-stringify": "^1.0.1", + "lodash.flatten": "^4.4.0", + "lodash.merge": "^4.6.2", + "lodash.sum": "^4.0.2", + "lodash.zipwith": "^4.2.0", + "redux": "^3.7.2", + "redux-cli-logger": "^2.0.1", + "redux-saga": "1.0.0", + "remote-redux-devtools": "^0.5.12", + "reselect-tree": "^1.3.4", + "semver": "^7.3.4", + "web3": "1.3.6", + "web3-eth-abi": "1.3.6" + }, + "dependencies": { + "@truffle/codec": { + "version": "0.10.9", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.10.9.tgz", + "integrity": "sha512-+xBcn1mTAqBhVaFULkMC+pJnUp3prL9QZtE5I4XhlCar3QLkSGR9Oy+Bm5qZwH72rctBRD/lGp2ezUo/oFc2MQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "bn.js": "^5.1.3", + "cbor": "^5.1.0", + "debug": "^4.3.1", + "lodash.clonedeep": "^4.5.0", + "lodash.escaperegexp": "^4.1.2", + "lodash.partition": "^4.6.0", + "lodash.sum": "^4.0.2", + "semver": "^7.3.4", + "utf8": "^3.0.0", + "web3-utils": "1.3.6" + } + }, + "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" + }, + "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 + } + } + }, + "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.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" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "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": { + "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 + } + } + } + } + }, + "@truffle/error": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.0.11.tgz", + "integrity": "sha512-ju6TucjlJkfYMmdraYY/IBJaFb+Sa+huhYtOoyOJ+G29KcgytUVnDzKGwC7Kgk6IsxQMm62Mc1E0GZzFbGGipw==", + "dev": true + }, + "@truffle/events": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@truffle/events/-/events-0.0.12.tgz", + "integrity": "sha512-Atblkx0M/Ct+uzx41HpKLLdHxB6p7aQ9jXw/r5KCRnbMBbOdoYWF+PCebGFkLvVg7N0Ll2dHpDvB+PDGP//cew==", + "dev": true, + "optional": true, + "requires": { + "emittery": "^0.4.1", + "ora": "^3.4.0" + } + }, + "@truffle/interface-adapter": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.4.24.tgz", + "integrity": "sha512-2Zho4dJbm/XGwNleY7FdxcjXiAR3SzdGklgrAW4N/YVmltaJv6bT56ACIbPNN6AdzkTSTO65OlsB/63sfSa/VA==", + "dev": true, + "requires": { + "bn.js": "^5.1.3", + "ethers": "^4.0.32", + "web3": "1.3.6" + }, + "dependencies": { + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "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" + }, + "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 + } + } + }, + "ethers": { + "version": "4.0.48", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.48.tgz", + "integrity": "sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g==", + "dev": true, + "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": { + "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.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", + "dev": true + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", + "dev": true + } + } + }, + "@truffle/preserve": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@truffle/preserve/-/preserve-0.2.2.tgz", + "integrity": "sha512-yg2AII9X2o9kwLvMXGJ9jcmrIhKtMynXFP19LacA27MAOV/v+xjauXL9irfcd/9zpSv2b1DACYbeTyufpsatvw==", + "dev": true, + "optional": true, + "requires": { + "spinnies": "^0.5.1" + } + }, + "@truffle/preserve-fs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@truffle/preserve-fs/-/preserve-fs-0.2.2.tgz", + "integrity": "sha512-t5YPqVfdEdpC85QRGxWPmgq8/iC4dDE2PSmmt0KKwtSx2kVw+DCXLUdl82T6Bp5En5Hbg8Pwehi1h37OAJ7dWQ==", + "dev": true, + "optional": true, + "requires": { + "@truffle/preserve": "^0.2.2" + } + }, + "@truffle/preserve-to-buckets": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@truffle/preserve-to-buckets/-/preserve-to-buckets-0.2.2.tgz", + "integrity": "sha512-VxfnLQ4NDt2t/MrM3FAt1TfOHzkusgPgyltO/cTFYDj+ljXWlECPY9XZgQ60kpWLbNzq6SXjJuWYnCYEmTxghA==", + "dev": true, + "optional": true, + "requires": { + "@textile/hub": "^6.0.2", + "@truffle/preserve": "^0.2.2", + "cids": "^1.1.5", + "ipfs-http-client": "^48.2.2", + "isomorphic-ws": "^4.0.1", + "iter-tools": "^7.0.2", + "ws": "^7.4.3" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "optional": true + } + } + }, + "@truffle/preserve-to-filecoin": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@truffle/preserve-to-filecoin/-/preserve-to-filecoin-0.2.2.tgz", + "integrity": "sha512-cg5uFp1HTlVpVH0dTpv+0nR6v0SZP6673m2NaFOjYpTtbN4AA+ijvXd0XPdDNitw/6So+vDcPpzuE79RkY5zSg==", + "dev": true, + "optional": true, + "requires": { + "@truffle/preserve": "^0.2.2", + "cids": "^1.1.5", + "delay": "^5.0.0", + "filecoin.js": "^0.0.5-alpha", + "node-fetch": "^2.6.0" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "@truffle/preserve-to-ipfs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@truffle/preserve-to-ipfs/-/preserve-to-ipfs-0.2.2.tgz", + "integrity": "sha512-6y/237oLtkJbDRJb1Lj6xblz1iaQXfbjJdvtTAxwX3Z9bcMQmv33pDaUTEgkYXc+dYaOf8hQi511xEoqJXQx6A==", + "dev": true, + "optional": true, + "requires": { + "@truffle/preserve": "^0.2.2", + "cids": "^1.1.5", + "ipfs-http-client": "^48.2.2", + "iter-tools": "^7.0.2" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "@truffle/provider": { + "version": "0.2.32", + "resolved": "https://registry.npmjs.org/@truffle/provider/-/provider-0.2.32.tgz", + "integrity": "sha512-dzO7bnCO5iSLfoHH/SIIYQ5dUi9oVxtRE1qJ89dwKuUgtvaWOTPtZK1MLq7Ai+wrgNrYFKBVpxQjkCPXGdMWWw==", + "dev": true, + "requires": { + "@truffle/error": "^0.0.14", + "@truffle/interface-adapter": "^0.5.0", + "web3": "1.3.6" + }, + "dependencies": { + "@truffle/error": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.0.14.tgz", + "integrity": "sha512-utJx+SZYoMqk8wldQG4gCVKhV8GwMJbWY7sLXFT/D8wWZTnE2peX7URFJh/cxkjTRCO328z1s2qewkhyVsu2HA==", + "dev": true + }, + "@truffle/interface-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.0.tgz", + "integrity": "sha512-0MRt9orgQqo0knyKDy0fGRqnI+alkuK0BUAvHB1/VUJgCKyWBNAUUZO5gPjuj75qCjV4Rw+W6SKDQpn2xOWsXw==", + "dev": true, + "requires": { + "bn.js": "^5.1.3", + "ethers": "^4.0.32", + "web3": "1.3.6" + } + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "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" + }, + "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 + } + } + }, + "ethers": { + "version": "4.0.48", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.48.tgz", + "integrity": "sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g==", + "dev": true, + "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": { + "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.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", + "dev": true + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", + "dev": true + } + } + }, + "@truffle/source-map-utils": { + "version": "1.3.43", + "resolved": "https://registry.npmjs.org/@truffle/source-map-utils/-/source-map-utils-1.3.43.tgz", + "integrity": "sha512-QDXNnvJO2R/5eTpTgiZFggkqKcDEA0LoxdVGJKCoMY5hCwSoG+ybpmWtsMBW+1hCYewxjvb5yGgYkhnTv/fs0A==", + "dev": true, + "requires": { + "@truffle/code-utils": "^1.2.27", + "@truffle/codec": "^0.10.9", + "debug": "^4.3.1", + "json-pointer": "^0.6.0", + "node-interval-tree": "^1.3.3", + "web3-utils": "1.3.6" + }, + "dependencies": { + "@truffle/codec": { + "version": "0.10.9", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.10.9.tgz", + "integrity": "sha512-+xBcn1mTAqBhVaFULkMC+pJnUp3prL9QZtE5I4XhlCar3QLkSGR9Oy+Bm5qZwH72rctBRD/lGp2ezUo/oFc2MQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "bn.js": "^5.1.3", + "cbor": "^5.1.0", + "debug": "^4.3.1", + "lodash.clonedeep": "^4.5.0", + "lodash.escaperegexp": "^4.1.2", + "lodash.partition": "^4.6.0", + "lodash.sum": "^4.0.2", + "semver": "^7.3.4", + "utf8": "^3.0.0", + "web3-utils": "1.3.6" + } + }, + "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" + }, + "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 + } + } + }, + "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.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" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "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": { + "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 + } + } + } + } + }, + "@trufflesuite/chromafi": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-2.2.2.tgz", + "integrity": "sha512-mItQwVBsb8qP/vaYHQ1kDt2vJLhjoEXJptT6y6fJGvFophMFhOI/NsTVUa0nJL1nyMeFiS6hSYuNVdpQZzB1gA==", + "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": "^10.4.1", + "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": { + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true + } + } + }, + "@types/abstract-leveldown": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-5.0.1.tgz", + "integrity": "sha512-wYxU3kp5zItbxKmeRYCEplS2MW7DzyBnxPGj+GJVHZEUZiK/nn5Ei1sUFgURDh+X051+zsGe28iud3oHjrYWQQ==", + "dev": true + }, + "@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, + "requires": { + "@types/node": "*" + } + }, + "@types/bignumber.js": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-5.0.0.tgz", + "integrity": "sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==", + "dev": true, + "requires": { + "bignumber.js": "*" + } + }, + "@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==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/chai": { + "version": "4.2.18", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.18.tgz", + "integrity": "sha512-rS27+EkB/RE1Iz3u0XtVL5q36MGDWbgYe7zWiodyKNUnthxY0rukK5V36eiUCtCisB7NN8zKYH6DO2M37qxFEQ==", + "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.34", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", + "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg==", + "dev": true + }, + "@types/cookies": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.6.tgz", + "integrity": "sha512-FK4U5Qyn7/Sc5ih233OuHO0qAkOpEcD/eG6584yEiLKizTFRny86qHLe/rej3HFQrkBuUjF4whFliAdODbVN/w==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/express": "*", + "@types/keygrip": "*", + "@types/node": "*" + } + }, + "@types/cors": { + "version": "2.8.10", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz", + "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==", + "dev": true, + "optional": true + }, + "@types/ed2curve": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@types/ed2curve/-/ed2curve-0.2.2.tgz", + "integrity": "sha512-G1sTX5xo91ydevQPINbL2nfgVAj/s1ZiqZxC8OCWduwu+edoNGUm5JXtTkg9F3LsBZbRI46/0HES4CPUE2wc9g==", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^1.0.0" + }, + "dependencies": { + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true, + "optional": true + } + } + }, + "@types/express": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.12.tgz", + "integrity": "sha512-pTYas6FrP15B1Oa0bkN5tQMNqOcVXa9j4FTFtO8DWI9kppKib+6NJtfTOOLcwxuuYvcX2+dVG6et1SxW/Kc17Q==", + "dev": 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.21", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.21.tgz", + "integrity": "sha512-gwCiEZqW6f7EoR8TTEfalyEhb1zA5jQJnRngr97+3pzMaO1RKoI1w2bw07TK72renMUVWcWS5mLI6rk1NqN0nA==", + "dev": 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/fs-capacitor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz", + "integrity": "sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/google-protobuf": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.2.tgz", + "integrity": "sha512-ubeqvw7sl6CdgeiIilsXB2jIFoD/D0F+/LIEp7xEBEXRNtDJcf05FRINybsJtL7GlkWOUVn6gJs2W9OF+xI6lg==", + "dev": true, + "optional": true + }, + "@types/http-assert": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.1.tgz", + "integrity": "sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ==", + "dev": true + }, + "@types/http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true, + "optional": true + }, + "@types/keygrip": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", + "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==", + "dev": true + }, + "@types/koa": { + "version": "2.13.3", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.3.tgz", + "integrity": "sha512-TaujBV+Dhe/FvmSMZJtCFBms+bqQacgUebk/M2C2tq8iGmHE/DDf4DcW2Hc7NqusVZmy5xzrWOjtdPKNP+fTfw==", + "dev": true, + "requires": { + "@types/accepts": "*", + "@types/content-disposition": "*", + "@types/cookies": "*", + "@types/http-assert": "*", + "@types/http-errors": "*", + "@types/keygrip": "*", + "@types/koa-compose": "*", + "@types/node": "*" + } + }, + "@types/koa-compose": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", + "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", + "dev": true, + "requires": { + "@types/koa": "*" + } + }, + "@types/levelup": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.1.tgz", + "integrity": "sha512-n//PeTpbHLjMLTIgW5B/g06W/6iuTBHuvUka2nFL9APMSVMNe2r4enADfu3CIE9IyV9E+uquf9OEQQqrDeg24A==", + "dev": true, + "requires": { + "@types/abstract-leveldown": "*", + "@types/node": "*" + } + }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", + "dev": true, + "optional": true + }, + "@types/lru-cache": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.0.tgz", + "integrity": "sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w==", + "dev": 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 + }, + "@types/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", + "dev": true + }, + "@types/node": { + "version": "12.20.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.14.tgz", + "integrity": "sha512-iFJOS5Q470FF+r4Ol2pSley7/wCNVqf+jgjhtxLLaJcDs+To2iCxlXIkJXrGLD9w9G/oJ9ibySu7z92DCwr7Pg==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@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.6", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "dev": true + }, + "@types/secp256k1": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.2.tgz", + "integrity": "sha512-QMg+9v0bbNJ2peLuHRWxzmy0HRJIG6gFZNhaRSp7S3ggSbCCxiqQB2/ybvhXyhHOCequpNkrx7OavNhrWOsW0A==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "1.13.9", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", + "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/to-json-schema": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@types/to-json-schema/-/to-json-schema-0.2.0.tgz", + "integrity": "sha512-9fqRjNFSSxJ8dQrE4v8gThS5ftxdFj8Q0y8hAjaF+uN+saJRxLiJdtFaDd9sv3bhzwcB2oDJpT/1ZelHnexbLw==", + "dev": true, + "optional": true, + "requires": { + "@types/json-schema": "*" + } + }, + "@types/websocket": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.2.tgz", + "integrity": "sha512-B5m9aq7cbbD/5/jThEr33nUY8WEfVi6A2YKCTOvw5Ldy7mtsOkqRvGjnzy6g7iMMDsgu7xREuCzqATLDLQVKcQ==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@types/ws": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.4.tgz", + "integrity": "sha512-d/7W23JAXPodQNbOZNXvl2K+bqAQrCMwlh/nuQsPSQk6Fq0opHoPrUw43aHsvSbIiQPr8Of2hkFbnz1XBFVyZQ==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@types/zen-observable": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.2.tgz", + "integrity": "sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg==", + "dev": true, + "optional": true + }, + "@vue/component-compiler-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz", + "integrity": "sha512-lejBLa7xAMsfiZfNp7Kv51zOzifnb29FwdnMLa96z26kXErPFioSf9BMcePVIQ6/Gc6/mC0UrPpxAWIHyae0vw==", + "dev": true, + "requires": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.14", + "postcss-selector-parser": "^6.0.2", + "prettier": "^1.18.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "dependencies": { + "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" + } + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true, + "optional": true + }, + "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 + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@wry/context": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.6.0.tgz", + "integrity": "sha512-sAgendOXR8dM7stJw3FusRxFHF/ZinU0lffsA2YTyyIOfic86JX02qlPqPVqJNZJPAxFt+2EE8bvq6ZlS0Kf+Q==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "@wry/equality": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz", + "integrity": "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "optional": true + } + } + }, + "@wry/trie": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.3.0.tgz", + "integrity": "sha512-Yw1akIogPhAT6XPYsRHlZZIS0tIGmAl9EYXHi2scf7LPKKqdqmow/Hu4kEqP2cJR3EjaU/9L0ZlAjFf3hFxmug==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "@zondax/filecoin-signing-tools": { + "version": "github:Digital-MOB-Filecoin/filecoin-signing-tools-js#8f8e92157cac2556d35cab866779e9a8ea8a4e25", + "from": "github:Digital-MOB-Filecoin/filecoin-signing-tools-js", + "dev": true, + "optional": true, + "requires": { + "axios": "^0.20.0", + "base32-decode": "^1.0.0", + "base32-encode": "^1.1.1", + "bip32": "^2.0.5", + "bip39": "^3.0.2", + "blakejs": "^1.1.0", + "bn.js": "^5.1.2", + "ipld-dag-cbor": "^0.17.0", + "leb128": "0.0.5", + "secp256k1": "^4.0.1" + }, + "dependencies": { + "axios": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz", + "integrity": "sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==", + "dev": true, + "optional": true, + "requires": { + "follow-redirects": "^1.10.0" + } + } + } + }, + "@zxing/text-encoding": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", + "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", + "dev": true, + "optional": true + }, + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "dev": true, + "optional": true + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": 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, + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "abstract-leveldown": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", + "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", + "dev": 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" + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", + "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", + "dev": true, + "optional": true, + "requires": { + "acorn": "^2.1.0" + }, + "dependencies": { + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", + "dev": true, + "optional": true + } + } + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "dev": true + }, + "adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "dev": true + }, + "aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + }, + "dependencies": { + "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 + } + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true, + "optional": 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 + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "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" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "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" + } + }, + "antlr4": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz", + "integrity": "sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ==", + "dev": true + }, + "antlr4ts": { + "version": "0.5.0-alpha.4", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", + "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", + "dev": true + }, + "any-signal": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/any-signal/-/any-signal-2.1.2.tgz", + "integrity": "sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ==", + "dev": true, + "optional": true, + "requires": { + "abort-controller": "^3.0.0", + "native-abort-controller": "^1.0.3" + }, + "dependencies": { + "native-abort-controller": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/native-abort-controller/-/native-abort-controller-1.0.3.tgz", + "integrity": "sha512-fd5LY5q06mHKZPD5FmMrn7Lkd2H018oBGKNOAdLpctBDEPFKsfJ1nX9ke+XRa8PEJJpjqrpQkGjq2IZ27QNmYA==", + "dev": true, + "optional": true + } + } + }, + "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" + } + }, + "apollo-cache-control": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.14.0.tgz", + "integrity": "sha512-qN4BCq90egQrgNnTRMUHikLZZAprf3gbm8rC5Vwmc6ZdLolQ7bFsa769Hqi6Tq/lS31KLsXBLTOsRbfPHph12w==", + "dev": true, + "optional": true, + "requires": { + "apollo-server-env": "^3.1.0", + "apollo-server-plugin-base": "^0.13.0" + } + }, + "apollo-datasource": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.9.0.tgz", + "integrity": "sha512-y8H99NExU1Sk4TvcaUxTdzfq2SZo6uSj5dyh75XSQvbpH6gdAXIW9MaBcvlNC7n0cVPsidHmOcHOWxJ/pTXGjA==", + "dev": true, + "optional": true, + "requires": { + "apollo-server-caching": "^0.7.0", + "apollo-server-env": "^3.1.0" + } + }, + "apollo-graphql": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.9.3.tgz", + "integrity": "sha512-rcAl2E841Iko4kSzj4Pt3PRBitmyq1MvoEmpl04TQSpGnoVgl1E/ZXuLBYxMTSnEAm7umn2IsoY+c6Ll9U/10A==", + "dev": true, + "optional": true, + "requires": { + "core-js-pure": "^3.10.2", + "lodash.sortby": "^4.7.0", + "sha.js": "^2.4.11" + } + }, + "apollo-link": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz", + "integrity": "sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==", + "dev": true, + "optional": true, + "requires": { + "apollo-utilities": "^1.3.0", + "ts-invariant": "^0.4.0", + "tslib": "^1.9.3", + "zen-observable-ts": "^0.8.21" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "optional": true + } + } + }, + "apollo-reporting-protobuf": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.8.0.tgz", + "integrity": "sha512-B3XmnkH6Y458iV6OsA7AhfwvTgeZnFq9nPVjbxmLKnvfkEl8hYADtz724uPa0WeBiD7DSFcnLtqg9yGmCkBohg==", + "dev": true, + "optional": true, + "requires": { + "@apollo/protobufjs": "1.2.2" + } + }, + "apollo-server": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/apollo-server/-/apollo-server-2.25.0.tgz", + "integrity": "sha512-cIXrEWzYWH2y4P4HrfTS0ql6UfJuPO1czb5u9Ch8bLPcWcL1lC84ZbsHzQHNNMLkNApSCAgoS3GZja7dF111Hw==", + "dev": true, + "optional": true, + "requires": { + "apollo-server-core": "^2.25.0", + "apollo-server-express": "^2.25.0", + "express": "^4.0.0", + "graphql-subscriptions": "^1.0.0", + "graphql-tools": "^4.0.8", + "stoppable": "^1.1.0" + }, + "dependencies": { + "graphql-tools": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.8.tgz", + "integrity": "sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg==", + "dev": true, + "optional": true, + "requires": { + "apollo-link": "^1.2.14", + "apollo-utilities": "^1.0.1", + "deprecated-decorator": "^0.1.6", + "iterall": "^1.1.3", + "uuid": "^3.1.0" + } + } + } + }, + "apollo-server-caching": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.7.0.tgz", + "integrity": "sha512-MsVCuf/2FxuTFVhGLK13B+TZH9tBd2qkyoXKKILIiGcZ5CDUEBO14vIV63aNkMkS1xxvK2U4wBcuuNj/VH2Mkw==", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "apollo-server-core": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.25.0.tgz", + "integrity": "sha512-LqDmY+R5dcb6zj/RgM7P8NnURV2XdQFIF4rY7g80hD9mc2WSCKHF6eH+lHG0sFPW7f8iBr+lJ4LyETuWEVF0hg==", + "dev": true, + "optional": true, + "requires": { + "@apollographql/apollo-tools": "^0.5.0", + "@apollographql/graphql-playground-html": "1.6.27", + "@apollographql/graphql-upload-8-fork": "^8.1.3", + "@josephg/resolvable": "^1.0.0", + "@types/ws": "^7.0.0", + "apollo-cache-control": "^0.14.0", + "apollo-datasource": "^0.9.0", + "apollo-graphql": "^0.9.0", + "apollo-reporting-protobuf": "^0.8.0", + "apollo-server-caching": "^0.7.0", + "apollo-server-env": "^3.1.0", + "apollo-server-errors": "^2.5.0", + "apollo-server-plugin-base": "^0.13.0", + "apollo-server-types": "^0.9.0", + "apollo-tracing": "^0.15.0", + "async-retry": "^1.2.1", + "fast-json-stable-stringify": "^2.0.0", + "graphql-extensions": "^0.15.0", + "graphql-tag": "^2.11.0", + "graphql-tools": "^4.0.8", + "loglevel": "^1.6.7", + "lru-cache": "^6.0.0", + "sha.js": "^2.4.11", + "subscriptions-transport-ws": "^0.9.11", + "uuid": "^8.0.0", + "ws": "^6.0.0" + }, + "dependencies": { + "graphql-tools": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.8.tgz", + "integrity": "sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg==", + "dev": true, + "optional": true, + "requires": { + "apollo-link": "^1.2.14", + "apollo-utilities": "^1.0.1", + "deprecated-decorator": "^0.1.6", + "iterall": "^1.1.3", + "uuid": "^3.1.0" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "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 + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "optional": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "apollo-server-env": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-3.1.0.tgz", + "integrity": "sha512-iGdZgEOAuVop3vb0F2J3+kaBVi4caMoxefHosxmgzAbbSpvWehB8Y1QiSyyMeouYC38XNVk5wnZl+jdGSsWsIQ==", + "dev": true, + "optional": true, + "requires": { + "node-fetch": "^2.6.1", + "util.promisify": "^1.0.0" + } + }, + "apollo-server-errors": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.5.0.tgz", + "integrity": "sha512-lO5oTjgiC3vlVg2RKr3RiXIIQ5pGXBFxYGGUkKDhTud3jMIhs+gel8L8zsEjKaKxkjHhCQAA/bcEfYiKkGQIvA==", + "dev": true, + "optional": true + }, + "apollo-server-express": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.25.0.tgz", + "integrity": "sha512-FCTisD+VB1LCcTjjhKvQZ/dkly83KVlioFMgcPjW1X/kzCznRT3aQoVn9bQHlzQr7NnpwFseb4Rhd2KKD4wKEA==", + "dev": true, + "optional": true, + "requires": { + "@apollographql/graphql-playground-html": "1.6.27", + "@types/accepts": "^1.3.5", + "@types/body-parser": "1.19.0", + "@types/cors": "2.8.10", + "@types/express": "4.17.11", + "@types/express-serve-static-core": "4.17.19", + "accepts": "^1.3.5", + "apollo-server-core": "^2.25.0", + "apollo-server-types": "^0.9.0", + "body-parser": "^1.18.3", + "cors": "^2.8.5", + "express": "^4.17.1", + "graphql-subscriptions": "^1.0.0", + "graphql-tools": "^4.0.8", + "parseurl": "^1.3.2", + "subscriptions-transport-ws": "^0.9.16", + "type-is": "^1.6.16" + }, + "dependencies": { + "@types/express": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz", + "integrity": "sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==", + "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.19", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz", + "integrity": "sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "graphql-tools": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.8.tgz", + "integrity": "sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg==", + "dev": true, + "optional": true, + "requires": { + "apollo-link": "^1.2.14", + "apollo-utilities": "^1.0.1", + "deprecated-decorator": "^0.1.6", + "iterall": "^1.1.3", + "uuid": "^3.1.0" + } + } + } + }, + "apollo-server-plugin-base": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.13.0.tgz", + "integrity": "sha512-L3TMmq2YE6BU6I4Tmgygmd0W55L+6XfD9137k+cWEBFu50vRY4Re+d+fL5WuPkk5xSPKd/PIaqzidu5V/zz8Kg==", + "dev": true, + "optional": true, + "requires": { + "apollo-server-types": "^0.9.0" + } + }, + "apollo-server-types": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.9.0.tgz", + "integrity": "sha512-qk9tg4Imwpk732JJHBkhW0jzfG0nFsLqK2DY6UhvJf7jLnRePYsPxWfPiNkxni27pLE2tiNlCwoDFSeWqpZyBg==", + "dev": true, + "optional": true, + "requires": { + "apollo-reporting-protobuf": "^0.8.0", + "apollo-server-caching": "^0.7.0", + "apollo-server-env": "^3.1.0" + } + }, + "apollo-tracing": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.15.0.tgz", + "integrity": "sha512-UP0fztFvaZPHDhIB/J+qGuy6hWO4If069MGC98qVs0I8FICIGu4/8ykpX3X3K6RtaQ56EDAWKykCxFv4ScxMeA==", + "dev": true, + "optional": true, + "requires": { + "apollo-server-env": "^3.1.0", + "apollo-server-plugin-base": "^0.13.0" + } + }, + "apollo-upload-client": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/apollo-upload-client/-/apollo-upload-client-14.1.2.tgz", + "integrity": "sha512-ozaW+4tnVz1rpfwiQwG3RCdCcZ93RV/37ZQbRnObcQ9mjb+zur58sGDPVg9Ef3fiujLmiE/Fe9kdgvIMA3VOjA==", + "dev": true, + "optional": true, + "requires": { + "@apollo/client": "^3.1.5", + "@babel/runtime": "^7.11.2", + "extract-files": "^9.0.0" + } + }, + "apollo-utilities": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz", + "integrity": "sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==", + "dev": true, + "optional": true, + "requires": { + "@wry/equality": "^0.1.2", + "fast-json-stable-stringify": "^2.0.0", + "ts-invariant": "^0.4.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "optional": true + } + } + }, + "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 + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "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": "sha1-bnIHtOzbObCviDA/pa4ivajfYcs=", + "dev": true, + "optional": true + }, + "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 + }, + "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-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "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.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "array.prototype.map": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.3.tgz", + "integrity": "sha512-nNcb30v0wfDyIe26Yif3PcV1JXQp4zEeEfupG7L4SRjnD6HLbO5b2a7eVSba53bOx4YCHYMBHt+Fp4vYstneRA==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.5" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "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==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "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 + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-args": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/assert-args/-/assert-args-1.2.1.tgz", + "integrity": "sha1-QEEDoUUqMv53iYgR5U5ZCoqTc70=", + "dev": true, + "optional": true, + "requires": { + "101": "^1.2.0", + "compound-subject": "0.0.1", + "debug": "^2.2.0", + "get-prototype-of": "0.0.0", + "is-capitalized": "^1.0.0", + "is-class": "0.0.4" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "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 + }, + "ast-parents": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz", + "integrity": "sha1-UI/Q8F0MSHddnszaLhdEIyYejdM=", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "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, + "optional": 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==", + "dev": true + }, + "async-retry": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.1.tgz", + "integrity": "sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==", + "dev": true, + "optional": true, + "requires": { + "retry": "0.12.0" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "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 + }, + "available-typed-arrays": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz", + "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==", + "dev": true + }, + "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=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "dev": true, + "requires": { + "follow-redirects": "^1.10.0" + } + }, + "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" + } + }, + "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 + }, + "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-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 + } + } + }, + "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-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "optional": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", + "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", + "dev": true, + "optional": true + }, + "babel-preset-fbjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", + "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", + "dev": true, + "optional": true, + "requires": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-syntax-class-properties": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoped-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-member-expression-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-property-literals": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" + } + }, + "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-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": { + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + } + } + }, + "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 + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "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" + } + } + } + }, + "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" + } + }, + "base32-decode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base32-decode/-/base32-decode-1.0.0.tgz", + "integrity": "sha512-KNWUX/R7wKenwE/G/qFMzGScOgVntOmbE27vvc6GrniDGYb6a5+qWcuoXl8WIOQL7q0TpK7nZDm1Y04Yi3Yn5g==", + "dev": true, + "optional": true + }, + "base32-encode": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/base32-encode/-/base32-encode-1.2.0.tgz", + "integrity": "sha512-cHFU8XeRyx0GgmoWi5qHMCVRiqU6J3MHWxVgun7jggCBUpVzm1Ir7M9dYr2whjSNc3tFeXfQ/oZjQu/4u55h9A==", + "dev": true, + "optional": true, + "requires": { + "to-data-view": "^1.1.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 + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "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 + }, + "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 + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "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==", + "dev": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bip32": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz", + "integrity": "sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==", + "dev": true, + "optional": 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, + "optional": true + } + } + }, + "bip39": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", + "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", + "dev": true, + "optional": 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, + "optional": true + } + } + }, + "bip66": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bitcore-lib": { + "version": "8.25.10", + "resolved": "https://registry.npmjs.org/bitcore-lib/-/bitcore-lib-8.25.10.tgz", + "integrity": "sha512-MyHpSg7aFRHe359RA/gdkaQAal3NswYZTLEuu0tGX1RGWXAYN9i/24fsjPqVKj+z0ua+gzAT7aQs0KiKXWCgKA==", + "dev": true, + "optional": true, + "requires": { + "bech32": "=1.1.3", + "bn.js": "=4.11.8", + "bs58": "^4.0.1", + "buffer-compare": "=1.1.1", + "elliptic": "^6.5.3", + "inherits": "=2.0.1", + "lodash": "^4.17.20" + }, + "dependencies": { + "bech32": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.3.tgz", + "integrity": "sha512-yuVFUvrNcoJi0sv5phmqc6P+Fl1HjRDRNOOkHY2X/3LBy2bIGNSFx4fZ95HMaXHupuS7cZR15AsvtmCIF4UEyg==", + "dev": true, + "optional": 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, + "optional": true + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true, + "optional": true + } + } + }, + "bitcore-mnemonic": { + "version": "8.25.10", + "resolved": "https://registry.npmjs.org/bitcore-mnemonic/-/bitcore-mnemonic-8.25.10.tgz", + "integrity": "sha512-FeXxO37BLV5JRvxPmVFB91zRHalavV8H4TdQGt1/hz0AkoPymIV68OkuB+TptpjeYgatcgKPoPvPhglJkTzFQQ==", + "dev": true, + "optional": true, + "requires": { + "bitcore-lib": "^8.25.10", + "unorm": "^1.4.1" + } + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "optional": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.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==", + "dev": true, + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "blakejs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz", + "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=", + "dev": true + }, + "blob-to-it": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/blob-to-it/-/blob-to-it-1.0.2.tgz", + "integrity": "sha512-yD8tikfTlUGEOSHExz4vDCIQFLaBPXIL0KcxGQt9RbwMVXBEh+jokdJyStvTXPgWrdKfwgk7RX8GPsgrYzsyng==", + "dev": true, + "optional": true, + "requires": { + "browser-readablestream-to-it": "^1.0.2" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "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 + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": 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": { + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "borc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz", + "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==", + "dev": true, + "requires": { + "bignumber.js": "^9.0.0", + "buffer": "^5.5.0", + "commander": "^2.15.0", + "ieee754": "^1.1.13", + "iso-url": "~0.4.7", + "json-text-sequence": "~0.1.0", + "readable-stream": "^3.6.0" + }, + "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 + }, + "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" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-headers": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/browser-headers/-/browser-headers-0.4.1.tgz", + "integrity": "sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg==", + "dev": true, + "optional": true + }, + "browser-readablestream-to-it": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.2.tgz", + "integrity": "sha512-lv4M2Z6RKJpyJijJzBQL5MNssS7i8yedl+QkhnLCyPtgNGNSXv1KthzUnye9NlRAtBAI80X6S9i+vK09Rzjcvg==", + "dev": true, + "optional": true + }, + "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==", + "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", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "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==", + "dev": 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", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": 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": { + "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" + } + }, + "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==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "dev": true, + "optional": true, + "requires": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } + }, + "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" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "optional": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "btoa-lite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", + "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", + "dev": true, + "optional": true + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-compare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-compare/-/buffer-compare-1.1.1.tgz", + "integrity": "sha1-W+e+hTr4kZjR9N3AkNHWakiu9ZY=", + "dev": true, + "optional": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "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==", + "dev": true + }, + "buffer-pipe": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/buffer-pipe/-/buffer-pipe-0.0.3.tgz", + "integrity": "sha512-GlxfuD/NrKvCNs0Ut+7b1IHjylfdegMBxQIlZHj7bObKVQBxB5S84gtm2yu1mQ8/sSggceWBDPY0cPXgvX2MuA==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2" + } + }, + "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=", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "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" + } + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "busboy": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", + "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", + "dev": true, + "optional": true, + "requires": { + "dicer": "0.3.0" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "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" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "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.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "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==", + "dev": true + } + } + }, + "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" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "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": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "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.30001235", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001235.tgz", + "integrity": "sha512-zWEwIVqnzPkSAXOUlQnPW2oKoYb2aLQ4Q5ejdjBcnH63rfypaW34CxaeBn1VMya2XaEU3P/R2qHpWyj+l0BT1A==", + "dev": true, + "optional": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "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" + } + }, + "chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "requires": { + "check-error": "^1.0.2" + } + }, + "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 + }, + "chai-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/chai-string/-/chai-string-1.5.0.tgz", + "integrity": "sha512-sydDC3S3pNAQMYwJrs6dQX0oBQ6KfIPuOZ78n7rocW0eJJlsHPh2t3kwW7xfwYA/1Bf6/arGtSUo16rxR2JFlw==", + "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==", + "dev": true, + "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 + }, + "cheerio": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.9.tgz", + "integrity": "sha512-QF6XVdrLONO6DXRF5iaolY+odmhj2CLj+xzNod7INPWMi/x9X4SOylH0S/vaPpX+AUU6t04s34SQNh7DbkuCng==", + "dev": true, + "requires": { + "cheerio-select": "^1.4.0", + "dom-serializer": "^1.3.1", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + } + }, + "cheerio-select": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.4.0.tgz", + "integrity": "sha512-sobR3Yqz27L553Qa7cK6rtJlMDbiKPdNywtR95Sj/YgfpLfy0u6CGJuaBKe5YE/vTc23SCRKxWSdlon/w6I/Ew==", + "dev": true, + "requires": { + "css-select": "^4.1.2", + "css-what": "^5.0.0", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0" + } + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "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==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-json": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", + "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==", + "dev": true, + "optional": 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" + } + } + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "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 + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-spinners": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", + "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", + "dev": true, + "optional": true + }, + "cli-table3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", + "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^4.2.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": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "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" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "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=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true, + "optional": 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==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-logger": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/color-logger/-/color-logger-0.0.6.tgz", + "integrity": "sha1-5WJF7ymCJlcRDHy3WpzXhstp7Rs=", + "dev": true + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true, + "optional": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "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 + }, + "compound-subject": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/compound-subject/-/compound-subject-0.0.1.tgz", + "integrity": "sha1-JxVUaYoVrmCLHfyv0wt7oeqJLEs=", + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "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" + } + }, + "configstore": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", + "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", + "dev": true, + "optional": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true, + "optional": true + }, + "consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "constant-case": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", + "integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=", + "dev": true, + "requires": { + "snake-case": "^2.1.0", + "upper-case": "^1.1.1" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "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==", + "dev": true + }, + "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, + "optional": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "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.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "dev": true + }, + "core-js-pure": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.14.0.tgz", + "integrity": "sha512-YVh+LN2FgNU0odThzm61BsdkwrbrchumFq3oztnE9vTKC4KS2fvnPmcx8t6jnqAyOTCTF4ZSiuK8Qhh7SNcL4g==", + "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=", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "dependencies": { + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + } + } + }, + "coveralls": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.0.tgz", + "integrity": "sha512-sHxOu2ELzW8/NC1UP5XVLbZDzO4S3VxfFye3XYCznopHy02YjNkHcj5bKaVw2O7hVaBdBjEdQGpie4II1mWhuQ==", + "dev": true, + "requires": { + "js-yaml": "^3.13.1", + "lcov-parse": "^1.0.0", + "log-driver": "^1.2.7", + "minimist": "^1.2.5", + "request": "^2.88.2" + } + }, + "crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "dev": true, + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "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 + } + } + }, + "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==", + "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", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "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": "3.0.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz", + "integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==", + "dev": true, + "optional": true, + "requires": { + "node-fetch": "2.6.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "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" + } + } + } + }, + "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==", + "dev": 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" + } + }, + "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 + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true, + "optional": true + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "optional": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "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, + "optional": true + } + } + }, + "css-loader": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", + "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", + "dev": true, + "requires": { + "camelcase": "^5.2.0", + "icss-utils": "^4.1.0", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.14", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^2.0.0", + "postcss-value-parser": "^3.3.0", + "schema-utils": "^1.0.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 + } + } + }, + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + } + }, + "css-what": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=", + "dev": true, + "optional": true + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true, + "optional": true + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "dev": true, + "optional": true, + "requires": { + "cssom": "0.3.x" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "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==", + "dev": true, + "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=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dataloader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.0.0.tgz", + "integrity": "sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==", + "dev": true, + "optional": true + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", + "dev": true + }, + "death": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", + "integrity": "sha1-AaqcQB7dknUFFEcLgmY5DGbGcxg=", + "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" + } + }, + "debug-fabulous": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-0.0.4.tgz", + "integrity": "sha1-+gccXYdIRoVCSAdCHKSxawsaB2M=", + "dev": true, + "optional": true, + "requires": { + "debug": "2.X", + "lazy-debug-legacy": "0.0.X", + "object-assign": "4.1.0" + }, + "dependencies": { + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "dev": true, + "optional": true + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decimal.js": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", + "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", + "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=", + "dev": true + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.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 + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "optional": true, + "requires": { + "clone": "^1.0.2" + } + }, + "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==", + "dev": true + }, + "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, + "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, + "requires": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.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==", + "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" + } + } + } + }, + "delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "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=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "deprecated-decorator": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", + "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=", + "dev": true, + "optional": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "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=", + "dev": true + }, + "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": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true, + "optional": true + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true, + "optional": true + }, + "detect-port": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", + "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "dev": true, + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + } + }, + "dicer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", + "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", + "dev": true, + "optional": true, + "requires": { + "streamsearch": "0.1.2" + } + }, + "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==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "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 + } + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "dirty-chai": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dirty-chai/-/dirty-chai-2.0.1.tgz", + "integrity": "sha512-ys79pWKvDMowIDEPC6Fig8d5THiC0DJ2gmTeGzVAoEH18J8OzLud0Jh7I9IWg3NSk8x2UocznUuFmfHCXYZx9w==", + "dev": true + }, + "dns-over-http-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz", + "integrity": "sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA==", + "dev": true, + "optional": true, + "requires": { + "debug": "^4.3.1", + "native-fetch": "^3.0.0", + "receptacle": "^1.3.2" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": 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, + "optional": 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-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", + "integrity": "sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "dev": true, + "optional": true, + "requires": { + "is-obj": "^1.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": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=", + "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=", + "dev": true, + "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=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ed2curve": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ed2curve/-/ed2curve-0.3.0.tgz", + "integrity": "sha512-8w2fmmq3hv9rCrcI7g9hms2pMunQr1JINfcjwR9tAyZqhtyaMN991lF/ZfHfr5tzZQ8c7y7aBgZbjfbd0fjFwQ==", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "1.x.x" + }, + "dependencies": { + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true, + "optional": true + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.7.3.tgz", + "integrity": "sha512-1AVMaxrHXTTMqd7EK0MGWusdqNr07Rpj8Th6bG4at0oNgIi/1LBwa9CjT/0Zy+M0k/tSJPS04nFxHj0SXDVgVw==", + "dev": true, + "optional": true, + "requires": { + "encoding": "^0.1.13" + } + }, + "electron-to-chromium": { + "version": "1.3.749", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.749.tgz", + "integrity": "sha512-F+v2zxZgw/fMwPz/VUGIggG4ZndDsYy0vlpthi3tjmDZlcfbhN5mYW0evXUsBr2sUtuDANFtle410A9u/sd/4A==", + "dev": true, + "optional": 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 + } + } + }, + "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 + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encode-utf8": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "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, + "requires": { + "abstract-leveldown": "^6.2.1", + "inherits": "^2.0.3", + "level-codec": "^9.0.0", + "level-errors": "^2.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==", + "dev": true, + "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": "sha1-MgA/P0OKKwFDFoE3+PpumGbIHtU=", + "dev": true, + "optional": true, + "requires": { + "write-stream": "~0.4.3" + } + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + }, + "dependencies": { + "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 + } + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "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 + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "optional": 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" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "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.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "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.1" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, + "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==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-denodeify": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-denodeify/-/es6-denodeify-0.1.5.tgz", + "integrity": "sha1-MdTV/pxVA+ElRgQ5MQ4WoqPznB8=", + "dev": true, + "optional": true + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "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==", + "dev": true, + "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, + "optional": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "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=", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "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" + } + } + } + }, + "esdoc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/esdoc/-/esdoc-1.1.0.tgz", + "integrity": "sha512-vsUcp52XJkOWg9m1vDYplGZN2iDzvmjDL5M/Mp8qkoDG3p2s0yIQCIjKR5wfPBaM3eV14a6zhQNYiNTCVzPnxA==", + "dev": true, + "requires": { + "babel-generator": "6.26.1", + "babel-traverse": "6.26.0", + "babylon": "6.18.0", + "cheerio": "1.0.0-rc.2", + "color-logger": "0.0.6", + "escape-html": "1.0.3", + "fs-extra": "5.0.0", + "ice-cap": "0.0.4", + "marked": "0.3.19", + "minimist": "1.2.0", + "taffydb": "2.7.3" + }, + "dependencies": { + "cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "dev": true, + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "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" + } + }, + "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" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "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" + } + }, + "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": "*" + } + }, + "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" + } + } + } + }, + "eslint": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.28.0.tgz", + "integrity": "sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "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.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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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 + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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 + }, + "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 + }, + "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 + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "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" + } + }, + "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.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" + } + } + } + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true + }, + "eslint-plugin-truffle": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-truffle/-/eslint-plugin-truffle-0.3.1.tgz", + "integrity": "sha512-mjDM1gD96UknBUSEufgdx5m1x3jkWL3Xn/npSZhOVoTbKk/nkBL7dCcH7xsO6GyAjmjvzdev5o5IA4lKWf9b4g==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "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 + } + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "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 + } + } + }, + "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.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "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=", + "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=", + "dev": true, + "requires": { + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" + }, + "dependencies": { + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", + "dev": true + } + } + }, + "eth-gas-reporter": { + "version": "0.2.22", + "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.22.tgz", + "integrity": "sha512-L1FlC792aTf3j/j+gGzSNlGrXKSxNPXQNk6TnV5NNZ2w3jnQCRyJjDl0zUo25Cq2t90IS5vGdbkwqFQK7Ce+kw==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.0.0-beta.146", + "@solidity-parser/parser": "^0.12.0", + "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.12.2", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.12.2.tgz", + "integrity": "sha512-d7VS7PxgMosm5NyaiyDJRNID5pK4AWj1l64Dbz0147hJgy5k2C0/ZiKK/9u5c5K+HRUVHmp+RMvGEjGh84oA5Q==", + "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 + }, + "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" + } + }, + "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==", + "dev": true, + "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" + } + }, + "ethers": { + "version": "4.0.48", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.48.tgz", + "integrity": "sha512-sZD5K8H28dOrcidzx9f8KYh8083n5BexIO3+SbE4jK83L85FxtpXZBCQdXb8gkg+7sBqomcLhhkU7UHL+F7I2g==", + "dev": true, + "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==", + "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" + } + } + } + }, + "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==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.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 + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", + "dev": true + }, + "keccak": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", + "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==", + "dev": true, + "requires": { + "bindings": "^1.5.0", + "inherits": "^2.0.4", + "nan": "^2.14.0", + "safe-buffer": "^5.2.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==", + "dev": true + }, + "secp256k1": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz", + "integrity": "sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==", + "dev": true, + "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" + } + }, + "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" + } + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", + "dev": true + } + } + }, + "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" + }, + "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-sig-util": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-2.5.4.tgz", + "integrity": "sha512-aCMBwp8q/4wrW4QLsF/HYBOSA7TpLKmkVwP3pYQNkEEseW2Rr8Z5Uxc9/h6HX+OG3tuHo+2bINVSihIeBfym6A==", + "dev": true, + "requires": { + "ethereumjs-abi": "0.6.8", + "ethereumjs-util": "^5.1.1", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.0" + }, + "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 + }, + "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" + } + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true + } + } + }, + "ethereum-bloom-filters": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.9.tgz", + "integrity": "sha512-GiK/RQkAkcVaEdxKVkPcG07PQ5vD7v2MFSHgZmBJSfMzNRHimntdBithsHAT89tAXnIpzVDWt8iaCD1DvkaxGg==", + "dev": true, + "requires": { + "js-sha3": "^0.8.0" + } + }, + "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": { + "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 + } + } + }, + "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" + }, + "dependencies": { + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", + "dev": true + } + } + }, + "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==", + "dev": true, + "requires": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + }, + "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 + } + } + }, + "ethereumjs-common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz", + "integrity": "sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" + } + }, + "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" + }, + "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 + } + } + }, + "ethers": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.3.0.tgz", + "integrity": "sha512-myN+338S4sFQZvQ9trii7xit8Hu/LnUtjA0ROFOHpUreQc3fgLZEMNVqF3vM1u2D78DIIeG1TbuozVCVlXQWvQ==", + "dev": true, + "requires": { + "@ethersproject/abi": "5.3.0", + "@ethersproject/abstract-provider": "5.3.0", + "@ethersproject/abstract-signer": "5.3.0", + "@ethersproject/address": "5.3.0", + "@ethersproject/base64": "5.3.0", + "@ethersproject/basex": "5.3.0", + "@ethersproject/bignumber": "5.3.0", + "@ethersproject/bytes": "5.3.0", + "@ethersproject/constants": "5.3.0", + "@ethersproject/contracts": "5.3.0", + "@ethersproject/hash": "5.3.0", + "@ethersproject/hdnode": "5.3.0", + "@ethersproject/json-wallets": "5.3.0", + "@ethersproject/keccak256": "5.3.0", + "@ethersproject/logger": "5.3.0", + "@ethersproject/networks": "5.3.0", + "@ethersproject/pbkdf2": "5.3.0", + "@ethersproject/properties": "5.3.0", + "@ethersproject/providers": "5.3.0", + "@ethersproject/random": "5.3.0", + "@ethersproject/rlp": "5.3.0", + "@ethersproject/sha2": "5.3.0", + "@ethersproject/signing-key": "5.3.0", + "@ethersproject/solidity": "5.3.0", + "@ethersproject/strings": "5.3.0", + "@ethersproject/transactions": "5.3.0", + "@ethersproject/units": "5.3.0", + "@ethersproject/wallet": "5.3.0", + "@ethersproject/web": "5.3.0", + "@ethersproject/wordlists": "5.3.0" + }, + "dependencies": { + "@ethersproject/abi": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.3.0.tgz", + "integrity": "sha512-NaT4UacjOwca8qCG/gv8k+DgTcWu49xlrvdhr/p8PTFnoS8e3aMWqjI3znFME5Txa/QWXDrg2/heufIUue9rtw==", + "dev": true, + "requires": { + "@ethersproject/address": "^5.3.0", + "@ethersproject/bignumber": "^5.3.0", + "@ethersproject/bytes": "^5.3.0", + "@ethersproject/constants": "^5.3.0", + "@ethersproject/hash": "^5.3.0", + "@ethersproject/keccak256": "^5.3.0", + "@ethersproject/logger": "^5.3.0", + "@ethersproject/properties": "^5.3.0", + "@ethersproject/strings": "^5.3.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=", + "dev": true, + "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=", + "dev": true + } + } + }, + "ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "dev": true, + "requires": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + } + }, + "event-iterator": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/event-iterator/-/event-iterator-1.2.0.tgz", + "integrity": "sha512-Daq7YUl0Mv1i4QEgzGQlz0jrx7hUFNyLGbiF+Ap7NCMCjDLCCnolyj6s0TAc6HmrBziO5rNVHsPwGMp7KdRPvw==", + "dev": true, + "optional": true + }, + "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 + }, + "eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", + "dev": true + }, + "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==", + "dev": true, + "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 + }, + "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" + } + }, + "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 + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", + "dev": true + }, + "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" + } + } + } + }, + "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, + "optional": 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, + "optional": 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, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "optional": true, + "requires": { + "isarray": "1.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, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": 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": { + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "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": "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" + } + }, + "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" + } + } + } + }, + "extract-files": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-9.0.0.tgz", + "integrity": "sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==", + "dev": true, + "optional": true + }, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "requires": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "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.16.0", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-2.16.0.tgz", + "integrity": "sha512-r1uoJQoLzKUgfAeGzSZ/7dGyvSLG3OGjmWIKZRJpKtY/791di7n/x389F0Bei3Ry8126Z6MKp78Cbt4+9LUp1g==", + "dev": true, + "requires": { + "pure-rand": "^4.1.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==", + "dev": true + }, + "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-fifo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.0.0.tgz", + "integrity": "sha512-4VEXmjxLj7sbs8J//cn2qhRap50dGzF5n8fjay8mau+Jn4hxSeR3xPFwxMaQq/pDaq7+KQk0PAbC2+nWDkJrmQ==", + "dev": true, + "optional": true + }, + "fast-future": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fast-future/-/fast-future-1.0.2.tgz", + "integrity": "sha1-hDWpqqAteSSNF9cE52JZMB2ZKAo=", + "dev": true, + "optional": true + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "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==", + "dev": true + }, + "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-sha256": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-sha256/-/fast-sha256-1.3.0.tgz", + "integrity": "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==", + "dev": true, + "optional": true + }, + "fastestsmallesttextencoderdecoder": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", + "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", + "dev": true, + "optional": true + }, + "fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "optional": true, + "requires": { + "bser": "2.1.1" + } + }, + "fbjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.0.tgz", + "integrity": "sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg==", + "dev": true, + "optional": true, + "requires": { + "cross-fetch": "^3.0.4", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + }, + "dependencies": { + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true, + "optional": true + } + } + }, + "fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", + "dev": true, + "optional": true + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "fetch-cookie": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-0.7.0.tgz", + "integrity": "sha512-Mm5pGlT3agW6t71xVM7vMZPIvI7T4FaTuFW4jari6dVzYHFDb3WZZsGpN22r/o3XMdkM0E7sPd1EGeyVbH2Tgg==", + "dev": true, + "optional": true, + "requires": { + "es6-denodeify": "^0.1.1", + "tough-cookie": "^2.3.1" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-type": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz", + "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==", + "dev": true + }, + "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==", + "dev": true + }, + "filecoin.js": { + "version": "0.0.5-alpha", + "resolved": "https://registry.npmjs.org/filecoin.js/-/filecoin.js-0.0.5-alpha.tgz", + "integrity": "sha512-xPrB86vDnTPfmvtN/rJSrhl4M77694ruOgNXd0+5gP67mgmCDhStLCqcr+zHIDRgDpraf7rY+ELbwjXZcQNdpQ==", + "dev": true, + "optional": true, + "requires": { + "@ledgerhq/hw-transport-webusb": "^5.22.0", + "@nodefactory/filsnap-adapter": "^0.2.1", + "@nodefactory/filsnap-types": "^0.2.1", + "@zondax/filecoin-signing-tools": "github:Digital-MOB-Filecoin/filecoin-signing-tools-js", + "bignumber.js": "^9.0.0", + "bitcore-lib": "^8.22.2", + "bitcore-mnemonic": "^8.22.2", + "btoa-lite": "^1.0.0", + "events": "^3.2.0", + "isomorphic-ws": "^4.0.1", + "node-fetch": "^2.6.0", + "rpc-websockets": "^5.3.1", + "scrypt-async": "^2.0.1", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.1", + "websocket": "^1.0.31", + "ws": "^7.3.1" + }, + "dependencies": { + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true, + "optional": true + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "optional": true + } + } + }, + "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, + "optional": 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" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": 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" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "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" + } + }, + "find-versions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", + "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", + "dev": true, + "requires": { + "semver-regex": "^3.1.2" + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true, + "optional": true + }, + "flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + }, + "dependencies": { + "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 + } + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "fmix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz", + "integrity": "sha1-x7vxJN7ELJ0ZHPuUfQqXeN2YbAw=", + "dev": true, + "requires": { + "imul": "^1.0.0" + } + }, + "follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", + "dev": true + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "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, + "optional": 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=", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fp-ts": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", + "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=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-capacitor": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-2.0.4.tgz", + "integrity": "sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA==", + "dev": true, + "optional": true + }, + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.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==", + "dev": true, + "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-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "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 + }, + "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-cli": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.12.2.tgz", + "integrity": "sha512-bnmwnJDBDsOWBUP8E/BExWf85TsdDEFelQSzihSJm9VChVO1SHp94YXLP5BlA4j/OTxp0wR4R1Tje9OHOuAJVw==", + "dev": true, + "requires": { + "ethereumjs-util": "6.2.1", + "source-map-support": "0.5.12", + "yargs": "13.2.4" + }, + "dependencies": { + "@types/bn.js": { + "version": "4.11.6", + "bundled": true, + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "14.11.2", + "bundled": true, + "dev": true + }, + "@types/pbkdf2": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/secp256k1": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "base-x": { + "version": "3.0.8", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "blakejs": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "bn.js": { + "version": "4.11.9", + "bundled": true, + "dev": true + }, + "brorand": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "bundled": true, + "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" + } + }, + "bs58": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "base-x": "^3.0.2" + } + }, + "bs58check": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "requires": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "buffer-from": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "bundled": true, + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "cliui": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "color-convert": { + "version": "1.9.3", + "bundled": true, + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "bundled": true, + "dev": true + }, + "create-hash": { + "version": "1.2.0", + "bundled": true, + "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", + "bundled": true, + "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-spawn": { + "version": "6.0.5", + "bundled": true, + "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" + } + }, + "decamelize": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "elliptic": { + "version": "6.5.3", + "bundled": true, + "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" + } + }, + "emoji-regex": { + "version": "7.0.3", + "bundled": true, + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "ethereum-cryptography": { + "version": "0.1.3", + "bundled": true, + "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": "6.2.1", + "bundled": true, + "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" + } + }, + "ethjs-util": { + "version": "0.1.6", + "bundled": true, + "dev": true, + "requires": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.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" + } + }, + "find-up": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "bundled": true, + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "hash-base": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "hash.js": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-hex-prefixed": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "keccak": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, + "lcid": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mem": { + "version": "4.3.0", + "bundled": true, + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "node-addon-api": { + "version": "2.0.2", + "bundled": true, + "dev": true + }, + "node-gyp-build": { + "version": "4.2.3", + "bundled": true, + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-locale": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "bundled": true, + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "pbkdf2": { + "version": "3.1.1", + "bundled": true, + "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" + } + }, + "pump": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "randombytes": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "ripemd160": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rlp": { + "version": "2.2.6", + "bundled": true, + "dev": true, + "requires": { + "bn.js": "^4.11.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "bundled": true, + "dev": true + }, + "scrypt-js": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "secp256k1": { + "version": "4.0.2", + "bundled": true, + "dev": true, + "requires": { + "elliptic": "^6.5.2", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "bundled": true, + "dev": true + }, + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true + }, + "source-map-support": { + "version": "0.5.12", + "bundled": true, + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "string-width": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "string_decoder": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "strip-hex-prefix": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-hex-prefixed": "1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "which": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "y18n": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "yargs": { + "version": "13.2.4", + "bundled": true, + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "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.0" + } + }, + "yargs-parser": { + "version": "13.1.2", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.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", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz", + "integrity": "sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==", + "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", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.0.8.tgz", + "integrity": "sha512-fqJXkewcGdi8LogKMgRyzc/Ls2js07yor7+g9KfPs09uPOcQLg7cc34JN+lk34HH9gg2HU0DIA5797ZR8znkfw==", + "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", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.0.10.tgz", + "integrity": "sha512-irx7kH7FDAeW7QChDPW19WsxqeB1d3XLyOLSXm0bfPqL1SS07LXWltBJUBUxqC03ORpAOcM3JQj57DU8JnVY2g==", + "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", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.9.tgz", + "integrity": "sha512-gKkmbZDMyGbVjr8nA5P0md1GgESqSGH7ILIrDidPdNXBl4adqbuA3OAuZx/O2oGpL6PtJ9BDa0kHheZ1ToHU3w==", + "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", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.0.7.tgz", + "integrity": "sha512-S5oh5DVfCo06xwJXT8fQC68mvJfgScTl2AXvbYMsHNfIBTDb084Wx4iA9MNlEReOv6HulkS+gyrUM/j3514rSw==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/bytes": "^5.0.9" + } + }, + "@ethersproject/bignumber": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.13.tgz", + "integrity": "sha512-b89bX5li6aK492yuPP5mPgRVgIxxBP7ksaBtKX5QQBsrZTpNOjf/MR4CjcUrAw8g+RQuD6kap9lPjFgY4U1/5A==", + "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", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.9.tgz", + "integrity": "sha512-k+17ZViDtAugC0s7HM6rdsTWEdIYII4RPCDkPEuxKc6i40Bs+m6tjRAtCECX06wKZnrEoR9pjOJRXHJ/VLoOcA==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/logger": "^5.0.8" + } + }, + "@ethersproject/constants": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.8.tgz", + "integrity": "sha512-sCc73pFBsl59eDfoQR5OCEZCRv5b0iywadunti6MQIr5lt3XpwxK1Iuzd8XSFO02N9jUifvuZRrt0cY0+NBgTg==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/bignumber": "^5.0.13" + } + }, + "@ethersproject/hash": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.0.10.tgz", + "integrity": "sha512-Tf0bvs6YFhw28LuHnhlDWyr0xfcDxSXdwM4TcskeBbmXVSKLv3bJQEEEBFUcRX0fJuslR3gCVySEaSh7vuMx5w==", + "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", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.7.tgz", + "integrity": "sha512-zpUBmofWvx9PGfc7IICobgFQSgNmTOGTGLUxSYqZzY/T+b4y/2o5eqf/GGmD7qnTGzKQ42YlLNo+LeDP2qe55g==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/bytes": "^5.0.9", + "js-sha3": "0.5.7" + } + }, + "@ethersproject/logger": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.8.tgz", + "integrity": "sha512-SkJCTaVTnaZ3/ieLF5pVftxGEFX56pTH+f2Slrpv7cU0TNpUZNib84QQdukd++sWUp/S7j5t5NW+WegbXd4U/A==", + "dev": true, + "optional": true + }, + "@ethersproject/networks": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.0.7.tgz", + "integrity": "sha512-dI14QATndIcUgcCBL1c5vUr/YsI5cCHLN81rF7PU+yS7Xgp2/Rzbr9+YqpC6NBXHFUASjh6GpKqsVMpufAL0BQ==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/logger": "^5.0.8" + } + }, + "@ethersproject/properties": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.7.tgz", + "integrity": "sha512-812H1Rus2vjw0zbasfDI1GLNPDsoyX1pYqiCgaR1BuyKxUTbwcH1B+214l6VGe1v+F6iEVb7WjIwMjKhb4EUsg==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/logger": "^5.0.8" + } + }, + "@ethersproject/rlp": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.7.tgz", + "integrity": "sha512-ulUTVEuV7PT4jJTPpfhRHK57tkLEDEY9XSYJtrSNHOqdwMvH0z7BM2AKIMq4LVDlnu4YZASdKrkFGEIO712V9w==", + "dev": true, + "optional": true, + "requires": { + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8" + } + }, + "@ethersproject/signing-key": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.8.tgz", + "integrity": "sha512-YKxQM45eDa6WAD+s3QZPdm1uW1MutzVuyoepdRRVmMJ8qkk7iOiIhUkZwqKLNxKzEJijt/82ycuOREc9WBNAKg==", + "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", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.0.8.tgz", + "integrity": "sha512-5IsdXf8tMY8QuHl8vTLnk9ehXDDm6x9FB9S9Og5IA1GYhLe5ZewydXSjlJlsqU2t9HRbfv97OJZV/pX8DVA/Hw==", + "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", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.9.tgz", + "integrity": "sha512-0Fu1yhdFBkrbMjenEr+39tmDxuHmaw0pe9Jb18XuKoItj7Z3p7+UzdHLr2S/okvHDHYPbZE5gtANDdQ3ZL1nBA==", + "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", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.0.12.tgz", + "integrity": "sha512-gVxS5iW0bgidZ76kr7LsTxj4uzN5XpCLzvZrLp8TP+4YgxHfCeetFyQkRPgBEAJdNrexdSBayvyJvzGvOq0O8g==", + "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", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "optional": 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==", + "dev": true, + "optional": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@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==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "14.14.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.20.tgz", + "integrity": "sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A==", + "dev": true + }, + "@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/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": "*" + } + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "abstract-leveldown": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz", + "integrity": "sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "optional": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "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, + "optional": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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", + "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" + } + }, + "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 + }, + "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-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true, + "optional": 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 + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "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", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "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 + }, + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "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==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "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 + }, + "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=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "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": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + } + } + }, + "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-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-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-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-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-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-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-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-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==", + "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", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "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": { + "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" + } + }, + "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" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "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 + } + } + }, + "babelify": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", + "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", + "dev": true, + "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==", + "dev": true + }, + "backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", + "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=", + "dev": true + }, + "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" + } + } + } + }, + "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.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + }, + "dependencies": { + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "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, + "optional": true + }, + "bip39": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-2.5.0.tgz", + "integrity": "sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA==", + "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", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz", + "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "optional": true + }, + "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 + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "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", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "optional": true + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "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=", + "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==", + "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", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "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", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "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", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "optional": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "dev": true, + "optional": true + } + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "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", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "dev": true, + "optional": true + }, + "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" + } + } + } + }, + "browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "dev": true, + "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=", + "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" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "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==", + "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=", + "dev": true, + "optional": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "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==", + "dev": true, + "optional": true + }, + "bytewise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz", + "integrity": "sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4=", + "dev": true, + "requires": { + "bytewise-core": "^1.2.2", + "typewise": "^1.0.3" + } + }, + "bytewise-core": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz", + "integrity": "sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI=", + "dev": true, + "requires": { + "typewise-core": "^1.2" + } + }, + "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" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "optional": true, + "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": { + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "optional": true + } + } + }, + "cachedown": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cachedown/-/cachedown-1.0.0.tgz", + "integrity": "sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU=", + "dev": true, + "requires": { + "abstract-leveldown": "^2.4.1", + "lru-cache": "^3.2.0" + }, + "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" + } + }, + "lru-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz", + "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=", + "dev": true, + "requires": { + "pseudomap": "^1.0.1" + } + } + } + }, + "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" + } + }, + "caniuse-lite": { + "version": "1.0.30001174", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001174.tgz", + "integrity": "sha512-tqClL/4ThQq6cfFXH3oJL4rifFBeM6gTkphjao5kgwMaW9yn0tKgQLAEfKzDwj6HQWCB/aWo8kTFlSvIN8geEA==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "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==", + "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", + "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", + "integrity": "sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=", + "dev": true, + "requires": { + "functional-red-black-tree": "^1.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "optional": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "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, + "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", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", + "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "dev": true, + "optional": 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==", + "dev": true, + "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==", + "dev": true, + "optional": 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" + } + }, + "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-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": "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 + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "optional": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "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==", + "dev": true, + "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=", + "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==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "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=", + "dev": true + }, + "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" + } + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "optional": true, + "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==", + "dev": true, + "optional": true + } + } + }, + "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, + "optional": 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==", + "dev": true, + "optional": true + }, + "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==", + "dev": true, + "optional": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true, + "optional": true + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "dev": true, + "optional": true + }, + "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.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "dev": true + }, + "core-js-pure": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.8.2.tgz", + "integrity": "sha512-v6zfIQqL/pzTVAbZvYUozsxNfxcFb6Ks3ZfEbuneJl3FW9Jb8F6vLWB6f+qTmAu72msUdyb84V8d/yBFf7FNnw==", + "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=", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "optional": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "optional": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "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==", + "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", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "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", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.3.tgz", + "integrity": "sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw==", + "dev": true, + "requires": { + "node-fetch": "2.1.2", + "whatwg-fetch": "2.0.4" + } + }, + "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==", + "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", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "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=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "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" + } + }, + "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=", + "dev": true + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "optional": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "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", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true, + "optional": true + }, + "deferred-leveldown": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz", + "integrity": "sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==", + "dev": true, + "requires": { + "abstract-leveldown": "~5.0.0", + "inherits": "^2.0.3" + }, + "dependencies": { + "abstract-leveldown": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz", + "integrity": "sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==", + "dev": true, + "requires": { + "xtend": "~4.0.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==", + "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" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "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=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "optional": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "optional": true, + "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=", + "dev": true, + "optional": true + }, + "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" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "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", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true + }, + "dotignore": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", + "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "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=", + "dev": true, + "optional": true + }, + "electron-to-chromium": { + "version": "1.3.636", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.636.tgz", + "integrity": "sha512-Adcvng33sd3gTjNIDNXGD1G4H6qCImIy2euUJAQHtLNplEKU5WEz5KRJxupRNIIT8sD5oFZLTKBWAf12Bsz24A==", + "dev": true + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "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", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "optional": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "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==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "encoding-down": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-5.0.4.tgz", + "integrity": "sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw==", + "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", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz", + "integrity": "sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==", + "dev": true, + "requires": { + "xtend": "~4.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==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "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.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "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", + "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==", + "dev": true, + "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=", + "dev": true, + "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==", + "dev": true, + "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=", + "dev": true, + "optional": true + }, + "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=", + "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=", + "dev": true, + "optional": true + }, + "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==", + "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", + "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" + } + }, + "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" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "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=", + "dev": true, + "optional": true, + "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==", + "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", + "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz", + "integrity": "sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==", + "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", + "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" + } + }, + "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-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" + } + }, + "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": { + "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 + } + } + }, + "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" + } + }, + "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-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-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==", + "dev": true, + "requires": { + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" + } + }, + "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" + } + } + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "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": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", + "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": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "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", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", + "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", + "dev": true, + "requires": { + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "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", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "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==", + "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", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "dev": true + }, + "memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", + "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" + } + } + } + }, + "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": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "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 + }, + "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": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "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==", + "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", + "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", + "integrity": "sha1-1nQdkAAQa1FRDHLbktY2VFam2l4=", + "dev": true, + "requires": { + "json-rpc-random-id": "^1.0.0", + "xtend": "^4.0.1" + } + }, + "eth-sig-util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-3.0.0.tgz", + "integrity": "sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ==", + "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", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz", + "integrity": "sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE=", + "dev": true, + "requires": { + "bn.js": "^4.10.0", + "ethereumjs-util": "^4.3.0" + }, + "dependencies": { + "ethereumjs-util": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz", + "integrity": "sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w==", + "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", + "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" + } + } + } + }, + "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==", + "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", + "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" + } + }, + "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-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" + } + }, + "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": { + "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 + } + } + }, + "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" + } + }, + "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-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-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==", + "dev": true, + "requires": { + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" + } + }, + "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" + } + } + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "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": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", + "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": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "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", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", + "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", + "dev": true, + "requires": { + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "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", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "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==", + "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", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "dev": true + }, + "memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", + "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" + } + } + } + }, + "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": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "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 + }, + "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": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "ethashjs": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ethashjs/-/ethashjs-0.0.8.tgz", + "integrity": "sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw==", + "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", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "dev": true + }, + "buffer-xor": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz", + "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "ethereumjs-util": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.0.7.tgz", + "integrity": "sha512-vU5rtZBlZsgkTw3o6PDKyB8li2EgLavnAbsKcfsH2YhHH1Le+PP8vEiMnAnvgc1B6uMoaM5GDCrVztBw0Q5K9g==", + "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", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.7.tgz", + "integrity": "sha512-cDcJJSJ9GMAcURiAWO3DxIEhTL/uWqlQnvgKpuYQzYPrt/izuGU+1ntQmHt0IRq6ADoSYHFnB+aCEFIldjhkMQ==", + "dev": true, + "optional": true, + "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==", + "dev": true, + "optional": true + } + } + }, + "ethereum-common": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", + "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=", + "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-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==", + "dev": true, + "requires": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + } + }, + "ethereumjs-account": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz", + "integrity": "sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA==", + "dev": true, + "requires": { + "ethereumjs-util": "^6.0.0", + "rlp": "^2.2.1", + "safe-buffer": "^5.1.1" + } + }, + "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": { + "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" + } + }, + "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": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "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": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", + "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": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "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", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", + "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", + "dev": true, + "requires": { + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "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", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "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==", + "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", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "dev": true + }, + "memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", + "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" + } + } + } + }, + "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": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "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 + }, + "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": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "ethereumjs-blockchain": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.4.tgz", + "integrity": "sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ==", + "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", + "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz", + "integrity": "sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" + } + }, + "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" + } + }, + "ethereumjs-vm": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz", + "integrity": "sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA==", + "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", + "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" + } + }, + "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" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "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": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", + "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": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "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", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", + "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", + "dev": true, + "requires": { + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "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", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "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==", + "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", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "dev": true + }, + "memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", + "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" + } + } + } + }, + "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": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "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" + } + } + } + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "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 + }, + "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": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "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, + "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", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", + "dev": true, + "optional": true, + "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=", + "dev": true, + "optional": true + } + } + }, + "ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "dev": true, + "requires": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + } + }, + "eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", + "dev": true, + "optional": true + }, + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "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==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "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": { + "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" + } + }, + "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-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": "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" + } + }, + "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 + }, + "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 + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "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", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "optional": true + }, + "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, + "optional": true + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "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 + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "checkpoint-store": "^1.1.0" + } + }, + "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==", + "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==", + "dev": true + }, + "fetch-ponyfill": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz", + "integrity": "sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=", + "dev": true, + "requires": { + "node-fetch": "~1.7.1" + }, + "dependencies": { + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "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", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + } + } + }, + "find-yarn-workspace-root": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz", + "integrity": "sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==", + "dev": true, + "requires": { + "fs-extra": "^4.0.3", + "micromatch": "^3.1.4" + }, + "dependencies": { + "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" + } + } + } + }, + "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" + } + } + } + }, + "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" + } + }, + "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-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-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" + } + } + } + }, + "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" + } + } + } + }, + "flow-stoplight": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/flow-stoplight/-/flow-stoplight-1.0.0.tgz", + "integrity": "sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s=", + "dev": true + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "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==", + "dev": true, + "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=", + "dev": true, + "optional": 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=", + "dev": true, + "optional": true + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": 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 + }, + "get-intrinsic": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", + "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "optional": true, + "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=", + "dev": true, + "requires": { + "assert-plus": "^1.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" + } + }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "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", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "optional": true, + "requires": { + "pump": "^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==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "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-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "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==", + "dev": true, + "optional": true + }, + "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==", + "dev": true, + "optional": true, + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, + "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" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^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==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "heap": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.6.tgz", + "integrity": "sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=", + "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=", + "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", + "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" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true, + "optional": true + }, + "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==", + "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", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true, + "optional": true + } + } + }, + "http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=", + "dev": true, + "optional": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "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==", + "dev": true, + "optional": true, + "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==", + "dev": true, + "optional": true, + "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=", + "dev": true, + "optional": true + } + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "immediate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", + "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "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==", + "dev": true + }, + "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" + } + }, + "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==", + "dev": true, + "optional": true + }, + "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-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-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.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-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": "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-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" + } + }, + "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": "sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw=", + "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==", + "dev": true + }, + "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=", + "dev": true + }, + "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-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "dev": true, + "optional": true + }, + "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=", + "dev": true, + "optional": true + }, + "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" + } + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "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==", + "dev": true, + "optional": 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-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "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=", + "dev": true + }, + "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": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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=", + "dev": true + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "optional": true, + "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=", + "dev": true, + "optional": true + }, + "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 + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "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=", + "dev": true, + "optional": true + }, + "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==", + "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", + "resolved": "https://registry.npmjs.org/json-rpc-error/-/json-rpc-error-2.0.0.tgz", + "integrity": "sha1-p6+cICg4tekFxyUOVH8a/3cligI=", + "dev": true, + "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=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "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==", + "dev": true + }, + "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=", + "dev": true, + "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=", + "dev": true + }, + "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" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "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", + "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==", + "dev": true, + "optional": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "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 + }, + "klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11" + } + }, + "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, + "requires": { + "buffer": "^5.6.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, + "requires": { + "errno": "~0.1.1" + } + }, + "level-iterator-stream": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz", + "integrity": "sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.5", + "xtend": "^4.0.0" + } + }, + "level-mem": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-3.0.1.tgz", + "integrity": "sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg==", + "dev": true, + "requires": { + "level-packager": "~4.0.0", + "memdown": "~3.0.0" + }, + "dependencies": { + "abstract-leveldown": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz", + "integrity": "sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + }, + "ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "dev": true + }, + "memdown": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-3.0.0.tgz", + "integrity": "sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA==", + "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", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "level-packager": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-4.0.1.tgz", + "integrity": "sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q==", + "dev": true, + "requires": { + "encoding-down": "~5.0.0", + "levelup": "^3.0.0" + } + }, + "level-post": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/level-post/-/level-post-1.0.7.tgz", + "integrity": "sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==", + "dev": true, + "requires": { + "ltgt": "^2.1.2" + } + }, + "level-sublevel": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-6.6.4.tgz", + "integrity": "sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA==", + "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", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-1.0.0.tgz", + "integrity": "sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.8", + "xtend": "^4.0.1" + } + }, + "levelup": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-3.1.1.tgz", + "integrity": "sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==", + "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", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz", + "integrity": "sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "xtend": "^4.0.0" + } + } + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "looper": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/looper/-/looper-2.0.0.tgz", + "integrity": "sha1-Zs0Md0rz1P7axTeU90LbVtqPCew=", + "dev": 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" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "optional": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "ltgt": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.1.3.tgz", + "integrity": "sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ=", + "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" + } + }, + "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==", + "dev": true, + "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=", + "dev": true, + "optional": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true, + "optional": true + }, + "merkle-patricia-tree": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz", + "integrity": "sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ==", + "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", + "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" + } + }, + "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" + } + } + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, + "optional": true + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "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==", + "dev": true, + "optional": true + }, + "mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "dev": true + }, + "mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "dev": true, + "requires": { + "mime-db": "1.45.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==", + "dev": true, + "optional": true + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "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==", + "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 + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.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" + } + }, + "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" + } + }, + "mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "dev": true, + "optional": true, + "requires": { + "mkdirp": "*" + } + }, + "mock-fs": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.13.0.tgz", + "integrity": "sha512-DD0vOdofJdoaRNtnWcrXe6RQbpHkPPmtqGq14uRX0F8ZKJ5nv89CVTYl/BZdppDxBDaV0hl75htg3abpEWlPZA==", + "dev": true, + "optional": true + }, + "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 + }, + "multibase": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "dev": true, + "optional": 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, + "optional": 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, + "optional": 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, + "optional": true, + "requires": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + } + } + }, + "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=", + "dev": true, + "optional": 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" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true, + "optional": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "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==", + "dev": true + }, + "node-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", + "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=", + "dev": true + }, + "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 + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true, + "optional": 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=", + "dev": true, + "optional": true, + "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=", + "dev": true, + "optional": true + } + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "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" + } + }, + "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-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": "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-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 + } + } + }, + "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" + } + } + } + }, + "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-is": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", + "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "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" + } + }, + "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" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz", + "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==", + "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", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "oboe": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz", + "integrity": "sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=", + "dev": true, + "optional": true, + "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=", + "dev": true, + "optional": true, + "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=", + "dev": true, + "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=", + "dev": true + }, + "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==", + "dev": true, + "optional": true + }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "dev": true, + "optional": true, + "requires": { + "p-finally": "^1.0.0" + }, + "dependencies": { + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "optional": true + } + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "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", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", + "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "optional": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "patch-package": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.2.2.tgz", + "integrity": "sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg==", + "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", + "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" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "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 + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "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" + } + }, + "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" + } + } + } + }, + "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=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "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=", + "dev": true, + "optional": true + }, + "pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "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", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": 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 + }, + "precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=", + "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=", + "dev": true, + "optional": 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.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "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==", + "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=", + "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==", + "dev": true, + "optional": true, + "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": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "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==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "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", + "resolved": "https://registry.npmjs.org/pull-cat/-/pull-cat-1.1.11.tgz", + "integrity": "sha1-tkLdElXaN2pwa220+pYvX9t0wxs=", + "dev": true + }, + "pull-defer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/pull-defer/-/pull-defer-0.2.3.tgz", + "integrity": "sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA==", + "dev": true + }, + "pull-level": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pull-level/-/pull-level-2.0.4.tgz", + "integrity": "sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg==", + "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", + "resolved": "https://registry.npmjs.org/pull-live/-/pull-live-1.0.1.tgz", + "integrity": "sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU=", + "dev": true, + "requires": { + "pull-cat": "^1.1.9", + "pull-stream": "^3.4.0" + } + }, + "pull-pushable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pull-pushable/-/pull-pushable-2.2.0.tgz", + "integrity": "sha1-Xy867UethpGfAbEqLpnW8b13ZYE=", + "dev": true + }, + "pull-stream": { + "version": "3.6.14", + "resolved": "https://registry.npmjs.org/pull-stream/-/pull-stream-3.6.14.tgz", + "integrity": "sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew==", + "dev": true + }, + "pull-window": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/pull-window/-/pull-window-2.1.4.tgz", + "integrity": "sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA=", + "dev": true, + "requires": { + "looper": "^2.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "optional": true, + "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==", + "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==", + "dev": true + }, + "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==", + "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", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "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==", + "dev": true, + "optional": true, + "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==", + "dev": true, + "optional": true + }, + "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==", + "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", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "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-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" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "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", + "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" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "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" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "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", + "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=", + "dev": true, + "optional": true, + "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=", + "dev": true, + "requires": { + "through": "~2.3.4" + } + }, + "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 + }, + "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==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rlp": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz", + "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "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 + }, + "scryptsy": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", + "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", + "dev": true, + "optional": true, + "requires": { + "pbkdf2": "^3.0.3" + } + }, + "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" + } + }, + "seedrandom": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.1.tgz", + "integrity": "sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg==", + "dev": true + }, + "semaphore": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", + "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "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", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "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=", + "dev": true, + "optional": true + } + } + }, + "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, + "optional": true + } + } + }, + "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==", + "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", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "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", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "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" + } + }, + "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 + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true, + "optional": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "optional": true + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "dev": true, + "optional": true, + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.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" + } + }, + "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-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": "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" + } + }, + "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 + }, + "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 + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "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" + } + } + } + }, + "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" + }, + "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 + }, + "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" + } + } + } + }, + "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-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.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "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-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 + }, + "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" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "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", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + } + } + }, + "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" + } + }, + "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-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": "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 + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "optional": true + }, + "stream-to-pull-stream": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz", + "integrity": "sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg==", + "dev": true, + "requires": { + "looper": "^3.0.0", + "pull-stream": "^3.2.3" + }, + "dependencies": { + "looper": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/looper/-/looper-3.0.0.tgz", + "integrity": "sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k=", + "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=", + "dev": true, + "optional": true + }, + "string.prototype.trim": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.3.tgz", + "integrity": "sha512-16IL9pIBA5asNOSukPfxX2W68BaBvxyiRK16H3RA/lWW9BDosh+w7f+LhomPHpXJ82QEe7w7/rY/S1CV97raLg==", + "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", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "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==", + "dev": true, + "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==", + "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=", + "dev": true, + "requires": { + "is-hex-prefixed": "1.0.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" + } + }, + "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": { + "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, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.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, + "optional": true + }, + "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" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "optional": 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, + "optional": 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, + "optional": 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, + "optional": true, + "requires": { + "prepend-http": "^1.0.1" + } + } + } + }, + "tape": { + "version": "4.13.3", + "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.3.tgz", + "integrity": "sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw==", + "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", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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 + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "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", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "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=", + "dev": true, + "optional": true + }, + "tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "dev": true, + "requires": { + "rimraf": "^2.6.3" + } + }, + "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" + }, + "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 + }, + "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" + } + } + } + }, + "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==", + "dev": true, + "optional": true + }, + "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" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true, + "optional": 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==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "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 + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true + }, + "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==", + "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==", + "dev": true, + "optional": true, + "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==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typewise": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz", + "integrity": "sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE=", + "dev": true, + "requires": { + "typewise-core": "^1.2.0" + } + }, + "typewise-core": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz", + "integrity": "sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU=", + "dev": true + }, + "typewiselite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typewiselite/-/typewiselite-1.0.0.tgz", + "integrity": "sha1-yIgvobsQksBgBal/NO9chQjjZk4=", + "dev": true + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true, + "optional": true + }, + "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==", + "dev": true, + "optional": true + }, + "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" + }, + "dependencies": { + "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 + } + } + }, + "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 + }, + "unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "optional": true + }, + "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 + } + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "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=", + "dev": true, + "optional": true, + "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=", + "dev": true, + "optional": true + }, + "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=", + "dev": true, + "optional": true + }, + "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==", + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz", + "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==", + "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", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "optional": 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 + }, + "varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==", + "dev": true, + "optional": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "optional": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "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==", + "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", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.11.tgz", + "integrity": "sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg==", + "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", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.12.tgz", + "integrity": "sha512-UwfL2uIU9arX/+/PRcIkT08/iBadGN2z6ExOROA2Dh5mAuWTBj6iJbQX4nekiV5H8cTrEG569LeX+HRco9Cbxw==", + "dev": true, + "optional": true + } + } + }, + "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==", + "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", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.12.tgz", + "integrity": "sha512-UwfL2uIU9arX/+/PRcIkT08/iBadGN2z6ExOROA2Dh5mAuWTBj6iJbQX4nekiV5H8cTrEG569LeX+HRco9Cbxw==", + "dev": true, + "optional": true + } + } + }, + "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==", + "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", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.11.tgz", + "integrity": "sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw==", + "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", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz", + "integrity": "sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA==", + "dev": true, + "optional": true, + "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==", + "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", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz", + "integrity": "sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg==", + "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", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.11.tgz", + "integrity": "sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ==", + "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", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz", + "integrity": "sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg==", + "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", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz", + "integrity": "sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw==", + "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", + "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" + } + }, + "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-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==", + "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", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz", + "integrity": "sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA==", + "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", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz", + "integrity": "sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ==", + "dev": true, + "optional": true, + "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==", + "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", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.12.tgz", + "integrity": "sha512-UwfL2uIU9arX/+/PRcIkT08/iBadGN2z6ExOROA2Dh5mAuWTBj6iJbQX4nekiV5H8cTrEG569LeX+HRco9Cbxw==", + "dev": true, + "optional": true + } + } + }, + "web3-net": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.11.tgz", + "integrity": "sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg==", + "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", + "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz", + "integrity": "sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==", + "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": "^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": { + "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" + } + }, + "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" + } + }, + "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=", + "dev": true, + "requires": { + "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", + "ethereumjs-util": "^5.1.1" + } + }, + "ethereumjs-abi": { + "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0", + "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", + "dev": true, + "requires": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + }, + "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" + } + } + } + }, + "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" + } + }, + "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": { + "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 + } + } + }, + "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" + } + }, + "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-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-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==", + "dev": true, + "requires": { + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" + } + }, + "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" + } + } + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "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": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", + "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": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "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", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", + "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", + "dev": true, + "requires": { + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "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", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "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==", + "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", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "dev": true + }, + "memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", + "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" + } + } + } + }, + "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": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "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 + }, + "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": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "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==", + "dev": true, + "optional": true, + "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==", + "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", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz", + "integrity": "sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg==", + "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", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.11.tgz", + "integrity": "sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg==", + "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", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz", + "integrity": "sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==", + "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", + "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" + } + } + } + }, + "websocket": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.32.tgz", + "integrity": "sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q==", + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "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 + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "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", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + } + } + }, + "xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "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", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "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", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", + "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", + "dev": true, + "optional": true, + "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=", + "dev": true, + "optional": true, + "requires": { + "cookiejar": "^2.1.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "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": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "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": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "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": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "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": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "optional": true + }, + "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.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "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-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-1.0.2.tgz", + "integrity": "sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==", + "dev": true, + "optional": true + }, + "get-params": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/get-params/-/get-params-0.1.2.tgz", + "integrity": "sha1-uuDfq6WIoMYNeDTA2Nwv9g7u8v4=", + "dev": true + }, + "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-prototype-of": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/get-prototype-of/-/get-prototype-of-0.0.0.tgz", + "integrity": "sha1-mHcr0QcW0W3rSzIlFsRp78oorEQ=", + "dev": true, + "optional": 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==", + "dev": true, + "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=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "ghost-testrpc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", + "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "node-emoji": "^1.10.0" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "optional": 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, + "optional": 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, + "optional": 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, + "optional": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, + "optional": true, + "requires": { + "extend": "^3.0.0", + "glob": "^5.0.3", + "glob-parent": "^3.0.0", + "micromatch": "^2.3.7", + "ordered-read-streams": "^0.3.0", + "through2": "^0.6.0", + "to-absolute-glob": "^0.1.1", + "unique-stream": "^2.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "optional": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true, + "optional": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "optional": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "optional": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.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, + "optional": 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, + "optional": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true, + "optional": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "optional": 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" + } + }, + "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, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "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": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + }, + "globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globalthis": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", + "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", + "dev": true, + "optional": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "google-protobuf": { + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.17.2.tgz", + "integrity": "sha512-LlFVMhSkNy6C1MakEjiwbLxq5w+V+Go+mvt2EUoysrp8gXl903ic2W/3BwzM4/WnDMJP+u7UO2efUSl/0CJMzA==", + "dev": true, + "optional": true + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": 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" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "graphql": { + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.5.0.tgz", + "integrity": "sha512-OmaM7y0kaK31NKG31q4YbD2beNYa6jBBKtMFT6gLYJljHLJr42IqJ8KX08u3Li/0ifzTU5HjmoOOrwa5BRLeDA==", + "dev": true, + "optional": true + }, + "graphql-extensions": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.15.0.tgz", + "integrity": "sha512-bVddVO8YFJPwuACn+3pgmrEg6I8iBuYLuwvxiE+lcQQ7POotVZxm2rgGw0PvVYmWWf3DT7nTVDZ5ROh/ALp8mA==", + "dev": true, + "optional": true, + "requires": { + "@apollographql/apollo-tools": "^0.5.0", + "apollo-server-env": "^3.1.0", + "apollo-server-types": "^0.9.0" + } + }, + "graphql-subscriptions": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.2.1.tgz", + "integrity": "sha512-95yD/tKi24q8xYa7Q9rhQN16AYj5wPbrb8tmHGM3WRc9EBmWrG/0kkMl+tQG8wcEuE9ibR4zyOM31p5Sdr2v4g==", + "dev": true, + "optional": true, + "requires": { + "iterall": "^1.3.0" + } + }, + "graphql-tag": { + "version": "2.12.4", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.4.tgz", + "integrity": "sha512-VV1U4O+9x99EkNpNmCUV5RZwq6MnK4+pGbRYWG+lA/m3uo7TSqJF81OkcOP148gFP6fzdl7JWYBrwWVTS9jXww==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "graphql-tools": { + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-6.2.6.tgz", + "integrity": "sha512-OyhSvK5ALVVD6bFiWjAqv2+lRyvjIRfb6Br5Tkjrv++rxnXDodPH/zhMbDGRw+W3SD5ioGEEz84yO48iPiN7jA==", + "dev": true, + "optional": true, + "requires": { + "@graphql-tools/batch-delegate": "^6.2.6", + "@graphql-tools/code-file-loader": "^6.2.4", + "@graphql-tools/delegate": "^6.2.4", + "@graphql-tools/git-loader": "^6.2.4", + "@graphql-tools/github-loader": "^6.2.4", + "@graphql-tools/graphql-file-loader": "^6.2.4", + "@graphql-tools/graphql-tag-pluck": "^6.2.4", + "@graphql-tools/import": "^6.2.4", + "@graphql-tools/json-file-loader": "^6.2.4", + "@graphql-tools/links": "^6.2.4", + "@graphql-tools/load": "^6.2.4", + "@graphql-tools/load-files": "^6.2.4", + "@graphql-tools/merge": "^6.2.4", + "@graphql-tools/mock": "^6.2.4", + "@graphql-tools/module-loader": "^6.2.4", + "@graphql-tools/relay-operation-optimizer": "^6.2.4", + "@graphql-tools/resolvers-composition": "^6.2.4", + "@graphql-tools/schema": "^6.2.4", + "@graphql-tools/stitch": "^6.2.4", + "@graphql-tools/url-loader": "^6.2.4", + "@graphql-tools/utils": "^6.2.4", + "@graphql-tools/wrap": "^6.2.4", + "tslib": "~2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true, + "optional": true + } + } + }, + "graphql-ws": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-4.9.0.tgz", + "integrity": "sha512-sHkK9+lUm20/BGawNEWNtVAeJzhZeBg21VmvmLoT5NdGVeZWv5PdIhkcayQIAgjSyyQ17WMKmbDijIPG2On+Ag==", + "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 + }, + "gulp-sourcemaps": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.12.1.tgz", + "integrity": "sha1-tDfR89mAzyboEYSCNxjOFa5ll7Y=", + "dev": true, + "optional": true, + "requires": { + "@gulp-sourcemaps/map-sources": "1.X", + "acorn": "4.X", + "convert-source-map": "1.X", + "css": "2.X", + "debug-fabulous": "0.0.X", + "detect-newline": "2.X", + "graceful-fs": "4.X", + "source-map": "~0.6.0", + "strip-bom": "2.X", + "through2": "2.X", + "vinyl": "1.X" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true, + "optional": true + }, + "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, + "optional": true + } + } + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "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 + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "hardhat": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.3.0.tgz", + "integrity": "sha512-nc4ro2bM4wPaA6/0Y22o5F5QrifQk2KCyPUUKLPUeFFZoGNGYB8vmeW/k9gV9DdMukdWTzfYlKc2Jn4bfb6tDQ==", + "dev": true, + "requires": { + "@ethereumjs/block": "^3.2.1", + "@ethereumjs/blockchain": "^5.2.1", + "@ethereumjs/common": "^2.2.0", + "@ethereumjs/tx": "^3.1.3", + "@ethereumjs/vm": "^5.3.2", + "@sentry/node": "^5.18.1", + "@solidity-parser/parser": "^0.11.0", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "abort-controller": "^3.0.0", + "adm-zip": "^0.4.16", + "ansi-escapes": "^4.3.0", + "chalk": "^2.4.2", + "chokidar": "^3.4.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "eth-sig-util": "^2.5.2", + "ethereum-cryptography": "^0.1.2", + "ethereumjs-abi": "^0.6.8", + "ethereumjs-util": "^7.0.10", + "find-up": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "^7.1.3", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "lodash": "^4.17.11", + "merkle-patricia-tree": "^4.1.0", + "mnemonist": "^0.38.0", + "mocha": "^7.1.2", + "node-fetch": "^2.6.0", + "qs": "^6.7.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "slash": "^3.0.0", + "solc": "0.7.3", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "true-case-path": "^2.2.1", + "tsort": "0.0.1", + "uuid": "^3.3.2", + "ws": "^7.2.1" + }, + "dependencies": { + "@solidity-parser/parser": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.11.1.tgz", + "integrity": "sha512-H8BSBoKE8EubJa0ONqecA2TviT3TnHeC4NpgnAHSUiuhZoQBfPB4L2P9bs8R6AoTW10Endvh3vc+fomVMIDIYQ==", + "dev": true + }, + "@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": "*" + } + }, + "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" + } + }, + "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" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "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" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.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 + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "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=", + "dev": true, + "requires": { + "p-limit": "^1.1.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=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true + } + } + }, + "hardhat-contract-sizer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.0.3.tgz", + "integrity": "sha512-iaixOzWxwOSIIE76cl2uk4m9VXI1hKU3bFt+gl7jDhyb2/JB2xOp5wECkfWqAoc4V5lD4JtjldZlpSTbzX+nPQ==", + "dev": true, + "requires": { + "cli-table3": "^0.6.0", + "colors": "^1.4.0" + } + }, + "hardhat-deploy": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.7.10.tgz", + "integrity": "sha512-+0oiEWy/FgKOEzRNhSWPqSjofVCwtkK3E5x916kbZ5SgFGOjWTFCrWbWUYjzc2GyZgNXuSuRn8mBowHSLF4sVg==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.0.0", + "@ethersproject/abstract-signer": "^5.0.0", + "@ethersproject/address": "^5.0.0", + "@ethersproject/bignumber": "^5.0.0", + "@ethersproject/bytes": "^5.0.0", + "@ethersproject/contracts": "^5.0.0", + "@ethersproject/providers": "^5.0.0", + "@ethersproject/solidity": "^5.0.0", + "@ethersproject/transactions": "^5.0.0", + "@ethersproject/wallet": "^5.0.0", + "@types/qs": "^6.9.4", + "axios": "^0.21.1", + "chalk": "^4.1.0", + "chokidar": "^3.4.0", + "debug": "^4.1.1", + "form-data": "^3.0.0", + "fs-extra": "^9.0.0", + "match-all": "^1.2.6", + "murmur-128": "^0.2.1", + "qs": "^6.9.4" + }, + "dependencies": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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 + }, + "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" + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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 + }, + "qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "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" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, + "hardhat-docgen": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hardhat-docgen/-/hardhat-docgen-1.1.1.tgz", + "integrity": "sha512-vMZqT2go9JmIAtTfK4QZLsL2hzGVccqkfDvSIvqC6wvH2FX9vmp4H5mTHoYqimanqZcU74QZ8Vi81G13m0WZ2w==", + "dev": true, + "requires": { + "css-loader": "^2.1.0", + "html-webpack-plugin": "^3.2.0", + "vue": "^2.6.12", + "vue-loader": "^15.6.4", + "vue-router": "^3.4.9", + "vue-template-compiler": "^2.6.7", + "webpack": "^4.29.5" + } + }, + "hardhat-gas-reporter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.4.tgz", + "integrity": "sha512-G376zKh81G3K9WtDA+SoTLWsoygikH++tD1E7llx+X7J+GbIqfwhDKKgvJjcnEesMrtR9UqQHK02lJuXY1RTxw==", + "dev": true, + "requires": { + "eth-gas-reporter": "^0.2.20", + "sha1": "^1.1.1" + } + }, + "hardhat-log-remover": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hardhat-log-remover/-/hardhat-log-remover-2.0.2.tgz", + "integrity": "sha512-TvEWOisQmZUZ7Mlb7s4XYS/MxgZzjFJSjDI8v3uTcrD6aaXy1QtomW6D6WNsISEWtwwRlSntOGpHQwFjrz2MCw==", + "dev": true + }, + "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=", + "dev": true + }, + "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==", + "dev": true + }, + "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 + }, + "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==", + "dev": true, + "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": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "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" + } + }, + "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": { + "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==", + "dev": true, + "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==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "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==", + "dev": true + } + } + }, + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "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" + } + }, + "hasha": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", + "dev": true, + "requires": { + "is-stream": "^1.0.1", + "pinkie-promise": "^2.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": "sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.3" + } + }, + "highlight.js": { + "version": "9.18.5", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.5.tgz", + "integrity": "sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA==", + "dev": true + }, + "highlightjs-solidity": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-1.1.0.tgz", + "integrity": "sha512-LtH7uuoe+FOmtQd41ozAZKLJC2chqdqs461FJcWAx00R3VcBhSQTRFfzRGtTQqu2wsVIEdHiyynrPrEDDWyIMw==", + "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=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dev": true, + "optional": true, + "requires": { + "react-is": "^16.7.0" + } + }, + "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==", + "dev": true, + "optional": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + } + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "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==", + "dev": 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", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=", + "dev": true + }, + "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.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "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 + } + } + }, + "husky": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz", + "integrity": "sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^7.0.0", + "find-versions": "^4.0.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^5.0.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "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 + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "requires": { + "find-up": "^5.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "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" + } + } + } + }, + "ice-cap": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/ice-cap/-/ice-cap-0.0.4.tgz", + "integrity": "sha1-im0xq0ysjUtW3k+pRt8zUlYbbhg=", + "dev": true, + "requires": { + "cheerio": "0.20.0", + "color-logger": "0.0.3" + }, + "dependencies": { + "cheerio": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.20.0.tgz", + "integrity": "sha1-XHEPK6uVZTJyhCugHG6mGzVF7DU=", + "dev": true, + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "~3.8.1", + "jsdom": "^7.0.2", + "lodash": "^4.1.0" + } + }, + "color-logger": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/color-logger/-/color-logger-0.0.3.tgz", + "integrity": "sha1-2bIt0dlz4Waxi/MT+fSBu6TfIBg=", + "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 + }, + "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" + } + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "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" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + }, + "dependencies": { + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + } + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "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" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "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": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "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==", + "dev": true, + "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=", + "dev": true + } + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "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" + } + }, + "imagemin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-6.1.0.tgz", + "integrity": "sha512-8ryJBL1CN5uSHpiBMX0rJw79C9F9aJqMnjGnrd/1CafegpNuA81RBAAru/jQQEOWlOJJlpRnlcVFF6wq+Ist0A==", + "dev": true, + "requires": { + "file-type": "^10.7.0", + "globby": "^8.0.1", + "make-dir": "^1.0.0", + "p-pipe": "^1.1.0", + "pify": "^4.0.1", + "replace-ext": "^1.0.0" + } + }, + "immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "dev": true + }, + "immutable": { + "version": "4.0.0-rc.12", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0-rc.12.tgz", + "integrity": "sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "optional": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "optional": true + } + } + }, + "imul": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", + "integrity": "sha1-nVhnFh6LPelsLDjV3HyxAvNeKsk=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "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==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } + } + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "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": "1.10.4", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", + "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "dev": true, + "requires": { + "fp-ts": "^1.0.0" + } + }, + "ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "dev": true, + "optional": 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==", + "dev": true + }, + "ipfs-core-types": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ipfs-core-types/-/ipfs-core-types-0.2.1.tgz", + "integrity": "sha512-q93+93qSybku6woZaajE9mCrHeVoMzNtZ7S5m/zx0+xHRhnoLlg8QNnGGsb5/+uFQt/RiBArsIw/Q61K9Jwkzw==", + "dev": true, + "optional": true, + "requires": { + "cids": "^1.1.5", + "multiaddr": "^8.0.0", + "peer-id": "^0.14.1" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "ipfs-core-utils": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/ipfs-core-utils/-/ipfs-core-utils-0.6.1.tgz", + "integrity": "sha512-UFIklwE3CFcsNIhYFDuz0qB7E2QtdFauRfc76kskgiqhGWcjqqiDeND5zBCrAy0u8UMaDqAbFl02f/mIq1yKXw==", + "dev": true, + "optional": true, + "requires": { + "any-signal": "^2.0.0", + "blob-to-it": "^1.0.1", + "browser-readablestream-to-it": "^1.0.1", + "cids": "^1.1.5", + "err-code": "^2.0.3", + "ipfs-core-types": "^0.2.1", + "ipfs-utils": "^5.0.0", + "it-all": "^1.0.4", + "it-map": "^1.0.4", + "it-peekable": "^1.0.1", + "multiaddr": "^8.0.0", + "multiaddr-to-uri": "^6.0.0", + "parse-duration": "^0.4.4", + "timeout-abort-controller": "^1.1.1", + "uint8arrays": "^1.1.0" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + }, + "dependencies": { + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + }, + "dependencies": { + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + }, + "dependencies": { + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + } + } + }, + "ipfs-http-client": { + "version": "48.2.2", + "resolved": "https://registry.npmjs.org/ipfs-http-client/-/ipfs-http-client-48.2.2.tgz", + "integrity": "sha512-f3ppfWe913SJLvunm0UgqdA1dxVZSGQJPaEVJtqgjxPa5x0fPDiBDdo60g2MgkW1W6bhF9RGlxvHHIE9sv/tdg==", + "dev": true, + "optional": true, + "requires": { + "any-signal": "^2.0.0", + "bignumber.js": "^9.0.0", + "cids": "^1.1.5", + "debug": "^4.1.1", + "form-data": "^3.0.0", + "ipfs-core-types": "^0.2.1", + "ipfs-core-utils": "^0.6.1", + "ipfs-utils": "^5.0.0", + "ipld-block": "^0.11.0", + "ipld-dag-cbor": "^0.17.0", + "ipld-dag-pb": "^0.20.0", + "ipld-raw": "^6.0.0", + "it-last": "^1.0.4", + "it-map": "^1.0.4", + "it-tar": "^1.2.2", + "it-to-stream": "^0.1.2", + "merge-options": "^2.0.0", + "multiaddr": "^8.0.0", + "multibase": "^3.0.0", + "multicodec": "^2.0.1", + "multihashes": "^3.0.1", + "nanoid": "^3.1.12", + "native-abort-controller": "~0.0.3", + "parse-duration": "^0.4.4", + "stream-to-it": "^0.2.2", + "uint8arrays": "^1.1.0" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + }, + "dependencies": { + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "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 + }, + "multibase": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-3.1.2.tgz", + "integrity": "sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1", + "web-encoding": "^1.0.6" + } + }, + "multicodec": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-2.1.3.tgz", + "integrity": "sha512-0tOH2Gtio39uO41o+2xl9UhRkCWxU5ZmZSbFCh/OjGzkWJI8e6lkN/s4Mj1YfyWoBod+2+S3W+6wO6nhkwN8pA==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "1.1.0", + "varint": "^6.0.0" + }, + "dependencies": { + "varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "optional": true + } + } + }, + "multihashes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-3.1.2.tgz", + "integrity": "sha512-AP4IoV/YzkNrfbQKZE3OMPibrmy350OmCd6cJkwyM8oExaXIlOY4UnOOVSQtAEuq/LR01XfXKCESidzZvSwHCQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^3.1.0", + "uint8arrays": "^2.0.5", + "varint": "^6.0.0" + }, + "dependencies": { + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + }, + "dependencies": { + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + } + } + }, + "varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "optional": true + } + } + }, + "nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "dev": true, + "optional": true + } + } + }, + "ipfs-utils": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ipfs-utils/-/ipfs-utils-5.0.1.tgz", + "integrity": "sha512-28KZPgO4Uf5duT2ORLAYfboUp98iUshDD7yRAfbNxNAR8Dtidfn6o20rZfoXnkri2zKBVIPlJkuCPmPJB+6erg==", + "dev": true, + "optional": true, + "requires": { + "abort-controller": "^3.0.0", + "any-signal": "^2.1.0", + "buffer": "^6.0.1", + "electron-fetch": "^1.7.2", + "err-code": "^2.0.0", + "fs-extra": "^9.0.1", + "is-electron": "^2.2.0", + "iso-url": "^1.0.0", + "it-glob": "0.0.10", + "it-to-stream": "^0.1.2", + "merge-options": "^2.0.0", + "nanoid": "^3.1.3", + "native-abort-controller": "0.0.3", + "native-fetch": "^2.0.0", + "node-fetch": "^2.6.0", + "stream-to-it": "^0.2.0" + }, + "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" + } + }, + "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" + } + }, + "iso-url": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-1.1.5.tgz", + "integrity": "sha512-+3JqoKdBTGmyv9vOkS6b9iHhvK34UajfTibrH/1HOK8TI7K2VsM0qOCd+aJdWKtSOA8g3PqZfcwDmnR0p3klqQ==", + "dev": true, + "optional": true + }, + "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" + } + }, + "nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "dev": true, + "optional": true + }, + "native-fetch": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-2.0.1.tgz", + "integrity": "sha512-gv4Bea+ga9QdXINurpkEqun3ap3vnB+WYoe4c8ddqUYEH7B2h6iD39RF8uVN7OwmSfMY3RDxkvBnoI4e2/vLXQ==", + "dev": true, + "optional": true, + "requires": { + "globalthis": "^1.0.1" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "optional": true + } + } + }, + "ipld-block": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/ipld-block/-/ipld-block-0.11.1.tgz", + "integrity": "sha512-sDqqLqD5qh4QzGq6ssxLHUCnH4emCf/8F8IwjQM2cjEEIEHMUj57XhNYgmGbemdYPznUhffxFGEHsruh5+HQRw==", + "dev": true, + "optional": true, + "requires": { + "cids": "^1.0.0" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "ipld-dag-cbor": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/ipld-dag-cbor/-/ipld-dag-cbor-0.17.1.tgz", + "integrity": "sha512-Bakj/cnxQBdscORyf4LRHxQJQfoaY8KWc7PWROQgX+aw5FCzBt8ga0VM/59K+ABOznsqNvyLR/wz/oYImOpXJw==", + "dev": true, + "optional": true, + "requires": { + "borc": "^2.1.2", + "cids": "^1.0.0", + "is-circular": "^1.0.2", + "multicodec": "^3.0.1", + "multihashing-async": "^2.0.0", + "uint8arrays": "^2.1.3" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "ipld-dag-pb": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/ipld-dag-pb/-/ipld-dag-pb-0.20.0.tgz", + "integrity": "sha512-zfM0EdaolqNjAxIrtpuGKvXxWk5YtH9jKinBuQGTcngOsWFQhyybGCTJHGNGGtRjHNJi2hz5Udy/8pzv4kcKyg==", + "dev": true, + "optional": true, + "requires": { + "cids": "^1.0.0", + "class-is": "^1.1.0", + "multicodec": "^2.0.0", + "multihashing-async": "^2.0.0", + "protons": "^2.0.0", + "reset": "^0.1.0", + "run": "^1.4.0", + "stable": "^0.1.8", + "uint8arrays": "^1.0.0" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + }, + "dependencies": { + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-2.1.3.tgz", + "integrity": "sha512-0tOH2Gtio39uO41o+2xl9UhRkCWxU5ZmZSbFCh/OjGzkWJI8e6lkN/s4Mj1YfyWoBod+2+S3W+6wO6nhkwN8pA==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "1.1.0", + "varint": "^6.0.0" + }, + "dependencies": { + "varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "optional": true + } + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + }, + "dependencies": { + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + } + } + }, + "ipld-raw": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ipld-raw/-/ipld-raw-6.0.0.tgz", + "integrity": "sha512-UK7fjncAzs59iu/o2kwYtb8jgTtW6B+cNWIiNpAJkfRwqoMk1xD/6i25ktzwe4qO8gQgoR9RxA5ibC23nq8BLg==", + "dev": true, + "optional": true, + "requires": { + "cids": "^1.0.0", + "multicodec": "^2.0.0", + "multihashing-async": "^2.0.0" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + }, + "dependencies": { + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + } + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-2.1.3.tgz", + "integrity": "sha512-0tOH2Gtio39uO41o+2xl9UhRkCWxU5ZmZSbFCh/OjGzkWJI8e6lkN/s4Mj1YfyWoBod+2+S3W+6wO6nhkwN8pA==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "1.1.0", + "varint": "^6.0.0" + }, + "dependencies": { + "multibase": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-3.1.2.tgz", + "integrity": "sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1", + "web-encoding": "^1.0.6" + } + }, + "uint8arrays": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-1.1.0.tgz", + "integrity": "sha512-cLdlZ6jnFczsKf5IH1gPHTtcHtPGho5r4CvctohmQjw8K7Q3gFdfIGHxSTdTaCKrL4w09SsPRJTqRS0drYeszA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^3.0.0", + "web-encoding": "^1.0.2" + } + }, + "varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "optional": true + } + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "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-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-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "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.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "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-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 + }, + "is-capitalized": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-capitalized/-/is-capitalized-1.0.0.tgz", + "integrity": "sha1-TIRktNkdPk7rRIid0s2PGwrEwTY=", + "dev": true, + "optional": true + }, + "is-circular": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-circular/-/is-circular-1.0.2.tgz", + "integrity": "sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA==", + "dev": true, + "optional": true + }, + "is-class": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.4.tgz", + "integrity": "sha1-4FdFFwW7NOOePjNZjJOpg3KWtzY=", + "dev": true, + "optional": true + }, + "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-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "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-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "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, + "optional": true + }, + "is-electron": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.0.tgz", + "integrity": "sha512-SpMppC2XR3YdxSzczXReBjqs2zGscWQpBIKqwXYBFic0ERaxNVgwLCHwOLZeESfdJQjX0RDvrJ1lBXX2ij+G1Q==", + "dev": true, + "optional": 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, + "optional": 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-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==", + "dev": true + }, + "is-generator-function": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.9.tgz", + "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==", + "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=", + "dev": true + }, + "is-ip": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", + "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", + "dev": true, + "optional": true, + "requires": { + "ip-regex": "^4.0.0" + } + }, + "is-lower-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=", + "dev": true, + "requires": { + "lower-case": "^1.1.0" + } + }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true + }, + "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": "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" + } + } + } + }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true, + "optional": true + }, + "is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "dev": true + }, + "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=", + "dev": true + }, + "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" + } + }, + "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, + "optional": 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, + "optional": true + }, + "is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "optional": true + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "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==", + "dev": true + }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "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" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "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": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=", + "dev": true, + "requires": { + "upper-case": "^1.1.0" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true, + "optional": true + }, + "is-valid-glob": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", + "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", + "dev": true, + "optional": true + }, + "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 + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "iso-constants": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/iso-constants/-/iso-constants-0.1.2.tgz", + "integrity": "sha512-OTCM5ZCQsHBCI4Wdu4tSxvDIkmDHd5EwJDps5mKqnQnWJSKlnwMs3EDZ4n3Fh1tmkWkDlyd2vCDbEYuPbyrUNQ==", + "dev": true, + "optional": true + }, + "iso-random-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/iso-random-stream/-/iso-random-stream-2.0.0.tgz", + "integrity": "sha512-lGuIu104KfBV9ubYTSaE3GeAr6I69iggXxBHbTBc5u/XKlwlWl0LCytnkIZissaKqvxablwRD9B3ktVnmIUnEg==", + "dev": true, + "optional": true, + "requires": { + "events": "^3.3.0", + "readable-stream": "^3.4.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==", + "dev": true, + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "iso-url": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz", + "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "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=", + "dev": true + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, + "it-all": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/it-all/-/it-all-1.0.5.tgz", + "integrity": "sha512-ygD4kA4vp8fi+Y+NBgEKt6W06xSbv6Ub/0V8d1r3uCyJ9Izwa1UspkIOlqY9fOee0Z1w3WRo1+VWyAU4DgtufA==", + "dev": true, + "optional": true + }, + "it-concat": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/it-concat/-/it-concat-1.0.3.tgz", + "integrity": "sha512-sjeZQ1BWQ9U/W2oI09kZgUyvSWzQahTkOkLIsnEPgyqZFaF9ME5gV6An4nMjlyhXKWQMKEakQU8oRHs2SdmeyA==", + "dev": true, + "optional": true, + "requires": { + "bl": "^4.0.0" + } + }, + "it-drain": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/it-drain/-/it-drain-1.0.4.tgz", + "integrity": "sha512-coB7mcyZ4lWBQKoQGJuqM+P94pvpn2T3KY27vcVWPqeB1WmoysRC76VZnzAqrBWzpWcoEJMjZ+fsMBslxNaWfQ==", + "dev": true, + "optional": true + }, + "it-glob": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/it-glob/-/it-glob-0.0.10.tgz", + "integrity": "sha512-p1PR15djgPV7pxdLOW9j4WcJdla8+91rJdUU2hU2Jm68vkxpIEXK55VHBeH8Lvqh2vqLtM83t8q4BuJxue6niA==", + "dev": true, + "optional": true, + "requires": { + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "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" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "optional": true + } + } + }, + "it-last": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/it-last/-/it-last-1.0.5.tgz", + "integrity": "sha512-PV/2S4zg5g6dkVuKfgrQfN2rUN4wdTI1FzyAvU+i8RV96syut40pa2s9Dut5X7SkjwA3P0tOhLABLdnOJ0Y/4Q==", + "dev": true, + "optional": true + }, + "it-map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/it-map/-/it-map-1.0.5.tgz", + "integrity": "sha512-EElupuWhHVStUgUY+OfTJIS2MZed96lDrAXzJUuqiiqLnIKoBRqtX1ZG2oR0bGDsSppmz83MtzCeKLZ9TVAUxQ==", + "dev": true, + "optional": true + }, + "it-peekable": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-1.0.2.tgz", + "integrity": "sha512-LRPLu94RLm+lxLZbChuc9iCXrKCOu1obWqxfaKhF00yIp30VGkl741b5P60U+rdBxuZD/Gt1bnmakernv7bVFg==", + "dev": true, + "optional": true + }, + "it-reader": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/it-reader/-/it-reader-2.1.0.tgz", + "integrity": "sha512-hSysqWTO9Tlwc5EGjVf8JYZzw0D2FsxD/g+eNNWrez9zODxWt6QlN6JAMmycK72Mv4jHEKEXoyzUN4FYGmJaZw==", + "dev": true, + "optional": true, + "requires": { + "bl": "^4.0.0" + } + }, + "it-tar": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/it-tar/-/it-tar-1.2.2.tgz", + "integrity": "sha512-M8V4a9I+x/vwXTjqvixcEZbQZHjwDIb8iUQ+D4M2QbhAdNs3WKVSl+45u5/F2XFx6jYMFOGzMVlKNK/uONgNIA==", + "dev": true, + "optional": true, + "requires": { + "bl": "^4.0.0", + "buffer": "^5.4.3", + "iso-constants": "^0.1.2", + "it-concat": "^1.0.0", + "it-reader": "^2.0.0", + "p-defer": "^3.0.0" + } + }, + "it-to-stream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/it-to-stream/-/it-to-stream-0.1.2.tgz", + "integrity": "sha512-DTB5TJRZG3untmZehcaFN0kGWl2bNv7tnJRgQHAO9QEt8jfvVRrebZtnD5NZd4SCj4WVPjl0LSrugNWE/UaZRQ==", + "dev": true, + "optional": true, + "requires": { + "buffer": "^5.6.0", + "fast-fifo": "^1.0.0", + "get-iterator": "^1.0.2", + "p-defer": "^3.0.0", + "p-fifo": "^1.0.0", + "readable-stream": "^3.6.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==", + "dev": true, + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "iter-tools": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/iter-tools/-/iter-tools-7.1.3.tgz", + "integrity": "sha512-Pnd3FVHgKnDHrTVjggXLMq5O/P60fho5iL0a0kkdLcofxX8STHw6cgYZ4ZHQS3Zb4Hg/VeqeNUxDs4vlVwUL4A==", + "dev": true, + "optional": true, + "requires": { + "@babel/runtime": "^7.12.1" + } + }, + "iterall": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", + "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==", + "dev": true, + "optional": true + }, + "iterate-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", + "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==", + "dev": true + }, + "iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "dev": true, + "requires": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + } + }, + "js-graph-algorithms": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/js-graph-algorithms/-/js-graph-algorithms-1.0.18.tgz", + "integrity": "sha1-+W7Ie/GU9cCjE2X6Dh0Ht7li2JE=", + "dev": true + }, + "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 + }, + "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 + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsan": { + "version": "3.1.13", + "resolved": "https://registry.npmjs.org/jsan/-/jsan-3.1.13.tgz", + "integrity": "sha512-9kGpCsGHifmw6oJet+y8HaCl14y7qgAsxVdV3pCHDySNR3BfDC30zgkssd7x5LRVAT22dnpbe9JdzzmXZnq9/g==", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-7.2.2.tgz", + "integrity": "sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4=", + "dev": true, + "optional": true, + "requires": { + "abab": "^1.0.0", + "acorn": "^2.4.0", + "acorn-globals": "^1.0.4", + "cssom": ">= 0.3.0 < 0.4.0", + "cssstyle": ">= 0.2.29 < 0.3.0", + "escodegen": "^1.6.1", + "nwmatcher": ">= 1.3.7 < 2.0.0", + "parse5": "^1.5.1", + "request": "^2.55.0", + "sax": "^1.1.4", + "symbol-tree": ">= 3.1.0 < 4.0.0", + "tough-cookie": "^2.2.0", + "webidl-conversions": "^2.0.0", + "whatwg-url-compat": "~0.6.5", + "xml-name-validator": ">= 2.0.1 < 3.0.0" + }, + "dependencies": { + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", + "dev": true, + "optional": true + }, + "parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", + "dev": true, + "optional": true + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "optional": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-pointer": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.1.tgz", + "integrity": "sha512-3OvjqKdCBvH41DLpV4iSt6v2XhZXV1bPB4OROuknvUXI7ZQNofieCPkmE26stEJ9zdQuvIxDHCuYhfgxFAAs+Q==", + "dev": true, + "requires": { + "foreach": "^2.0.4" + } + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "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==", + "dev": true + }, + "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=", + "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=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "delimit-stream": "0.1.0" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsondown": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jsondown/-/jsondown-1.0.0.tgz", + "integrity": "sha512-p6XxPaq59aXwcdDQV3ISMA5xk+1z6fJuctcwwSdR9iQgbYOcIrnknNrhcMGG+0FaUfKHGkdDpQNaZrovfBoyOw==", + "dev": true, + "optional": true, + "requires": { + "memdown": "1.4.1", + "mkdirp": "0.5.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, + "optional": true, + "requires": { + "xtend": "~4.0.0" + } + }, + "memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", + "dev": true, + "optional": 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" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true, + "optional": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + } + } + }, + "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" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonschema": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.0.tgz", + "integrity": "sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw==", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "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", + "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" + } + }, + "kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", + "dev": true + }, + "keypair": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/keypair/-/keypair-1.0.3.tgz", + "integrity": "sha512-0wjZ2z/SfZZq01+3/8jYLd8aEShSa+aat1zyPGQY3IuKoEAp6DJGvu2zt6snELrQU9jbCkIlCyNOD7RdQbHhkQ==", + "dev": true, + "optional": true + }, + "keypather": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/keypather/-/keypather-1.10.2.tgz", + "integrity": "sha1-4ESWMtSz5RbyHMAUznxWRP3c5hQ=", + "dev": true, + "requires": { + "101": "^1.0.0" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "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 + }, + "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" + } + }, + "lazy-debug-legacy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz", + "integrity": "sha1-U3cWwHduTPeePtG2IfdljCkRsbE=", + "dev": true, + "optional": true + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, + "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" + } + }, + "lcov-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", + "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", + "dev": true + }, + "leb128": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/leb128/-/leb128-0.0.5.tgz", + "integrity": "sha512-elbNtfmu3GndZbesVF6+iQAfVjOXW9bM/aax9WwMlABZW+oK9sbAZEXoewaPHmL34sxa8kVwWsru8cNE/yn2gg==", + "dev": true, + "optional": true, + "requires": { + "bn.js": "^5.0.0", + "buffer-pipe": "0.0.3" + } + }, + "level": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/level/-/level-5.0.1.tgz", + "integrity": "sha512-wcak5OQeA4rURGacqS62R/xNHjCYnJSQDBOlm4KNUGJVE9bWv2B04TclqReYejN+oD65PzD4FsqeWoI5wNC5Lg==", + "dev": true, + "optional": true, + "requires": { + "level-js": "^4.0.0", + "level-packager": "^5.0.0", + "leveldown": "^5.0.0", + "opencollective-postinstall": "^2.0.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, + "requires": { + "buffer": "^5.6.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 + }, + "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, + "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, + "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, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "level-js": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/level-js/-/level-js-4.0.2.tgz", + "integrity": "sha512-PeGjZsyMG4O89KHiez1zoMJxStnkM+oBIqgACjoo5PJqFiSUUm3GNod/KcbqN5ktyZa8jkG7I1T0P2u6HN9lIg==", + "dev": true, + "optional": true, + "requires": { + "abstract-leveldown": "~6.0.1", + "immediate": "~3.2.3", + "inherits": "^2.0.3", + "ltgt": "^2.1.2", + "typedarray-to-buffer": "~3.1.5" + }, + "dependencies": { + "abstract-leveldown": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.0.3.tgz", + "integrity": "sha512-jzewKKpZbaYUa6HTThnrl+GrJhzjEAeuc7hTVpZdzg7kupXZFoqQDFwyOwLNbmJKJlmzw8yiipMPkDiuKkT06Q==", + "dev": true, + "optional": true, + "requires": { + "level-concat-iterator": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "immediate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", + "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=", + "dev": true, + "optional": true + } + } + }, + "level-mem": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz", + "integrity": "sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==", + "dev": true, + "requires": { + "level-packager": "^5.0.3", + "memdown": "^5.0.0" + } + }, + "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, + "requires": { + "encoding-down": "^6.3.0", + "levelup": "^4.3.2" + } + }, + "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, + "requires": { + "xtend": "^4.0.2" + } + }, + "level-write-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/level-write-stream/-/level-write-stream-1.0.0.tgz", + "integrity": "sha1-P3+7Z5pVE3wP6zA97nZuEu4Twdw=", + "dev": true, + "optional": true, + "requires": { + "end-stream": "~0.1.0" + } + }, + "level-ws": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz", + "integrity": "sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^3.1.0", + "xtend": "^4.0.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" + } + } + } + }, + "leveldown": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-5.0.2.tgz", + "integrity": "sha512-Ib6ygFYBleS8x2gh3C1AkVsdrUShqXpe6jSTnZ6sRycEXKhqVf+xOSkhgSnjidpPzyv0d95LJVFrYQ4NuXAqHA==", + "dev": true, + "optional": true, + "requires": { + "abstract-leveldown": "~6.0.0", + "fast-future": "~1.0.2", + "napi-macros": "~1.8.1", + "node-gyp-build": "~3.8.0" + }, + "dependencies": { + "abstract-leveldown": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.0.3.tgz", + "integrity": "sha512-jzewKKpZbaYUa6HTThnrl+GrJhzjEAeuc7hTVpZdzg7kupXZFoqQDFwyOwLNbmJKJlmzw8yiipMPkDiuKkT06Q==", + "dev": true, + "optional": true, + "requires": { + "level-concat-iterator": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node-gyp-build": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.8.0.tgz", + "integrity": "sha512-bYbpIHyRqZ7sVWXxGpz8QIRug5JZc/hzZH4GbdT9HTZi6WmKCZ8GLvP8OZ9TTiIBvwPFKgtGrlWQSXDAvYdsPw==", + "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, + "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" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "libp2p-crypto": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/libp2p-crypto/-/libp2p-crypto-0.19.4.tgz", + "integrity": "sha512-8iUwiNlU/sFEtXQpxaehmXUQ5Fw6r52H7NH0d8ZSb8nKBbO6r8y8ft6f1to8A81SrFOVd4/zsjEzokpedDvRgw==", + "dev": true, + "optional": true, + "requires": { + "err-code": "^3.0.1", + "is-typedarray": "^1.0.0", + "iso-random-stream": "^2.0.0", + "keypair": "^1.0.1", + "multibase": "^4.0.3", + "multicodec": "^3.0.1", + "multihashes": "^4.0.2", + "multihashing-async": "^2.1.2", + "node-forge": "^0.10.0", + "pem-jwk": "^2.0.0", + "protobufjs": "^6.10.2", + "secp256k1": "^4.0.0", + "uint8arrays": "^2.1.4", + "ursa-optional": "^0.10.1" + }, + "dependencies": { + "err-code": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", + "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==", + "dev": true, + "optional": true + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "linked-list": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/linked-list/-/linked-list-0.1.0.tgz", + "integrity": "sha1-eYsP+X0bkqT9CEgPVa6k6dSdN78=", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "optional": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "optional": true + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "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" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "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._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true, + "optional": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true, + "optional": true + }, + "lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", + "dev": true, + "optional": true + }, + "lodash.assigninwith": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assigninwith/-/lodash.assigninwith-4.2.0.tgz", + "integrity": "sha1-rwLJhDKshtk9ppW0voAUAZcXNq8=", + "dev": true, + "optional": 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.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.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true, + "optional": true + }, + "lodash.keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.2.0.tgz", + "integrity": "sha1-oIYCrBLk+4P5H8H7ejYKTZujUgU=", + "dev": true, + "optional": 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.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=", + "dev": true, + "optional": 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.rest": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/lodash.rest/-/lodash.rest-4.0.5.tgz", + "integrity": "sha1-lU73UEkmIDjJbR/Jiyj9r58Hcqo=", + "dev": true, + "optional": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "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 + }, + "lodash.template": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.2.4.tgz", + "integrity": "sha1-0FPBno50442WW/T7SV2A8Qnn96Q=", + "dev": true, + "optional": true, + "requires": { + "lodash._reinterpolate": "~3.0.0", + "lodash.assigninwith": "^4.0.0", + "lodash.keys": "^4.0.0", + "lodash.rest": "^4.0.0", + "lodash.templatesettings": "^4.0.0", + "lodash.tostring": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "optional": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, + "lodash.tostring": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/lodash.tostring/-/lodash.tostring-4.1.4.tgz", + "integrity": "sha1-Vgwn0fjq3eA8LM4Zj+9cAx2CmPs=", + "dev": true, + "optional": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "lodash.without": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.without/-/lodash.without-4.4.0.tgz", + "integrity": "sha1-PNRXSgC2e643OpS3SHcmQFB7eqw=", + "dev": true, + "optional": true + }, + "lodash.xor": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.xor/-/lodash.xor-4.5.0.tgz", + "integrity": "sha1-TUjtfpgJWwYyWCunFNP/iuj7HbY=", + "dev": true, + "optional": true + }, + "lodash.zipwith": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zipwith/-/lodash.zipwith-4.2.0.tgz", + "integrity": "sha1-r6zwP9LzhK8p4mPDxr2juA4/Uf0=", + "dev": true + }, + "log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "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.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "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": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "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": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=", + "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==", + "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" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=", + "dev": true + }, + "ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "dev": true + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "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=", + "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-stream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.6.tgz", + "integrity": "sha1-0u9OuBGihkTHqJiZhcacL91JaCc=", + "dev": true, + "optional": 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 + }, + "marked": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", + "dev": true + }, + "match-all": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/match-all/-/match-all-1.2.6.tgz", + "integrity": "sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==", + "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, + "optional": true + }, + "mcl-wasm": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.7.tgz", + "integrity": "sha512-jDGiCQA++5hX37gdH6RDZ3ZsA0raet7xyY/R5itj5cbcdf4Gvw+YyxWX/ZZ0Z2UPxJiw1ktRsCJZzpnqlQILdw==", + "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==", + "dev": true, + "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=", + "dev": true + }, + "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" + } + }, + "memdown": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", + "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", + "dev": true, + "requires": { + "abstract-leveldown": "~6.2.1", + "functional-red-black-tree": "~1.0.1", + "immediate": "~3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.2.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, + "requires": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + } + }, + "immediate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", + "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=", + "dev": true + }, + "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==", + "dev": true + } + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "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=", + "dev": true + }, + "merge-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-2.0.0.tgz", + "integrity": "sha512-S7xYIeWHl2ZUKF7SDeBhGg6rfv5bKxVBdk95s/I7wVF8d+hjLSztJ/B271cnUiF6CAFduEQ5Zn3HYwAjT16DlQ==", + "dev": true, + "optional": true, + "requires": { + "is-plain-obj": "^2.0.0" + }, + "dependencies": { + "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, + "optional": true + } + } + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "merkle-patricia-tree": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.0.tgz", + "integrity": "sha512-0sBVXs7z1Q1/kxzWZ3nPnxSPiaHKF/f497UQzt9O7isRcS10tel9jM/4TivF6Jv7V1yFq4bWyoATxbDUOen5vQ==", + "dev": true, + "requires": { + "@types/levelup": "^4.3.0", + "ethereumjs-util": "^7.0.10", + "level-mem": "^5.0.1", + "level-ws": "^2.0.0", + "readable-stream": "^3.6.0", + "rlp": "^2.2.4", + "semaphore-async-await": "^1.5.1" + }, + "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": "*" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "meros": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/meros/-/meros-1.1.4.tgz", + "integrity": "sha512-E9ZXfK9iQfG9s73ars9qvvvbSIkJZF5yOo9j4tcwM5tN8mUKfj/EKN5PzOr3ZH0y5wL7dLAHw3RVEfpQV9Q7VQ==", + "dev": true, + "optional": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "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" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^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 + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dev": true, + "requires": { + "mime-db": "1.48.0" + } + }, + "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 + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "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==", + "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 + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "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==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.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": "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" + } + }, + "mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "dev": true, + "requires": { + "mkdirp": "*" + } + }, + "mnemonist": { + "version": "0.38.3", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.3.tgz", + "integrity": "sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==", + "dev": true, + "requires": { + "obliterator": "^1.6.1" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "mock-fs": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", + "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==", + "dev": true + }, + "module": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/module/-/module-1.2.5.tgz", + "integrity": "sha1-tQPrBs3BNHP1aBhCaXTN5+xZvxU=", + "dev": true, + "optional": true, + "requires": { + "chalk": "1.1.3", + "concat-stream": "1.5.1", + "lodash.template": "4.2.4", + "map-stream": "0.0.6", + "tildify": "1.2.0", + "vinyl-fs": "2.4.3", + "yargs": "4.6.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, + "optional": 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, + "optional": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "optional": 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" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "concat-stream": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.1.tgz", + "integrity": "sha1-87gKz54fSOOHXAaItBtsMWAu6hw=", + "dev": true, + "optional": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~2.0.0", + "typedarray": "~0.0.5" + } + }, + "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, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "optional": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "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, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + }, + "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, + "optional": 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, + "optional": true + }, + "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, + "optional": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true, + "optional": true + }, + "yargs": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.6.0.tgz", + "integrity": "sha1-y0BQwBWb+2u2ScD0r1UFJqhGGdw=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "pkg-conf": "^1.1.2", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1", + "string-width": "^1.0.1", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.0" + } + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true, + "optional": true + } + } + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multiaddr": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/multiaddr/-/multiaddr-8.1.2.tgz", + "integrity": "sha512-r13IzW8+Sv9zab9Gt8RPMIN2WkptIPq99EpAzg4IbJ/zTELhiEwXWr9bAmEatSCI4j/LSA6ESJzvz95JZ+ZYXQ==", + "dev": true, + "optional": true, + "requires": { + "cids": "^1.0.0", + "class-is": "^1.1.0", + "dns-over-http-resolver": "^1.0.0", + "err-code": "^2.0.3", + "is-ip": "^3.1.0", + "multibase": "^3.0.0", + "uint8arrays": "^1.1.0", + "varint": "^5.0.0" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + }, + "dependencies": { + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "multibase": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-3.1.2.tgz", + "integrity": "sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1", + "web-encoding": "^1.0.6" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + }, + "dependencies": { + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + }, + "dependencies": { + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + } + } + }, + "multiaddr-to-uri": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/multiaddr-to-uri/-/multiaddr-to-uri-6.0.0.tgz", + "integrity": "sha512-OjpkVHOXEmIKMO8WChzzQ7aZQcSQX8squxmvtDbRpy7/QNmJ3Z7jv6qyD74C28QtaeNie8O8ngW2AkeiMmKP7A==", + "dev": true, + "optional": true, + "requires": { + "multiaddr": "^8.0.0" + } + }, + "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" + } + } + } + }, + "multihashing-async": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/multihashing-async/-/multihashing-async-2.1.2.tgz", + "integrity": "sha512-FTPNnWWxwIK5dXXmTFhySSF8Fkdqf7vzqpV09+RWsmfUhrsL/b3Arg3+bRrBnXTtjxm3JRGI3wSAtQHL0QCxhQ==", + "dev": true, + "optional": true, + "requires": { + "blakejs": "^1.1.0", + "err-code": "^3.0.0", + "js-sha3": "^0.8.0", + "multihashes": "^4.0.1", + "murmurhash3js-revisited": "^3.0.0", + "uint8arrays": "^2.1.3" + }, + "dependencies": { + "err-code": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", + "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==", + "dev": true, + "optional": true + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "murmur-128": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/murmur-128/-/murmur-128-0.2.1.tgz", + "integrity": "sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==", + "dev": true, + "requires": { + "encode-utf8": "^1.0.2", + "fmix": "^0.1.0", + "imul": "^1.0.0" + } + }, + "murmurhash3js-revisited": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz", + "integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==", + "dev": true, + "optional": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true + }, + "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=", + "dev": true + }, + "nanoid": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", + "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==", + "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" + } + }, + "napi-macros": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-1.8.2.tgz", + "integrity": "sha512-Tr0DNY4RzTaBG2W2m3l7ZtFuJChTH6VZhXVhkGGjF/4cZTt+i8GcM9ozD+30Lmr4mDoZ5Xx34t2o4GJqYWDGcg==", + "dev": true, + "optional": true + }, + "native-abort-controller": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/native-abort-controller/-/native-abort-controller-0.0.3.tgz", + "integrity": "sha512-YIxU5nWqSHG1Xbu3eOu3pdFRD882ivQpIcu6AiPVe2oSVoRbfYW63DVkZm3g1gHiMtZSvZzF6THSzTGEBYl8YA==", + "dev": true, + "optional": true, + "requires": { + "globalthis": "^1.0.1" + } + }, + "native-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-3.0.0.tgz", + "integrity": "sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==", + "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.6.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", + "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", + "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==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "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=", + "dev": true + }, + "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-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-emoji": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", + "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", + "dev": true, + "requires": { + "lodash.toarray": "^4.4.0" + } + }, + "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" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "dev": true + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true, + "optional": true + }, + "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-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true, + "optional": 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-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + } + } + }, + "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": { + "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" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true + } + } + }, + "node-releases": { + "version": "1.1.72", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", + "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", + "dev": true, + "optional": 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==", + "dev": true + }, + "noop-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/noop-fn/-/noop-fn-1.0.0.tgz", + "integrity": "sha1-XzPUfxPSFQ35PgywNmmemC94/78=", + "dev": true, + "optional": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "optional": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": 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 + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true + }, + "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" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + } + } + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "dev": true, + "optional": true + }, + "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=", + "dev": true, + "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=", + "dev": true + } + } + }, + "nwmatcher": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", + "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", + "dev": true, + "optional": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "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" + } + }, + "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" + } + } + } + }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "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-path": { + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.5.tgz", + "integrity": "sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg==", + "dev": true, + "optional": 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" + } + }, + "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" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "optional": 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" + } + }, + "obliterator": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-1.6.1.tgz", + "integrity": "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==", + "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" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "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=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true + }, + "optimism": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.16.1.tgz", + "integrity": "sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg==", + "dev": true, + "optional": true, + "requires": { + "@wry/context": "^0.6.0", + "@wry/trie": "^0.3.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "optional": true + }, + "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, + "optional": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "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, + "optional": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true, + "optional": true, + "requires": { + "is-stream": "^1.0.1", + "readable-stream": "^2.0.1" + } + }, + "original-require": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/original-require/-/original-require-1.0.1.tgz", + "integrity": "sha1-DxMEcVhM0zURxew4yNWSE/msXiA=", + "dev": true + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "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, + "optional": 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==", + "dev": true + }, + "p-defer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", + "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", + "dev": true, + "optional": true + }, + "p-fifo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-fifo/-/p-fifo-1.0.0.tgz", + "integrity": "sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==", + "dev": true, + "optional": true, + "requires": { + "fast-fifo": "^1.0.0", + "p-defer": "^3.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "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-pipe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", + "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=", + "dev": true + }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "dev": true, + "requires": { + "p-finally": "^1.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 + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "paramap-it": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/paramap-it/-/paramap-it-0.1.1.tgz", + "integrity": "sha512-3uZmCAN3xCw7Am/4ikGzjjR59aNMJVXGSU7CjG2Z6DfOAdhnLdCOd0S0m1sTkN4ov9QhlE3/jkzyu953hq0uwQ==", + "dev": true, + "optional": true, + "requires": { + "event-iterator": "^1.0.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.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": 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-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-duration": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-0.4.4.tgz", + "integrity": "sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg==", + "dev": true, + "optional": 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, + "optional": 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, + "optional": 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, + "optional": 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==", + "dev": true + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascal-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", + "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=", + "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-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", + "integrity": "sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "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 + }, + "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=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "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=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "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=", + "dev": true + } + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "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" + } + }, + "peer-id": { + "version": "0.14.8", + "resolved": "https://registry.npmjs.org/peer-id/-/peer-id-0.14.8.tgz", + "integrity": "sha512-GpuLpob/9FrEFvyZrKKsISEkaBYsON2u0WtiawLHj1ii6ewkoeRiSDFLyIefYhw0jGvQoeoZS05jaT52X7Bvig==", + "dev": true, + "optional": true, + "requires": { + "cids": "^1.1.5", + "class-is": "^1.1.0", + "libp2p-crypto": "^0.19.0", + "minimist": "^1.2.5", + "multihashes": "^4.0.2", + "protobufjs": "^6.10.2", + "uint8arrays": "^2.0.5" + }, + "dependencies": { + "cids": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", + "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "multicodec": "^3.0.1", + "multihashes": "^4.0.1", + "uint8arrays": "^2.1.3" + } + }, + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "multicodec": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", + "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "dev": true, + "optional": true, + "requires": { + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "multihashes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.2.tgz", + "integrity": "sha512-xpx++1iZr4ZQHjN1mcrXS6904R36LWLxX/CBifczjtmrtCXEX623DMWOF1eiNSg+pFpiZDFVBgou/4v6ayCHSQ==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.2" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.1" + } + } + } + }, + "pegjs": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", + "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=", + "dev": true + }, + "pem-jwk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pem-jwk/-/pem-jwk-2.0.0.tgz", + "integrity": "sha512-rFxu7rVoHgQ5H9YsP50dDWf0rHjreVA2z0yPiWr5WdH/UHb29hKtF7h6l8vNd1cbYR1t0QL+JKhW55a2ZV4KtA==", + "dev": true, + "optional": true, + "requires": { + "asn1.js": "^5.0.1" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "phantomjs-prebuilt": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", + "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3", + "extract-zip": "^1.6.5", + "fs-extra": "^1.0.0", + "hasha": "^2.2.0", + "kew": "^0.7.0", + "progress": "^1.1.8", + "request": "^2.81.0", + "request-progress": "^2.0.1", + "which": "^1.2.10" + } + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-1.1.3.tgz", + "integrity": "sha1-N45W1v0T6Iv7b0ol33qD+qvduls=", + "dev": true, + "optional": true, + "requires": { + "find-up": "^1.0.0", + "load-json-file": "^1.1.0", + "object-assign": "^4.0.1", + "symbol": "^0.2.1" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "optional": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "optional": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": 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, + "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, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.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" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "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 + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", + "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^3.3.1" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", + "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", + "dev": true, + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^7.0.6" + } + }, + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "pouchdb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/pouchdb/-/pouchdb-7.1.1.tgz", + "integrity": "sha512-8bXWclixNJZqokvxGHRsG19zehSJiaZaz4dVYlhXhhUctz7gMcNTElHjPBzBdZlKKvt9aFDndmXN1VVE53Co8g==", + "dev": true, + "optional": true, + "requires": { + "argsarray": "0.0.1", + "buffer-from": "1.1.0", + "clone-buffer": "1.0.0", + "double-ended-queue": "2.1.0-0", + "fetch-cookie": "0.7.0", + "immediate": "3.0.6", + "inherits": "2.0.3", + "level": "5.0.1", + "level-codec": "9.0.1", + "level-write-stream": "1.0.0", + "leveldown": "5.0.2", + "levelup": "4.0.2", + "ltgt": "2.2.1", + "node-fetch": "2.4.1", + "readable-stream": "1.0.33", + "spark-md5": "3.0.0", + "through2": "3.0.1", + "uuid": "3.2.1", + "vuvuzela": "1.0.3" + }, + "dependencies": { + "abstract-leveldown": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.0.3.tgz", + "integrity": "sha512-jzewKKpZbaYUa6HTThnrl+GrJhzjEAeuc7hTVpZdzg7kupXZFoqQDFwyOwLNbmJKJlmzw8yiipMPkDiuKkT06Q==", + "dev": true, + "optional": true, + "requires": { + "level-concat-iterator": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "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 + }, + "deferred-leveldown": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.0.1.tgz", + "integrity": "sha512-BXohsvTedWOLkj2n/TY+yqVlrCWa2Zs8LSxh3uCAgFOru7/pjxKyZAexGa1j83BaKloER4PqUyQ9rGPJLt9bqA==", + "dev": true, + "optional": true, + "requires": { + "abstract-leveldown": "~6.0.0", + "inherits": "^2.0.3" + } + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true, + "optional": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true, + "optional": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true, + "optional": true + }, + "level-codec": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.1.tgz", + "integrity": "sha512-ajFP0kJ+nyq4i6kptSM+mAvJKLOg1X5FiFPtLG9M5gCEZyBmgDi3FkDrvlMkEzrUn1cWxtvVmrvoS4ASyO/q+Q==", + "dev": true, + "optional": true + }, + "levelup": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.0.2.tgz", + "integrity": "sha512-cx9PmLENwbGA3svWBEbeO2HazpOSOYSXH4VA+ahVpYyurvD+SDSfURl29VBY2qgyk+Vfy2dJd71SBRckj/EZVA==", + "dev": true, + "optional": true, + "requires": { + "deferred-leveldown": "~5.0.0", + "level-errors": "~2.0.0", + "level-iterator-stream": "~4.0.0", + "xtend": "~4.0.0" + } + }, + "node-fetch": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.4.1.tgz", + "integrity": "sha512-P9UbpFK87NyqBZzUuDBDz4f6Yiys8xm8j7ACDbi6usvFm6KItklQUKjeoqTrYS/S1k6I8oaOC2YLLDr/gg26Mw==", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "1.0.33", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", + "integrity": "sha1-OjYN1mwbHX/UcFOJhg7aHQ9hEmw=", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "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==", + "dev": true, + "optional": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "2 || 3" + }, + "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" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "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-abstract-mapreduce": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-abstract-mapreduce/-/pouchdb-abstract-mapreduce-7.2.2.tgz", + "integrity": "sha512-7HWN/2yV2JkwMnGnlp84lGvFtnm0Q55NiBUdbBcaT810+clCGKvhssBCrXnmwShD1SXTwT83aszsgiSfW+SnBA==", + "dev": true, + "optional": true, + "requires": { + "pouchdb-binary-utils": "7.2.2", + "pouchdb-collate": "7.2.2", + "pouchdb-collections": "7.2.2", + "pouchdb-errors": "7.2.2", + "pouchdb-fetch": "7.2.2", + "pouchdb-mapreduce-utils": "7.2.2", + "pouchdb-md5": "7.2.2", + "pouchdb-utils": "7.2.2" + } + }, + "pouchdb-adapter-leveldb-core": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-adapter-leveldb-core/-/pouchdb-adapter-leveldb-core-7.2.2.tgz", + "integrity": "sha512-K9UGf1Ivwe87mjrMqN+1D07tO/DfU7ariVDrGffuOjvl+3BcvUF25IWrxsBObd4iPOYCH7NVQWRpojhBgxULtQ==", + "dev": true, + "optional": true, + "requires": { + "argsarray": "0.0.1", + "buffer-from": "1.1.1", + "double-ended-queue": "2.1.0-0", + "levelup": "4.4.0", + "pouchdb-adapter-utils": "7.2.2", + "pouchdb-binary-utils": "7.2.2", + "pouchdb-collections": "7.2.2", + "pouchdb-errors": "7.2.2", + "pouchdb-json": "7.2.2", + "pouchdb-md5": "7.2.2", + "pouchdb-merge": "7.2.2", + "pouchdb-utils": "7.2.2", + "sublevel-pouchdb": "7.2.2", + "through2": "3.0.2" + }, + "dependencies": { + "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" + } + } + } + }, + "pouchdb-adapter-memory": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-adapter-memory/-/pouchdb-adapter-memory-7.2.2.tgz", + "integrity": "sha512-9o+zdItPEq7rIrxdkUxgsLNaZkDJAGEqqoYgeYdrHidOCZnlhxhX3g7/R/HcpDKC513iEPqJWDJQSfeT6nVKkw==", + "dev": true, + "optional": true, + "requires": { + "memdown": "1.4.1", + "pouchdb-adapter-leveldb-core": "7.2.2", + "pouchdb-utils": "7.2.2" + }, + "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, + "optional": true, + "requires": { + "xtend": "~4.0.0" + } + }, + "memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", + "dev": true, + "optional": 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" + } + } + } + }, + "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": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true, + "optional": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "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" + } + }, + "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.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-adapter-utils/-/pouchdb-adapter-utils-7.2.2.tgz", + "integrity": "sha512-2CzZkTyTyHZkr3ePiWFMTiD5+56lnembMjaTl8ohwegM0+hYhRyJux0biAZafVxgIL4gnCUC4w2xf6WVztzKdg==", + "dev": true, + "optional": true, + "requires": { + "pouchdb-binary-utils": "7.2.2", + "pouchdb-collections": "7.2.2", + "pouchdb-errors": "7.2.2", + "pouchdb-md5": "7.2.2", + "pouchdb-merge": "7.2.2", + "pouchdb-utils": "7.2.2" + } + }, + "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": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true, + "optional": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "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" + } + }, + "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.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-binary-utils/-/pouchdb-binary-utils-7.2.2.tgz", + "integrity": "sha512-shacxlmyHbUrNfE6FGYpfyAJx7Q0m91lDdEAaPoKZM3SzAmbtB1i+OaDNtYFztXjJl16yeudkDb3xOeokVL3Qw==", + "dev": true, + "optional": true, + "requires": { + "buffer-from": "1.1.1" + } + }, + "pouchdb-collate": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-collate/-/pouchdb-collate-7.2.2.tgz", + "integrity": "sha512-/SMY9GGasslknivWlCVwXMRMnQ8myKHs4WryQ5535nq1Wj/ehpqWloMwxEQGvZE1Sda3LOm7/5HwLTcB8Our+w==", + "dev": true, + "optional": true + }, + "pouchdb-collections": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-collections/-/pouchdb-collections-7.2.2.tgz", + "integrity": "sha512-6O9zyAYlp3UdtfneiMYuOCWdUCQNo2bgdjvNsMSacQX+3g8WvIoFQCYJjZZCpTttQGb+MHeRMr8m2U95lhJTew==", + "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" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "pouchdb-errors": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-errors/-/pouchdb-errors-7.2.2.tgz", + "integrity": "sha512-6GQsiWc+7uPfgEHeavG+7wuzH3JZW29Dnrvz8eVbDFE50kVFxNDVm3EkYHskvo5isG7/IkOx7PV7RPTA3keG3g==", + "dev": true, + "optional": true, + "requires": { + "inherits": "2.0.4" + } + }, + "pouchdb-fetch": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-fetch/-/pouchdb-fetch-7.2.2.tgz", + "integrity": "sha512-lUHmaG6U3zjdMkh8Vob9GvEiRGwJfXKE02aZfjiVQgew+9SLkuOxNw3y2q4d1B6mBd273y1k2Lm0IAziRNxQnA==", + "dev": true, + "optional": true, + "requires": { + "abort-controller": "3.0.0", + "fetch-cookie": "0.10.1", + "node-fetch": "2.6.0" + }, + "dependencies": { + "fetch-cookie": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-0.10.1.tgz", + "integrity": "sha512-beB+VEd4cNeVG1PY+ee74+PkuCQnik78pgLi5Ah/7qdUfov8IctU0vLUbBT8/10Ma5GMBeI4wtxhGrEfKNYs2g==", + "dev": true, + "optional": true, + "requires": { + "tough-cookie": "^2.3.3 || ^3.0.1 || ^4.0.0" + } + }, + "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, + "optional": true + } + } + }, + "pouchdb-find": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-find/-/pouchdb-find-7.2.2.tgz", + "integrity": "sha512-BmFeFVQ0kHmDehvJxNZl9OmIztCjPlZlVSdpijuFbk/Fi1EFPU1BAv3kLC+6DhZuOqU/BCoaUBY9sn66pPY2ag==", + "dev": true, + "optional": true, + "requires": { + "pouchdb-abstract-mapreduce": "7.2.2", + "pouchdb-collate": "7.2.2", + "pouchdb-errors": "7.2.2", + "pouchdb-fetch": "7.2.2", + "pouchdb-md5": "7.2.2", + "pouchdb-selector-core": "7.2.2", + "pouchdb-utils": "7.2.2" + } + }, + "pouchdb-json": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-json/-/pouchdb-json-7.2.2.tgz", + "integrity": "sha512-3b2S2ynN+aoB7aCNyDZc/4c0IAdx/ir3nsHB+/RrKE9cM3QkQYbnnE3r/RvOD1Xvr6ji/KOCBie+Pz/6sxoaug==", + "dev": true, + "optional": true, + "requires": { + "vuvuzela": "1.0.3" + } + }, + "pouchdb-mapreduce-utils": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-mapreduce-utils/-/pouchdb-mapreduce-utils-7.2.2.tgz", + "integrity": "sha512-rAllb73hIkU8rU2LJNbzlcj91KuulpwQu804/F6xF3fhZKC/4JQMClahk+N/+VATkpmLxp1zWmvmgdlwVU4HtQ==", + "dev": true, + "optional": true, + "requires": { + "argsarray": "0.0.1", + "inherits": "2.0.4", + "pouchdb-collections": "7.2.2", + "pouchdb-utils": "7.2.2" + } + }, + "pouchdb-md5": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-md5/-/pouchdb-md5-7.2.2.tgz", + "integrity": "sha512-c/RvLp2oSh8PLAWU5vFBnp6ejJABIdKqboZwRRUrWcfGDf+oyX8RgmJFlYlzMMOh4XQLUT1IoaDV8cwlsuryZw==", + "dev": true, + "optional": true, + "requires": { + "pouchdb-binary-utils": "7.2.2", + "spark-md5": "3.0.1" + }, + "dependencies": { + "spark-md5": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.1.tgz", + "integrity": "sha512-0tF3AGSD1ppQeuffsLDIOWlKUd3lS92tFxcsrh5Pe3ZphhnoK+oXIBTzOAThZCiuINZLvpiLH/1VS1/ANEJVig==", + "dev": true, + "optional": true + } + } + }, + "pouchdb-merge": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-merge/-/pouchdb-merge-7.2.2.tgz", + "integrity": "sha512-6yzKJfjIchBaS7Tusuk8280WJdESzFfQ0sb4jeMUNnrqs4Cx3b0DIEOYTRRD9EJDM+je7D3AZZ4AT0tFw8gb4A==", + "dev": true, + "optional": true + }, + "pouchdb-selector-core": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-selector-core/-/pouchdb-selector-core-7.2.2.tgz", + "integrity": "sha512-XYKCNv9oiNmSXV5+CgR9pkEkTFqxQGWplnVhO3W9P154H08lU0ZoNH02+uf+NjZ2kjse7Q1fxV4r401LEcGMMg==", + "dev": true, + "optional": true, + "requires": { + "pouchdb-collate": "7.2.2", + "pouchdb-utils": "7.2.2" + } + }, + "pouchdb-utils": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/pouchdb-utils/-/pouchdb-utils-7.2.2.tgz", + "integrity": "sha512-XmeM5ioB4KCfyB2MGZXu1Bb2xkElNwF1qG+zVFbQsKQij0zvepdOUfGuWvLRHxTOmt4muIuSOmWZObZa3NOgzQ==", + "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.2.2", + "pouchdb-errors": "7.2.2", + "pouchdb-md5": "7.2.2", + "uuid": "8.1.0" + }, + "dependencies": { + "uuid": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.1.0.tgz", + "integrity": "sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==", + "dev": true, + "optional": true + } + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "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=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true, + "optional": true + }, + "prettier": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", + "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", + "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.13", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.13.tgz", + "integrity": "sha512-AWMDRSabpNQMX7EqdDKgx/UVtQY6e3/Iu4gSPYDGvgiWl+OY8kYhAMll2NZHK/X+F0YYpPHYpebkDh7MGxbB1g==", + "dev": true, + "requires": { + "@solidity-parser/parser": "^0.13.2", + "emoji-regex": "^9.2.2", + "escape-string-regexp": "^4.0.0", + "semver": "^7.3.5", + "solidity-comments-extractor": "^0.0.7", + "string-width": "^4.2.2" + }, + "dependencies": { + "@solidity-parser/parser": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.13.2.tgz", + "integrity": "sha512-RwHnpRnfrnD2MSPveYoPh8nhofEvX7fgjHk1Oq+NNvCcLx4r1js91CO9o+F/F3fBzOCyvm8kKRTriFICX/odWw==", + "dev": true, + "requires": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "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 + }, + "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" + } + } + } + }, + "pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "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==", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise.allsettled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", + "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==", + "dev": true, + "requires": { + "array.prototype.map": "^1.0.1", + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "iterate-value": "^1.0.0" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "optional": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "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.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "dependencies": { + "@types/node": { + "version": "15.12.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.1.tgz", + "integrity": "sha512-zyxJM8I1c9q5sRMtVF+zdd13Jt6RU4r4qfhTd7lQubyThvLfx6yYekWSQjGCGV2Tkecgxnlpl/DNlb6Hg+dmEw==", + "dev": true, + "optional": true + } + } + }, + "protocol-buffers-schema": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.5.1.tgz", + "integrity": "sha512-YVCvdhxWNDP8/nJDyXLuM+UFsuPk4+1PB7WGPVDzm3HTHbzFLxQYeW2iZpS4mmnXrQJGBzt230t/BbEb7PrQaw==", + "dev": true, + "optional": true + }, + "protons": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protons/-/protons-2.0.1.tgz", + "integrity": "sha512-FlmPorLEeCEDPu+uIn0Qardgiy5XqVA4IyNTz9wb9c0e2U7BEXdRcIbx64r09o4Abtf+4B7mkTtMbsIXMxZzKw==", + "dev": true, + "optional": true, + "requires": { + "protocol-buffers-schema": "^3.3.1", + "signed-varint": "^2.0.1", + "uint8arrays": "^2.1.3", + "varint": "^5.0.0" + }, + "dependencies": { + "multibase": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1" + } + }, + "uint8arrays": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^4.0.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==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "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==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": 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" + }, + "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 + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "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==", + "dev": true + }, + "pure-rand": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-4.2.0.tgz", + "integrity": "sha512-d2IwZpSFSLGWmjThAdMECofl07uOMqmuIHqH8mRY7h7Hl2jY5ZJZ9fx9dEBIKkKyk4jmEvS0vnpdFUtzPi3Ctg==", + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "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 + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "optional": 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, + "optional": true + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "optional": true + } + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "optional": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "optional": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "optional": true + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "optional": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "optional": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "optional": true, + "requires": { + "pinkie-promise": "^2.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==", + "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" + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "receptacle": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/receptacle/-/receptacle-1.3.2.tgz", + "integrity": "sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + }, + "dependencies": { + "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 + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "dev": true, + "requires": { + "minimatch": "3.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-cli-logger": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/redux-cli-logger/-/redux-cli-logger-2.1.0.tgz", + "integrity": "sha512-75mVsggAJRSykWy2qxdGI7osocDWvc3RCMeN93hlvS/FxgdRww12NaXslez+W6gBOrSJKO7W16V0IzuISSfCxg==", + "dev": true, + "requires": { + "colors": "^1.1.2" + } + }, + "redux-devtools-core": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/redux-devtools-core/-/redux-devtools-core-0.2.1.tgz", + "integrity": "sha512-RAGOxtUFdr/1USAvxrWd+Gq/Euzgw7quCZlO5TgFpDfG7rB5tMhZUrNyBjpzgzL2yMk0eHnPYIGm7NkIfRzHxQ==", + "dev": true, + "requires": { + "get-params": "^0.1.2", + "jsan": "^3.1.13", + "lodash": "^4.17.11", + "nanoid": "^2.0.0", + "remotedev-serialize": "^0.1.8" + } + }, + "redux-devtools-instrument": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/redux-devtools-instrument/-/redux-devtools-instrument-1.10.0.tgz", + "integrity": "sha512-X8JRBCzX2ADSMp+iiV7YQ8uoTNyEm0VPFPd4T854coz6lvRiBrFSqAr9YAS2n8Kzxx8CJQotR0QF9wsMM+3DvA==", + "dev": true, + "requires": { + "lodash": "^4.17.19", + "symbol-observable": "^1.2.0" + } + }, + "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" + } + }, + "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==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "optional": 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": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "relay-compiler": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/relay-compiler/-/relay-compiler-10.1.0.tgz", + "integrity": "sha512-HPqc3N3tNgEgUH5+lTr5lnLbgnsZMt+MRiyS0uAVNhuPY2It0X1ZJG+9qdA3L9IqKFUNwVn6zTO7RArjMZbARQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/core": "^7.0.0", + "@babel/generator": "^7.5.0", + "@babel/parser": "^7.0.0", + "@babel/runtime": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "babel-preset-fbjs": "^3.3.0", + "chalk": "^4.0.0", + "fb-watchman": "^2.0.0", + "fbjs": "^3.0.0", + "glob": "^7.1.1", + "immutable": "~3.7.6", + "nullthrows": "^1.1.1", + "relay-runtime": "10.1.0", + "signedsource": "^1.0.0", + "yargs": "^15.3.1" + }, + "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, + "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" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "optional": true + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "optional": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.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 + }, + "immutable": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", + "integrity": "sha1-E7TTyxK++hVIKib+Gy665kAHHks=", + "dev": true, + "optional": 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, + "optional": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "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" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "optional": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.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": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "relay-runtime": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-10.1.0.tgz", + "integrity": "sha512-bxznLnQ1ST6APN/cFi7l0FpjbZVchWQjjhj9mAuJBuUqNNCh9uV+UTRhpQF7Q8ycsPp19LHTpVyGhYb0ustuRQ==", + "dev": true, + "optional": true, + "requires": { + "@babel/runtime": "^7.0.0", + "fbjs": "^3.0.0" + } + }, + "remote-redux-devtools": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/remote-redux-devtools/-/remote-redux-devtools-0.5.16.tgz", + "integrity": "sha512-xZ2D1VRIWzat5nsvcraT6fKEX9Cfi+HbQBCwzNnUAM8Uicm/anOc60XGalcaDPrVmLug7nhDl2nimEa3bL3K9w==", + "dev": true, + "requires": { + "jsan": "^3.1.13", + "querystring": "^0.2.0", + "redux-devtools-core": "^0.2.1", + "redux-devtools-instrument": "^1.9.4", + "rn-host-detect": "^1.1.5", + "socketcluster-client": "^14.2.1" + } + }, + "remotedev-serialize": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/remotedev-serialize/-/remotedev-serialize-0.1.9.tgz", + "integrity": "sha512-5tFdZg9mSaAWTv6xmQ7HtHjKMLSFQFExEZOtJe10PLsv1wb7cy7kYHtBvTYRro27/3fRGEcQBRNKSaixOpb69w==", + "dev": true, + "requires": { + "jsan": "^3.1.13" + } + }, + "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, + "optional": true + }, + "renderkid": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", + "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "dev": true, + "requires": { + "css-select": "^2.0.2", + "dom-converter": "^0.2", + "htmlparser2": "^3.10.1", + "lodash": "^4.17.20", + "strip-ansi": "^3.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 + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + } + } + }, + "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.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "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": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + } + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "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" + } + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + }, + "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==", + "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" + } + }, + "request-progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", + "dev": true, + "requires": { + "throttleit": "^1.0.0" + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "requires": { + "request-promise-core": "1.1.4", + "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.0.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", + "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==", + "dev": true + }, + "reselect-tree": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/reselect-tree/-/reselect-tree-1.3.4.tgz", + "integrity": "sha512-1OgNq1IStyJFqIqOoD3k3Ge4SsYCMP9W88VQOfvgyLniVKLfvbYO1Vrl92SyEK5021MkoBX6tWb381VxTDyPBQ==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "esdoc": "^1.0.4", + "json-pointer": "^0.6.0", + "reselect": "^4.0.0", + "source-map-support": "^0.5.3" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": 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 + } + } + }, + "reset": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/reset/-/reset-0.1.0.tgz", + "integrity": "sha1-n8cxQXGZWubLC35YsGznUir0uvs=", + "dev": true, + "optional": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "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 + }, + "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=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.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 + }, + "retimer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/retimer/-/retimer-2.0.0.tgz", + "integrity": "sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg==", + "dev": true, + "optional": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true, + "optional": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "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==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rlp": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz", + "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", + "dev": true, + "requires": { + "bn.js": "^4.11.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 + } + } + }, + "rn-host-detect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rn-host-detect/-/rn-host-detect-1.2.0.tgz", + "integrity": "sha512-btNg5kzHcjZZ7t7mvvV/4wNJ9e3MPgrWivkRgWURzXL0JJ0pwWlU4zrbmdlz3HHzHOxhBhHB4D+/dbMFfu4/4A==", + "dev": true + }, + "rpc-websockets": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-5.3.1.tgz", + "integrity": "sha512-rIxEl1BbXRlIA9ON7EmY/2GUM7RLMy8zrUPTiLPFiYnYOz0I3PXfCmDDrge5vt4pW4oIcAXBDvgZuJ1jlY5+VA==", + "dev": true, + "optional": true, + "requires": { + "@babel/runtime": "^7.8.7", + "assert-args": "^1.2.1", + "babel-runtime": "^6.26.0", + "circular-json": "^0.5.9", + "eventemitter3": "^3.1.2", + "uuid": "^3.4.0", + "ws": "^5.2.2" + }, + "dependencies": { + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true, + "optional": true + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "optional": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "run": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/run/-/run-1.4.0.tgz", + "integrity": "sha1-4X2ekEOrL+F3dsspnhI3848LT/o=", + "dev": true, + "optional": true, + "requires": { + "minimatch": "*" + } + }, + "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 + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "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.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "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 + }, + "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==", + "dev": true + }, + "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 + }, + "sc-channel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/sc-channel/-/sc-channel-1.2.0.tgz", + "integrity": "sha512-M3gdq8PlKg0zWJSisWqAsMmTVxYRTpVRqw4CWAdKBgAfVKumFcTjoCV0hYu7lgUXccCtCD8Wk9VkkE+IXCxmZA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + } + } + }, + "sc-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sc-errors/-/sc-errors-2.0.1.tgz", + "integrity": "sha512-JoVhq3Ud+3Ujv2SIG7W0XtjRHsrNgl6iXuHHsh0s+Kdt5NwI6N2EGAZD4iteitdDv68ENBkpjtSvN597/wxPSQ==", + "dev": true + }, + "sc-formatter": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sc-formatter/-/sc-formatter-3.0.2.tgz", + "integrity": "sha512-9PbqYBpCq+OoEeRQ3QfFIGE6qwjjBcd2j7UjgDlhnZbtSnuGgHdcRklPKYGuYFH82V/dwd+AIpu8XvA1zqTd+A==", + "dev": true + }, + "sc-istanbul": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", + "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "scrypt-async": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/scrypt-async/-/scrypt-async-2.0.1.tgz", + "integrity": "sha512-wHR032jldwZNy7Tzrfu7RccOgGf8r5hyDMSP2uV6DpLiBUsR8JsDcx/in73o2UGVVrH5ivRFdNsFPcjtl3LErQ==", + "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==", + "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" + } + }, + "seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "dev": true, + "optional": true + }, + "semaphore-async-await": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz", + "integrity": "sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo=", + "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 + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-regex": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.2.tgz", + "integrity": "sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": 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": { + "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 + } + } + }, + "sentence-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", + "integrity": "sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case-first": "^1.1.2" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "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==", + "dev": true, + "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==", + "dev": true, + "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-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=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "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==", + "dev": true + }, + "signed-varint": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/signed-varint/-/signed-varint-2.0.1.tgz", + "integrity": "sha1-UKmYnafJjCxh2tEZvJdHDvhSgSk=", + "dev": true, + "optional": true, + "requires": { + "varint": "~5.0.0" + } + }, + "signedsource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz", + "integrity": "sha1-HdrOSYF5j5O9gzlzgD2A1S6TrWo=", + "dev": true, + "optional": true + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "dev": true, + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "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" + } + }, + "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 + } + } + }, + "snake-case": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=", + "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": { + "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" + } + } + } + }, + "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" + } + } + } + }, + "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" + }, + "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" + } + } + } + }, + "socketcluster-client": { + "version": "14.3.1", + "resolved": "https://registry.npmjs.org/socketcluster-client/-/socketcluster-client-14.3.1.tgz", + "integrity": "sha512-Sd/T0K/9UlqTfz+HUuFq90dshA5OBJPQbdkRzGtcKIOm52fkdsBTt0FYpiuzzxv5VrU7PWpRm6KIfNXyPwlLpw==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "clone": "2.1.1", + "component-emitter": "1.2.1", + "linked-list": "0.1.0", + "querystring": "0.2.0", + "sc-channel": "^1.2.0", + "sc-errors": "^2.0.1", + "sc-formatter": "^3.0.1", + "uuid": "3.2.1", + "ws": "7.1.0" + }, + "dependencies": { + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + }, + "ws": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.0.tgz", + "integrity": "sha512-Swie2C4fs7CkwlHu1glMePLYJJsWjzhl1vm3ZaLplD0h7OMkZyZ6kLTB/OagiU923bZrPFXuDTeEqaEN4NWG4g==", + "dev": true, + "requires": { + "async-limiter": "^1.0.0" + } + } + } + }, + "sol2uml": { + "version": "1.1.25", + "resolved": "https://registry.npmjs.org/sol2uml/-/sol2uml-1.1.25.tgz", + "integrity": "sha512-p1UcPGQ49Kh7KAGgtonjunTL086iaA9hr8QfgmTQXJbqe3ztGsshGaemzASkWANI1FXvIDGlAYEvFxc6gQa+ng==", + "dev": true, + "requires": { + "@solidity-parser/parser": "^0.10.2", + "axios": "^0.21.1", + "commander": "^3.0.2", + "debug": "^4.3.1", + "js-graph-algorithms": "^1.0.18", + "klaw": "^3.0.0", + "svg-to-png": "^4.0.0", + "verror": "^1.10.0", + "viz.js": "^1.8.2" + }, + "dependencies": { + "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" + } + }, + "klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "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 + } + } + }, + "solc": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", + "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", + "dev": true, + "requires": { + "command-exists": "^1.2.8", + "commander": "3.0.2", + "follow-redirects": "^1.12.1", + "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" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "solhint": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/solhint/-/solhint-3.3.6.tgz", + "integrity": "sha512-HWUxTAv2h7hx3s3hAab3ifnlwb02ZWhwFU/wSudUHqteMS3ll9c+m1FlGn9V8ztE2rf3Z82fQZA005Wv7KpcFA==", + "dev": true, + "requires": { + "@solidity-parser/parser": "^0.13.2", + "ajv": "^6.6.1", + "antlr4": "4.7.1", + "ast-parents": "0.0.1", + "chalk": "^2.4.2", + "commander": "2.18.0", + "cosmiconfig": "^5.0.7", + "eslint": "^5.6.0", + "fast-diff": "^1.1.2", + "glob": "^7.1.3", + "ignore": "^4.0.6", + "js-yaml": "^3.12.0", + "lodash": "^4.17.11", + "prettier": "^1.14.3", + "semver": "^6.3.0" + }, + "dependencies": { + "@solidity-parser/parser": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.13.2.tgz", + "integrity": "sha512-RwHnpRnfrnD2MSPveYoPh8nhofEvX7fgjHk1Oq+NNvCcLx4r1js91CO9o+F/F3fBzOCyvm8kKRTriFICX/odWw==", + "dev": true, + "requires": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "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 + }, + "commander": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz", + "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.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 + } + } + }, + "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" + } + }, + "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 + }, + "eslint": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" + }, + "dependencies": { + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.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 + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "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": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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 + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^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 + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "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 + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true, + "optional": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "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 + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": 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" + } + }, + "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 + }, + "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" + } + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "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 + }, + "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" + } + }, + "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" + } + } + } + }, + "solhint-plugin-prettier": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/solhint-plugin-prettier/-/solhint-plugin-prettier-0.0.4.tgz", + "integrity": "sha512-JVxh8ZkD4ydb0EndbNcstpFU+vWzUvX3jr9z6u72+Srg/zjD8JQ1tIMjMn0H1PnsNLItZqPZ6RYIPJB6HOsVMg==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "solidity-comments-extractor": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz", + "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==", + "dev": true + }, + "solidity-coverage": { + "version": "0.7.16", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.16.tgz", + "integrity": "sha512-ttBOStywE6ZOTJmmABSg4b8pwwZfYKG8zxu40Nz+sRF5bQX7JULXWj/XbX0KXps3Fsp8CJXg8P29rH3W54ipxw==", + "dev": true, + "requires": { + "@solidity-parser/parser": "^0.12.0", + "@truffle/provider": "^0.2.24", + "chalk": "^2.4.2", + "death": "^1.1.0", + "detect-port": "^1.3.0", + "fs-extra": "^8.1.0", + "ganache-cli": "^6.11.0", + "ghost-testrpc": "^0.0.2", + "global-modules": "^2.0.0", + "globby": "^10.0.1", + "jsonschema": "^1.2.4", + "lodash": "^4.17.15", + "node-emoji": "^1.10.0", + "pify": "^4.0.1", + "recursive-readdir": "^2.2.2", + "sc-istanbul": "^0.4.5", + "semver": "^7.3.4", + "shelljs": "^0.8.3", + "web3-utils": "^1.3.0" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@solidity-parser/parser": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.12.2.tgz", + "integrity": "sha512-d7VS7PxgMosm5NyaiyDJRNID5pK4AWj1l64Dbz0147hJgy5k2C0/ZiKK/9u5c5K+HRUVHmp+RMvGEjGh84oA5Q==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "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 + }, + "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" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "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" + } + }, + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "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 + }, + "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" + } + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "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" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "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" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "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" + } + } + } + }, + "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": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "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 + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "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 + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "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" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "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=", + "dev": true, + "requires": { + "p-limit": "^1.1.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=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "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" + } + }, + "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": { + "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.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "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-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "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 + }, + "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" + }, + "dependencies": { + "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-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "spark-md5": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.0.tgz", + "integrity": "sha1-NyIifFTi+vJLHcbZM8wUTm9xv+8=", + "dev": true, + "optional": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "optional": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true, + "optional": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "optional": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", + "dev": true, + "optional": true + }, + "spinnies": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/spinnies/-/spinnies-0.5.1.tgz", + "integrity": "sha512-WpjSXv9NQz0nU3yCT9TFEOfpFrXADY9C5fG6eAJqixLhvTX1jP3w92Y8IE5oafIe42nlF9otjhllnXN/QCaB3A==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^2.4.2", + "cli-cursor": "^3.0.0", + "strip-ansi": "^5.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "optional": 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==", + "dev": true, + "optional": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "optional": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "optional": true, + "requires": { + "mimic-fn": "^2.1.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==", + "dev": true, + "optional": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "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, + "optional": true, + "requires": { + "ansi-regex": "^4.1.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==", + "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" + } + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true, + "optional": true + }, + "stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "dev": true, + "requires": { + "type-fest": "^0.7.1" + }, + "dependencies": { + "type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "dev": true + } + } + }, + "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=", + "dev": true + }, + "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 + }, + "stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "dev": true, + "optional": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "stream-to-it": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/stream-to-it/-/stream-to-it-0.2.3.tgz", + "integrity": "sha512-xaK9EjPtLox5rrC7YLSBXSanTtUJN/lzJlMFvy9VaROmnyvy0U/X6m2uMhXPJRn3g3M9uOSIzTszW7BPiWSg9w==", + "dev": true, + "optional": true, + "requires": { + "get-iterator": "^1.0.2" + } + }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", + "dev": true, + "optional": 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=", + "dev": true + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "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.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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.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" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "optional": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-bom-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", + "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", + "dev": true, + "optional": true, + "requires": { + "first-chunk-stream": "^1.0.0", + "strip-bom": "^2.0.0" + } + }, + "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=", + "dev": true, + "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.2.2", + "resolved": "https://registry.npmjs.org/sublevel-pouchdb/-/sublevel-pouchdb-7.2.2.tgz", + "integrity": "sha512-y5uYgwKDgXVyPZceTDGWsSFAhpSddY29l9PJbXqMJLfREdPmQTY8InpatohlEfCXX7s1LGcrfYAhxPFZaJOLnQ==", + "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": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "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": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + } + } + }, + "subscriptions-transport-ws": { + "version": "0.9.18", + "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.18.tgz", + "integrity": "sha512-tztzcBTNoEbuErsVQpTN2xUNN/efAZXyCyL5m3x4t6SKrEiTL2N8SaKWBFWM4u56pL79ULif3zjyeq+oV+nOaA==", + "dev": true, + "optional": true, + "requires": { + "backo2": "^1.0.2", + "eventemitter3": "^3.1.0", + "iterall": "^1.2.1", + "symbol-observable": "^1.0.4", + "ws": "^5.2.0" + }, + "dependencies": { + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true, + "optional": true + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "optional": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "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==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svg-to-png": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/svg-to-png/-/svg-to-png-4.0.0.tgz", + "integrity": "sha512-rRZtKkufSiOh9peAA8Sn/+VnrHR0copUi+btLwygoKHJ21lDmMT6AXHrBjqL3rYDXT/81k5pTMJ34UsnjXliiw==", + "dev": true, + "requires": { + "imagemin": "^6.0.0", + "phantomjs-prebuilt": "^2.1.7" + } + }, + "swap-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=", + "dev": true, + "requires": { + "lower-case": "^1.1.1", + "upper-case": "^1.1.1" + } + }, + "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": { + "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.1.29", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "dev": 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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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 + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "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" + } + } + } + }, + "symbol": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/symbol/-/symbol-0.2.3.tgz", + "integrity": "sha1-O5hzuKkB5Hxu/iFSajrDcu8ou8c=", + "dev": true, + "optional": true + }, + "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 + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "optional": true + }, + "sync-fetch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/sync-fetch/-/sync-fetch-0.3.0.tgz", + "integrity": "sha512-dJp4qg+x4JwSEW1HibAuMi0IIrBI3wuQr2GimmqB7OXR50wmwzfdusG+p39R9w3R6aFtZ2mzvxvWKQ3Bd/vx3g==", + "dev": true, + "optional": true, + "requires": { + "buffer": "^5.7.0", + "node-fetch": "^2.6.1" + } + }, + "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": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": 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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "taffydb": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.7.3.tgz", + "integrity": "sha1-KtNxaWKUmPylvIQkMJbTzeDsOjQ=", + "dev": true + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": 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" + } + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "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 + }, + "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 + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "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 + } + } + }, + "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.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "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" + } + } + } + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "through2-filter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", + "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "dev": true, + "optional": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0" + } + }, + "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=", + "dev": true + }, + "timeout-abort-controller": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/timeout-abort-controller/-/timeout-abort-controller-1.1.1.tgz", + "integrity": "sha512-BsF9i3NAJag6T0ZEjki9j654zoafI2X6ayuNd6Tp8+Ul6Tr5s4jo973qFeiWrRSweqvskC+AHDKUmIW4b7pdhQ==", + "dev": true, + "optional": true, + "requires": { + "abort-controller": "^3.0.0", + "retimer": "^2.0.0" + } + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tiny-queue": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tiny-queue/-/tiny-queue-0.2.1.tgz", + "integrity": "sha1-JaZ/LG4lOyypQZd7XvdELvl6YEY=", + "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, + "optional": true, + "requires": { + "bindings": "^1.3.0", + "bn.js": "^4.11.8", + "create-hmac": "^1.1.7", + "elliptic": "^6.4.0", + "nan": "^2.13.2" + }, + "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 + } + } + }, + "title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", + "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-absolute-glob": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", + "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^2.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, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-data-view": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz", + "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==", + "dev": true, + "optional": true + }, + "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=", + "dev": true, + "optional": true + }, + "to-json-schema": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/to-json-schema/-/to-json-schema-0.2.5.tgz", + "integrity": "sha512-jP1ievOee8pec3tV9ncxLSS48Bnw7DIybgy112rhMCEhf3K4uyVNZZHr03iQQBzbV5v5Hos+dlZRRyk6YSMNDw==", + "dev": true, + "optional": true, + "requires": { + "lodash.isequal": "^4.5.0", + "lodash.keys": "^4.2.0", + "lodash.merge": "^4.6.2", + "lodash.omit": "^4.5.0", + "lodash.without": "^4.4.0", + "lodash.xor": "^4.5.0" + } + }, + "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" + }, + "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" + } + } + } + }, + "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==", + "dev": true + }, + "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": "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" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "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==", + "dev": true, + "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": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true, + "optional": 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 + }, + "true-case-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", + "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==", + "dev": true + }, + "truffle": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/truffle/-/truffle-5.3.9.tgz", + "integrity": "sha512-heKtYqUmYCtMxIn1ho/MgeLMYeoqeUrf0f4J7nQnSrMaPz0L5YXdtYI5UP4fFkc6XKLZWHfvyx/3ccz05OS63Q==", + "dev": true, + "requires": { + "@truffle/db": "^0.5.14", + "@truffle/debugger": "^9.0.1", + "@truffle/preserve-fs": "^0.2.2", + "@truffle/preserve-to-buckets": "^0.2.2", + "@truffle/preserve-to-filecoin": "^0.2.2", + "@truffle/preserve-to-ipfs": "^0.2.2", + "app-module-path": "^2.2.0", + "mocha": "8.1.2", + "original-require": "^1.0.1" + }, + "dependencies": { + "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-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "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" + } + }, + "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" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.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.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" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "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 + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "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" + } + }, + "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-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 + }, + "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 + }, + "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" + } + }, + "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.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "mocha": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.2.tgz", + "integrity": "sha512-I8FRAcuACNMLQn3lS4qeWLxXqLvGf6r2CaLstDpZmMUUSmvW6Cnm1AuHxgbc7ctZVRcfwspCRbDHymPsi3dkJw==", + "dev": true, + "requires": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.4.2", + "debug": "4.1.1", + "diff": "4.0.2", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.14.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.2", + "object.assign": "4.1.0", + "promise.allsettled": "1.0.2", + "serialize-javascript": "4.0.0", + "strip-json-comments": "3.0.1", + "supports-color": "7.1.0", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.0.0", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.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 + }, + "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" + } + }, + "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" + } + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "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" + } + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "yargs-unparser": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.1.tgz", + "integrity": "sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "decamelize": "^1.2.0", + "flat": "^4.1.0", + "is-plain-obj": "^1.1.0", + "yargs": "^14.2.3" + }, + "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, + "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, + "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" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.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": "^15.0.1" + } + }, + "yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + } + } + }, + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "ts-invariant": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", + "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "optional": true + } + } + }, + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "dev": true + }, + "tsort": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", + "integrity": "sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "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=", + "dev": true + }, + "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==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "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.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "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==", + "dev": true, + "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==", + "dev": true, + "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, + "optional": 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" + } + }, + "ua-parser-js": { + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==", + "dev": true, + "optional": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "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==", + "dev": true + } + } + }, + "uint8arrays": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-1.1.0.tgz", + "integrity": "sha512-cLdlZ6jnFczsKf5IH1gPHTtcHtPGho5r4CvctohmQjw8K7Q3gFdfIGHxSTdTaCKrL4w09SsPRJTqRS0drYeszA==", + "dev": true, + "optional": true, + "requires": { + "multibase": "^3.0.0", + "web-encoding": "^1.0.2" + }, + "dependencies": { + "multibase": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-3.1.2.tgz", + "integrity": "sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw==", + "dev": true, + "optional": true, + "requires": { + "@multiformats/base-x": "^4.0.1", + "web-encoding": "^1.0.6" + } + } + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "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" + } + }, + "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==", + "dev": true + }, + "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" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "optional": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + }, + "dependencies": { + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "optional": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + } + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "optional": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "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 + }, + "unixify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", + "integrity": "sha1-OmQcjC/7zk2mg6XHDwOkYpQMIJA=", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^2.1.1" + }, + "dependencies": { + "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, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "dev": true, + "optional": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "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 + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "optional": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "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": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=", + "dev": true, + "requires": { + "upper-case": "^1.1.1" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "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": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "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=", + "dev": true, + "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=", + "dev": true + }, + "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=", + "dev": true + }, + "ursa-optional": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/ursa-optional/-/ursa-optional-0.10.2.tgz", + "integrity": "sha512-TKdwuLboBn7M34RcvVTuQyhvrA8gYKapuVdm0nBP0mnBc7oECOfUQZrY91cefL3/nm64ZyrejSRrhTVdX7NG/A==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.14.2" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.5.tgz", + "integrity": "sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==", + "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==", + "dev": true + }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "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=", + "dev": true + }, + "util.promisify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz", + "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==", + "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" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "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 + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", + "dev": true, + "optional": true + }, + "valid-url": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", + "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=", + "dev": true, + "optional": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "optional": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-or-promise": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.6.tgz", + "integrity": "sha512-9r0wQsWD8z/BxPOvnwbPf05ZvFngXyouE9EKB+5GbYix+BYnAwrIChCUyFIinfbf2FL/U71z+CPpbnmTdxrwBg==", + "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=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "optional": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + }, + "dependencies": { + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true, + "optional": true + } + } + }, + "vinyl-fs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.3.tgz", + "integrity": "sha1-PZflYuv91LZpId6nBia4S96dLQc=", + "dev": true, + "optional": true, + "requires": { + "duplexify": "^3.2.0", + "glob-stream": "^5.3.2", + "graceful-fs": "^4.0.0", + "gulp-sourcemaps": "^1.5.2", + "is-valid-glob": "^0.3.0", + "lazystream": "^1.0.0", + "lodash.isequal": "^4.0.0", + "merge-stream": "^1.0.0", + "mkdirp": "^0.5.0", + "object-assign": "^4.0.0", + "readable-stream": "^2.0.4", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^1.0.0", + "through2": "^2.0.0", + "through2-filter": "^2.0.0", + "vali-date": "^1.0.0", + "vinyl": "^1.0.0" + } + }, + "viz.js": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/viz.js/-/viz.js-1.8.2.tgz", + "integrity": "sha512-W+1+N/hdzLpQZEcvz79n2IgUE9pfx6JLdHh3Kh8RGvLL8P1LdJVQmi2OsDcLdY4QVID4OUy+FPelyerX0nJxIQ==", + "dev": true + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "vue": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.13.tgz", + "integrity": "sha512-O+pAdJkce1ooYS1XyoQtpBQr9An+Oys3w39rkqxukVO3ZD1ilYJkWBGoRuadiQEm2LLJnCL2utV4TMSf52ubjw==", + "dev": true + }, + "vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true + }, + "vue-loader": { + "version": "15.9.7", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.7.tgz", + "integrity": "sha512-qzlsbLV1HKEMf19IqCJqdNvFJRCI58WNbS6XbPqK13MrLz65es75w392MSQ5TsARAfIjUw+ATm3vlCXUJSOH9Q==", + "dev": true, + "requires": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + } + }, + "vue-router": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.1.tgz", + "integrity": "sha512-RRQNLT8Mzr8z7eL4p7BtKvRaTSGdCbTy2+Mm5HTJvLGYSSeG9gDzNasJPP/yOYKLy+/cLG/ftrqq5fvkFwBJEw==", + "dev": true + }, + "vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dev": true, + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "vue-template-compiler": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.13.tgz", + "integrity": "sha512-latKAqpUjCkovB8XppW5gnZbSdYQzkf8pavsMBZYZrQcG6lAnj0EH4Ty7jMwAwFw5Cf4mybKBHlp1UTjnLPOWw==", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.1.0" + } + }, + "vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true + }, + "vuvuzela": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vuvuzela/-/vuvuzela-1.0.3.tgz", + "integrity": "sha1-O+FF5YJxxzylUnndhR8SpoIRSws=", + "dev": true, + "optional": true + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "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, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "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" + } + }, + "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, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "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, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + } + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "optional": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "web-encoding": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz", + "integrity": "sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==", + "dev": true, + "optional": true, + "requires": { + "@zxing/text-encoding": "0.9.0", + "util": "^0.12.3" + } + }, + "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" + }, + "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" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "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" + } + } + } + }, + "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" + }, + "dependencies": { + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + } + } + }, + "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" + }, + "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" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "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" + } + } + } + }, + "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" + }, + "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" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "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" + } + } + } + }, + "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" + }, + "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" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "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" + } + } + } + }, + "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" + }, + "dependencies": { + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + } + } + }, + "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" + }, + "dependencies": { + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + } + } + }, + "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" + }, + "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" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "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" + } + } + } + }, + "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" + }, + "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" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "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" + } + } + } + }, + "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": { + "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" + } + }, + "scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "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 + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "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" + } + } + } + }, + "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" + }, + "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" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "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" + } + } + } + }, + "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" + }, + "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" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "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" + } + } + } + }, + "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" + }, + "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" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "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" + } + } + } + }, + "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" + }, + "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" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "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" + } + } + } + }, + "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" + }, + "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" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "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" + } + } + } + }, + "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" + }, + "dependencies": { + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + } + } + }, + "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" + }, + "dependencies": { + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + } + } + }, + "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.2.9", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.9.tgz", + "integrity": "sha512-9hcpuis3n/LxFzEVjwnVgvJzTirS2S9/MiNAa7l4WOEoywY+BSNwnRX4MuHnjkh9NY25B6QOjuNG6FNnSjTw1w==", + "dev": true, + "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==", + "dev": true + } + } + }, + "webidl-conversions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-2.0.1.tgz", + "integrity": "sha1-O/glj30xjHRDw28uFpQCoaZwNQY=", + "dev": true, + "optional": true + }, + "webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "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" + } + }, + "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-url-compat": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz", + "integrity": "sha1-AImBEa9om7CXVBzVpFymyHmERb8=", + "dev": true, + "optional": true, + "requires": { + "tr46": "~0.0.1" + } + }, + "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-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "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" + } + }, + "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": { + "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" + } + } + } + }, + "wif": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", + "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=", + "dev": true, + "optional": true, + "requires": { + "bs58check": "<3.0.0" + } + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", + "dev": true, + "optional": true + }, + "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 + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "workerpool": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", + "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==", + "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": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "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" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "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" + } + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "write-stream": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/write-stream/-/write-stream-0.4.3.tgz", + "integrity": "sha1-g8yMA0fQr2BXqThitOOuAd5cgcE=", + "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": "sha1-8y124/uGM0SlSNeZIwBxc2ZbO40=", + "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==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true, + "optional": true + }, + "xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "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", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "dev": 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", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", + "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", + "dev": true, + "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=", + "dev": true, + "requires": { + "cookiejar": "^2.1.1" + } + }, + "xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", + "dev": true, + "optional": true + }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", + "dev": true + }, + "xss": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.9.tgz", + "integrity": "sha512-2t7FahYnGJys6DpHLhajusId7R0Pm2yTmuL0GV9+mV0ZlaLSnb2toBmppATfg5sWIhZQGlsTLoecSzya+l4EAQ==", + "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==", + "dev": true + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "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": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "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-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" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "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" + } + } + } + }, + "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" + } + }, + "yarn": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/yarn/-/yarn-1.22.10.tgz", + "integrity": "sha512-IanQGI9RRPAN87VGTF7zs2uxkSyQSrSPsju0COgbsKQOOXr5LtcVPeyXWgwVa0ywG3d8dg6kSYKGBuYK021qeA==" + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "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 + }, + "zen-observable": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==", + "dev": true, + "optional": true + }, + "zen-observable-ts": { + "version": "0.8.21", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz", + "integrity": "sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^1.9.3", + "zen-observable": "^0.8.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..0b9ca17 --- /dev/null +++ b/package.json @@ -0,0 +1,79 @@ +{ + "name": "origins-launchpad", + "version": "1.2.8", + "description": "The smart contracts for the Origins Platform", + "keywords": [ + "Origins", + "Launchpad", + "Token Sale" + ], + "author": "Franklin Richards ", + "homepage": "https://live.sovryn.app/origins", + "repository": { + "type": "git", + "url": "https://github.com/DistributedCollective/origins" + }, + "bugs": { + "url": "https://github.com/DistributedCollective/origins/issues" + }, + "license": "UNLICENSED", + "devDependencies": { + "@nomiclabs/hardhat-ethers": "^2.0.1", + "@nomiclabs/hardhat-ganache": "^2.0.0", + "@nomiclabs/hardhat-truffle5": "^2.0.0", + "@nomiclabs/hardhat-web3": "^2.0.0", + "@openzeppelin/test-helpers": "^0.5.10", + "bignumber.js": "^9.0.0", + "bn.js": "^5.1.2", + "chai": "^4.2.0", + "chai-as-promised": "^7.1.1", + "chai-bn": "^0.2.1", + "chai-string": "^1.5.0", + "coveralls": "^3.1.0", + "decimal.js": "10.2.0", + "dirty-chai": "^2.0.1", + "eslint": "^7.21.0", + "eslint-config-prettier": "^8.1.0", + "eslint-plugin-truffle": "^0.3.1", + "ethereumjs-abi": "^0.6.8", + "ethers": "^5.0.19", + "ganache-core": "^2.10.2", + "hardhat": "^2.0.11", + "hardhat-contract-sizer": "^2.0.2", + "hardhat-deploy": "^0.7.0-beta.46", + "hardhat-docgen": "^1.1.1", + "hardhat-gas-reporter": "^1.0.4", + "hardhat-log-remover": "^2.0.0", + "husky": "^4.3.6", + "prettier": "^2.2.1", + "prettier-plugin-solidity": "^1.0.0-beta.2", + "solhint": "^3.0.0", + "solhint-plugin-prettier": "^0.0.4", + "solidity-coverage": "^0.7.13", + "solparse": "^2.2.8", + "sol2uml": "^1.1.17", + "truffle": "^5.1.60" + }, + "scripts": { + "analyze-contracts": "slither .", + "contract-size": "yarn run hardhat size-contracts", + "coverage": "npx hardhat coverage", + "doc": "yarn run hardhat docgen", + "lint": "npm run lint-sol && npm run lint-js", + "lint-sol": "solhint contracts/{*,**/*,**/**/*,**/**/**/*,**/**/**/**/*}.sol", + "lint-js": "eslint . --ext .js", + "prettier": "prettier --write .", + "prettier-check": "prettier --check .", + "test": "npx hardhat test", + "uml": "npx sol2uml ./contracts -o UML.svg" + }, + "husky": { + "hooks": { + "pre-commit": "yarn prettier && yarn lint", + "pre-push": "yarn prettier-check && yarn test" + } + }, + "dependencies": { + "yarn": "^1.22.10" + } +} diff --git a/scripts/origins/README.md b/scripts/origins/README.md new file mode 100644 index 0000000..b65f592 --- /dev/null +++ b/scripts/origins/README.md @@ -0,0 +1,64 @@ +# Script: Origins + +## Origins Platform + +These are the scripts which will be used to deploy the Origins Platform. + +## Prerequisite + +Please fill the below details in mainnet.json (or the corresponding network JSON files): + +- Multisig Owners in `multisigOwners` +- Initial Admin in `initialAdmin`, this should be the EOA which runs this script. Don't forget to remove this address as an admin. It is recommended to use a multisig as the sole admin after initial setup. +- Verifier in `originsVerifiers`, this address will be adding the address list which has to be verified to a particular tier. +- Deposit Address in `depositAddress`, this address will receive the sale proceedings from the sale. Recommended to use a multisig provided by the Token Owners. +- Token Release Time in `waitedTimestamp`, after this time, users who bought tokens in any tier with Transfer Type of Sale anything apart from `Unlocked` will be able to claim/vest their token in Locked Fund Contract. +- Populate the tiers as per the tier details. + +## Steps: + +1. Create a multisig, if not already created. If already created, please add that to `multisig` in the JSON file to the corresponding network. + +To create: + +``` +brownie run scripts/origins/deployMultisig.py --network [ENTER DESIRED NETWORK] +``` + +2. Create the Locked Fund Contract. + +To create: + +``` +brownie run scripts/origins/deployLockedFund.py --network [ENTER DESIRED NETWORK] +``` + +Then select the correct option to deploy Locked Fund Contract. + +3. Create the Origins Platform. + +To create: + +``` +brownie run scripts/origins/deployOrigins.py --network [ENTER DESIRED NETWORK] +``` + +Then select the correct option to deploy Origins. + +4. Once the Origins is created, tiers has to be created. And required things to be set. There is an option when running `deployOrigins` to create tier. Select that, and add the tier ID based on JSON to add the tier in smart contract. + +5. Set the `waitedTS` of Locked Fund. Running the `deployLockedFund` will show an option for the same. + +6. (Optional, this is already done in Step 3) Set the origins as an admin of Locked Fund. Similar to above, running the `deployLockedFund` will show an option for the same. + +7. Now to create tier, you can select the option of Create Tier in the origins script. It will ask for the index, provide that based on the values file tier detail entry. + +8. Other things to do after things are deployed: + - If the verification type is `ByAddress` (Optional): + - Add yourself as a Verifier to verify address. + - Verify Addresses, if the verification type is `ByAddress`. (TODO: Currently it takes all the addresses at once and tries to verify, need to sequentialize that to take X number of wallets at once. A CSV parsed sequential list taker has to be built.) + - Remove yourself as a Verifier. + - Remove yourself as an Owner of Origins Platform. + - Remove yourself as an Owner of Locked Fund. + +Note: There are many other options for the Origins Script, and best to look to it for more in depth detail about each step. diff --git a/scripts/origins/deployLockedFund.py b/scripts/origins/deployLockedFund.py new file mode 100644 index 0000000..6bf4776 --- /dev/null +++ b/scripts/origins/deployLockedFund.py @@ -0,0 +1,154 @@ +from brownie import * + +import time +import json +import csv +import math + +def main(): + loadConfig() + + balanceBefore = acct.balance() + choice() + balanceAfter = acct.balance() + + print("=============================================================") + print("Balance Before: ", balanceBefore) + print("Balance After: ", balanceAfter) + print("Gas Used: ", balanceBefore - balanceAfter) + print("=============================================================") + +# ========================================================================================================================================= +def loadConfig(): + global values, acct, thisNetwork + thisNetwork = network.show_active() + + if thisNetwork == "development": + acct = accounts[0] + configFile = open('./scripts/origins/values/development.json') + elif thisNetwork == "testnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/origins/values/testnet.json') + elif thisNetwork == "rsk-testnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/origins/values/testnet.json') + elif thisNetwork == "rsk-mainnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/origins/values/mainnet.json') + else: + raise Exception("Network not supported.") + + # Load deployment parameters and contracts addresses + values = json.load(configFile) + +# ========================================================================================================================================= +def choice(): + repeat = True + while(repeat): + print("\nOptions:") + print("1 for Deploying Locked Fund.") + print("2 for Adding LockedFund as an Admin of Vesting Registry.") + print("3 for Adding Origins as an Admin.") + print("4 for Removing yourself as an Admin.") + print("5 for Updating Vesting Registry.") + print("6 for Updating waited timestamp.") + print("7 to exit.") + selection = int(input("Enter the choice: ")) + if(selection == 1): + deployLockedFund() + elif(selection == 2): + addLockedFundAsVestingAdmin() + elif(selection == 3): + addOriginsAsAdmin() + elif(selection == 4): + removeMyselfAsAdmin() + elif(selection == 5): + updateVestingRegistry() + elif(selection == 6): + updateWaitedTS() + elif(selection == 7): + repeat = False + else: + print("\nSmarter people have written this, enter valid selection ;)\n") + +# == Locked Fund Deployment =============================================================================================================== +def deployLockedFund(): + waitedTS = values['waitedTimestamp'] + if thisNetwork == "testnet" or thisNetwork == "rsk-testnet": + waitedTS = int(time.time()) + (4*24*60*60) + token = values['token'] + vestingRegistry = values['vestingRegistry'] + adminList = [values['multisig'], acct] + + print("\n=============================================================") + print("Deployment Parameters for LockedFund") + print("=============================================================") + print("Waited Timestamp: ", waitedTS) + print("Token Address: ", token) + print("Vesting Registry: ", vestingRegistry) + print("Admin List: ", adminList) + print("=============================================================") + + lockedFund = acct.deploy(LockedFund, waitedTS, token, vestingRegistry, adminList) + values['lockedFund'] = str(lockedFund.address) + print("\nLocked Fund Deployed.") + + addLockedFundAsVestingAdmin() + updateWaitedTS() + + writeToJSON() + +# ========================================================================================================================================= +def addLockedFundAsVestingAdmin(): + vestingRegistry = Contract.from_abi("VestingRegistry3", address=values['vestingRegistry'], abi=VestingRegistry3.abi, owner=acct) + print("\nAdding LockedFund as an admin of Vesting Registry.\n") + vestingRegistry.addAdmin(values['lockedFund']) + print("\nAdded Locked Fund:",values['lockedFund'],"as the admin of Vesting Registry:", values['vestingRegistry']) + +# ========================================================================================================================================= +def addOriginsAsAdmin(): + lockedFund = Contract.from_abi("LockedFund", address=values['lockedFund'], abi=LockedFund.abi, owner=acct) + print("\nAdding Origins as an admin to LockedFund...\n") + lockedFund.addAdmin(values['origins']) + print("Added Origins as", values['origins'], "as an admin of Locked Fund.") + +# ========================================================================================================================================= +def removeMyselfAsAdmin(): + lockedFund = Contract.from_abi("LockedFund", address=values['lockedFund'], abi=LockedFund.abi, owner=acct) + print("\nRemoving myself as an admin to LockedFund...\n") + lockedFund.removeAdmin(acct) + print("Removed myself as", acct, "as an admin of Locked Fund.") + +# ========================================================================================================================================= +def updateVestingRegistry(): + lockedFund = Contract.from_abi("LockedFund", address=values['lockedFund'], abi=LockedFund.abi, owner=acct) + print("\nUpdating Vesting Registry of LockedFund...\n") + lockedFund.changeVestingRegistry(values['vestingRegistry']) + print("Updated Vesting Registry as", values['vestingRegistry'], "of LockedFund...\n") + +# ========================================================================================================================================= +def updateWaitedTS(): + lockedFund = Contract.from_abi("LockedFund", address=values['lockedFund'], abi=LockedFund.abi, owner=acct) + print("\nUpdating Waited Timestamp of LockedFund...\n") + lockedFund.changeWaitedTS(values['waitedTimestamp']) + print("Updated Waited Timestamp as", values['waitedTimestamp'], "of LockedFund...\n") + +# ========================================================================================================================================= +def writeToJSON(): + if thisNetwork == "development": + fileHandle = open('./scripts/origins/values/development.json', "w") + elif thisNetwork == "testnet" or thisNetwork == "rsk-testnet": + fileHandle = open('./scripts/origins/values/testnet.json', "w") + elif thisNetwork == "rsk-mainnet": + fileHandle = open('./scripts/origins/values/mainnet.json', "w") + json.dump(values, fileHandle, indent=4) + +# ========================================================================================================================================= +def waitTime(): + if(thisNetwork != "development"): + print("\nWaiting for 30 seconds for the node to propogate correctly...\n") + time.sleep(15) + print("Just 15 more seconds...\n") + time.sleep(10) + print("5 more seconds I promise...\n") + time.sleep(5) diff --git a/scripts/origins/deployMultisig.py b/scripts/origins/deployMultisig.py new file mode 100644 index 0000000..c0dd06a --- /dev/null +++ b/scripts/origins/deployMultisig.py @@ -0,0 +1,74 @@ +from brownie import * +import json + +def main(): + loadConfig() + + balanceBefore = acct.balance() + # Function Call + deployMultisig() + balanceAfter = acct.balance() + + print("=============================================================") + print("Balance Before: ", balanceBefore) + print("Balance After: ", balanceAfter) + print("Gas Used: ", balanceBefore - balanceAfter) + print("=============================================================") + +# ========================================================================================================================================= +def loadConfig(): + global values, acct, thisNetwork + thisNetwork = network.show_active() + + if thisNetwork == "development": + acct = accounts[0] + configFile = open('./scripts/origins/values/development.json') + elif thisNetwork == "testnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/origins/values/testnet.json') + elif thisNetwork == "rsk-testnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/origins/values/testnet.json') + elif thisNetwork == "rsk-mainnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/origins/values/mainnet.json') + else: + raise Exception("Network not supported") + + # Load values & deployed contracts addresses. + values = json.load(configFile) + +# == Multisig Deployment ================================================================================================================== +def deployMultisig(): + owners = values["multisigOwners"] + requiredConf = 1 + if network.show_active() == "mainnet": + requiredConf = int(len(owners)/2 + 1) + print("=============================================================") + print("Deployment Parameters") + print("=============================================================") + print("Multisig Owners: ", owners) + print("Required Confirmations: ", requiredConf) + print("=============================================================") + + print("Deploying the multisig...\n") + multisig = acct.deploy(MultiSigWallet, owners, requiredConf) + print("=============================================================") + print("Deployed Details") + print("=============================================================") + print("Multisig Address: ", multisig) + print("=============================================================") + + # Updating the JSON Values. + values["multisig"] = str(multisig) + writeToJSON() + +# ========================================================================================================================================= +def writeToJSON(): + if thisNetwork == "development": + fileHandle = open('./scripts/origins/values/development.json', "w") + elif thisNetwork == "testnet" or thisNetwork == "rsk-testnet": + fileHandle = open('./scripts/origins/values/testnet.json', "w") + elif thisNetwork == "rsk-mainnet": + fileHandle = open('./scripts/origins/values/mainnet.json', "w") + json.dump(values, fileHandle, indent=4) diff --git a/scripts/origins/deployOrigins.py b/scripts/origins/deployOrigins.py new file mode 100644 index 0000000..5bd17a1 --- /dev/null +++ b/scripts/origins/deployOrigins.py @@ -0,0 +1,498 @@ +from brownie import * + +import time +import json +import sys +import csv +import math + +def main(): + loadConfig() + + balanceBefore = acct.balance() + choice() + balanceAfter = acct.balance() + + print("=============================================================") + print("Balance Before: ", balanceBefore) + print("Balance After: ", balanceAfter) + print("Gas Used: ", balanceBefore - balanceAfter) + print("=============================================================") + +# ========================================================================================================================================= +def loadConfig(): + global values, acct, thisNetwork + thisNetwork = network.show_active() + + if thisNetwork == "development": + acct = accounts[0] + configFile = open('./scripts/origins/values/development.json') + elif thisNetwork == "testnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/origins/values/testnet.json') + elif thisNetwork == "rsk-testnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/origins/values/testnet.json') + elif thisNetwork == "rsk-mainnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/origins/values/mainnet.json') + else: + raise Exception("Network not supported.") + + # Load deployment parameters and contracts addresses + values = json.load(configFile) + +# ========================================================================================================================================= +def choice(): + repeat = True + while(repeat): + print("\nOptions:") + print("1 for Deploying Origins.") + print("2 for Updating/Adding Deposit Address.") + print("3 for Setting Locked Fund.") + print("4 for Creating a new Tier.") + print("5 for Setting Tier Verification.") + print("6 for Setting Tier Deposit Parameters.") + print("7 for Setting Tier Token Limit Parameters.") + print("8 for Setting Tier Token Amount Parameters.") + print("9 for Setting Tier Vest or Lock Parameters.") + print("10 for Setting Tier Time Parameters.") + print("11 for Buying Tokens.") + print("12 for Adding Myself as a Verifier.") + print("13 for Verified my wallet with Tier ID") + print("14 for Verifying Wallet List with Tier ID") + print("15 for Removing Myself as an Owner.") + print("16 for Removing Myself as a Verifier.") + print("17 for getting the Tier Count.") + print("18 for getting the Tier Details.") + print("19 for getting the Owner Details.") + print("20 for getting the Verifier Details.") + print("21 to exit.") + selection = int(input("Enter the choice: ")) + if(selection == 1): + deployOrigins() + elif(selection == 2): + updateDepositAddress() + elif(selection == 3): + updateLockedFund() + elif(selection == 4): + createNewTier() + elif(selection == 5): + setTierVerification() + elif(selection == 6): + setTierDeposit() + elif(selection == 7): + setTierTokenLimit() + elif(selection == 8): + setTierTokenAmount() + elif(selection == 9): + setTierVestOrLock() + elif(selection == 10): + setTierTime() + elif(selection == 11): + buyTokens() + elif(selection == 12): + addMyselfAsVerifier() + elif(selection == 13): + verifyMyWallet() + elif(selection == 14): + verifyWalletList() + elif(selection == 15): + removeMyselfAsOwner() + elif(selection == 16): + removeMyselfAsVerifier() + elif(selection == 17): + getTierCount() + elif(selection == 18): + getTierDetails() + elif(selection == 19): + getOwnerList() + elif(selection == 20): + getVerifierList() + elif(selection == 21): + repeat = False + else: + print("\nSmarter people have written this, enter valid selection ;)\n") + +# ========================================================================================================================================= +def deployOrigins(): + adminList = [values['multisig'], acct] + token = values['token'] + depositAddress = values['depositAddress'] + + print("\n=============================================================") + print("Deployment Parameters for Origins") + print("=============================================================") + print("Admin List: ", adminList) + print("Token Address: ", token) + print("Deposit Address: ", depositAddress) + print("=============================================================") + + origins = acct.deploy(OriginsBase, adminList, token, depositAddress) + + print("\nOrigins Deployed.") + + values['origins'] = str(origins) + writeToJSON() + + updateLockedFund() + + lockedFund = Contract.from_abi("LockedFund", address=values['lockedFund'], abi=LockedFund.abi, owner=acct) + print("\nAdding Origins as an admin to LockedFund...\n") + lockedFund.addAdmin(values['origins']) + print("Added Origins as", values['origins'], " as an admin of Locked Fund.") + + addMyselfAsVerifier() + + getOwnerList() + getVerifierList() + + # For easy deployment uncomment below three lines. + # createNewTier() + # createNewTier() + # verifyWallet() + +# ========================================================================================================================================= +def updateDepositAddress(): + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + print("\nUpdating Deposit Address of Origins...\n") + origins.setDepositAddress(values['depositAddress']) + print("Updated Deposit Address as", values['depositAddress'], " of Origins...\n") + +# ========================================================================================================================================= +def updateLockedFund(): + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + print("\nUpdating Locked Fund Contract Address of Origins...\n") + origins.setLockedFund(values['lockedFund']) + print("Updated Locked Fund Contract Address as", values['lockedFund'], " of Origins...\n") + +# ========================================================================================================================================= +def readTier(reason): + print("\nIf you want to",reason,"the first tier, i.e. Index = 1 in JSON `tiers`, enter 1.") + tierID = int(input("Enter the Tier ID (Based on JSON File): ")) + return tierID + +# ========================================================================================================================================= +def getDepositType(depositType): + if depositType == 0: + return "RBTC" + elif depositType == 1: + return "Token" + else: + return "Invalid Entry!" + +# ========================================================================================================================================= +def getVerificationType(verificationType): + if verificationType == 0: + return "None" + elif verificationType == 1: + return "Everyone" + elif verificationType == 2: + return "ByAddress" + else: + return "Invalid Entry!" + +# ========================================================================================================================================= +def getSaleEndDurationOrTS(saleEndDurationOrTimestamp): + if saleEndDurationOrTimestamp == 0: + return "None" + elif saleEndDurationOrTimestamp == 1: + return "UntilSupply" + elif saleEndDurationOrTimestamp == 2: + return "Duration" + elif saleEndDurationOrTimestamp == 3: + return "Timestamp" + else: + return "Invalid Entry!" + +# ========================================================================================================================================= +def getTransferType(transferType): + if transferType == 0: + return "None" + elif transferType == 1: + return "Unlocked" + elif transferType == 2: + return "WaitedUnlock" + elif transferType == 3: + return "Vested" + elif transferType == 4: + return "Locked" + else: + return "Invalid Entry!" + +# ========================================================================================================================================= +def makeAllowance(tokenObj, spender, amount): + print("\nChecking if enough token balance if there.") + bal = tokenObj.balanceOf(acct) + if(bal < amount): + print("\nNot enough token balance available for creating tier.") + sys.exit() + print("\nBalance:",bal) + print("\nApproving Token Transfer from", acct, " to", spender) + tokenObj.approve(spender, amount) + print("Token Transfer Approved...") + +# ========================================================================================================================================= +def checkAllowance(tokenObj, spender, amount): + if(tokenObj.allowance(acct, spender) < amount): + if thisNetwork == "rsk-mainnet": + print("\nNot enough token approved. Please approve the spender.") + print("1 for approve.") + print("Anything else for exit.") + selection = int(input("Enter Choice: ")) + if(selection == 1): + makeAllowance(tokenObj, spender, amount) + else: + sys.exit() + else: + makeAllowance(tokenObj, spender, amount) + +# ========================================================================================================================================= +def createNewTier(): + tierID = readTier("add") + + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + + # IMPORTANT TODO: It is removed for the current sale, but has to be reimplemented in the future. + # minAmount = values['tiers'][tierID]['minimumAmount'] + + maxAmount = values['tiers'][tierID]['maximumAmount'] + tokensForSale = int(values['tiers'][tierID]['tokensForSale']) + decimal = int(values['decimal']) + remainingTokens = tokensForSale * (10 ** decimal) + saleStartTimestamp = values['tiers'][tierID]['saleStartTimestamp'] + saleEnd = values['tiers'][tierID]['saleEnd'] + + # IMPORTANT TODO: This needs to be changed in the future when adding Origins the capability + # to call the Locked Fund Contract to set the waitedTS. + # unlockedTS = values['waitedTimestamp'] + + unlockedBP = values['tiers'][tierID]['unlockedBP'] + vestOrLockCliff = values['tiers'][tierID]['vestOrLockCliff'] + vestOrLockDuration = values['tiers'][tierID]['vestOrLockDuration'] + depositRate = values['tiers'][tierID]['depositRate'] + + # IMPORTANT TODO: It is removed for the current sale, but has to be reimplemented in the future. + # depositToken = values['tiers'][tierID]['depositToken'] + + depositType = values['tiers'][tierID]['depositType'] + depositTypeReadable = getDepositType(int(depositType)) + verificationType = values['tiers'][tierID]['verificationType'] + verificationTypeReadable = getVerificationType(int(verificationType)) + saleEndDurationOrTimestamp = values['tiers'][tierID]['saleEndDurationOrTimestamp'] + saleEndDurationOrTimestampReadable = getSaleEndDurationOrTS(int(saleEndDurationOrTimestamp)) + transferType = values['tiers'][tierID]['transferType'] + transferTypeReadable = getTransferType(int(transferType)) + + print("\n=============================================================") + print("Tier Parameters:") + print("=============================================================") + # print("Minimum allowed asset: ", minAmount) + print("Maximum allowed asset: ", maxAmount) + print("Tokens For Sale (with Decimal): ", tokensForSale) + print("Tokens For Sale (without Decimal): ", remainingTokens) + print("Sale Start Timestamp: ", saleStartTimestamp) + print("Sale End Duration/Timestamp: ", saleEnd) + # print("Unlocked Token Timestamp: ", unlockedTS) + print("Unlocked Token Basis Point: ", unlockedBP) + print("Vest Or Lock Cliff: ", vestOrLockCliff) + print("Vest Or Lock Duration: ", vestOrLockDuration) + print("Deposit Rate: ", depositRate) + # print("Deposit Token: ", depositToken) + print("Deposit Type: ", depositTypeReadable) + print("Verification Type: ", verificationTypeReadable) + print("Sale End Duration or Timestamp: ", saleEndDurationOrTimestampReadable) + print("Transfer Type: ", transferTypeReadable) + print("=============================================================") + + if(depositTypeReadable == "Invalid Entry!" or verificationTypeReadable == "Invalid Entry!" or saleEndDurationOrTimestampReadable == "Invalid Entry!" or transferTypeReadable == "Invalid Entry!"): + print("\nPlease check the types and tier parameters.") + sys.exit() + + token = Contract.from_abi("Token", address=values['token'], abi=Token.abi, owner=acct) + checkAllowance(token, origins.address, remainingTokens) + + balance = token.balanceOf(acct) + print("\nCurrent User Token Balance:",balance) + + print("\nCreating new tier...") + # Based on the new parameters added on the TODO above, need to add the parameters here as well. + origins.createTier(maxAmount, remainingTokens, saleStartTimestamp, saleEnd, unlockedBP, vestOrLockCliff, vestOrLockDuration, depositRate, depositType, verificationType, saleEndDurationOrTimestamp, transferType) + + balance = token.balanceOf(acct) + print("Updated User Token Balance:",balance) + +# ========================================================================================================================================= +def setTierVerification(): + tierID = readTier("edit") + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + origins.setTierVerification(tierID, values['tiers'][tierID]['verificationType']) + print("Tier Verification Updated.") + +# ========================================================================================================================================= +def setTierDeposit(): + tierID = readTier("edit") + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + origins.setTierDeposit(tierID, values['tiers'][tierID]['depositRate'], values['tiers'][tierID]['depositToken'], values['tiers'][tierID]['depositType']) + print("Tier Deposit Updated.") + +# ========================================================================================================================================= +def setTierTokenLimit(): + tierID = readTier("edit") + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + origins.setTierTokenLimit(tierID, values['tiers'][tierID]['minimumAmount'], values['tiers'][tierID]['maximumAmount']) + print("Tier Token Limit Updated.") + +# ========================================================================================================================================= +def setTierTokenAmount(): + tierID = readTier("edit") + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + tokensForSale = int(values['tiers'][tierID]['tokensForSale']) + decimal = int(values['decimal']) + remainingTokens = tokensForSale * (10 ** decimal) + origins.setTierTokenAmount(tierID, remainingTokens) + print("Tier Token Amount Updated.") + +# ========================================================================================================================================= +def setTierVestOrLock(): + tierID = readTier("edit") + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + origins.setTierVestOrLock(tierID, values['tiers'][tierID]['vestOrLockCliff'], values['tiers'][tierID]['vestOrLockDuration'], values['tiers'][tierID]['unlockedBP'], values['tiers'][tierID]['transferType']) + print("Tier Vest or Lock Updated.") + +# ========================================================================================================================================= +def setTierTime(): + tierID = readTier("edit") + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + origins.setTierTime(tierID, values['tiers'][tierID]['saleStartTimestamp'], values['tiers'][tierID]['saleEnd'], values['tiers'][tierID]['saleEndDurationOrTimestamp']) + print("Tier Time Updated.") + +# ========================================================================================================================================= +def buyTokens(): + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + tierID = readTier("buy tokens in") + amount = 0 + rbtcAmount = 0 + print("\nIf you want to send just `X` RBTC/Token, put 1 itself, (X * (10 ** Decimals)) is done behind the screen.") + amount = float(input("Enter the amount of tokens/RBTC you want to send: ")) + if(values['tiers'][tierID]['depositToken'] != '0x0000000000000000000000000000000000000000'): + token = Contract.from_abi("Token", address=values['tiers'][tierID]['depositToken'], abi=Token.abi, owner=acct) + decimal = token.decimals() + amount = amount * (10 ** decimal) + checkAllowance(token, origins.address, amount) + else: + decimal = 18 + amount = amount * (10 ** decimal) + rbtcAmount = amount + origins.buy(tierID, amount, {'value':rbtcAmount}) + +# ========================================================================================================================================= +def addMyselfAsVerifier(): + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + print("\nAdding myself as a Verifier...\n") + origins.addVerifier(acct) + print("Added",acct,"as a verifier.") + +# ========================================================================================================================================= +def verifyMyWallet(): + tierID = readTier("verify my wallet to") + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + origins.addressVerification(acct, tierID) + print("My address is Verified.") + +def verifyWalletList(): + tierID = readTier("verify the wallet list to") + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + origins.multipleAddressSingleTierVerification(values['toVerify'], tierID) + print("All the address Verified.") + +# ========================================================================================================================================= +def removeMyselfAsVerifier(): + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + print("\nRemoving myself as a Verifier...\n") + origins.removeVerifier(acct) + print("Removed myself as a Verifier.") + +# ========================================================================================================================================= +def removeMyselfAsOwner(): + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + print("\nRemoving myself as an Owner...") + origins.removeOwner(acct) + print("Removed myself as an Owner.") + +# ========================================================================================================================================= +def getTierCount(): + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + print("\n=============================================================") + print("Tier Count:",origins.getTierCount()) + print("=============================================================") + +# ========================================================================================================================================= +def getTierDetails(): + # Here +1 is added because readTier will return 0 for entering 1. The index in Smart Contract is 1 itself, unlike the JSON file. + tierID = readTier("read") + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + + minAmount, maxAmount, remainingTokens, saleStartTimestamp, saleEnd, unlockedBP, vestOrLockCliff, vestOrLockDuration, depositRate = origins.readTierPartA(tierID) + depositToken, depositType, verificationType, saleEndDurationOrTimestamp, transferType = origins.readTierPartB(tierID) + + decimal = int(values['decimal']) + tokensForSale = remainingTokens / (10 ** decimal) + depositTypeReadable = getDepositType(int(depositType)) + verificationTypeReadable = getVerificationType(int(verificationType)) + saleEndDurationOrTimestampReadable = getSaleEndDurationOrTS(int(saleEndDurationOrTimestamp)) + transferTypeReadable = getTransferType(int(transferType)) + + print("\n=============================================================") + print("Tier Details of Tier ID",tierID) + print("=============================================================") + print("Minimum allowed asset: ", minAmount) + print("Maximum allowed asset: ", maxAmount) + print("Tokens For Sale (with Decimal): ", tokensForSale) + print("Tokens For Sale (without Decimal): ", remainingTokens) + print("Sale Start Timestamp: ", saleStartTimestamp) + print("Sale End Duration/Timestamp: ", saleEnd) + print("Unlocked Token Basis Point: ", unlockedBP) + print("Vest Or Lock Cliff: ", vestOrLockCliff) + print("Vest Or Lock Duration: ", vestOrLockDuration) + print("Deposit Rate: ", depositRate) + print("Deposit Token: ", depositToken) + print("Deposit Type: ", depositTypeReadable) + print("Verification Type: ", verificationTypeReadable) + print("Sale End Duration or Timestamp: ", saleEndDurationOrTimestampReadable) + print("Transfer Type: ", transferTypeReadable) + print("=============================================================") + +# ========================================================================================================================================= +def getOwnerList(): + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + print("\n=============================================================") + print("Owner List: ",origins.getOwners()) + print("=============================================================") + +# ========================================================================================================================================= +def getVerifierList(): + origins = Contract.from_abi("OriginsBase", address=values['origins'], abi=OriginsBase.abi, owner=acct) + print("\n=============================================================") + print("Verifier List: ",origins.getVerifiers()) + print("=============================================================") + +# ========================================================================================================================================= +def writeToJSON(): + if thisNetwork == "development": + fileHandle = open('./scripts/origins/values/development.json', "w") + elif thisNetwork == "testnet" or thisNetwork == "rsk-testnet": + fileHandle = open('./scripts/origins/values/testnet.json', "w") + elif thisNetwork == "rsk-mainnet": + fileHandle = open('./scripts/origins/values/mainnet.json', "w") + json.dump(values, fileHandle, indent=4) + +# ========================================================================================================================================= +def waitTime(): + if(thisNetwork != "development"): + print("\nWaiting for 30 seconds for the node to propogate correctly...\n") + time.sleep(15) + print("Just 15 more seconds...\n") + time.sleep(10) + print("5 more seconds I promise...\n") + time.sleep(5) diff --git a/scripts/origins/values/development.json b/scripts/origins/values/development.json new file mode 100644 index 0000000..4aaad29 --- /dev/null +++ b/scripts/origins/values/development.json @@ -0,0 +1,67 @@ +{ + "token": "0xBcb61491F1859f53438918F1A5aFCA542Af9D397", + "decimal": "18", + "multisigOwners": [ + "0x4C3d3505d34213751c4b4d621cB6bDe7E664E222", + "0xb1c5C1B84E33CD32a153f1eB120e9Bd7109cc435", + "0xe1a148735f07bc5fe7cfb60499d325c8380488a8" + ], + "multisig": "0x42E8D004c84E6B5Bad559D3b5CE7947AADb9E0bc", + "originsVerifiers": ["0x4C3d3505d34213751c4b4d621cB6bDe7E664E222", "0xb1c5C1B84E33CD32a153f1eB120e9Bd7109cc435"], + "depositAddress": "0x9Cf4CC7185E957C63f0BA6a4D793F594c702AD66", + "waitedTimestamp": "1626270000", + "vestingRegistry": "0xA95916C3D979400C7443961330b3092510a229Ba", + "origins": "0x34b97ffa01dc0DC959c5f1176273D0de3be914C1", + "lockedFund": "0xF06D5f5BfFFCB6a52c84cfebc03AD35637728E73", + "tiers": [ + { + "DONT_DELETE_THIS": "This acts as the zero index entry in SC which has to be skipped." + }, + { + "minimumAmount": "1", + "maximumAmount": "50000000000000000", + "tokensForSale": "11508000", + "saleStartTimestamp": "1626270000", + "saleEnd": "259200", + "unlockedBP": "0", + "vestOrLockCliff": "1", + "vestOrLockDuration": "11", + "depositRate": "100", + "depositToken": "0x0000000000000000000000000000000000000000", + "depositType": "0", + "verificationType": "2", + "saleEndDurationOrTimestamp": "2", + "transferType": "3" + }, + { + "minimumAmount": "1", + "maximumAmount": "75000000000000000", + "tokensForSale": "20000000", + "saleStartTimestamp": "1626270000", + "saleEnd": "259200", + "unlockedBP": "5000", + "vestOrLockCliff": "1", + "vestOrLockDuration": "11", + "depositRate": "50", + "depositToken": "0x0000000000000000000000000000000000000000", + "depositType": "0", + "verificationType": "1", + "saleEndDurationOrTimestamp": "2", + "transferType": "3" + } + ], + "toVerify": [ + "0x531FFAb0A033707f3794222b9ba6c64D0099374A", + "0x54b8Aef719B63Ef9354b618AC1828b71EE6e496D", + "0xa41f08993b6d4dE3281F31492F7a93D6F403806B", + "0xdd771DdF2e13632ECccC4057690e35338b20FdF3", + "0x7d20eaa96aDbFe158C222210E7A8c05c44Da9d15", + "0x2bD2201bfe156a71EB0d02837172FFc237218505", + "0xA987a709f4A93eC25738FeC0F8d6189260459ed7", + "0xAB3d3DB6c8AF12B47a249451AAAde546a1A617Ea", + "0x48343139f46EA80422F7820cC0eBE5B77bbB1818", + "0xCB1857547a18837155694b4E267d3C64e677A2Ed", + "0x01e1205a5c3B6ffa3859Ab8E18134763132A422A" + ], + "verified": [] +} diff --git a/scripts/origins/values/mainnet.json b/scripts/origins/values/mainnet.json new file mode 100644 index 0000000..935ce9d --- /dev/null +++ b/scripts/origins/values/mainnet.json @@ -0,0 +1,51 @@ +{ + "token": "0xF769f619E3b9DBCd552E62dF217D5DC095f6a42b", + "decimal": "18", + "multisigOwners": ["", "0xb1c5C1B84E33CD32a153f1eB120e9Bd7109cc435", "0xe1a148735f07bc5fe7cfb60499d325c8380488a8"], + "multisig": "0x8f2608FA847A37989Df18E008ed476569AfE21D0", + "originsVerifiers": ["0x4C3d3505d34213751c4b4d621cB6bDe7E664E222"], + "depositAddress": "", + "waitedTimestamp": "", + "vestingRegistry": "", + "origins": "", + "lockedFund": "", + "tiers": [ + { + "DONT_DELETE_THIS": "This acts as the zero index entry in SC which has to be skipped." + }, + { + "minimumAmount": "", + "maximumAmount": "", + "tokensForSale": "11508000", + "saleStartTimestamp": "0", + "saleEnd": "172800", + "unlockedBP": "0", + "vestOrLockCliff": "1", + "vestOrLockDuration": "11", + "depositRate": "100", + "depositToken": "0x0000000000000000000000000000000000000000", + "depositType": "0", + "verificationType": "2", + "saleEndDurationOrTimestamp": "2", + "transferType": "3" + }, + { + "minimumAmount": "", + "maximumAmount": "", + "tokensForSale": "20000000", + "saleStartTimestamp": "0", + "saleEnd": "172800", + "unlockedBP": "5000", + "vestOrLockCliff": "1", + "vestOrLockDuration": "11", + "depositRate": "50", + "depositToken": "0x0000000000000000000000000000000000000000", + "depositType": "0", + "verificationType": "1", + "saleEndDurationOrTimestamp": "2", + "transferType": "3" + } + ], + "toVerify": [], + "verified": [] +} diff --git a/scripts/origins/values/testnet.json b/scripts/origins/values/testnet.json new file mode 100644 index 0000000..8a8db13 --- /dev/null +++ b/scripts/origins/values/testnet.json @@ -0,0 +1,67 @@ +{ + "token": "0xF769f619E3b9DBCd552E62dF217D5DC095f6a42b", + "decimal": "18", + "multisigOwners": [ + "0x4C3d3505d34213751c4b4d621cB6bDe7E664E222", + "0xb1c5C1B84E33CD32a153f1eB120e9Bd7109cc435", + "0xe1a148735f07bc5fe7cfb60499d325c8380488a8" + ], + "multisig": "0x8f2608FA847A37989Df18E008ed476569AfE21D0", + "originsVerifiers": ["0x4C3d3505d34213751c4b4d621cB6bDe7E664E222", "0xb1c5C1B84E33CD32a153f1eB120e9Bd7109cc435"], + "depositAddress": "0x9Cf4CC7185E957C63f0BA6a4D793F594c702AD66", + "waitedTimestamp": "1627837200", + "vestingRegistry": "0xE402a46F372a461dD19ed34453253a0B5D1e0509", + "origins": "0xf4963730a7A1E1aA06E01A0C70Ae465Ba7C4a9E3", + "lockedFund": "0x0188907C12ddE77ddD41500Ae7263aD6BF243B29", + "tiers": [ + { + "DONT_DELETE_THIS": "This acts as the zero index entry in SC which has to be skipped." + }, + { + "minimumAmount": "1", + "maximumAmount": "50000000000000000", + "tokensForSale": "11508000", + "saleStartTimestamp": "1624473000", + "saleEnd": "259200", + "unlockedBP": "0", + "vestOrLockCliff": "1", + "vestOrLockDuration": "11", + "depositRate": "100", + "depositToken": "0x0000000000000000000000000000000000000000", + "depositType": "0", + "verificationType": "2", + "saleEndDurationOrTimestamp": "2", + "transferType": "3" + }, + { + "minimumAmount": "1", + "maximumAmount": "75000000000000000", + "tokensForSale": "20000000", + "saleStartTimestamp": "1624732200", + "saleEnd": "259200", + "unlockedBP": "5000", + "vestOrLockCliff": "1", + "vestOrLockDuration": "11", + "depositRate": "50", + "depositToken": "0x0000000000000000000000000000000000000000", + "depositType": "0", + "verificationType": "1", + "saleEndDurationOrTimestamp": "2", + "transferType": "3" + } + ], + "toVerify": [ + "0x531FFAb0A033707f3794222b9ba6c64D0099374A", + "0x54b8Aef719B63Ef9354b618AC1828b71EE6e496D", + "0xa41f08993b6d4dE3281F31492F7a93D6F403806B", + "0xdd771DdF2e13632ECccC4057690e35338b20FdF3", + "0x7d20eaa96aDbFe158C222210E7A8c05c44Da9d15", + "0x2bD2201bfe156a71EB0d02837172FFc237218505", + "0xA987a709f4A93eC25738FeC0F8d6189260459ed7", + "0xAB3d3DB6c8AF12B47a249451AAAde546a1A617Ea", + "0x48343139f46EA80422F7820cC0eBE5B77bbB1818", + "0xCB1857547a18837155694b4E267d3C64e677A2Ed", + "0x01e1205a5c3B6ffa3859Ab8E18134763132A422A" + ], + "verified": [] +} diff --git a/scripts/token/README.md b/scripts/token/README.md new file mode 100644 index 0000000..7e6b16a --- /dev/null +++ b/scripts/token/README.md @@ -0,0 +1,57 @@ +# Script: Token + +## Token Sale + +Origins Platform requires a token for the sale. If the project for which the origins are used does not want to create their own token, this script can be used to create the token as well as it's corresponding governance, staking and vesting. + +### Pre-requisite + +Please fill the below details in mainnet.json (or the corresponding network JSON files): + +- Token Parameters like Name, Symbol, Decimal and Amount in `tokenName, tokenSymbol, tokenDecimal and tokenAmount`. + +IMPORTANT: Token Amount is multiplied by 10 raise to the number of decimals. So, if a token with 100 Million supply has to be created, the amount should be 100 Million and the decimals should be mentioned as required, the rest script will take care. + +- Add multisig owners in `multisigOwners`. + +- All the other values, including some of the values (token address) in origins folder of script gets populated automatically. + +### Deployment + +1. Run deploy_Token.py (Don't forget to transfer ownership of token after everything is done.) + +``` +brownie run scripts/token/deployToken.py --network [ENTER DESIRED NETWORK] +``` + +It will ask for a choice between deployment and transfer of ownership. Initially we select deployment. After running step 2, we can go forward to transferring ownership anytime we want. + +The deployment will take: + +- the token name from `tokenName` +- the token symbol from `tokenSymbol` +- the token amount from `tokenAmount` +- the decimals from `tokenDecimal` + from the JSON files. `Amount * (10 ** Decimals)` will be done by the script. + +It will also update the testnet/mainnet JSON file with the new contract addresses as well. + +2. Run deploy_multisig.py + +``` +brownie run scripts/token/deployMultisig.py --network [ENTER DESIRED NETWORK] +``` + +NOTE: Before deploying, please make sure you add the correct key holders into `multisigOwners` in the JSON file based on the network. + +The multisig will be the owner of Token when running the Transfer Ownership in `deployToken.py` also will be the owner of the Governance, Staking, etc. + +3. Run deploy_stake_and_vest.py + +``` +brownie run scripts/token/deployStakeAndVest.py --network [ENTER DESIRED NETWORK] +``` + +This will create the staking and vesting. + +Important: It does not deploy feeSharing, as for FISH sale the governance was not deployed, thus for feeSharing, the address is taken from JSON and a dummy address is passed. diff --git a/scripts/token/deployMultisig.py b/scripts/token/deployMultisig.py new file mode 100644 index 0000000..612ae50 --- /dev/null +++ b/scripts/token/deployMultisig.py @@ -0,0 +1,72 @@ +from brownie import * +import json + +def main(): + loadConfig() + + balanceBefore = acct.balance() + deployMultisig() + balanceAfter = acct.balance() + + print("=============================================================") + print("Balance Before: ", balanceBefore) + print("Balance After: ", balanceAfter) + print("Gas Used: ", balanceBefore - balanceAfter) + print("=============================================================") + +# ========================================================================================================================================= +def loadConfig(): + global values, acct, thisNetwork + thisNetwork = network.show_active() + + if thisNetwork == "development": + acct = accounts[0] + configFile = open('./scripts/token/values/development.json') + elif thisNetwork == "testnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/token/values/testnet.json') + elif thisNetwork == "rsk-testnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/token/values/testnet.json') + elif thisNetwork == "rsk-mainnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/token/values/mainnet.json') + else: + raise Exception("Network not supported") + + # Load values & deployed contracts addresses. + values = json.load(configFile) + +# ========================================================================================================================================= +def deployMultisig(): + owners = values["multisigOwners"] + if network.show_active() == "development": + owners[0] = acct.address + requiredConf = 1 + if network.show_active() == "mainnet": + requiredConf = int(len(owners)/2 + 1) + print("=============================================================") + print("Deployment Parameters") + print("=============================================================") + print("Multisig Owners: ", owners) + print("Required Confirmations: ", requiredConf) + print("=============================================================") + + multisig = acct.deploy(MultiSigWallet, owners, requiredConf) + print("=============================================================") + print("Deployed Details") + print("=============================================================") + print("Multisig Address: ", multisig) + print("=============================================================") + values["multisig"] = str(multisig) + writeToJSON() + +# ========================================================================================================================================= +def writeToJSON(): + if thisNetwork == "development": + fileHandle = open('./scripts/token/values/development.json', "w") + elif thisNetwork == "testnet" or thisNetwork == "rsk-testnet": + fileHandle = open('./scripts/token/values/testnet.json', "w") + elif thisNetwork == "rsk-mainnet": + fileHandle = open('./scripts/token/values/mainnet.json', "w") + json.dump(values, fileHandle, indent=4) diff --git a/scripts/token/deployStakeAndVest.py b/scripts/token/deployStakeAndVest.py new file mode 100644 index 0000000..fa7891f --- /dev/null +++ b/scripts/token/deployStakeAndVest.py @@ -0,0 +1,94 @@ +from brownie import * +import json + +def main(): + loadConfig() + + balanceBefore = acct.balance() + deployStakingAndVesting() + balanceAfter = acct.balance() + + print("=============================================================") + print("Balance Before: ", balanceBefore) + print("Balance After: ", balanceAfter) + print("Gas Used: ", balanceBefore - balanceAfter) + print("=============================================================") + +# ========================================================================================================================================= +def loadConfig(): + global values, origins, acct, thisNetwork + thisNetwork = network.show_active() + + if thisNetwork == "development": + acct = accounts[0] + configFile = open('./scripts/token/values/development.json') + originsFile = open('./scripts/origins/values/development.json') + elif thisNetwork == "testnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/token/values/testnet.json') + originsFile = open('./scripts/origins/values/testnet.json') + elif thisNetwork == "rsk-testnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/token/values/testnet.json') + originsFile = open('./scripts/origins/values/testnet.json') + elif thisNetwork == "rsk-mainnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/token/values/mainnet.json') + originsFile = open('./scripts/origins/values/mainnet.json') + else: + raise Exception("Network not supported") + + # Load values & deployed contracts addresses. + values = json.load(configFile) + origins = json.load(originsFile) + +# ========================================================================================================================================= +def deployStakingAndVesting(): + multisig = values["multisig"] + token = values["Token"] + feeSharing = values["feeSharing"] + + print("\nDeploying the staking logic...\n") + stakingLogic = acct.deploy(Staking) + values["stakingLogic"] = str(stakingLogic) + + print("Deploying the staking proxy...\n") + staking = acct.deploy(StakingProxy, token) + values["staking"] = str(staking) + + print("Setting the staking logic to proxy...\n") + staking.setImplementation(stakingLogic.address) + staking = Contract.from_abi("Staking", address=staking.address, abi=Staking.abi, owner=acct) + + print("Setting the Fee Sharing into Staking...\n") + staking.setFeeSharing(feeSharing) + + print("Deploying the vesting logic...\n") + vestingLogic = acct.deploy(VestingLogic) + values["vestingLogic"] = str(vestingLogic) + + print("Deploying the vesting factory...\n") + vestingFactory = acct.deploy(VestingFactory, vestingLogic.address) + values["vestingFactory"] = str(vestingFactory) + + print("Deploying the vesting registry...\n") + vestingRegistry = acct.deploy(VestingRegistry3, vestingFactory.address, token, staking.address, feeSharing, multisig) + values["vestingRegistry"] = str(vestingRegistry) + origins["vestingRegistry"] = str(vestingRegistry) + + print("Almost finished, writing the values to json.") + writeToJSON() + +# ========================================================================================================================================= +def writeToJSON(): + if thisNetwork == "development": + tokenHandle = open('./scripts/token/values/development.json', "w") + originsHandle = open('./scripts/origins/values/development.json', "w") + elif thisNetwork == "testnet" or thisNetwork == "rsk-testnet": + tokenHandle = open('./scripts/token/values/testnet.json', "w") + originsHandle = open('./scripts/origins/values/testnet.json', "w") + elif thisNetwork == "rsk-mainnet": + tokenHandle = open('./scripts/token/values/mainnet.json', "w") + originsHandle = open('./scripts/origins/values/mainnet.json', "w") + json.dump(values, tokenHandle, indent=4) + json.dump(origins, originsHandle, indent=4) diff --git a/scripts/token/deployToken.py b/scripts/token/deployToken.py new file mode 100644 index 0000000..60255f5 --- /dev/null +++ b/scripts/token/deployToken.py @@ -0,0 +1,129 @@ +from brownie import * +import json +import time + +def main(): + loadConfig() + + balanceBefore = acct.balance() + choice() + balanceAfter = acct.balance() + + print("=============================================================") + print("Balance Before: ", balanceBefore) + print("Balance After: ", balanceAfter) + print("Gas Used: ", balanceBefore - balanceAfter) + print("=============================================================") + +# ========================================================================================================================================= +def loadConfig(): + global values, origins, acct, thisNetwork + thisNetwork = network.show_active() + + if thisNetwork == "development": + acct = accounts[0] + configFile = open('./scripts/token/values/development.json') + originsFile = open('./scripts/origins/values/development.json') + elif thisNetwork == "testnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/token/values/testnet.json') + originsFile = open('./scripts/origins/values/testnet.json') + elif thisNetwork == "rsk-testnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/token/values/testnet.json') + originsFile = open('./scripts/origins/values/testnet.json') + elif thisNetwork == "rsk-mainnet": + acct = accounts.load("rskdeployer") + configFile = open('./scripts/token/values/mainnet.json') + originsFile = open('./scripts/origins/values/mainnet.json') + else: + raise Exception("Network not supported") + + # Load values & deployed contracts addresses. + values = json.load(configFile) + origins = json.load(originsFile) + +# ========================================================================================================================================= +def choice(): + repeat = True + while(repeat): + print("Options:") + print("1 for Deploying Token.") + print("2 for Transfering Token Ownership to multisig.") + print("3 to exit.") + selection = int(input("Enter the choice: ")) + if(selection == 1): + deployToken() + elif(selection == 2): + transferTokenOwnership() + elif(selection == 3): + repeat = False + else: + print("Smarter people have written this, enter valid selection ;)\n") + +# ========================================================================================================================================= +def deployToken(): + tokenName = values["tokenName"] + tokenSymbol = values["tokenSymbol"] + tokenDecimal = int(values["tokenDecimal"]) + tokenAmount = int(values["tokenAmount"]) * (10 ** tokenDecimal) + print("=============================================================") + print("Deployment Parameters") + print("=============================================================") + print("Token Name: ", tokenName) + print("Token Symbol: ", tokenSymbol) + print("Token Decimal: ", tokenDecimal) + print("Token Balance with Decimal: ", tokenAmount/(10 ** tokenDecimal)) + print("Token Balance without Decimal: ", tokenAmount) + print("=============================================================") + + print("Deploying the Token with the above parameters...") + TokenObj = acct.deploy(Token, tokenAmount, tokenName, tokenSymbol, tokenDecimal) + waitTime() + tokenAmount = TokenObj.balanceOf(acct) + print("=============================================================") + print("Deployed Details") + print("=============================================================") + print("Token Address: ", TokenObj) + print("Token Balance with Decimal: ", tokenAmount/(10 ** tokenDecimal)) + print("Token Balance without Decimal: ", tokenAmount) + print("=============================================================") + values["token"] = str(TokenObj) + origins["token"] = str(TokenObj) + origins["decimal"] = values["tokenDecimal"] + writeToJSON() + + +# ========================================================================================================================================= +def transferTokenOwnership(): + tokenAddress = values["token"] + multisig = values["multisig"] + TokenObj = Contract.from_abi("Staking", address=tokenAddress, abi=Token.abi, owner=acct) + print("Current Token Owner of:", tokenAddress, "is", TokenObj.owner()) + TokenObj.transferOwnership(multisig) + waitTime() + print("New Token Owner of:", tokenAddress, "is", TokenObj.owner()) + +# ========================================================================================================================================= +def writeToJSON(): + if thisNetwork == "development": + tokenHandle = open('./scripts/token/values/development.json', "w") + originsHandle = open('./scripts/origins/values/development.json', "w") + elif thisNetwork == "testnet" or thisNetwork == "rsk-testnet": + tokenHandle = open('./scripts/token/values/testnet.json', "w") + originsHandle = open('./scripts/origins/values/testnet.json', "w") + elif thisNetwork == "rsk-mainnet": + tokenHandle = open('./scripts/token/values/mainnet.json', "w") + originsHandle = open('./scripts/origins/values/mainnet.json', "w") + json.dump(values, tokenHandle, indent=4) + json.dump(origins, originsHandle, indent=4) + +# ========================================================================================================================================= +def waitTime(): + if(thisNetwork != "development"): + print("\nWaiting for 30 seconds for the node to propogate correctly...\n") + time.sleep(15) + print("Just 15 more seconds...\n") + time.sleep(10) + print("5 more seconds I promise...\n") + time.sleep(5) diff --git a/scripts/token/values/development.json b/scripts/token/values/development.json new file mode 100644 index 0000000..7c89443 --- /dev/null +++ b/scripts/token/values/development.json @@ -0,0 +1,19 @@ +{ + "tokenName": "Babelfish", + "tokenSymbol": "FISH", + "tokenDecimal": "18", + "tokenAmount": "420000000", + "token": "0xBcb61491F1859f53438918F1A5aFCA542Af9D397", + "multisig": "0xdCF93F11ef216cEC9C07fd31dD801c9b2b39Afb4", + "multisigOwners": [ + "0x66aB6D9362d4F35596279692F0251Db635165871", + "0xb1c5C1B84E33CD32a153f1eB120e9Bd7109cc435", + "0xe1a148735f07bc5fe7cfb60499d325c8380488a8" + ], + "stakingLogic": "0xD22363efee93190f82b52FCD62B7Dbcb920eF658", + "staking": "0x4D1B781ce59B8C184F63B99D39d6719A522f46B5", + "feeSharing": "0x0000000000000000000000000000000000000001", + "vestingLogic": "0xADeD61D42dE86f9058386D1D0d739d20C7eAfC43", + "vestingFactory": "0x832698Daec363C9A7aB036C224Af5B21280b3AC6", + "vestingRegistry": "0xA95916C3D979400C7443961330b3092510a229Ba" +} diff --git a/scripts/token/values/mainnet.json b/scripts/token/values/mainnet.json new file mode 100644 index 0000000..8825a53 --- /dev/null +++ b/scripts/token/values/mainnet.json @@ -0,0 +1,15 @@ +{ + "tokenName": "Babelfish", + "tokenSymbol": "FISH", + "tokenDecimal": "18", + "tokenAmount": "420000000", + "token": "", + "multisig": "", + "multisigOwners": ["", "0xb1c5C1B84E33CD32a153f1eB120e9Bd7109cc435", "0xe1a148735f07bc5fe7cfb60499d325c8380488a8"], + "stakingLogic": "", + "staking": "", + "feeSharing": "0x0000000000000000000000000000000000000001", + "vestingLogic": "", + "vestingFactory": "", + "vestingRegistry": "" +} diff --git a/scripts/token/values/testnet.json b/scripts/token/values/testnet.json new file mode 100644 index 0000000..53b6a83 --- /dev/null +++ b/scripts/token/values/testnet.json @@ -0,0 +1,19 @@ +{ + "tokenName": "Babelfish", + "tokenSymbol": "FISH", + "tokenDecimal": "18", + "tokenAmount": "420000000", + "token": "0xF769f619E3b9DBCd552E62dF217D5DC095f6a42b", + "multisig": "0xad48087BaaEEe65b919CE62c052A833545f2f882", + "multisigOwners": [ + "0x4C3d3505d34213751c4b4d621cB6bDe7E664E222", + "0xb1c5C1B84E33CD32a153f1eB120e9Bd7109cc435", + "0xe1a148735f07bc5fe7cfb60499d325c8380488a8" + ], + "stakingLogic": "0x0e6F05f56FF79F10d7985064E3bC3Bb340c1e493", + "staking": "0x437A875DfeDf0aC23878c75Fa621176b647ef9c9", + "feeSharing": "0x0000000000000000000000000000000000000001", + "vestingLogic": "0x5ab606Cd93e5C0FaDF4FB0f2F9Ac68b31Bc811bB", + "vestingFactory": "0xd3db91063e1e4E50812BE9E3801235D0581b6e6A", + "vestingRegistry": "0xE402a46F372a461dD19ed34453253a0B5D1e0509" +} diff --git a/tests/LockedFund/admin.test.js b/tests/LockedFund/admin.test.js new file mode 100644 index 0000000..1c3152d --- /dev/null +++ b/tests/LockedFund/admin.test.js @@ -0,0 +1,135 @@ +const { + // External Functions + expectRevert, + assert, + // Custom Functions + randomValue, + currentTimestamp, + createStakeAndVest, + // Contract Artifacts + Token, + LockedFund, + VestingRegistry, +} = require("../utils"); + +const { zero, zeroAddress, zeroBasisPoint, invalidBasisPoint, unlockTypeWaited } = require("../constants"); + +let { cliff, duration, waitedTS } = require("../variable"); + +contract("LockedFund (Admin Functions)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic; + let creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive; + + before("Initiating Accounts & Creating Test Token Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); + [creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive] = accounts; + + waitedTS = await currentTimestamp(); + + // Creating the instance of Test Token. + token = await Token.new(zero, "Test Token", "TST", 18, { from: creator }); + + // Creating the Staking and Vesting + [staking, vestingLogic, vestingRegistry] = await createStakeAndVest(creator, token); + }); + + beforeEach("Creating New Locked Fund Contract Instance.", async () => { + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [admin], { from: creator }); + + // Adding lockedFund as an admin in the Vesting Registry. + await vestingRegistry.addAdmin(lockedFund.address, { from: creator }); + }); + + it("Admin should be able to add another admin.", async () => { + await lockedFund.addAdmin(newAdmin, { from: admin }); + }); + + it("Admin should not be able to add zero address as another admin.", async () => { + await expectRevert(lockedFund.addAdmin(zeroAddress, { from: admin }), "LockedFund: Invalid Address."); + }); + + it("Admin should not be able to add another admin more than once.", async () => { + await lockedFund.addAdmin(newAdmin, { from: admin }); + await expectRevert(lockedFund.addAdmin(newAdmin, { from: admin }), "LockedFund: Address is already admin."); + }); + + it("Admin should be able to remove an admin.", async () => { + await lockedFund.addAdmin(newAdmin, { from: admin }); + await lockedFund.removeAdmin(newAdmin, { from: admin }); + }); + + it("Admin should not be able to call removeAdmin() with a normal user address.", async () => { + await expectRevert(lockedFund.removeAdmin(userOne, { from: admin }), "LockedFund: Address is not an admin."); + }); + + it("Admin should be able to change the vestingRegistry.", async () => { + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + await lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: admin }); + }); + + it("Admin should not be able to change the vestingRegistry as a zero address.", async () => { + await expectRevert( + lockedFund.changeVestingRegistry(zeroAddress, { from: admin }), + "LockedFund: Vesting registry address is invalid." + ); + }); + + it("Admin should be able to change the waited timestamp.", async () => { + let value = randomValue(); + let newWaitedTS = waitedTS + value; + await lockedFund.changeWaitedTS(newWaitedTS, { from: admin }); + }); + + it("Admin should not be able to change the waited TS as zero.", async () => { + await expectRevert(lockedFund.changeWaitedTS(zero, { from: admin }), "LockedFund: Waited TS cannot be zero."); + }); + + it("Admin should be able to deposit using depositVested().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, unlockTypeWaited, { from: admin }); + }); + + it("Admin should not be able to deposit using depositWaitedUnlocked() with invalid basis point.", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await expectRevert( + lockedFund.depositWaitedUnlocked(userOne, value, invalidBasisPoint, { from: admin }), + "LockedFund: Basis Point has to be less than 10000." + ); + }); + + it("Admin should not be able to deposit with the duration as zero.", async () => { + let value = randomValue(); + await expectRevert( + lockedFund.depositVested(userOne, value, cliff, zero, zeroBasisPoint, unlockTypeWaited, { from: admin }), + "LockedFund: Duration cannot be zero." + ); + }); + + it("Admin should not be able to deposit with the duration higher than max allowed.", async () => { + let value = randomValue(); + await expectRevert( + lockedFund.depositVested(userOne, value, cliff, 100, zeroBasisPoint, unlockTypeWaited, { from: admin }), + "LockedFund: Duration is too long." + ); + }); + + it("Admin should not be able to deposit with basis point higher than max allowed.", async () => { + let value = randomValue(); + await expectRevert( + lockedFund.depositVested(userOne, value, cliff, duration, invalidBasisPoint, unlockTypeWaited, { from: admin }), + "LockedFund: Basis Point has to be less than 10000." + ); + }); +}); diff --git a/tests/LockedFund/creator.test.js b/tests/LockedFund/creator.test.js new file mode 100644 index 0000000..2614c27 --- /dev/null +++ b/tests/LockedFund/creator.test.js @@ -0,0 +1,110 @@ +const { + // External Functions + expectRevert, + assert, + // Custom Functions + randomValue, + currentTimestamp, + createStakeAndVest, + // Contract Artifacts + Token, + LockedFund, + VestingRegistry, +} = require("../utils"); + +const { zero, zeroAddress, zeroBasisPoint, unlockTypeWaited } = require("../constants"); + +let { cliff, duration, waitedTS } = require("../variable"); + +contract("LockedFund (Creator Functions)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic; + let creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive; + + before("Initiating Accounts & Creating Test Token Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); + [creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive] = accounts; + + waitedTS = await currentTimestamp(); + + // Creating the instance of Test Token. + token = await Token.new(zero, "Test Token", "TST", 18, { from: creator }); + + // Creating the Staking and Vesting + [staking, vestingLogic, vestingRegistry] = await createStakeAndVest(creator, token); + }); + + beforeEach("Creating New Locked Fund Contract Instance.", async () => { + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [admin], { from: creator }); + + // Adding lockedFund as an admin in the Vesting Registry. + await vestingRegistry.addAdmin(lockedFund.address, { from: creator }); + }); + + it("Creator should not be able to create a lockedFund contract with zero as waited timestamp.", async () => { + await expectRevert( + LockedFund.new(0, token.address, vestingRegistry.address, [admin], { from: creator }), + "LockedFund: Waited TS cannot be zero." + ); + }); + + it("Creator should not be able to create a lockedFund contract with zero address for token.", async () => { + await expectRevert( + LockedFund.new(waitedTS, zeroAddress, vestingRegistry.address, [admin], { from: creator }), + "LockedFund: Invalid Token Address." + ); + }); + + it("Creator should not be able to create a lockedFund contract with zero address as vesting registry.", async () => { + await expectRevert( + LockedFund.new(waitedTS, token.address, zeroAddress, [admin], { from: creator }), + "LockedFund: Vesting registry address is invalid." + ); + }); + + it("Creator should not be able to create a lockedFund contract with invalid admin address.", async () => { + await expectRevert( + LockedFund.new(waitedTS, token.address, vestingRegistry.address, [zeroAddress], { from: creator }), + "LockedFund: Invalid Address." + ); + }); + + it("Creator should not be able to add another admin.", async () => { + await expectRevert(lockedFund.addAdmin(newAdmin, { from: creator }), "LockedFund: Only admin can call this."); + }); + + it("Creator should not be able to remove an admin.", async () => { + await expectRevert(lockedFund.removeAdmin(newAdmin, { from: creator }), "LockedFund: Only admin can call this."); + }); + + it("Creator should not be able to change the vestingRegistry.", async () => { + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + await expectRevert( + lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: creator }), + "LockedFund: Only admin can call this." + ); + }); + + it("Creator should not be able to change the waited timestamp.", async () => { + let value = randomValue(); + let newWaitedTS = waitedTS + value; + await expectRevert(lockedFund.changeWaitedTS(newWaitedTS, { from: creator }), "LockedFund: Only admin can call this."); + }); + + it("Creator should not be able to deposit using depositVested().", async () => { + let value = randomValue(); + token.mint(creator, value, { from: creator }); + token.approve(lockedFund.address, value, { from: creator }); + await expectRevert( + lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, unlockTypeWaited, { from: creator }), + "LockedFund: Only admin can call this." + ); + }); +}); diff --git a/tests/LockedFund/event.test.js b/tests/LockedFund/event.test.js new file mode 100644 index 0000000..a5a8316 --- /dev/null +++ b/tests/LockedFund/event.test.js @@ -0,0 +1,246 @@ +const { + // External Functions + BN, + expectEvent, + assert, + // Custom Functions + randomValue, + currentTimestamp, + createStakeAndVest, + // Contract Artifacts + Token, + LockedFund, + VestingFactory, + VestingRegistry, +} = require("../utils"); + +const { zero, zeroAddress, zeroBasisPoint, fiftyBasisPoint, unlockTypeWaited } = require("../constants"); + +let { cliff, duration, waitedTS } = require("../variable"); + +contract("LockedFund (Events)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic; + let creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive; + + before("Initiating Accounts & Creating Test Token Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); + [creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive] = accounts; + + waitedTS = await currentTimestamp(); + + // Creating the instance of Test Token. + token = await Token.new(zero, "Test Token", "TST", 18, { from: creator }); + + // Creating the Staking and Vesting + [staking, vestingLogic, vestingRegistry] = await createStakeAndVest(creator, token); + }); + + beforeEach("Creating New Locked Fund Contract Instance.", async () => { + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [admin], { from: creator }); + + // Adding lockedFund as an admin in the Vesting Registry. + await vestingRegistry.addAdmin(lockedFund.address, { from: creator }); + }); + + it("Adding another admin should emit AdminAdded.", async () => { + let txReceipt = await lockedFund.addAdmin(newAdmin, { from: admin }); + expectEvent(txReceipt, "AdminAdded", { + _initiator: admin, + _newAdmin: newAdmin, + }); + }); + + it("Removing another admin should emit AdminRemoved.", async () => { + await lockedFund.addAdmin(newAdmin, { from: admin }); + let txReceipt = await lockedFund.removeAdmin(newAdmin, { from: admin }); + expectEvent(txReceipt, "AdminRemoved", { + _initiator: admin, + _removedAdmin: newAdmin, + }); + }); + + it("Changing the vestingRegistry should emit VestingRegistryUpdated.", async () => { + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + let txReceipt = await lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: admin }); + expectEvent(txReceipt, "VestingRegistryUpdated", { + _initiator: admin, + _vestingRegistry: newVestingRegistry.address, + }); + }); + + it("Changing the waited timestamp should emit WaitedTSUpdated.", async () => { + let value = randomValue(); + let newWaitedTS = waitedTS + value; + let txReceipt = await lockedFund.changeWaitedTS(newWaitedTS, { from: admin }); + expectEvent(txReceipt, "WaitedTSUpdated", { + _initiator: admin, + _waitedTS: new BN(newWaitedTS), + }); + }); + + it("Depositing using depositVested() should emit VestedDeposited.", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + let txReceipt = await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, unlockTypeWaited, { from: admin }); + expectEvent(txReceipt, "VestedDeposited", { + _initiator: admin, + _userAddress: userOne, + _amount: new BN(value), + _cliff: new BN(cliff), + _duration: new BN(duration), + _basisPoint: new BN(zeroBasisPoint), + }); + }); + + it("Withdrawing waited unlocked balance using withdrawWaitedUnlockedBalance() should emit Withdrawn.", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, unlockTypeWaited, { from: admin }); + let txReceipt = await lockedFund.withdrawWaitedUnlockedBalance(zeroAddress, { from: userOne }); + expectEvent(txReceipt, "Withdrawn", { + _initiator: userOne, + _userAddress: userOne, + _amount: new BN(Math.floor(value / 2)), + }); + }); + + it("Withdrawing waited unlocked balance to another wallet using withdrawWaitedUnlockedBalance() should emit Withdrawn.", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, unlockTypeWaited, { from: admin }); + let txReceipt = await lockedFund.withdrawWaitedUnlockedBalance(userTwo, { from: userOne }); + expectEvent(txReceipt, "Withdrawn", { + _initiator: userOne, + _userAddress: userTwo, + _amount: new BN(Math.floor(value / 2)), + }); + }); + + it("Creating vesting and staking vested balance using createVestingAndStake() should emit VestingCreated and TokenStaked.", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, unlockTypeWaited, { from: admin }); + let txReceipt = await lockedFund.createVestingAndStake({ from: userOne }); + let vestingAddress = await vestingRegistry.getVesting(userOne); + expectEvent(txReceipt, "VestingCreated", { + _initiator: userOne, + _userAddress: userOne, + _vesting: vestingAddress, + }); + expectEvent(txReceipt, "TokenStaked", { + _initiator: userOne, + _vesting: vestingAddress, + _amount: new BN(value), + }); + }); + + it("Creating vesting using createVesting() should emit VestingCreated.", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, unlockTypeWaited, { from: admin }); + let txReceipt = await lockedFund.createVesting({ from: userOne }); + let vestingAddress = await vestingRegistry.getVesting(userOne); + expectEvent(txReceipt, "VestingCreated", { + _initiator: userOne, + _userAddress: userOne, + _vesting: vestingAddress, + }); + }); + + it("Staking vested balance using stakeTokens() should emit TokenStaked.", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, unlockTypeWaited, { from: admin }); + let vestingAddress = await vestingRegistry.getVesting(userOne); + let txReceipt = await lockedFund.stakeTokens({ from: userOne }); + expectEvent(txReceipt, "TokenStaked", { + _initiator: userOne, + _vesting: vestingAddress, + _amount: new BN(value), + }); + }); + + it("Wthdrawing waited unlocked balance, creating vesting and staking vested balance using withdrawAndStakeTokens() should emit Withdrawn, VestingCreated and TokenStaked.", async () => { + vestingFactory = await VestingFactory.new(vestingLogic.address); + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + vestingFactory.transferOwnership(newVestingRegistry.address); + await newVestingRegistry.addAdmin(lockedFund.address); + await lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: admin }); + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, unlockTypeWaited, { from: admin }); + let txReceipt = await lockedFund.withdrawAndStakeTokens(zeroAddress, { from: userOne }); + expectEvent(txReceipt, "Withdrawn", { + _initiator: userOne, + _userAddress: userOne, + _amount: new BN(Math.floor(value / 2)), + }); + let vestingAddress = await newVestingRegistry.getVesting(userOne); + expectEvent(txReceipt, "VestingCreated", { + _initiator: userOne, + _userAddress: userOne, + _vesting: vestingAddress, + }); + expectEvent(txReceipt, "TokenStaked", { + _initiator: userOne, + _vesting: vestingAddress, + _amount: new BN(Math.ceil(value / 2)), + }); + }); + + it("Withdrawing waited unlocked balance to any wallet, creating vesting and staking vested balance using withdrawAndStakeTokens() should emit Withdrawn, VestingCreated and TokenStaked.", async () => { + vestingFactory = await VestingFactory.new(vestingLogic.address); + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + vestingFactory.transferOwnership(newVestingRegistry.address); + await newVestingRegistry.addAdmin(lockedFund.address); + await lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: admin }); + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, unlockTypeWaited, { from: admin }); + let txReceipt = await lockedFund.withdrawAndStakeTokens(userTwo, { from: userOne }); + expectEvent(txReceipt, "Withdrawn", { + _initiator: userOne, + _userAddress: userTwo, + _amount: new BN(Math.floor(value / 2)), + }); + let vestingAddress = await newVestingRegistry.getVesting(userOne); + expectEvent(txReceipt, "VestingCreated", { + _initiator: userOne, + _userAddress: userOne, + _vesting: vestingAddress, + }); + expectEvent(txReceipt, "TokenStaked", { + _initiator: userOne, + _vesting: vestingAddress, + _amount: new BN(Math.ceil(value / 2)), + }); + }); +}); diff --git a/tests/LockedFund/state.test.js b/tests/LockedFund/state.test.js new file mode 100644 index 0000000..d9b1d0a --- /dev/null +++ b/tests/LockedFund/state.test.js @@ -0,0 +1,584 @@ +const { + // External Functions + assert, + // Custom Functions + randomValue, + currentTimestamp, + createStakeAndVest, + checkStatus, + getTokenBalances, + // Contract Artifacts + Token, + LockedFund, + VestingFactory, + VestingRegistry, +} = require("../utils"); + +const { + zero, + zeroAddress, + fourWeeks, + zeroBasisPoint, + fiftyBasisPoint, + unlockTypeNone, + unlockTypeImmediate, + unlockTypeWaited, +} = require("../constants"); + +let { cliff, duration, waitedTS } = require("../variable"); + +contract("LockedFund (State Change)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic; + let creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive; + + before("Initiating Accounts & Creating Test Token Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); + [creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive] = accounts; + + waitedTS = await currentTimestamp(); + + // Creating the instance of Test Token. + token = await Token.new(zero, "Test Token", "TST", 18, { from: creator }); + + // Creating the Staking and Vesting + [staking, vestingLogic, vestingRegistry] = await createStakeAndVest(creator, token); + }); + + beforeEach("Creating New Locked Fund Contract Instance.", async () => { + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [admin], { from: creator }); + + // Adding lockedFund as an admin in the Vesting Registry. + await vestingRegistry.addAdmin(lockedFund.address, { from: creator }); + }); + + it("Admin should be able to add another admin.", async () => { + await lockedFund.addAdmin(newAdmin, { from: admin }); + await checkStatus( + lockedFund, + [1, 1, 0, 0, 1, 1, 1, 1, 1, 1], + newAdmin, + waitedTS, + token.address, + zero, + zero, + vestingRegistry.address, + zero, + zero, + zero, + zero, + true + ); + }); + + it("Admin should be able to remove an admin.", async () => { + await lockedFund.addAdmin(newAdmin, { from: admin }); + await checkStatus( + lockedFund, + [1, 1, 0, 0, 1, 1, 1, 1, 1, 1], + newAdmin, + waitedTS, + token.address, + zero, + zero, + vestingRegistry.address, + zero, + zero, + zero, + zero, + true + ); + await lockedFund.removeAdmin(newAdmin, { from: admin }); + await checkStatus( + lockedFund, + [1, 1, 0, 0, 1, 1, 1, 1, 1, 1], + newAdmin, + waitedTS, + token.address, + zero, + zero, + vestingRegistry.address, + zero, + zero, + zero, + zero, + false + ); + }); + + it("Admin should be able to change the vestingRegistry.", async () => { + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + await lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: admin }); + await checkStatus( + lockedFund, + [1, 1, 0, 0, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + zero, + zero, + newVestingRegistry.address, + zero, + zero, + zero, + zero, + false + ); + }); + + it("Admin should be able to change the waited timestamp.", async () => { + let value = randomValue(); + let newWaitedTS = waitedTS + value; + await lockedFund.changeWaitedTS(newWaitedTS, { from: admin }); + await checkStatus( + lockedFund, + [1, 1, 0, 0, 1, 1, 1, 1, 1, 1], + userOne, + newWaitedTS, + token.address, + zero, + zero, + vestingRegistry.address, + zero, + zero, + zero, + zero, + false + ); + }); + + it("Admin should be able to deposit using depositVested() and unlock as waited.", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, unlockTypeWaited, { from: admin }); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + Math.ceil(value / 2), + zero, + Math.floor(value / 2), + zero, + false + ); + }); + + it("Admin should be able to deposit using depositVested() and unlock as immediate.", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, unlockTypeImmediate, { from: admin }); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + Math.ceil(value / 2), + zero, + zero, + Math.floor(value / 2), + false + ); + }); + + it("Admin should be able to deposit using depositVested() and unlock as none.", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, unlockTypeNone, { from: admin }); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + value, + zero, + zero, + zero, + false + ); + }); + + it("Admin should be able to deposit using depositLocked().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositLocked(userOne, value, cliff, duration, fiftyBasisPoint, unlockTypeWaited, { from: admin }); + // TODO: Check status + }); + + it("Admin should be able to deposit using depositWaitedUnlocked() with non zero basis point.", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositWaitedUnlocked(userOne, value, fiftyBasisPoint, { from: admin }); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + zero, + zero, + vestingRegistry.address, + zero, + zero, + Math.ceil(value / 2), + Math.floor(value / 2), + false + ); + }); + + it("Admin should be able to deposit using depositWaitedUnlocked() with zero basis point.", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositWaitedUnlocked(userOne, value, zeroBasisPoint, { from: admin }); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + zero, + zero, + vestingRegistry.address, + zero, + zero, + value, + zero, + false + ); + }); + + it("User should be able to withdraw waited unlocked balance using withdrawWaitedUnlockedBalance().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, unlockTypeWaited, { from: admin }); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + Math.ceil(value / 2), + zero, + Math.floor(value / 2), + zero, + false + ); + let oldBalances = await getTokenBalances(userOne, token, lockedFund); + await lockedFund.withdrawWaitedUnlockedBalance(zeroAddress, { from: userOne }); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + Math.ceil(value / 2), + zero, + zero, + zero, + false + ); + let newBalances = await getTokenBalances(userOne, token, lockedFund); + assert.strictEqual(newBalances[0].toNumber(), oldBalances[0].toNumber() + Math.floor(value / 2), "Token Balance not matching."); + }); + + it("User should be able to withdraw waited unlocked balance to any wallet using withdrawWaitedUnlockedBalance().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, unlockTypeWaited, { from: admin }); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + Math.ceil(value / 2), + zero, + Math.floor(value / 2), + zero, + false + ); + let oldBalances = await getTokenBalances(userTwo, token, lockedFund); + await lockedFund.withdrawWaitedUnlockedBalance(userTwo, { from: userOne }); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + Math.ceil(value / 2), + zero, + zero, + zero, + false + ); + let newBalances = await getTokenBalances(userTwo, token, lockedFund); + assert.strictEqual(newBalances[0].toNumber(), oldBalances[0].toNumber() + Math.floor(value / 2), "Token Balance not matching."); + }); + + it("User should be able to create vesting and stake vested balance using createVestingAndStake().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, unlockTypeWaited, { from: admin }); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + value, + zero, + zero, + zero, + false + ); + await lockedFund.createVestingAndStake({ from: userOne }); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + zero, + zero, + zero, + zero, + false + ); + }); + + it("User should be able to create vesting using createVesting().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, unlockTypeWaited, { from: admin }); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + value, + zero, + zero, + zero, + false + ); + await lockedFund.createVesting({ from: userOne }); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + value, + zero, + zero, + zero, + false + ); + }); + + it("User should be able to stake vested balance using stakeTokens().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, unlockTypeWaited, { from: admin }); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + value, + zero, + zero, + zero, + false + ); + await lockedFund.stakeTokens({ from: userOne }); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + vestingRegistry.address, + zero, + zero, + zero, + zero, + false + ); + }); + + it("User should be able to withdraw waited unlocked balance, create vesting and stake vested balance using withdrawAndStakeTokens().", async () => { + vestingFactory = await VestingFactory.new(vestingLogic.address); + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + vestingFactory.transferOwnership(newVestingRegistry.address); + await newVestingRegistry.addAdmin(lockedFund.address); + await lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: admin }); + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, unlockTypeWaited, { from: admin }); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + newVestingRegistry.address, + Math.ceil(value / 2), + zero, + Math.floor(value / 2), + zero, + false + ); + let oldBalances = await getTokenBalances(userOne, token, lockedFund); + await lockedFund.withdrawAndStakeTokens(zeroAddress, { from: userOne }); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + newVestingRegistry.address, + zero, + zero, + zero, + zero, + false + ); + let newBalances = await getTokenBalances(userOne, token, lockedFund); + assert.strictEqual(newBalances[0].toNumber(), oldBalances[0].toNumber() + Math.floor(value / 2), "Token Balance not matching."); + }); + + it("User should be able to withdraw waited unlocked balance to any wallet, create vesting and stake vested balance using withdrawAndStakeTokens().", async () => { + vestingFactory = await VestingFactory.new(vestingLogic.address); + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + vestingFactory.transferOwnership(newVestingRegistry.address); + await newVestingRegistry.addAdmin(lockedFund.address); + await lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: admin }); + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, unlockTypeWaited, { from: admin }); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + newVestingRegistry.address, + Math.ceil(value / 2), + zero, + Math.floor(value / 2), + zero, + false + ); + let oldBalances = await getTokenBalances(userTwo, token, lockedFund); + await lockedFund.withdrawAndStakeTokens(userTwo, { from: userOne }); + await checkStatus( + lockedFund, + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + userOne, + waitedTS, + token.address, + cliff, + duration, + newVestingRegistry.address, + zero, + zero, + zero, + zero, + false + ); + let newBalances = await getTokenBalances(userTwo, token, lockedFund); + assert.strictEqual(newBalances[0].toNumber(), oldBalances[0].toNumber() + Math.floor(value / 2), "Token Balance not matching."); + }); + + it("Admin should be able to get the cliff and duration of a user.", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, unlockTypeWaited, { from: admin }); + let detail = await lockedFund.getCliffAndDuration(userOne, { from: admin }); + assert.equal(detail[0].toNumber() / fourWeeks, cliff, "Cliff does not match."); + assert.equal(detail[1].toNumber() / fourWeeks, duration, "Duration does not match."); + }); +}); diff --git a/tests/LockedFund/user.test.js b/tests/LockedFund/user.test.js new file mode 100644 index 0000000..248acd7 --- /dev/null +++ b/tests/LockedFund/user.test.js @@ -0,0 +1,171 @@ +const { + // External Functions + expectRevert, + assert, + // Custom Functions + randomValue, + currentTimestamp, + createStakeAndVest, + // Contract Artifacts + Token, + LockedFund, + VestingRegistry, +} = require("../utils"); + +const { zero, zeroAddress, zeroBasisPoint, fiftyBasisPoint, unlockTypeWaited } = require("../constants"); + +let { cliff, duration, waitedTS } = require("../variable"); + +contract("LockedFund (User Functions)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic; + let creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive; + + before("Initiating Accounts & Creating Test Token Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); + [creator, admin, newAdmin, userOne, userTwo, userThree, userFour, userFive] = accounts; + + waitedTS = await currentTimestamp(); + + // Creating the instance of Test Token. + token = await Token.new(zero, "Test Token", "TST", 18, { from: creator }); + + // Creating the Staking and Vesting + [staking, vestingLogic, vestingRegistry] = await createStakeAndVest(creator, token); + }); + + beforeEach("Creating New Locked Fund Contract Instance.", async () => { + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [admin], { from: creator }); + + // Adding lockedFund as an admin in the Vesting Registry. + await vestingRegistry.addAdmin(lockedFund.address, { from: creator }); + }); + + it("User should not be able to add another admin.", async () => { + await expectRevert(lockedFund.addAdmin(newAdmin, { from: userOne }), "LockedFund: Only admin can call this."); + }); + + it("User should not be able to remove an admin.", async () => { + await expectRevert(lockedFund.removeAdmin(newAdmin, { from: userOne }), "LockedFund: Only admin can call this."); + }); + + it("User should not be able to change the vestingRegistry.", async () => { + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + await expectRevert( + lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: userOne }), + "LockedFund: Only admin can call this." + ); + }); + + it("User should not be able to change the waited timestamp.", async () => { + let value = randomValue(); + let newWaitedTS = waitedTS + value; + await expectRevert(lockedFund.changeWaitedTS(newWaitedTS, { from: userOne }), "LockedFund: Only admin can call this."); + }); + + it("User should not be able to deposit using depositVested().", async () => { + let value = randomValue(); + token.mint(userOne, value, { from: creator }); + token.approve(lockedFund.address, value, { from: userOne }); + await expectRevert( + lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, unlockTypeWaited, { from: userOne }), + "LockedFund: Only admin can call this." + ); + }); + + it("User should be able to withdraw waited unlocked balance using withdrawWaitedUnlockedBalance().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, unlockTypeWaited, { from: admin }); + await lockedFund.withdrawWaitedUnlockedBalance(zeroAddress, { from: userOne }); + }); + + it("User should be able to withdraw waited unlocked balance to any wallet using withdrawWaitedUnlockedBalance().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, unlockTypeWaited, { from: admin }); + await lockedFund.withdrawWaitedUnlockedBalance(userTwo, { from: userOne }); + }); + + it("User should not be able to withdraw waited unlocked balance before waitedTimestamp using withdrawWaitedUnlockedBalance().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, unlockTypeWaited, { from: admin }); + let timestamp = await currentTimestamp(); + await lockedFund.changeWaitedTS(timestamp + 10000, { from: admin }); + await expectRevert( + lockedFund.withdrawWaitedUnlockedBalance(zeroAddress, { from: userOne }), + "LockedFund: Wait Timestamp not yet passed." + ); + }); + + it("User should be able to create vesting and stake vested balance using createVestingAndStake().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, unlockTypeWaited, { from: admin }); + await lockedFund.createVestingAndStake({ from: userOne }); + }); + + it("User should be able to create vesting using createVesting().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, unlockTypeWaited, { from: admin }); + await lockedFund.createVesting({ from: userOne }); + }); + + it("User should be able to stake vested balance using stakeTokens().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, unlockTypeWaited, { from: admin }); + await lockedFund.stakeTokens({ from: userOne }); + }); + + it("User should not be able to stake vested balance using stakeTokens() if vesting is not created previously.", async () => { + let newVestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator // This should be Governance Timelock Contract. + ); + await lockedFund.changeVestingRegistry(newVestingRegistry.address, { from: admin }); + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, zeroBasisPoint, unlockTypeWaited, { from: admin }); + await expectRevert(lockedFund.stakeTokens({ from: userOne }), "function call to a non-contract account"); + }); + + it("User should be able to withdraw waited unlocked balance, create vesting and stake vested balance using withdrawAndStakeTokens().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, unlockTypeWaited, { from: admin }); + await lockedFund.withdrawAndStakeTokens(zeroAddress, { from: userOne }); + }); + + it("User should be able to withdraw waited unlocked balance to any wallet, create vesting and stake vested balance using withdrawAndStakeTokens().", async () => { + let value = randomValue(); + token.mint(admin, value, { from: creator }); + token.approve(lockedFund.address, value, { from: admin }); + await lockedFund.depositVested(userOne, value, cliff, duration, fiftyBasisPoint, unlockTypeWaited, { from: admin }); + await lockedFund.withdrawAndStakeTokens(userTwo, { from: userOne }); + }); + + it("User should not be able to create vesting and stake vested balance using createVestingAndStake() if cliff and duration is not set.", async () => { + await expectRevert(lockedFund.createVestingAndStake({ from: userTwo }), "LockedFund: Cliff and/or Duration not set."); + }); +}); diff --git a/tests/OriginsAdmin/creator.test.js b/tests/OriginsAdmin/creator.test.js new file mode 100644 index 0000000..daf584c --- /dev/null +++ b/tests/OriginsAdmin/creator.test.js @@ -0,0 +1,42 @@ +const { + // External Functions + expectRevert, + assert, + // Contract Artifacts + OriginsAdmin, +} = require("../utils"); + +contract("OriginsAdmin (Owner Functions)", (accounts) => { + let originsAdmin; + let creator, ownerOne, ownerTwo, ownerThree; + let verifierOne, verifierTwo, verifierThree, userOne; + + before("Initiating Accounts & Creating Contract Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); + [creator, ownerOne, ownerTwo, ownerThree, verifierOne, verifierTwo, verifierThree, userOne] = accounts; + + // Creating the instance of OriginsAdmin Contract. + originsAdmin = await OriginsAdmin.new([ownerOne], { from: creator }); + }); + + it("Creator should not be able to create an instance with same owner address twice.", async () => { + await expectRevert(OriginsAdmin.new([ownerOne, ownerOne], { from: creator }), "OriginsAdmin: Each owner can be added only once."); + }); + + it("Creator should not be able to add another owner.", async () => { + await expectRevert(originsAdmin.addOwner(ownerTwo, { from: creator }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Creator should not be able to remove an owner.", async () => { + await expectRevert(originsAdmin.removeOwner(ownerTwo, { from: creator }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Creator should not be able to add a verifier.", async () => { + await expectRevert(originsAdmin.addVerifier(verifierOne, { from: creator }), "OriginsAdmin: Only owner can call this function."); + }); + + it("Creator should not be able to remove a verifier.", async () => { + await expectRevert(originsAdmin.removeVerifier(verifierOne, { from: creator }), "OriginsAdmin: Only owner can call this function."); + }); +}); diff --git a/tests/OriginsAdmin/event.test.js b/tests/OriginsAdmin/event.test.js new file mode 100644 index 0000000..679b020 --- /dev/null +++ b/tests/OriginsAdmin/event.test.js @@ -0,0 +1,54 @@ +const { + // External Functions + expectEvent, + assert, + // Contract Artifacts + OriginsAdmin, +} = require("../utils"); + +contract("OriginsAdmin (Owner Functions)", (accounts) => { + let originsAdmin; + let creator, ownerOne, ownerTwo, ownerThree; + let verifierOne, verifierTwo, verifierThree, userOne; + + before("Initiating Accounts & Creating Contract Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); + [creator, ownerOne, ownerTwo, ownerThree, verifierOne, verifierTwo, verifierThree, userOne] = accounts; + + // Creating the instance of OriginsAdmin Contract. + originsAdmin = await OriginsAdmin.new([ownerOne], { from: creator }); + }); + + it("Adding another owner should emit OwnerAdded.", async () => { + let txReceipt = await originsAdmin.addOwner(ownerTwo, { from: ownerOne }); + expectEvent(txReceipt, "OwnerAdded", { + _initiator: ownerOne, + _newOwner: ownerTwo, + }); + }); + + it("Remove an owner should emit OwnerRemoved.", async () => { + let txReceipt = await originsAdmin.removeOwner(ownerTwo, { from: ownerOne }); + expectEvent(txReceipt, "OwnerRemoved", { + _initiator: ownerOne, + _removedOwner: ownerTwo, + }); + }); + + it("Adding a verifier should emit VerifierAdded.", async () => { + let txReceipt = await originsAdmin.addVerifier(verifierOne, { from: ownerOne }); + expectEvent(txReceipt, "VerifierAdded", { + _initiator: ownerOne, + _newVerifier: verifierOne, + }); + }); + + it("Removing a verifier should emit VerifierRemoved.", async () => { + let txReceipt = await originsAdmin.removeVerifier(verifierOne, { from: ownerOne }); + expectEvent(txReceipt, "VerifierRemoved", { + _initiator: ownerOne, + _removedVerifier: verifierOne, + }); + }); +}); diff --git a/tests/OriginsAdmin/owner.test.js b/tests/OriginsAdmin/owner.test.js new file mode 100644 index 0000000..d8167e7 --- /dev/null +++ b/tests/OriginsAdmin/owner.test.js @@ -0,0 +1,64 @@ +const { + // External Functions + expectRevert, + assert, + // Contract Artifacts + OriginsAdmin, +} = require("../utils"); + +const { zeroAddress } = require("../constants"); + +contract("OriginsAdmin (Owner Functions)", (accounts) => { + let originsAdmin; + let creator, ownerOne, ownerTwo, ownerThree; + let verifierOne, verifierTwo, verifierThree, userOne; + + before("Initiating Accounts & Creating Contract Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); + [creator, ownerOne, ownerTwo, ownerThree, verifierOne, verifierTwo, verifierThree, userOne] = accounts; + + // Creating the instance of OriginsAdmin Contract. + originsAdmin = await OriginsAdmin.new([ownerOne], { from: creator }); + }); + + it("Owner should be able to add another owner.", async () => { + await originsAdmin.addOwner(ownerTwo, { from: ownerOne }); + }); + + it("Owner should not be able to add zero address as another owner.", async () => { + await expectRevert(originsAdmin.addOwner(zeroAddress, { from: ownerOne }), "OriginsAdmin: Invalid Address."); + }); + + it("Owner should not be able to add another owner more than once.", async () => { + await expectRevert(originsAdmin.addOwner(ownerTwo, { from: ownerOne }), "OriginsAdmin: Address is already an owner."); + }); + + it("Owner should be able to remove an owner.", async () => { + await originsAdmin.removeOwner(ownerTwo, { from: ownerOne }); + }); + + it("Owner should not be able to call removeOwner() with a normal user address.", async () => { + await expectRevert(originsAdmin.removeOwner(userOne, { from: ownerOne }), "OriginsAdmin: Address is not an owner."); + }); + + it("Owner should be able to add a verifier.", async () => { + await originsAdmin.addVerifier(verifierOne, { from: ownerOne }); + }); + + it("Owner should not be able to add zero address as a verifier.", async () => { + await expectRevert(originsAdmin.addVerifier(zeroAddress, { from: ownerOne }), "OriginsAdmin: Invalid Address."); + }); + + it("Owner should not be able to add another verifier more than once.", async () => { + await expectRevert(originsAdmin.addVerifier(verifierOne, { from: ownerOne }), "OriginsAdmin: Address is already a verifier."); + }); + + it("Owner should be able to remove a verifier.", async () => { + await originsAdmin.removeVerifier(verifierOne, { from: ownerOne }); + }); + + it("Owner should not be able to call removeVerifier() with a normal user address.", async () => { + await expectRevert(originsAdmin.removeVerifier(userOne, { from: ownerOne }), "OriginsAdmin: Address is not a verifier."); + }); +}); diff --git a/tests/OriginsAdmin/state.test.js b/tests/OriginsAdmin/state.test.js new file mode 100644 index 0000000..ea2a8e1 --- /dev/null +++ b/tests/OriginsAdmin/state.test.js @@ -0,0 +1,56 @@ +const { + // External Functions + assert, + // Contract Artifacts + OriginsAdmin, +} = require("../utils"); + +contract("OriginsAdmin (Owner Functions)", (accounts) => { + let originsAdmin; + let creator, ownerOne, ownerTwo, ownerThree; + let verifierOne, verifierTwo, verifierThree, userOne; + + before("Initiating Accounts & Creating Contract Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 8, "Alteast 8 accounts are required to test the contracts."); + [creator, ownerOne, ownerTwo, ownerThree, verifierOne, verifierTwo, verifierThree, userOne] = accounts; + + // Creating the instance of OriginsAdmin Contract. + originsAdmin = await OriginsAdmin.new([ownerOne], { from: creator }); + }); + + it("Owner should be able to add another owner.", async () => { + await originsAdmin.addOwner(ownerTwo, { from: ownerOne }); + let isAdmin = await originsAdmin.checkOwner(ownerTwo); + assert.strictEqual(isAdmin, true, "Owner status not udpated correctly."); + }); + + it("Owner should be able to remove an owner.", async () => { + await originsAdmin.removeOwner(ownerTwo, { from: ownerOne }); + let isAdmin = await originsAdmin.checkOwner(ownerTwo); + assert.strictEqual(isAdmin, false, "Owner status not udpated correctly."); + }); + + it("Owner should be able to add a verifier.", async () => { + await originsAdmin.addVerifier(verifierOne, { from: ownerOne }); + let isVerifier = await originsAdmin.checkVerifier(verifierOne); + assert.strictEqual(isVerifier, true, "Verifier status not udpated correctly."); + }); + + it("Owner should be able to remove a verifier.", async () => { + await originsAdmin.removeVerifier(verifierOne, { from: ownerOne }); + let isVerifier = await originsAdmin.checkVerifier(verifierOne); + assert.strictEqual(isVerifier, false, "Verifier status not udpated correctly."); + }); + + it("Owner should be able to get owner list.", async () => { + let owners = await originsAdmin.getOwners({ from: ownerOne }); + assert.strictEqual(owners[0], ownerOne, "Owner address incorrect."); + }); + + it("Owner should be able to get verifier list.", async () => { + await originsAdmin.addVerifier(verifierOne, { from: ownerOne }); + let verifiers = await originsAdmin.getVerifiers({ from: ownerOne }); + assert.strictEqual(verifiers[0], verifierOne, "Verifier address incorrect."); + }); +}); diff --git a/tests/OriginsBase/creator.test.js b/tests/OriginsBase/creator.test.js new file mode 100644 index 0000000..e7908d9 --- /dev/null +++ b/tests/OriginsBase/creator.test.js @@ -0,0 +1,225 @@ +const { + // External Functions + expectRevert, + assert, + // Custom Functions + currentTimestamp, + createStakeAndVest, + // Contract Artifacts + Token, + LockedFund, + OriginsBase, +} = require("../utils"); + +const { zero, zeroAddress } = require("../constants"); + +let { + waitedTS, + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + secondMinAmount, + secondMaxAmount, + secondRemainingTokens, + secondSaleStartTS, + secondSaleEnd, + secondUnlockedBP, + secondVestOrLockCliff, + secondVestOfLockDuration, + secondDepositRate, + secondDepositToken, + secondDepositType, + secondSaleEndDurationOrTS, + secondTransferType, +} = require("../variable"); + +contract("OriginsBase (Creator Functions)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic, originsBase; + let creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr; + let tierCount; + + before("Initiating Accounts & Creating Test Contract Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 9, "Alteast 9 accounts are required to test the contracts."); + [creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr] = accounts; + + let timestamp = await currentTimestamp(); + waitedTS = timestamp; + firstSaleStartTS = timestamp; + + // Creating the instance of Test Token. + token = await Token.new(zero, "Test Token", "TST", 18, { from: creator }); + + // Creating the Staking and Vesting + [staking, vestingLogic, vestingRegistry] = await createStakeAndVest(creator, token); + + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner], { from: creator }); + + // Creating the instance of OriginsBase Contract. + originsBase = await OriginsBase.new([owner], token.address, depositAddr, { from: creator }); + + // Setting lockedFund in Origins. + await originsBase.setLockedFund(lockedFund.address, { from: owner }); + + // Added Origins as an admin of LockedFund. + await lockedFund.addAdmin(originsBase.address, { from: owner }); + + // Setting Verifier in Origins. + await originsBase.addVerifier(verifier, { from: owner }); + + // Minting new tokens, Approving Origins and creating a new tier. + await token.mint(owner, firstRemainingTokens, { from: creator }); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + }); + + beforeEach("Updating the timestamp.", async () => { + let timestamp = await currentTimestamp(); + firstSaleStartTS = timestamp; + secondSaleStartTS = timestamp; + }); + + it("Creator should not be able to create a originsBase with invalid token address.", async () => { + await expectRevert( + OriginsBase.new([owner], zeroAddress, depositAddr, { from: creator }), + "OriginsBase: Token Address cannot be zero." + ); + }); + + it("Creator should not be able to set deposit address.", async () => { + await expectRevert( + originsBase.setDepositAddress(newDepositAddr, { from: creator }), + "OriginsAdmin: Only owner can call this function." + ); + }); + + it("Creator should not be able to set Locked Fund Contract.", async () => { + let newLockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); + await expectRevert( + originsBase.setLockedFund(newLockedFund.address, { from: creator }), + "OriginsAdmin: Only owner can call this function." + ); + }); + + it("Creator should not be able to add a new tier.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: creator }); + await expectRevert( + originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: creator } + ), + "OriginsAdmin: Only owner can call this function." + ); + }); + + it("Creator should not be able to set Tier Deposit Parameters.", async () => { + await expectRevert( + originsBase.setTierDeposit(tierCount, secondDepositRate, secondDepositToken, secondDepositType, { from: creator }), + "OriginsAdmin: Only owner can call this function." + ); + }); + + it("Creator should not be able to set Tier Token Limit Parameters.", async () => { + await expectRevert( + originsBase.setTierTokenLimit(tierCount, secondMinAmount, secondMaxAmount, { from: creator }), + "OriginsAdmin: Only owner can call this function." + ); + }); + + it("Creator should not be able to set Tier Token Amount Parameters.", async () => { + await expectRevert( + originsBase.setTierTokenAmount(tierCount, secondRemainingTokens, { from: creator }), + "OriginsAdmin: Only owner can call this function." + ); + }); + + it("Creator should not be able to set Tier Vest or Lock Parameters.", async () => { + await expectRevert( + originsBase.setTierVestOrLock( + tierCount, + secondVestOrLockCliff, + secondVestOfLockDuration, + secondUnlockedBP, + secondTransferType, + { from: creator } + ), + "OriginsAdmin: Only owner can call this function." + ); + }); + + it("Creator should not be able to set Tier Time Parameters.", async () => { + await expectRevert( + originsBase.setTierTime(tierCount, secondSaleStartTS, secondSaleEnd, secondSaleEndDurationOrTS, { from: creator }), + "OriginsAdmin: Only owner can call this function." + ); + }); + + it("Creator should not be able to verify a single address to a single tier.", async () => { + await expectRevert( + originsBase.addressVerification(userOne, tierCount, { from: creator }), + "OriginsAdmin: Only verifier can call this function." + ); + }); + + it("Creator should not be able to verify a single address to a multiple tier.", async () => { + tierCount = 3; + await expectRevert( + originsBase.singleAddressMultipleTierVerification(userOne, [tierCount, tierCount - 1, tierCount - 2], { from: creator }), + "OriginsAdmin: Only verifier can call this function." + ); + }); + + it("Creator should not be able to verify a multiple address to a single tier.", async () => { + await expectRevert( + originsBase.multipleAddressSingleTierVerification([userOne, userTwo, userThree], tierCount, { from: creator }), + "OriginsAdmin: Only verifier can call this function." + ); + }); + + it("Creator should not be able to verify a multiple address to a multiple tier.", async () => { + tierCount = 3; + await expectRevert( + originsBase.multipleAddressAndTierVerification([userOne, userTwo, userThree], [tierCount, tierCount - 1, tierCount - 2], { + from: creator, + }), + "OriginsAdmin: Only verifier can call this function." + ); + }); +}); diff --git a/tests/OriginsBase/event.test.js b/tests/OriginsBase/event.test.js new file mode 100644 index 0000000..70b786d --- /dev/null +++ b/tests/OriginsBase/event.test.js @@ -0,0 +1 @@ +// TODO diff --git a/tests/OriginsBase/owner.test.js b/tests/OriginsBase/owner.test.js new file mode 100644 index 0000000..a7b285d --- /dev/null +++ b/tests/OriginsBase/owner.test.js @@ -0,0 +1,647 @@ +const { + // External Functions + expectRevert, + time, + assert, + // Custom Functions + currentTimestamp, + createStakeAndVest, + // Contract Artifacts + Token, + LockedFund, + OriginsBase, +} = require("../utils"); + +const { + zero, + zeroAddress, + invalidBasisPoint, + depositTypeRBTC, + depositTypeToken, + saleEndDurationOrTSTimestamp, + verificationTypeEveryone, +} = require("../constants"); + +let { + waitedTS, + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + secondMinAmount, + secondMaxAmount, + secondRemainingTokens, + secondSaleStartTS, + secondSaleEnd, + secondUnlockedBP, + secondVestOrLockCliff, + secondVestOfLockDuration, + secondDepositRate, + secondDepositToken, + secondDepositType, + secondVerificationType, + secondSaleEndDurationOrTS, + secondTransferType, +} = require("../variable"); + +contract("OriginsBase (Owner Functions)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic, originsBase; + let creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr; + let tierCount; + + before("Initiating Accounts & Creating Test Contract Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 9, "Alteast 9 accounts are required to test the contracts."); + [creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr] = accounts; + + let timestamp = await currentTimestamp(); + waitedTS = timestamp; + + // Creating the instance of Test Token. + token = await Token.new(zero, "Test Token", "TST", 18, { from: creator }); + + // Creating the Staking and Vesting + [staking, vestingLogic, vestingRegistry] = await createStakeAndVest(creator, token); + + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner], { from: creator }); + }); + + beforeEach("Creating New OriginsBase Contract Instance.", async () => { + // Creating the instance of OriginsBase Contract. + originsBase = await OriginsBase.new([owner], token.address, depositAddr, { from: creator }); + + // Setting lockedFund in Origins. + await originsBase.setLockedFund(lockedFund.address, { from: owner }); + + // Added Origins as an admin of LockedFund. + await lockedFund.addAdmin(originsBase.address, { from: owner }); + + let timestamp = await currentTimestamp(); + waitedTS = timestamp; + firstSaleStartTS = timestamp; + secondSaleStartTS = timestamp; + }); + + it("Owner should be able to set deposit address.", async () => { + await originsBase.setDepositAddress(newDepositAddr, { from: owner }); + }); + + it("Owner should not be able to add zero address as deposit address.", async () => { + await expectRevert(originsBase.setDepositAddress(zeroAddress, { from: owner }), "OriginsBase: Deposit Address cannot be zero."); + }); + + it("Owner should be able to set Locked Fund Contract.", async () => { + let newLockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); + await originsBase.setLockedFund(newLockedFund.address, { from: owner }); + }); + + it("Owner should not be able to add zero address as Locked Fund Contract.", async () => { + await expectRevert(originsBase.setLockedFund(zeroAddress, { from: owner }), "OriginsBase: Locked Fund Address cannot be zero."); + }); + + it("Owner should be able to add a new tier.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + }); + + it("Owner should be able to set Tier Verification Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await originsBase.setTierVerification(1, secondVerificationType, { from: owner }); + }); + + it("Owner should be able to set Tier Deposit Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await originsBase.setTierDeposit(1, secondDepositRate, secondDepositToken, secondDepositType, { from: owner }); + }); + + it("Owner should not be able to set Tier Deposit Parameters with deposit rate as zero.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await expectRevert( + originsBase.setTierDeposit(1, zero, secondDepositToken, secondDepositType, { from: owner }), + "OriginsBase: Deposit Rate cannot be zero." + ); + }); + + it("Owner should not be able to set Tier Deposit Parameters with deposit token as zero address if deposit type is Token.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await expectRevert( + originsBase.setTierDeposit(1, secondDepositRate, zeroAddress, depositTypeToken, { from: owner }), + "OriginsBase: Deposit Token Address cannot be zero." + ); + }); + + it("Owner should be able to set Tier Deposit Parameters with correct deposit token address if deposit type is Token.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + let newToken = await Token.new(zero, "Test Token", "TST", 18); + await originsBase.setTierDeposit(1, secondDepositRate, newToken.address, depositTypeToken, { from: owner }); + }); + + it("Owner should be able to set Tier Deposit Parameters with deposit token as zero address if deposit type is RBTC.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await originsBase.setTierDeposit(1, secondDepositRate, zeroAddress, depositTypeRBTC, { from: owner }); + }); + + it("Owner should be able to set Tier Token Limit Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await originsBase.setTierTokenLimit(1, secondMinAmount, secondMaxAmount, { from: owner }); + }); + + it("Owner should not be able to set Tier Token Limit Parameters with minimum is greater than maximum amount.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await expectRevert( + originsBase.setTierTokenLimit(1, secondMaxAmount, secondMinAmount, { from: owner }), + "OriginsBase: Min Amount cannot be higher than Max Amount." + ); + }); + + it("Owner should be able to set Tier Token Amount Parameters where extra is provided.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await token.mint(owner, secondRemainingTokens); + await token.approve(originsBase.address, secondRemainingTokens, { from: owner }); + await originsBase.setTierTokenAmount(1, secondRemainingTokens, { from: owner }); + }); + + it("Owner should be able to set Tier Token Amount Parameters where extra is returned.", async () => { + await token.mint(owner, secondRemainingTokens); + await token.approve(originsBase.address, secondRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + secondRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await originsBase.setTierTokenAmount(1, firstRemainingTokens, { from: owner }); + }); + + it("Owner should not be able to set Tier Token Amount Parameters with remaining token as zero.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await expectRevert( + originsBase.setTierTokenAmount(1, zero, { from: owner }), + "OriginsBase: Total token to sell should be higher than zero." + ); + }); + + it("Owner should not be able to set Tier Token Amount Parameters with max allowed is higher than remaining token.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await expectRevert( + originsBase.setTierTokenAmount(1, 1, { from: owner }), + "OriginsBase: Max Amount to buy should not be higher than token availability." + ); + }); + + it("Owner should be able to set Tier Vest or Lock Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await originsBase.setTierVestOrLock(1, secondVestOrLockCliff, secondVestOfLockDuration, secondUnlockedBP, secondTransferType, { + from: owner, + }); + }); + + it("Owner should not be able to set Tier Vest or Lock Parameters with cliff higher than duration.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await expectRevert( + originsBase.setTierVestOrLock(1, secondVestOfLockDuration, secondVestOrLockCliff, secondUnlockedBP, secondTransferType, { + from: owner, + }), + "OriginsBase: Cliff has to be <= duration." + ); + }); + + it("Owner should not be able to set Tier Vest or Lock Parameters with cliff higher than duration.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await expectRevert( + originsBase.setTierVestOrLock(1, secondVestOrLockCliff, secondVestOfLockDuration, invalidBasisPoint, secondTransferType, { + from: owner, + }), + "OriginsBase: The basis point cannot be higher than 10K." + ); + }); + + it("Owner should be able to set Tier Time Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await originsBase.setTierTime(1, secondSaleStartTS, secondSaleEnd, secondSaleEndDurationOrTS, { from: owner }); + }); + + it("Owner should not be able to set Tier Time Parameters with sale start timestamp is higher than sale end timestamp.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await expectRevert( + originsBase.setTierTime(1, secondSaleStartTS, secondSaleStartTS, saleEndDurationOrTSTimestamp, { from: owner }), + "OriginsBase: The sale start TS cannot be after sale end TS." + ); + }); + + it("Owner should not be able to set Tier Time Parameters with sale start timestamp is higher than sale end timestamp.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await expectRevert( + originsBase.setTierTime(1, (await currentTimestamp()) - 1000, (await currentTimestamp()) - 100, saleEndDurationOrTSTimestamp, { + from: owner, + }), + "OriginsBase: The sale end duration cannot be past already." + ); + }); + + it("Owner should be able to withdraw the sale deposit to deposit address.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + let amount = 20000; + await token.mint(userOne, amount); + await token.approve(originsBase.address, amount, { from: userOne }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + amount = 20000; + await token.mint(userTwo, amount); + await token.approve(originsBase.address, amount, { from: userTwo }); + await originsBase.buy(tierCount, zero, { from: userTwo, value: amount }); + amount = 20000; + await token.mint(userThree, amount); + await token.approve(originsBase.address, amount, { from: userThree }); + await originsBase.buy(tierCount, zero, { from: userThree, value: amount }); + await originsBase.withdrawSaleDeposit({ from: owner }); + }); + + it("Owner should be able to withdraw the sale deposit to own address if deposit address is not set.", async () => { + originsBase = await OriginsBase.new([owner], token.address, zeroAddress); + await originsBase.setLockedFund(lockedFund.address, { from: owner }); + await lockedFund.addAdmin(originsBase.address, { from: owner }); + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + let amount = 20000; + await token.mint(userOne, amount); + await token.approve(originsBase.address, amount, { from: userOne }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + amount = 20000; + await token.mint(userTwo, amount); + await token.approve(originsBase.address, amount, { from: userTwo }); + await originsBase.buy(tierCount, zero, { from: userTwo, value: amount }); + amount = 20000; + await token.mint(userThree, amount); + await token.approve(originsBase.address, amount, { from: userThree }); + await originsBase.buy(tierCount, zero, { from: userThree, value: amount }); + await originsBase.withdrawSaleDeposit({ from: owner }); + }); + + it("Owner should be able to withdraw the sale deposit and remaining tokens to deposit address.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + let amount = 20000; + await token.mint(userOne, amount); + await token.approve(originsBase.address, amount, { from: userOne }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await token.mint(userTwo, amount); + await token.approve(originsBase.address, amount, { from: userTwo }); + await originsBase.buy(tierCount, zero, { from: userTwo, value: amount }); + await time.increase(firstSaleEnd + 100); + await originsBase.withdrawSaleDeposit({ from: owner }); + }); +}); diff --git a/tests/OriginsBase/state.test.js b/tests/OriginsBase/state.test.js new file mode 100644 index 0000000..fc63213 --- /dev/null +++ b/tests/OriginsBase/state.test.js @@ -0,0 +1,613 @@ +const { + // External Functions + BN, + balance, + assert, + // Custom Functions + currentTimestamp, + createStakeAndVest, + checkTier, + // Contract Artifacts + Token, + LockedFund, + OriginsBase, +} = require("../utils"); + +const { zero, verificationTypeEveryone } = require("../constants"); + +let { + waitedTS, + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositToken, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + secondMinAmount, + secondMaxAmount, + secondRemainingTokens, + secondSaleStartTS, + secondSaleEnd, + secondUnlockedBP, + secondVestOrLockCliff, + secondVestOfLockDuration, + secondDepositRate, + secondDepositToken, + secondDepositType, + secondVerificationType, + secondSaleEndDurationOrTS, + secondTransferType, +} = require("../variable"); + +contract("OriginsBase (State Functions)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic, originsBase; + let creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr; + let tierCount; + + before("Initiating Accounts & Creating Test Contract Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 9, "Alteast 9 accounts are required to test the contracts."); + [creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr] = accounts; + + let timestamp = await currentTimestamp(); + waitedTS = timestamp; + firstSaleStartTS = timestamp; + + // Creating the instance of Test Token. + token = await Token.new(zero, "Test Token", "TST", 18, { from: creator }); + + // Creating the Staking and Vesting + [staking, vestingLogic, vestingRegistry] = await createStakeAndVest(creator, token); + + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner], { from: creator }); + + // Creating the instance of OriginsBase Contract. + originsBase = await OriginsBase.new([owner], token.address, depositAddr, { from: creator }); + + // Setting lockedFund in Origins. + await originsBase.setLockedFund(lockedFund.address, { from: owner }); + + // Added Origins as an admin of LockedFund. + await lockedFund.addAdmin(originsBase.address, { from: owner }); + + // Setting Verifier in Origins. + await originsBase.addVerifier(verifier, { from: owner }); + + // Minting new tokens, Approving Origins and creating a new tier. + await token.mint(owner, firstRemainingTokens, { from: creator }); + + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + + await originsBase.addressVerification(userOne, tierCount, { from: verifier }); + }); + + beforeEach("Updating the timestamp.", async () => { + let timestamp = await currentTimestamp(); + firstSaleStartTS = timestamp; + secondSaleStartTS = timestamp; + }); + + it("Setting a deposit address should update the state.", async () => { + await originsBase.setDepositAddress(newDepositAddr, { from: owner }); + let cDepositAddr = await originsBase.getDepositAddress(); + assert.strictEqual(cDepositAddr, newDepositAddr, "Deposit Address is not correctly set."); + + // Resetting it for other tests. + await originsBase.setDepositAddress(depositAddr, { from: owner }); + }); + + it("Setting Locked Fund Contract should update the state.", async () => { + let newLockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); + await originsBase.setLockedFund(newLockedFund.address, { from: owner }); + let cLockedFund = await originsBase.getLockDetails(); + assert.strictEqual(cLockedFund, newLockedFund.address, "Locked Fund Contract is not correctly set."); + + // Resetting it for other tests. + await originsBase.setLockedFund(lockedFund.address, { from: owner }); + }); + + it("Adding a new tier should update the state correctly.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await checkTier( + originsBase, + tierCount, + zero, + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositToken, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType + ); + }); + + it("Owner should be able to set Tier Verification Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.setTierVerification(tierCount, secondVerificationType, { from: owner }); + await checkTier( + originsBase, + tierCount, + zero, + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositToken, + firstDepositType, + secondVerificationType, + firstSaleEndDurationOrTS, + firstTransferType + ); + }); + + it("Owner should be able to set Tier Deposit Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.setTierDeposit(tierCount, secondDepositRate, secondDepositToken, secondDepositType, { from: owner }); + await checkTier( + originsBase, + tierCount, + zero, + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + secondDepositRate, + secondDepositToken, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType + ); + }); + + it("Owner should be able to set Tier Token Limit Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.setTierTokenLimit(tierCount, secondMinAmount, secondMaxAmount, { from: owner }); + await checkTier( + originsBase, + tierCount, + secondMinAmount, + secondMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositToken, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType + ); + }); + + it("Owner should be able to set Tier Token Amount Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await token.mint(owner, secondRemainingTokens); + await token.approve(originsBase.address, secondRemainingTokens, { from: owner }); + await originsBase.setTierTokenAmount(tierCount, secondRemainingTokens, { from: owner }); + await checkTier( + originsBase, + tierCount, + zero, + firstMaxAmount, + secondRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositToken, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType + ); + }); + + it("Owner should be able to set Tier Vest or Lock Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.setTierVestOrLock( + tierCount, + secondVestOrLockCliff, + secondVestOfLockDuration, + secondUnlockedBP, + secondTransferType, + { from: owner } + ); + await checkTier( + originsBase, + tierCount, + zero, + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + secondUnlockedBP, + secondVestOrLockCliff, + secondVestOfLockDuration, + firstDepositRate, + firstDepositToken, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + secondTransferType + ); + }); + + it("Owner should be able to set Tier Time Parameters.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.setTierTime(tierCount, secondSaleStartTS, secondSaleEnd, secondSaleEndDurationOrTS, { from: owner }); + await checkTier( + originsBase, + tierCount, + zero, + firstMaxAmount, + firstRemainingTokens, + secondSaleStartTS, + secondSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositToken, + firstDepositType, + firstVerificationType, + secondSaleEndDurationOrTS, + firstTransferType + ); + }); + + it("Verifier should be able to verify a single address to a single tier.", async () => { + await originsBase.addressVerification(userOne, tierCount, { from: verifier }); + let currentStatus = await originsBase.isAddressApproved(userOne, tierCount); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + }); + + it("Verifier should be able to verify a single address to a multiple tier.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.singleAddressMultipleTierVerification(userOne, [tierCount, tierCount - 1, tierCount - 2], { from: verifier }); + let currentStatus = await originsBase.isAddressApproved(userOne, tierCount); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + currentStatus = await originsBase.isAddressApproved(userOne, tierCount - 1); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + currentStatus = await originsBase.isAddressApproved(userOne, tierCount - 2); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + }); + + it("Verifier should be able to verify a multiple address to a single tier.", async () => { + await originsBase.multipleAddressSingleTierVerification([userOne, userTwo, userThree], tierCount, { from: verifier }); + let currentStatus = await originsBase.isAddressApproved(userOne, tierCount); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + currentStatus = await originsBase.isAddressApproved(userTwo, tierCount); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + currentStatus = await originsBase.isAddressApproved(userThree, tierCount); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + }); + + it("Verifier should be able to verify a multiple address to a multiple tier.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.multipleAddressAndTierVerification([userOne, userTwo, userThree], [tierCount, tierCount - 1, tierCount - 2], { + from: verifier, + }); + let currentStatus = await originsBase.isAddressApproved(userOne, tierCount); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + currentStatus = await originsBase.isAddressApproved(userTwo, tierCount - 1); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + currentStatus = await originsBase.isAddressApproved(userThree, tierCount - 2); + assert.strictEqual(currentStatus, true, "Address Verification invalid"); + }); + + it("User should be able to buy tokens.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.addressVerification(userOne, tierCount, { from: verifier }); + let amount = 10000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + let userVestedBalance = await lockedFund.getVestedBalance(userOne); + assert(userVestedBalance.eq(new BN(amount).mul(new BN(firstDepositRate))), "User Vesting Balance is wrong."); + }); + + it("User should be able to buy tokens multiple times until max asset amount reaches.", async () => { + let amount = 10000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + let userVestedBalance = await lockedFund.getVestedBalance(userOne); + assert(userVestedBalance.eq(new BN(amount).mul(new BN(4)).mul(new BN(firstDepositRate))), "User Vesting Balance is wrong."); + }); + + it("User should be refunded the extra after the max reaches.", async () => { + let amount = 20000; + let oldBalance = await balance.current(userOne); + let tx = await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + let gasUsed = tx.receipt.gasUsed; + let gasPrice = (await web3.eth.getTransaction(tx.tx)).gasPrice; + let newBalance = await balance.current(userOne); + newBalance = newBalance.add(new BN(gasUsed).mul(new BN(gasPrice))); + let userVestedBalance = await lockedFund.getVestedBalance(userOne); + assert(oldBalance.sub(newBalance).eq(new BN(10000)), "User not returned enough."); + assert(userVestedBalance.eq(firstMaxAmount.mul(new BN(firstDepositRate))), "User Vested Balance is wrong."); + }); + + it("Owner should be able to withdraw the sale deposit to deposit address.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + let amount = 20000; + await token.mint(userOne, amount); + await token.approve(originsBase.address, amount, { from: userOne }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + amount = 20000; + await token.mint(userTwo, amount); + await token.approve(originsBase.address, amount, { from: userTwo }); + await originsBase.buy(tierCount, zero, { from: userTwo, value: amount }); + amount = 20000; + await token.mint(userThree, amount); + await token.approve(originsBase.address, amount, { from: userThree }); + await originsBase.buy(tierCount, zero, { from: userThree, value: amount }); + let oldBalance = await balance.current(depositAddr); + await originsBase.withdrawSaleDeposit({ from: owner }); + let newBalance = await balance.current(depositAddr); + assert(newBalance.sub(oldBalance).eq(new BN(60000)), "Admin did not received the total sale proceedings."); + }); +}); diff --git a/tests/OriginsBase/user.test.js b/tests/OriginsBase/user.test.js new file mode 100644 index 0000000..e71f100 --- /dev/null +++ b/tests/OriginsBase/user.test.js @@ -0,0 +1,516 @@ +const { + // External Functions + expectRevert, + assert, + // Custom Functions + randomValue, + currentTimestamp, + createStakeAndVest, + // Contract Artifacts + Token, + LockedFund, + OriginsBase, +} = require("../utils"); + +const { + zero, + saleEndDurationOrTSNone, + saleEndDurationOrTSUntilSupply, + saleEndDurationOrTSDuration, + verificationTypeNone, + verificationTypeEveryone, + transferTypeNone, + transferTypeUnlocked, + transferTypeWaitedUnlock, + transferTypeLocked, +} = require("../constants"); + +let { + waitedTS, + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, +} = require("../variable"); + +contract("OriginsBase (User Functions)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic, originsBase; + let creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr; + let tierCount; + + before("Initiating Accounts & Creating Test Contract Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 9, "Alteast 9 accounts are required to test the contracts."); + [creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr] = accounts; + + let timestamp = await currentTimestamp(); + waitedTS = timestamp; + firstSaleStartTS = timestamp; + + // Creating the instance of Test Token. + token = await Token.new(zero, "Test Token", "TST", 18, { from: creator }); + + // Creating the Staking and Vesting + [staking, vestingLogic, vestingRegistry] = await createStakeAndVest(creator, token); + + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner], { from: creator }); + + // Creating the instance of OriginsBase Contract. + originsBase = await OriginsBase.new([owner], token.address, depositAddr, { from: creator }); + + // Setting lockedFund in Origins. + await originsBase.setLockedFund(lockedFund.address, { from: owner }); + + // Added Origins as an admin of LockedFund. + await lockedFund.addAdmin(originsBase.address, { from: owner }); + + // Setting Verifier in Origins. + await originsBase.addVerifier(verifier, { from: owner }); + + // Minting new tokens, Approving Origins and creating a new tier. + await token.mint(owner, firstRemainingTokens, { from: creator }); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + }); + + beforeEach("Updating the timestamp.", async () => { + let timestamp = await currentTimestamp(); + firstSaleStartTS = timestamp; + secondSaleStartTS = timestamp; + }); + + it("User should be able to buy tokens.", async () => { + await originsBase.addressVerification(userOne, tierCount, { from: verifier }); + let amount = 10000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + }); + + it("User should be able to buy tokens multiple times until max asset amount reaches.", async () => { + let amount = 10000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + }); + + it("User should be allowed to buy until the max reaches.", async () => { + let amount = 10000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await expectRevert( + originsBase.buy(tierCount, zero, { from: userOne, value: amount }), + "OriginsBase: User already bought maximum allowed." + ); + }); + + it("User should be allowed to buy with Immediate Unlock.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + transferTypeUnlocked, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + let amount = 10000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + }); + + it("User should be allowed to buy with Waited Unlock.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + transferTypeWaitedUnlock, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + let amount = 10000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + }); + + it("User should be allowed to buy with Locked Transfer.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + transferTypeLocked, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + let amount = 10000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + }); + + it("User should not be allowed to buy without setting Transfer Type.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + transferTypeNone, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + let amount = 10000; + await expectRevert( + originsBase.buy(tierCount, zero, { from: userOne, value: amount }), + "OriginsBase: Transfer Type not set by owner." + ); + }); + + it("User should not be allowed to buy if sale end duration or TS not set.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + (await currentTimestamp()) + 1000, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + saleEndDurationOrTSNone, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + let amount = 10000; + await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount }), "OriginsBase: Sale not allowed."); + }); + + it("User should not be allowed to buy if sale start time is not set.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + zero, + (await currentTimestamp()) + 1000, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + saleEndDurationOrTSDuration, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + let amount = 10000; + await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount }), "OriginsBase: Sale has not started yet."); + }); + + it("User should not be allowed to buy if the token sale has ended.", async () => { + let amount = 100; + await token.mint(owner, amount); + await token.approve(originsBase.address, amount, { from: owner }); + await originsBase.createTier( + amount, + amount, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + 1, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await expectRevert(originsBase.buy(tierCount, zero, { from: userTwo, value: amount }), "OriginsBase: Sale ended."); + }); + + it("User should not be allowed to buy if sale end is not set.", async () => { + let amount = randomValue(); + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + zero, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount }), "OriginsBase: Sale not allowed."); + }); + + it("User should not be allowed to buy if total tokens are sold with Sale End as Duration.", async () => { + let amount = 100; + await token.mint(owner, amount); + await token.approve(originsBase.address, amount, { from: owner }); + await originsBase.createTier( + amount / 2, + amount, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + 1, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount / 2 }); + await originsBase.buy(tierCount, zero, { from: userTwo, value: amount / 2 }); + await expectRevert(originsBase.buy(tierCount, zero, { from: userThree, value: amount / 2 }), "OriginsBase: Sale ended."); + }); + + it("User should not be allowed to buy if total tokens are sold with Sale End as Until Supply.", async () => { + let amount = 100; + await token.mint(owner, amount); + await token.approve(originsBase.address, amount, { from: owner }); + await originsBase.createTier( + amount, + amount, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + 1, + firstDepositType, + verificationTypeEveryone, + saleEndDurationOrTSUntilSupply, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount / 2 }); + await originsBase.buy(tierCount, zero, { from: userTwo, value: amount / 2 }); + await expectRevert(originsBase.buy(tierCount, zero, { from: userThree, value: amount / 2 }), "OriginsBase: Sale ended."); + }); + + it("User should not be allowed to buy if Verification is not set.", async () => { + let amount = randomValue(); + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + verificationTypeNone, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount }), "OriginsBase: No one is allowed for sale."); + }); + + it("If verification is done by address, user should only be allowed if it is done by verified address.", async () => { + let amount = randomValue(); + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: amount }), "OriginsBase: User not approved for sale."); + }); + + it("User should not be allowed to buy once the max reaches even if there is remaining tokens.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + let amount = 25000; + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + await originsBase.buy(tierCount, zero, { from: userOne, value: amount }); + amount = 5000; + await expectRevert( + originsBase.buy(tierCount, zero, { from: userOne, value: amount }), + "OriginsBase: User already bought maximum allowed." + ); + // Though any other user can still buy. + amount = 5000; + await token.approve(originsBase.address, amount, { from: userTwo }); + }); + + it("User should not be allowed to buy tokens with zero deposit in RBTC", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await expectRevert(originsBase.buy(tierCount, zero, { from: userOne, value: zero }), "OriginsBase: Amount cannot be zero."); + }); + + it("User should not be allowed to buy with assets deposited less than minimum allowed.", async () => { + let amount = 1000; + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + verificationTypeEveryone, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + await originsBase.setTierTokenLimit(tierCount, 10000, firstMaxAmount, { from: owner }); + await expectRevert( + originsBase.buy(tierCount, zero, { from: userOne, value: amount }), + "OriginsBase: Deposit is less than minimum allowed." + ); + }); + + it("User should be able to get token address.", async () => { + let tokenAddress = await originsBase.getToken({ from: userOne }); + }); + + it("User should be able to get Tokens Bought By Address On Tier.", async () => { + let tokensBought = await originsBase.getTokensBoughtByAddressOnTier(userOne, 1, { from: userOne }); + }); + + it("User should be able to get Participating Wallet Count Per Tier.", async () => { + let participatingWallet = await originsBase.getParticipatingWalletCountPerTier(1, { from: userOne }); + }); + + it("User should be able to get Total Token Allocation Per Tier.", async () => { + let totalTokenAllocation = await originsBase.getTotalTokenAllocationPerTier(1, { from: userOne }); + }); + + it("User should be able to get Tokens Sold Per Tier.", async () => { + let tokensSoldPerTier = await originsBase.getTokensSoldPerTier(1, { from: userOne }); + }); + + it("User should be able to check Sale Ended.", async () => { + let saleEnded = await originsBase.checkSaleEnded(1, { from: userOne }); + }); +}); diff --git a/tests/OriginsBase/verifier.test.js b/tests/OriginsBase/verifier.test.js new file mode 100644 index 0000000..c5d02ee --- /dev/null +++ b/tests/OriginsBase/verifier.test.js @@ -0,0 +1,216 @@ +const { + // External Functions + expectRevert, + assert, + // Custom Functions + currentTimestamp, + createStakeAndVest, + // Contract Artifacts + Token, + LockedFund, + OriginsBase, +} = require("../utils"); + +const { zero, zeroAddress } = require("../constants"); + +let { + waitedTS, + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + secondMinAmount, + secondMaxAmount, + secondRemainingTokens, + secondSaleStartTS, + secondSaleEnd, + secondUnlockedBP, + secondVestOrLockCliff, + secondVestOfLockDuration, + secondDepositRate, + secondDepositToken, + secondDepositType, + secondSaleEndDurationOrTS, + secondTransferType, +} = require("../variable"); + +contract("OriginsBase (Verifier Functions)", (accounts) => { + let token, lockedFund, vestingRegistry, vestingLogic, stakingLogic, originsBase; + let creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr; + let tierCount; + + before("Initiating Accounts & Creating Test Contract Instance.", async () => { + // Checking if we have enough accounts to test. + assert.isAtLeast(accounts.length, 9, "Alteast 9 accounts are required to test the contracts."); + [creator, owner, newOwner, userOne, userTwo, userThree, verifier, depositAddr, newDepositAddr] = accounts; + + let timestamp = await currentTimestamp(); + waitedTS = timestamp; + + // Creating the instance of Test Token. + token = await Token.new(zero, "Test Token", "TST", 18, { from: creator }); + + // Creating the Staking and Vesting + [staking, vestingLogic, vestingRegistry] = await createStakeAndVest(creator, token); + + // Creating the instance of LockedFund Contract. + lockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner], { from: creator }); + + // Creating the instance of OriginsBase Contract. + originsBase = await OriginsBase.new([owner], token.address, depositAddr, { from: creator }); + + // Setting lockedFund in Origins. + await originsBase.setLockedFund(lockedFund.address, { from: owner }); + + // Added Origins as an admin of LockedFund. + await lockedFund.addAdmin(originsBase.address, { from: owner }); + + // Setting Verifier in Origins. + await originsBase.addVerifier(verifier, { from: owner }); + }); + + beforeEach("Updating the timestamp and creating new Tier.", async () => { + let timestamp = await currentTimestamp(); + firstSaleStartTS = timestamp; + secondSaleStartTS = timestamp; + + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: owner } + ); + tierCount = await originsBase.getTierCount(); + }); + + it("Verifier should not be able to set deposit address.", async () => { + await expectRevert( + originsBase.setDepositAddress(newDepositAddr, { from: verifier }), + "OriginsAdmin: Only owner can call this function." + ); + }); + + it("Verifier should not be able to set Locked Fund Contract.", async () => { + let newLockedFund = await LockedFund.new(waitedTS, token.address, vestingRegistry.address, [owner]); + await expectRevert( + originsBase.setLockedFund(newLockedFund.address, { from: verifier }), + "OriginsAdmin: Only owner can call this function." + ); + }); + + it("Verifier should not be able to add a new tier.", async () => { + await token.mint(owner, firstRemainingTokens); + await token.approve(originsBase.address, firstRemainingTokens, { from: owner }); + await expectRevert( + originsBase.createTier( + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + { from: verifier } + ), + "OriginsAdmin: Only owner can call this function." + ); + }); + + it("Verifier should not be able to set Tier Deposit Parameters.", async () => { + await expectRevert( + originsBase.setTierDeposit(tierCount, secondDepositRate, secondDepositToken, secondDepositType, { from: verifier }), + "OriginsAdmin: Only owner can call this function." + ); + }); + + it("Verifier should not be able to set Tier Token Limit Parameters.", async () => { + await expectRevert( + originsBase.setTierTokenLimit(tierCount, secondMinAmount, secondMaxAmount, { from: verifier }), + "OriginsAdmin: Only owner can call this function." + ); + }); + + it("Verifier should not be able to set Tier Token Amount Parameters.", async () => { + await expectRevert( + originsBase.setTierTokenAmount(tierCount, secondRemainingTokens, { from: verifier }), + "OriginsAdmin: Only owner can call this function." + ); + }); + + it("Verifier should not be able to set Tier Vest or Lock Parameters.", async () => { + await expectRevert( + originsBase.setTierVestOrLock( + tierCount, + secondVestOrLockCliff, + secondVestOfLockDuration, + secondUnlockedBP, + secondTransferType, + { from: verifier } + ), + "OriginsAdmin: Only owner can call this function." + ); + }); + + it("Verifier should not be able to set Tier Time Parameters.", async () => { + await expectRevert( + originsBase.setTierTime(tierCount, secondSaleStartTS, secondSaleEnd, secondSaleEndDurationOrTS, { from: verifier }), + "OriginsAdmin: Only owner can call this function." + ); + }); + + it("Verifier should be able to verify a single address to a single tier.", async () => { + await originsBase.addressVerification(userOne, tierCount, { from: verifier }); + }); + + it("Verifier should not be able to verify a zero address to a single tier.", async () => { + await expectRevert( + originsBase.addressVerification(zeroAddress, tierCount, { from: verifier }), + "OriginsBase: Address to be verified cannot be zero." + ); + }); + + it("Verifier should be able to verify a single address to a multiple tier.", async () => { + await originsBase.singleAddressMultipleTierVerification(userOne, [tierCount, tierCount - 1, tierCount - 2], { from: verifier }); + }); + + it("Verifier should be able to verify a multiple address to a single tier.", async () => { + await originsBase.multipleAddressSingleTierVerification([userOne, userTwo, userThree], tierCount, { from: verifier }); + }); + + it("Verifier should be able to verify a multiple address to a multiple tier.", async () => { + await originsBase.multipleAddressAndTierVerification([userOne, userTwo, userThree], [tierCount, tierCount - 1, tierCount - 2], { + from: verifier, + }); + }); + + it("Verifier should not be able to verify a multiple address of length x to a multiple tier of length y, where x != y.", async () => { + await expectRevert( + originsBase.multipleAddressAndTierVerification([userOne, userTwo, userThree], [tierCount, tierCount - 1], { from: verifier }), + "OriginsBase: Address and Tier Array length mismatch." + ); + }); +}); diff --git a/tests/constants.js b/tests/constants.js new file mode 100644 index 0000000..05ec10c --- /dev/null +++ b/tests/constants.js @@ -0,0 +1,67 @@ +// Constants + +const { + BN, // Big Number support. + constants, +} = require("@openzeppelin/test-helpers"); + +let zero = new BN(0); +let zeroAddress = constants.ZERO_ADDRESS; + +const fourWeeks = 4 * 7 * 24 * 60 * 60; + +const zeroBasisPoint = 0; +const twentyBasisPoint = 2000; +const fiftyBasisPoint = 5000; +const hundredBasisPoint = 10000; +const invalidBasisPoint = 10001; + +const depositTypeRBTC = 0; +const depositTypeToken = 1; + +const unlockTypeNone = 0; +const unlockTypeImmediate = 1; +const unlockTypeWaited = 2; + +const saleEndDurationOrTSNone = 0; +const saleEndDurationOrTSUntilSupply = 1; +const saleEndDurationOrTSDuration = 2; +const saleEndDurationOrTSTimestamp = 3; + +const verificationTypeNone = 0; +const verificationTypeEveryone = 1; +const verificationTypeByAddress = 2; + +const transferTypeNone = 0; +const transferTypeUnlocked = 1; +const transferTypeWaitedUnlock = 2; +const transferTypeVested = 3; +const transferTypeLocked = 4; + +module.exports = { + zero, + zeroAddress, + fourWeeks, + zeroBasisPoint, + twentyBasisPoint, + fiftyBasisPoint, + hundredBasisPoint, + invalidBasisPoint, + depositTypeRBTC, + depositTypeToken, + unlockTypeNone, + unlockTypeImmediate, + unlockTypeWaited, + saleEndDurationOrTSNone, + saleEndDurationOrTSUntilSupply, + saleEndDurationOrTSDuration, + saleEndDurationOrTSTimestamp, + verificationTypeNone, + verificationTypeEveryone, + verificationTypeByAddress, + transferTypeNone, + transferTypeUnlocked, + transferTypeWaitedUnlock, + transferTypeVested, + transferTypeLocked, +}; diff --git a/tests/utils.js b/tests/utils.js new file mode 100644 index 0000000..f3c8bc8 --- /dev/null +++ b/tests/utils.js @@ -0,0 +1,264 @@ +// Independent Variables +let { saleEndDurationOrTSDuration, saleEndDurationOrTSTimestamp } = require("./variable.js"); + +// Independent Constants + +const { zeroAddress, fourWeeks } = require("./constants.js"); + +// External Functions + +const { + BN, // Big Number support. + constants, + expectRevert, // Assertions for transactions that should fail. + expectEvent, + time, + balance, +} = require("@openzeppelin/test-helpers"); + +const { assert } = require("chai"); + +// Custom Functions + +/** + * Function to create a random value. + * It expects no parameter. + * + * @return {number} Random Value. + */ +function randomValue() { + return Math.floor(Math.random() * 10000) + 10000; +} + +/** + * Function to get back the current timestamp in seconds. + * It expects no parameter. + * + * @return {number} Current Unix Timestamp. + */ +async function currentTimestamp() { + let timestamp = await time.latest(); + return timestamp; +} +/** + * Function to create staking and vesting details. + */ +async function createStakeAndVest(creator, token) { + // Creating the Staking Instance. + stakingLogic = await StakingLogic.new(token.address, { from: creator }); + staking = await StakingProxy.new(token.address, { from: creator }); + await staking.setImplementation(stakingLogic.address, { from: creator }); + staking = await StakingLogic.at(staking.address); + + // Creating the FeeSharing Instance. + feeSharingProxy = await FeeSharingProxy.new(zeroAddress, staking.address, { from: creator }); + + // Creating the Vesting Instance. + vestingLogic = await VestingLogic.new({ from: creator }); + vestingFactory = await VestingFactory.new(vestingLogic.address, { from: creator }); + vestingRegistry = await VestingRegistry.new( + vestingFactory.address, + token.address, + staking.address, + feeSharingProxy.address, + creator, // This should be Governance Timelock Contract. + { from: creator } + ); + vestingFactory.transferOwnership(vestingRegistry.address, { from: creator }); + + return [staking, vestingLogic, vestingRegistry]; +} + +/** + * Function to check the contract state. + * + * @param contractInstance The contract instance. + * @param checkArray The items to be checked. + * @param userAddr The user address for any particular check. + * @param waitedTS Whether the waited unlock started or not. + * @param token The token address which is being locked, unlocked, vested, etc. + * @param cliff Wait period after which locked token starts unlocking, represented in 4 weeks duration. 2 means 8 weeks. + * @param duration Duration of the entire staking, represented similar to cliff. + * @param vestingRegistry The vesting registry address. + * @param vestedBalance The vested balance of the `userAddr`. + * @param lockedBalance The locked balance of the `userAddr`. + * @param waitedUnlockedBalance The waited unlocked balance of the `userAddr`. + * @param unlockedBalance The unlocked balance of the `userAddr`. + * @param isAdmin True if `userAddr` is an admin, false otherwise. + */ +async function checkStatus( + contractInstance, + checkArray, + userAddr, + waitedTS, + token, + cliff, + duration, + vestingRegistry, + vestedBalance, + lockedBalance, + waitedUnlockedBalance, + unlockedBalance, + isAdmin +) { + if (checkArray[0] == 1) { + let cValue = await contractInstance.getWaitedTS(); + assert.equal(waitedTS, cValue.toNumber(), "The waited timestamp does not match."); + } + if (checkArray[1] == 1) { + let cValue = await contractInstance.getToken(); + assert.strictEqual(token, cValue, "The token does not match."); + } + if (checkArray[2] == 1) { + let cValue = await contractInstance.cliff(userAddr); + assert.equal(cliff, cValue.toNumber() / fourWeeks, "The cliff does not match."); + } + if (checkArray[3] == 1) { + let cValue = await contractInstance.duration(userAddr); + assert.equal(duration, cValue.toNumber() / fourWeeks, "The duration does not match."); + } + if (checkArray[4] == 1) { + let cValue = await contractInstance.getVestingDetails(); + assert.strictEqual(vestingRegistry, cValue, "The vesting registry does not match."); + } + if (checkArray[5] == 1) { + let cValue = await contractInstance.getVestedBalance(userAddr); + assert.equal(vestedBalance, cValue.toNumber(), "The vested balance does not match."); + } + if (checkArray[6] == 1) { + let cValue = await contractInstance.getLockedBalance(userAddr); + assert.equal(lockedBalance, cValue.toNumber(), "The locked balance does not match."); + } + if (checkArray[7] == 1) { + let cValue = await contractInstance.getWaitedUnlockedBalance(userAddr); + assert.equal(waitedUnlockedBalance, cValue.toNumber(), "The waited unlocked balance does not match."); + } + if (checkArray[8] == 1) { + let cValue = await contractInstance.getUnlockedBalance(userAddr); + assert.equal(unlockedBalance, cValue.toNumber(), "The unlocked balance does not match."); + } + if (checkArray[9] == 1) { + let cValue = await contractInstance.adminStatus(userAddr); + assert.equal(isAdmin, cValue, "The admin status does not match."); + } +} + +/** + * Function to get the current token balance in contract & wallet. + * It expects user address along with contract & token instances as parameters. + * + * @param addr The user/contract address. + * @param tokenContract The Token Contract. + * @param lockedFundContract The Locked Fund Contract. + * + * @return [Token Balance, Vested Balance, Locked Balance, Waited Unlocked Balance, Unlocked Balance]. + */ +async function getTokenBalances(addr, tokenContract, lockedFundContract) { + let tokenBal = await tokenContract.balanceOf(addr); + let vestedBal = await lockedFundContract.getVestedBalance(addr); + let lockedBal = await lockedFundContract.getLockedBalance(addr); + let waitedUnlockedBal = await lockedFundContract.getWaitedUnlockedBalance(addr); + let unlockedBal = await lockedFundContract.getUnlockedBalance(addr); + return [tokenBal, vestedBal, lockedBal, waitedUnlockedBal, unlockedBal]; +} + +/** + * Mints random token for user account and then approve a contract. + * + * @param tokenContract The Token Contract. + * @param userAddr User Address. + * @param toApprove User Address who is approved. + * + * @returns value The token amount which was minted by user. + */ +async function userMintAndApprove(tokenContract, userAddr, toApprove) { + let value = randomValue(); + await tokenContract.mint(userAddr, value); + await tokenContract.approve(toApprove, value, { from: userAddr }); + return value; +} + +/** + * Checks Tier Details. + */ +async function checkTier( + _originsBase, + _tierCount, + _minAmount, + _maxAmount, + _remainingTokens, + _saleStartTS, + _saleEnd, + _unlockedBP, + _vestOrLockCliff, + _vestOrLockDuration, + _depositRate, + _depositToken, + _depositType, + _verificationType, + _saleEndDurationOrTS, + _transferType +) { + let tierPartA = await _originsBase.readTierPartA(_tierCount); + let tierPartB = await _originsBase.readTierPartB(_tierCount); + assert(tierPartA._minAmount.eq(new BN(_minAmount)), "Minimum Amount is not correctly set."); + assert(tierPartA._maxAmount.eq(new BN(_maxAmount)), "Maximum Amount is not correctly set."); + assert(tierPartA._remainingTokens.eq(new BN(_remainingTokens)), "Remaining Token is not correctly set."); + assert(tierPartA._saleStartTS.eq(new BN(_saleStartTS)), "Sale Start TS is not correctly set."); + if (tierPartB._saleEndDurationOrTS == saleEndDurationOrTSDuration) { + assert(tierPartA._saleEnd.eq(new BN(Number(_saleStartTS) + Number(_saleEnd))), "Sale End TS is not correctly set."); + } else if (tierPartB._saleEndDurationOrTS == saleEndDurationOrTSTimestamp) { + assert(tierPartA._saleEnd.eq(new BN(_saleEnd)), "Sale End TS is not correctly set."); + } + assert(tierPartA._unlockedBP.eq(new BN(_unlockedBP)), "Unlocked Basis Point is not correctly set."); + assert(tierPartA._vestOrLockCliff.eq(new BN(_vestOrLockCliff)), "Vest or Lock Cliff is not correctly set."); + assert(tierPartA._vestOrLockDuration.eq(new BN(_vestOrLockDuration)), "Vest or Lock Duration is not correctly set."); + assert(tierPartA._depositRate.eq(new BN(_depositRate)), "Deposit Rate is not correctly set."); + assert.strictEqual(tierPartB._depositToken, _depositToken, "Deposit Token is not correctly set."); + assert(tierPartB._depositType.eq(new BN(_depositType)), "Deposit Type is not correctly set."); + assert(tierPartB._verificationType.eq(new BN(_verificationType)), "Verification Type is not correctly set."); + assert(tierPartB._saleEndDurationOrTS.eq(new BN(_saleEndDurationOrTS)), "Sale End Duration or TS is not correctly set."); + assert(tierPartB._transferType.eq(new BN(_transferType)), "Transfer Type is not correctly set."); +} + +// Contract Artifacts +const Token = artifacts.require("Token"); +const LockedFund = artifacts.require("LockedFund"); +const StakingLogic = artifacts.require("Staking"); +const StakingProxy = artifacts.require("StakingProxy"); +const FeeSharingProxy = artifacts.require("FeeSharingProxyMockup"); +const VestingLogic = artifacts.require("VestingLogic"); +const VestingFactory = artifacts.require("VestingFactory"); +const VestingRegistry = artifacts.require("VestingRegistry3"); +const OriginsAdmin = artifacts.require("OriginsAdmin"); +const OriginsBase = artifacts.require("OriginsBase"); + +module.exports = { + // External Functions + BN, + constants, + expectRevert, + expectEvent, + time, + balance, + assert, + // Custom Functions + randomValue, + currentTimestamp, + createStakeAndVest, + checkStatus, + getTokenBalances, + userMintAndApprove, + checkTier, + // Contract Artifacts + Token, + LockedFund, + StakingLogic, + StakingProxy, + FeeSharingProxy, + VestingLogic, + VestingFactory, + VestingRegistry, + OriginsAdmin, + OriginsBase, +}; diff --git a/tests/variable.js b/tests/variable.js new file mode 100644 index 0000000..eaf1dcc --- /dev/null +++ b/tests/variable.js @@ -0,0 +1,117 @@ +const { + BN, // Big Number support. +} = require("@openzeppelin/test-helpers"); + +const { + zeroAddress, + depositTypeRBTC, + verificationTypeEveryone, + verificationTypeByAddress, + saleEndDurationOrTSDuration, + transferTypeVested, +} = require("./constants"); + +// Variables + +let cliff = 1; // This is in 4 weeks. i.e. 1 * 4 weeks. +let duration = 11; // This is in 4 weeks. i.e. 11 * 4 weeks. + +let waitedTS = 0; + +let [ + firstMinAmount, + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositToken, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, +] = [ + 1, + new BN(50000), + new BN(6000000), + 0, + 86400, + 0, + 1, + 11, + 100, + zeroAddress, + depositTypeRBTC, + verificationTypeByAddress, + saleEndDurationOrTSDuration, + transferTypeVested, +]; + +let [ + secondMinAmount, + secondMaxAmount, + secondRemainingTokens, + secondSaleStartTS, + secondSaleEnd, + secondUnlockedBP, + secondVestOrLockCliff, + secondVestOfLockDuration, + secondDepositRate, + secondDepositToken, + secondDepositType, + secondVerificationType, + secondSaleEndDurationOrTS, + secondTransferType, +] = [ + 1, + new BN(75000), + new BN(10000000), + 0, + 86400, + 5000, + 1, + 11, + 50, + zeroAddress, + depositTypeRBTC, + verificationTypeEveryone, + saleEndDurationOrTSDuration, + transferTypeVested, +]; + +module.exports = { + cliff, + duration, + waitedTS, + firstMinAmount, + firstMaxAmount, + firstRemainingTokens, + firstSaleStartTS, + firstSaleEnd, + firstUnlockedBP, + firstVestOrLockCliff, + firstVestOfLockDuration, + firstDepositRate, + firstDepositToken, + firstDepositType, + firstVerificationType, + firstSaleEndDurationOrTS, + firstTransferType, + secondMinAmount, + secondMaxAmount, + secondRemainingTokens, + secondSaleStartTS, + secondSaleEnd, + secondUnlockedBP, + secondVestOrLockCliff, + secondVestOfLockDuration, + secondDepositRate, + secondDepositToken, + secondDepositType, + secondVerificationType, + secondSaleEndDurationOrTS, + secondTransferType, +}; diff --git a/truffle-config.js b/truffle-config.js new file mode 100644 index 0000000..7ea30e1 --- /dev/null +++ b/truffle-config.js @@ -0,0 +1,52 @@ +/* eslint-disable */ +require("chai") + .use(require("chai-as-promised")) + .use(require("chai-bn")(require("bn.js"))) + .use(require("chai-string")) + .use(require("dirty-chai")) + .expect(); + +const Decimal = require("decimal.js"); +Decimal.set({ precision: 100, rounding: Decimal.ROUND_DOWN, toExpPos: 40 }); + +const ganache = require("ganache-core"); +/* eslint-enable */ + +module.exports = { + contracts_directory: "./contracts", + contracts_build_directory: "./build/contracts", + test_directory: "./tests", + networks: { + development: { + host: "localhost", + port: 7545, + network_id: "*", + gasPrice: 20000000000, + gas: 6800000, + provider: ganache.provider({ + gasLimit: 6800000, + gasPrice: 20000000000, + default_balance_ether: 10000000000000000000, + }), + }, + }, + plugins: ["solidity-coverage"], + compilers: { + solc: { + version: "0.5.17", + settings: { + optimizer: { + enabled: true, + runs: 200, + }, + }, + }, + }, + mocha: { + enableTimeouts: false, + before_timeout: 3600000, + timeout: 1800000, + useColors: true, + reporter: "list", + }, +};