diff --git a/buidler.config.ts b/buidler.config.ts index deaa7bcd..6e15ca7f 100644 --- a/buidler.config.ts +++ b/buidler.config.ts @@ -1,17 +1,19 @@ import path from 'path'; import fs from 'fs'; -import {usePlugin} from '@nomiclabs/buidler/config'; +import {usePlugin, task} from '@nomiclabs/buidler/config'; // @ts-ignore import {accounts} from './test-wallets.js'; import {eEthereumNetwork} from './helpers/types'; import {BUIDLEREVM_CHAINID, COVERAGE_CHAINID} from './helpers/buidler-constants'; +import {setDRE} from './helpers/misc-utils'; + +require('dotenv').config(); usePlugin('@nomiclabs/buidler-ethers'); usePlugin('buidler-typechain'); usePlugin('solidity-coverage'); usePlugin('@nomiclabs/buidler-waffle'); usePlugin('@nomiclabs/buidler-etherscan'); -usePlugin('buidler-gas-reporter'); const SKIP_LOAD = process.env.SKIP_LOAD === 'true'; const DEFAULT_BLOCK_GAS_LIMIT = 12450000; @@ -22,15 +24,12 @@ const ETHERSCAN_KEY = process.env.ETHERSCAN_KEY || ''; const MNEMONIC_PATH = "m/44'/60'/0'/0"; const MNEMONIC = process.env.MNEMONIC || ''; -// Prevent to load scripts before compilation and typechain -if (!SKIP_LOAD) { - ['misc', 'migrations', 'dev', 'full'].forEach((folder) => { - const tasksPath = path.join(__dirname, 'tasks', folder); - fs.readdirSync(tasksPath) - .filter((pth) => pth.includes('.ts')) - .forEach((task) => require(`${tasksPath}/${task}`)); - }); -} +task(`set-DRE`, `Inits the DRE, to have access to all the plugins' objects`).setAction( + async (_, _DRE) => { + setDRE(_DRE); + return _DRE; + } +); const getCommonNetworkConfig = (networkName: eEthereumNetwork, networkId: number) => { return { diff --git a/config/aave.ts b/config/aave.ts index 3c8923c2..76f08a9d 100644 --- a/config/aave.ts +++ b/config/aave.ts @@ -1,8 +1,29 @@ import BigNumber from 'bignumber.js'; -import {oneRay} from '../helpers/constants'; +import {oneRay, ZERO_ADDRESS} from '../helpers/constants'; import {IAaveConfiguration, EthereumNetwork, eEthereumNetwork} from '../helpers/types'; import {CommonsConfig} from './commons'; +import { + stablecoinStrategyBUSD, + stablecoinStrategyDAI, + stablecoinStrategySUSD, + stablecoinStrategyTUSD, + stablecoinStrategyUSDC, + stablecoinStrategyUSDT, + strategyAAVE, + strategyBase, + strategyKNC, + strategyLINK, + strategyMANA, + strategyMKR, + strategyREN, + strategyREP, + strategySNX, + strategyUNI, + strategyWBTC, + strategyWETH, + strategyYFI, +} from './reservesConfigs'; // ---------------- // POOL--SPECIFIC PARAMS @@ -12,307 +33,101 @@ export const AaveConfig: IAaveConfiguration = { ...CommonsConfig, ConfigName: 'Aave', ProviderId: 1, - ReserveSymbols: [ - 'WETH', - 'DAI', - 'LEND', - 'TUSD', - 'BAT', - 'USDC', - 'USDT', - 'SUSD', - 'ZRX', - 'MKR', - 'WBTC', - 'LINK', - 'KNC', - 'MANA', - 'REP', - 'SNX', - 'BUSD', - ], ReservesConfig: { - DAI: { - baseVariableBorrowRate: new BigNumber(0.01).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.05).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.16).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '7500', - liquidationThreshold: '8000', - liquidationBonus: '10500', - borrowingEnabled: true, - stableBorrowRateEnabled: true, - reserveDecimals: '18', - }, - TUSD: { - baseVariableBorrowRate: new BigNumber(0.01).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.04).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.14).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '7500', - liquidationThreshold: '8000', - liquidationBonus: '10500', - borrowingEnabled: true, - stableBorrowRateEnabled: true, - reserveDecimals: '18', - }, - USDC: { - baseVariableBorrowRate: new BigNumber(0.01).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.04).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.16).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '7500', - liquidationThreshold: '8000', - liquidationBonus: '10500', - borrowingEnabled: true, - stableBorrowRateEnabled: true, - reserveDecimals: '6', - }, - USDT: { - baseVariableBorrowRate: new BigNumber(0.01).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.04).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.14).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '-1', - liquidationThreshold: '8000', - liquidationBonus: '10500', - borrowingEnabled: true, - stableBorrowRateEnabled: true, - reserveDecimals: '6', - }, - SUSD: { - baseVariableBorrowRate: new BigNumber(0.01).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.04).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.14).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '-1', - liquidationThreshold: '8000', - liquidationBonus: '10500', - borrowingEnabled: true, - stableBorrowRateEnabled: false, - reserveDecimals: '18', - }, - LEND: { - baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.08).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.1).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '6000', - liquidationThreshold: '6500', - liquidationBonus: '11500', - borrowingEnabled: true, - stableBorrowRateEnabled: true, - reserveDecimals: '18', - }, - BAT: { - baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.08).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.1).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '6000', - liquidationThreshold: '6500', - liquidationBonus: '11000', - borrowingEnabled: true, - stableBorrowRateEnabled: true, - reserveDecimals: '18', - }, - WETH: { - baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.08).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.1).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '7500', - liquidationThreshold: '8000', - liquidationBonus: '10500', - borrowingEnabled: true, - stableBorrowRateEnabled: true, - reserveDecimals: '18', - }, - LINK: { - baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.08).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.1).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '6500', - liquidationThreshold: '7000', - liquidationBonus: '11000', - borrowingEnabled: true, - stableBorrowRateEnabled: true, - reserveDecimals: '18', - }, - WBTC: { - baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.08).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.1).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '6000', - liquidationThreshold: '6500', - liquidationBonus: '11500', - borrowingEnabled: true, - stableBorrowRateEnabled: true, - reserveDecimals: '8', - }, - KNC: { - baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.08).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.1).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '6000', - liquidationThreshold: '6500', - liquidationBonus: '11000', - borrowingEnabled: true, - stableBorrowRateEnabled: true, - reserveDecimals: '18', - }, - REP: { - baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.08).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.1).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '6000', - liquidationThreshold: '6500', - liquidationBonus: '11000', - borrowingEnabled: true, - stableBorrowRateEnabled: true, - reserveDecimals: '18', - }, - MKR: { - baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.08).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.1).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '6000', - liquidationThreshold: '6500', - liquidationBonus: '11000', - borrowingEnabled: true, - stableBorrowRateEnabled: true, - reserveDecimals: '18', - }, - MANA: { - baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.08).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.1).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '6000', - liquidationThreshold: '6500', - liquidationBonus: '11000', - borrowingEnabled: true, - stableBorrowRateEnabled: true, - reserveDecimals: '18', - }, - ZRX: { - baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.08).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.1).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '6000', - liquidationThreshold: '6500', - liquidationBonus: '11000', - borrowingEnabled: true, - stableBorrowRateEnabled: true, - reserveDecimals: '18', - }, - SNX: { - baseVariableBorrowRate: new BigNumber(0.03).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.12).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.1).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '-1', - liquidationThreshold: '6500', - liquidationBonus: '11000', - borrowingEnabled: true, - stableBorrowRateEnabled: false, - reserveDecimals: '18', - }, - BUSD: { - baseVariableBorrowRate: new BigNumber(0.01).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.04).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.14).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '-1', - liquidationThreshold: '8000', - liquidationBonus: '11000', - borrowingEnabled: true, - stableBorrowRateEnabled: false, - reserveDecimals: '18', - }, + AAVE: strategyAAVE, + BAT: strategyBase, + BUSD: stablecoinStrategyBUSD, + DAI: stablecoinStrategyDAI, + ENJ: strategyREN, + KNC: strategyKNC, + LINK: strategyLINK, + MANA: strategyMANA, + MKR: strategyMKR, + REN: strategyREN, + REP: strategyREP, + SNX: strategySNX, + SUSD: stablecoinStrategySUSD, + TUSD: stablecoinStrategyTUSD, + UNI: strategyUNI, + USDC: stablecoinStrategyUSDC, + USDT: stablecoinStrategyUSDT, + WBTC: strategyWBTC, + WETH: strategyWETH, + YFI: strategyYFI, + ZRX: strategyBase, }, ReserveAssets: { [eEthereumNetwork.buidlerevm]: {}, + [eEthereumNetwork.hardhat]: {}, [eEthereumNetwork.coverage]: {}, [EthereumNetwork.kovan]: { - WETH: '0xd0a1e359811322d97991e03f863a0c30c2cf029c', + AAVE: '0xB597cd8D3217ea6477232F9217fa70837ff667Af', + BAT: '0x2d12186Fbb9f9a8C28B3FfdD4c42920f8539D738', + BUSD: '0x4c6E1EFC12FDfD568186b7BAEc0A43fFfb4bCcCf', DAI: '0xFf795577d9AC8bD7D90Ee22b6C1703490b6512FD', + ENJ: '0xC64f90Cd7B564D3ab580eb20a102A8238E218be2', + KNC: '0x3F80c39c0b96A0945f9F0E9f55d8A8891c5671A8', + LINK: '0xAD5ce863aE3E4E9394Ab43d4ba0D80f419F61789', + MANA: '0x738Dc6380157429e957d223e6333Dc385c85Fec7', + MKR: '0x61e4CAE3DA7FD189e52a4879C7B8067D7C2Cc0FA', + REN: '0x5eebf65A6746eed38042353Ba84c8e37eD58Ac6f', + REP: '0x260071C8D61DAf730758f8BD0d6370353956AE0E', + SNX: '0x7FDb81B0b8a010dd4FFc57C3fecbf145BA8Bd947', + SUSD: '0x99b267b9D96616f906D53c26dECf3C5672401282', TUSD: '0x016750AC630F711882812f24Dba6c95b9D35856d', + UNI: '0x075A36BA8846C6B6F53644fDd3bf17E5151789DC', USDC: '0xe22da380ee6B445bb8273C81944ADEB6E8450422', USDT: '0x13512979ADE267AB5100878E2e0f485B568328a4', - SUSD: '0xD868790F57B39C9B2B51b12de046975f986675f9', - LEND: '0x690eAcA024935Aaff9B14b9FF9e9C8757a281f3C', - BAT: '0x2d12186Fbb9f9a8C28B3FfdD4c42920f8539D738', - REP: '0x260071C8D61DAf730758f8BD0d6370353956AE0E', - MKR: '0x61e4CAE3DA7FD189e52a4879C7B8067D7C2Cc0FA', - LINK: '0xAD5ce863aE3E4E9394Ab43d4ba0D80f419F61789', - KNC: '0x3F80c39c0b96A0945f9F0E9f55d8A8891c5671A8', WBTC: '0xD1B98B6607330172f1D991521145A22BCe793277', - MANA: '0x738Dc6380157429e957d223e6333Dc385c85Fec7', + WETH: '0xd0a1e359811322d97991e03f863a0c30c2cf029c', + YFI: '0xb7c325266ec274fEb1354021D27FA3E3379D840d', ZRX: '0xD0d76886cF8D952ca26177EB7CfDf83bad08C00C', - SNX: '0x7FDb81B0b8a010dd4FFc57C3fecbf145BA8Bd947', - BUSD: '0x4c6E1EFC12FDfD568186b7BAEc0A43fFfb4bCcCf', }, [EthereumNetwork.ropsten]: { - WETH: '0xc778417e063141139fce010982780140aa0cd5ab', + AAVE: '', + BAT: '0x85B24b3517E3aC7bf72a14516160541A60cFF19d', + BUSD: '0xFA6adcFf6A90c11f31Bc9bb59eC0a6efB38381C6', DAI: '0xf80A32A835F79D7787E8a8ee5721D0fEaFd78108', + ENJ: ZERO_ADDRESS, + KNC: '0xCe4aA1dE3091033Ba74FA2Ad951f6adc5E5cF361', + LINK: '0x1a906E71FF9e28d8E01460639EB8CF0a6f0e2486', + MANA: '0x78b1F763857C8645E46eAdD9540882905ff32Db7', + MKR: '0x2eA9df3bABe04451c9C3B06a2c844587c59d9C37', + REN: ZERO_ADDRESS, + REP: '0xBeb13523503d35F9b3708ca577CdCCAdbFB236bD', + SNX: '0xF80Aa7e2Fda4DA065C55B8061767F729dA1476c7', + SUSD: '0xc374eB17f665914c714Ac4cdC8AF3a3474228cc5', TUSD: '0xa2EA00Df6d8594DBc76b79beFe22db9043b8896F', + UNI: ZERO_ADDRESS, USDC: '0x851dEf71f0e6A903375C1e536Bd9ff1684BAD802', USDT: '0xB404c51BBC10dcBE948077F18a4B8E553D160084', - SUSD: '0xc374eB17f665914c714Ac4cdC8AF3a3474228cc5', - LEND: '0xB47F338EC1e3857BB188E63569aeBAB036EE67c6', - BAT: '0x85B24b3517E3aC7bf72a14516160541A60cFF19d', - REP: '0xBeb13523503d35F9b3708ca577CdCCAdbFB236bD', - MKR: '0x2eA9df3bABe04451c9C3B06a2c844587c59d9C37', - LINK: '0x1a906E71FF9e28d8E01460639EB8CF0a6f0e2486', - KNC: '0xCe4aA1dE3091033Ba74FA2Ad951f6adc5E5cF361', WBTC: '0xa0E54Ab6AA5f0bf1D62EC3526436F3c05b3348A0', - MANA: '0x78b1F763857C8645E46eAdD9540882905ff32Db7', + WETH: '0xc778417e063141139fce010982780140aa0cd5ab', + YFI: ZERO_ADDRESS, ZRX: '0x02d7055704EfF050323A2E5ee4ba05DB2A588959', - SNX: '0xF80Aa7e2Fda4DA065C55B8061767F729dA1476c7', - BUSD: '0xFA6adcFf6A90c11f31Bc9bb59eC0a6efB38381C6', }, [EthereumNetwork.main]: { - WETH: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + AAVE: '0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9', + BAT: '0x0d8775f648430679a709e98d2b0cb6250d2887ef', + BUSD: '0x4Fabb145d64652a948d72533023f6E7A623C7C53', DAI: '0x6b175474e89094c44da98b954eedeac495271d0f', + ENJ: '0xF629cBd94d3791C9250152BD8dfBDF380E2a3B9c', + KNC: '0xdd974d5c2e2928dea5f71b9825b8b646686bd200', + LINK: '0x514910771af9ca656af840dff83e8264ecf986ca', + MANA: '0x0f5d2fb29fb7d3cfee444a200298f468908cc942', + MKR: '0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2', + REN: '0x408e41876cCCDC0F92210600ef50372656052a38', + REP: '0x1985365e9f78359a9B6AD760e32412f4a445E862', + SNX: '0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F', + SUSD: '0x57ab1ec28d129707052df4df418d58a2d46d5f51', TUSD: '0x0000000000085d4780B73119b644AE5ecd22b376', + UNI: '0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984', USDC: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', USDT: '0xdac17f958d2ee523a2206206994597c13d831ec7', - SUSD: '0x57ab1ec28d129707052df4df418d58a2d46d5f51', - LEND: '0x80fB784B7eD66730e8b1DBd9820aFD29931aab03', - BAT: '0x0d8775f648430679a709e98d2b0cb6250d2887ef', - REP: '0x1985365e9f78359a9B6AD760e32412f4a445E862', - MKR: '0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2', - LINK: '0x514910771af9ca656af840dff83e8264ecf986ca', - KNC: '0xdd974d5c2e2928dea5f71b9825b8b646686bd200', WBTC: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', - MANA: '0x0f5d2fb29fb7d3cfee444a200298f468908cc942', + WETH: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + YFI: '0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e', ZRX: '0xe41d2489571d322189246dafa5ebde1f4699f498', - SNX: '0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F', - BUSD: '0x4Fabb145d64652a948d72533023f6E7A623C7C53', }, }, }; diff --git a/config/commons.ts b/config/commons.ts index 71c60c66..5030a923 100644 --- a/config/commons.ts +++ b/config/commons.ts @@ -1,25 +1,30 @@ import BigNumber from 'bignumber.js'; -import {oneEther, oneRay, RAY} from '../helpers/constants'; +import {zeroPad} from 'ethers/lib/utils'; +import {oneEther, oneRay, RAY, ZERO_ADDRESS} from '../helpers/constants'; import {ICommonConfiguration, EthereumNetwork, eEthereumNetwork} from '../helpers/types'; const MOCK_CHAINLINK_AGGREGATORS_PRICES = { - DAI: oneEther.multipliedBy('0.00369068412860').toFixed(), - TUSD: oneEther.multipliedBy('0.00364714136416').toFixed(), - USDC: oneEther.multipliedBy('0.00367714136416').toFixed(), - LEND: oneEther.multipliedBy('0.00003620948469').toFixed(), + AAVE: oneEther.multipliedBy('0.003620948469').toFixed(), BAT: oneEther.multipliedBy('0.00137893825230').toFixed(), - USDT: oneEther.multipliedBy('0.00369068412860').toFixed(), - SUSD: oneEther.multipliedBy('0.00364714136416').toFixed(), - MKR: oneEther.multipliedBy('2.508581').toFixed(), - REP: oneEther.multipliedBy('0.048235').toFixed(), - ZRX: oneEther.multipliedBy('0.001151').toFixed(), - WBTC: oneEther.multipliedBy('47.332685').toFixed(), - LINK: oneEther.multipliedBy('0.009955').toFixed(), - KNC: oneEther.multipliedBy('0.001072').toFixed(), - MANA: oneEther.multipliedBy('0.000158').toFixed(), - SNX: oneEther.multipliedBy('0.00442616').toFixed(), BUSD: oneEther.multipliedBy('0.00736484').toFixed(), + DAI: oneEther.multipliedBy('0.00369068412860').toFixed(), + ENJ: oneEther.multipliedBy('0.00029560').toFixed(), + KNC: oneEther.multipliedBy('0.001072').toFixed(), + LINK: oneEther.multipliedBy('0.009955').toFixed(), + MANA: oneEther.multipliedBy('0.000158').toFixed(), + MKR: oneEther.multipliedBy('2.508581').toFixed(), + REN: oneEther.multipliedBy('0.00065133').toFixed(), + REP: oneEther.multipliedBy('0.048235').toFixed(), + SNX: oneEther.multipliedBy('0.00442616').toFixed(), + SUSD: oneEther.multipliedBy('0.00364714136416').toFixed(), + TUSD: oneEther.multipliedBy('0.00364714136416').toFixed(), + UNI: oneEther.multipliedBy('0.00536479').toFixed(), + USDC: oneEther.multipliedBy('0.00367714136416').toFixed(), + USDT: oneEther.multipliedBy('0.00369068412860').toFixed(), WETH: oneEther.toFixed(), + WBTC: oneEther.multipliedBy('47.332685').toFixed(), + YFI: oneEther.multipliedBy('22.407436').toFixed(), + ZRX: oneEther.multipliedBy('0.001151').toFixed(), USD: '5848466240000000', UNI_DAI_ETH: oneEther.multipliedBy('2.1').toFixed(), UNI_USDC_ETH: oneEther.multipliedBy('2.1').toFixed(), @@ -35,7 +40,6 @@ const MOCK_CHAINLINK_AGGREGATORS_PRICES = { export const CommonsConfig: ICommonConfiguration = { ConfigName: 'Commons', ProviderId: 0, - ReserveSymbols: [], ProtocolGlobalParams: { OptimalUtilizationRate: new BigNumber(0.8).times(RAY), ExcessUtilizationRate: new BigNumber(0.2).times(RAY), @@ -61,6 +65,7 @@ export const CommonsConfig: ICommonConfiguration = { ...MOCK_CHAINLINK_AGGREGATORS_PRICES, }, }, + // TODO: reorg alphabetically, checking the reason of tests failing LendingRateOracleRatesCommon: { WETH: { borrowRate: oneRay.multipliedBy(0.03).toFixed(), @@ -83,7 +88,7 @@ export const CommonsConfig: ICommonConfiguration = { BAT: { borrowRate: oneRay.multipliedBy(0.03).toFixed(), }, - LEND: { + AAVE: { borrowRate: oneRay.multipliedBy(0.03).toFixed(), }, LINK: { @@ -110,6 +115,15 @@ export const CommonsConfig: ICommonConfiguration = { SNX: { borrowRate: oneRay.multipliedBy(0.03).toFixed(), }, + YFI: { + borrowRate: oneRay.multipliedBy(0.03).toFixed(), + }, + REN: { + borrowRate: oneRay.multipliedBy(0.03).toFixed(), + }, + UNI: { + borrowRate: oneRay.multipliedBy(0.03).toFixed(), + }, BUSD: { borrowRate: oneRay.multipliedBy(0.05).toFixed(), }, @@ -118,38 +132,53 @@ export const CommonsConfig: ICommonConfiguration = { // COMMON PROTOCOL ADDRESSES ACROSS POOLS // ---------------- - // If lendingPoolManagerAddress is set, will take priority over lendingPoolManagerAddressIndex - AaveAdmin: { + // If PoolAdmin/emergencyAdmin is set, will take priority over PoolAdminIndex/emergencyAdminIndex + PoolAdmin: { + [eEthereumNetwork.coverage]: undefined, + [eEthereumNetwork.buidlerevm]: undefined, + [eEthereumNetwork.coverage]: undefined, + [eEthereumNetwork.hardhat]: undefined, + [eEthereumNetwork.kovan]: undefined, + [eEthereumNetwork.ropsten]: undefined, + [eEthereumNetwork.main]: undefined, + }, + PoolAdminIndex: 0, + EmergencyAdmin: { + [eEthereumNetwork.hardhat]: undefined, [eEthereumNetwork.coverage]: undefined, [eEthereumNetwork.buidlerevm]: undefined, [eEthereumNetwork.kovan]: undefined, [eEthereumNetwork.ropsten]: undefined, [eEthereumNetwork.main]: undefined, }, - AaveAdminIndex: 0, + EmergencyAdminIndex: 1, ProviderRegistry: { [eEthereumNetwork.kovan]: '', [eEthereumNetwork.ropsten]: '', [eEthereumNetwork.main]: '', [eEthereumNetwork.coverage]: '', + [eEthereumNetwork.hardhat]: '', [eEthereumNetwork.buidlerevm]: '', }, LendingRateOracle: { [eEthereumNetwork.coverage]: '', + [eEthereumNetwork.hardhat]: '', [eEthereumNetwork.buidlerevm]: '', - [eEthereumNetwork.kovan]: '0xdcde9bb6a49e37fa433990832ab541ae2d4feb4a', + [eEthereumNetwork.kovan]: '0xdCde9Bb6a49e37fA433990832AB541AE2d4FEB4a', [eEthereumNetwork.ropsten]: '0x05dcca805a6562c1bdd0423768754acb6993241b', [eEthereumNetwork.main]: '0x4d728a4496e4de35f218d5a214366bde3a62b51c', }, TokenDistributor: { [eEthereumNetwork.coverage]: '', [eEthereumNetwork.buidlerevm]: '', + [eEthereumNetwork.hardhat]: '', [EthereumNetwork.kovan]: '0x971efe90088f21dc6a36f610ffed77fc19710708', [EthereumNetwork.ropsten]: '0xeba2ea67942b8250d870b12750b594696d02fc9c', [EthereumNetwork.main]: '0xe3d9988f676457123c5fd01297605efdd0cba1ae', }, ChainlinkProxyPriceProvider: { [eEthereumNetwork.coverage]: '', + [eEthereumNetwork.hardhat]: '', [eEthereumNetwork.buidlerevm]: '', [EthereumNetwork.kovan]: '0x276C4793F2EE3D5Bf18C5b879529dD4270BA4814', [EthereumNetwork.ropsten]: '0x657372A559c30d236F011239fF9fbB6D76718271', @@ -157,6 +186,7 @@ export const CommonsConfig: ICommonConfiguration = { }, FallbackOracle: { [eEthereumNetwork.coverage]: '', + [eEthereumNetwork.hardhat]: '', [eEthereumNetwork.buidlerevm]: '', [EthereumNetwork.kovan]: '0x50913E8E1c650E790F8a1E741FF9B1B1bB251dfe', [EthereumNetwork.ropsten]: '0xAD1a978cdbb8175b2eaeC47B01404f8AEC5f4F0d', @@ -164,85 +194,99 @@ export const CommonsConfig: ICommonConfiguration = { }, ChainlinkAggregator: { [eEthereumNetwork.coverage]: {}, + [eEthereumNetwork.hardhat]: {}, [eEthereumNetwork.buidlerevm]: {}, [EthereumNetwork.kovan]: { - DAI: '0x6F47077D3B6645Cb6fb7A29D280277EC1e5fFD90', - TUSD: '0x02424c54D78D48179Fd12ebFfB11c16f9CA984Ad', - USDC: '0x672c1C0d1130912D83664011E7960a42E8cA05D5', - USDT: '0xCC833A6522721B3252e7578c5BCAF65738B75Fc3', - SUSD: '0xa353F8b083F7575cfec443b5ad585D42f652E9F7', - LEND: '0xdce38940264dfbc01ad1486c21764948e511947e', - BAT: '0x2c8d01771CCDca47c103194C5860dbEA2fE61626', - REP: '0x09F4A94F44c29d4967C761bBdB89f5bD3E2c09E6', - MKR: '0x14D7714eC44F44ECD0098B39e642b246fB2c38D0', - LINK: '0xf1e71Afd1459C05A2F898502C4025be755aa844A', - KNC: '0x0893AaF58f62279909F9F6FF2E5642f53342e77F', - WBTC: '0x33E5085E92f5b53E9A193E28ad2f76bF210550BB', - MANA: '0x3c30c5c415B2410326297F0f65f5Cbb32f3aefCc', - ZRX: '0x2636cfdDB457a6C7A7D60A439F1E5a5a0C3d9c65', - SNX: '0x775E76cca1B5bc903c9a8C6f77416A35E5744664', - BUSD: '0x63294A05C9a81b1A40CAD3f2ff30617111630393', - USD: '0xD21912D8762078598283B14cbA40Cb4bFCb87581', + AAVE: '0xd04647B7CB523bb9f26730E9B6dE1174db7591Ad', + BAT: '0x0e4fcEC26c9f85c3D714370c98f43C4E02Fc35Ae', + BUSD: '0xbF7A18ea5DE0501f7559144e702b29c55b055CcB', + DAI: '0x22B58f1EbEDfCA50feF632bD73368b2FdA96D541', + ENJ: '0xfaDbe2ee798889F02d1d39eDaD98Eff4c7fe95D4', + KNC: '0xb8E8130d244CFd13a75D6B9Aee029B1C33c808A7', + LINK: '0x3Af8C569ab77af5230596Acf0E8c2F9351d24C38', + MANA: '0x1b93D8E109cfeDcBb3Cc74eD761DE286d5771511', + MKR: '0x0B156192e04bAD92B6C1C13cf8739d14D78D5701', + REN: '0xF1939BECE7708382b5fb5e559f630CB8B39a10ee', + REP: '0x3A7e6117F2979EFf81855de32819FBba48a63e9e', + SNX: '0xF9A76ae7a1075Fe7d646b06fF05Bd48b9FA5582e', + SUSD: '0xb343e7a1aF578FA35632435243D814e7497622f7', + TUSD: '0x7aeCF1c19661d12E962b69eBC8f6b2E63a55C660', + UNI: '0x17756515f112429471F86f98D5052aCB6C47f6ee', + USDC: '0x64EaC61A2DFda2c3Fa04eED49AA33D021AeC8838', + USDT: '0x0bF499444525a23E7Bb61997539725cA2e928138', + WBTC: '0xF7904a295A029a3aBDFFB6F12755974a958C7C25', + YFI: '0xC5d1B1DEb2992738C0273408ac43e1e906086B6C', + ZRX: '0xBc3f28Ccc21E9b5856E81E6372aFf57307E2E883', + USD: '0x9326BFA02ADD2366b30bacB125260Af641031331', UNI_DAI_ETH: '0x0338C40020Bf886c11406115fD1ba205Ef1D9Ff9', - UNI_USDC_ETH: '0x7f5E5D34591e9a70D187BBA94260C30B92aC0961', - UNI_SETH_ETH: '0xc5F1eA001c1570783b3af418fa775237Eb129EDC', UNI_LEND_ETH: '0xB996b1a11BA0aACc4deA57f7f92d1722428f2E90', UNI_LINK_ETH: '0x267490eE9Ad21dfE839aE73A8B1c8C9A36F60d33', UNI_MKR_ETH: '0x6eBF25AB0A18B8F6243619f1AE6b94373169A069', + UNI_SETH_ETH: '0xc5F1eA001c1570783b3af418fa775237Eb129EDC', + UNI_USDC_ETH: '0x7f5E5D34591e9a70D187BBA94260C30B92aC0961', }, [EthereumNetwork.ropsten]: { + AAVE: ZERO_ADDRESS, + BAT: '0xafd8186c962daf599f171b8600f3e19af7b52c92', + BUSD: '0x0A32D96Ff131cd5c3E0E5AAB645BF009Eda61564', DAI: '0x64b8e49baded7bfb2fd5a9235b2440c0ee02971b', + ENJ: ZERO_ADDRESS, + KNC: '0x19d97ceb36624a31d827032d8216dd2eb15e9845', + LINK: '0xb8c99b98913bE2ca4899CdcaF33a3e519C20EeEc', + MANA: '0xDab909dedB72573c626481fC98CEE1152b81DEC2', + MKR: '0x811B1f727F8F4aE899774B568d2e72916D91F392', + REN: ZERO_ADDRESS, + REP: '0xa949ee9ba80c0f381481f2eab538bc5547a5ac67', + SNX: '0xA95674a8Ed9aa9D2E445eb0024a9aa05ab44f6bf', + SUSD: '0xe054b4aee7ac7645642dd52f1c892ff0128c98f0', TUSD: '0x523ac85618df56e940534443125ef16daf785620', + UNI: ZERO_ADDRESS, USDC: '0xe1480303dde539e2c241bdc527649f37c9cbef7d', USDT: '0xc08fe0c4d97ccda6b40649c6da621761b628c288', - SUSD: '0xe054b4aee7ac7645642dd52f1c892ff0128c98f0', - LEND: '0xf7b4834fe443d1E04D757b4b089b35F5A90F2847', - BAT: '0xafd8186c962daf599f171b8600f3e19af7b52c92', - REP: '0xa949ee9ba80c0f381481f2eab538bc5547a5ac67', - MKR: '0x811B1f727F8F4aE899774B568d2e72916D91F392', - LINK: '0xb8c99b98913bE2ca4899CdcaF33a3e519C20EeEc', - KNC: '0x19d97ceb36624a31d827032d8216dd2eb15e9845', WBTC: '0x5b8B87A0abA4be247e660B0e0143bB30Cdf566AF', - MANA: '0xDab909dedB72573c626481fC98CEE1152b81DEC2', + YFI: ZERO_ADDRESS, ZRX: '0x1d0052e4ae5b4ae4563cbac50edc3627ca0460d7', - SNX: '0xA95674a8Ed9aa9D2E445eb0024a9aa05ab44f6bf', - BUSD: '0x0A32D96Ff131cd5c3E0E5AAB645BF009Eda61564', - USD: '0x8468b2bDCE073A157E560AA4D9CcF6dB1DB98507', UNI_DAI_ETH: '0x16048819e3f77b7112eB033624A0bA9d33743028', - UNI_USDC_ETH: '0x6952A2678D574073DB97963886c2F38CD09C8Ba3', - UNI_SETH_ETH: '0x23Ee5188806BD2D31103368B0EA0259bc6706Af1', UNI_LEND_ETH: '0x43c44B27376Afedee06Bae2A003e979FC3B3Da6C', UNI_LINK_ETH: '0xb60c29714146EA3539261f599Eb30f62904108Fa', UNI_MKR_ETH: '0x594ae5421f378b8B4AF9e758C461d2A1FF990BC5', + UNI_SETH_ETH: '0x23Ee5188806BD2D31103368B0EA0259bc6706Af1', + UNI_USDC_ETH: '0x6952A2678D574073DB97963886c2F38CD09C8Ba3', + USD: '0x8468b2bDCE073A157E560AA4D9CcF6dB1DB98507', }, [EthereumNetwork.main]: { + AAVE: '0x6Df09E975c830ECae5bd4eD9d90f3A95a4f88012', + BAT: '0x9b4e2579895efa2b4765063310Dc4109a7641129', + BUSD: '0x5d4BB541EED49D0290730b4aB332aA46bd27d888', DAI: '0x037E8F2125bF532F3e228991e051c8A7253B642c', + ENJ: '0x24D9aB51950F3d62E9144fdC2f3135DAA6Ce8D1B', + KNC: '0xd0e785973390fF8E77a83961efDb4F271E6B8152', + LINK: '0xeCfA53A8bdA4F0c4dd39c55CC8deF3757aCFDD07', + MANA: '0xc89c4ed8f52Bb17314022f6c0dCB26210C905C97', + MKR: '0xda3d675d50ff6c555973c4f0424964e1f6a4e7d3', + REN: '0x3147D7203354Dc06D9fd350c7a2437bcA92387a4', + REP: '0xb8b513d9cf440C1b6f5C7142120d611C94fC220c', + SNX: '0xE23d1142dE4E83C08bb048bcab54d50907390828', + SUSD: '0x6d626Ff97f0E89F6f983dE425dc5B24A18DE26Ea', TUSD: '0x73ead35fd6A572EF763B13Be65a9db96f7643577', + UNI: '0xD6aA3D25116d8dA79Ea0246c4826EB951872e02e', USDC: '0xdE54467873c3BCAA76421061036053e371721708', USDT: '0xa874fe207DF445ff19E7482C746C4D3fD0CB9AcE', - SUSD: '0x6d626Ff97f0E89F6f983dE425dc5B24A18DE26Ea', - LEND: '0x1EeaF25f2ECbcAf204ECADc8Db7B0db9DA845327', - BAT: '0x9b4e2579895efa2b4765063310Dc4109a7641129', - REP: '0xb8b513d9cf440C1b6f5C7142120d611C94fC220c', - MKR: '0xda3d675d50ff6c555973c4f0424964e1f6a4e7d3', - LINK: '0xeCfA53A8bdA4F0c4dd39c55CC8deF3757aCFDD07', - KNC: '0xd0e785973390fF8E77a83961efDb4F271E6B8152', WBTC: '0x0133Aa47B6197D0BA090Bf2CD96626Eb71fFd13c', - MANA: '0xc89c4ed8f52Bb17314022f6c0dCB26210C905C97', + YFI: '0x7c5d4F8345e66f68099581Db340cd65B078C41f4', ZRX: '0xA0F9D94f060836756FFC84Db4C78d097cA8C23E8', - SNX: '0xE23d1142dE4E83C08bb048bcab54d50907390828', - BUSD: '0x5d4BB541EED49D0290730b4aB332aA46bd27d888', - USD: '0x59b826c214aBa7125bFA52970d97736c105Cc375', UNI_DAI_ETH: '0x1bAB293850289Bf161C5DA79ff3d1F02A950555b', - UNI_USDC_ETH: '0x444315Ee92F2bb3579293C17B07194227fA99bF0', - UNI_SETH_ETH: '0x517D40E49660c7705b2e99eEFA6d7B0E9Ba5BF10', UNI_LEND_ETH: '0xF4C8Db2d999b024bBB6c6022566503eD41f2AC1E', UNI_LINK_ETH: '0xE2A639Beb647d7F709ca805ABa760bBEfdbE37e3', UNI_MKR_ETH: '0xEe40a5E8F3732bE6ECDb5A90e23D0b7bF0D4a73c', + UNI_SETH_ETH: '0x517D40E49660c7705b2e99eEFA6d7B0E9Ba5BF10', + UNI_USDC_ETH: '0x444315Ee92F2bb3579293C17B07194227fA99bF0', + USD: '0x59b826c214aBa7125bFA52970d97736c105Cc375', }, }, ReserveAssets: { [eEthereumNetwork.coverage]: {}, + [eEthereumNetwork.hardhat]: {}, [eEthereumNetwork.buidlerevm]: {}, [EthereumNetwork.main]: {}, [EthereumNetwork.kovan]: {}, @@ -252,17 +296,28 @@ export const CommonsConfig: ICommonConfiguration = { ATokenDomainSeparator: { [eEthereumNetwork.coverage]: '0x95b73a72c6ecf4ccbbba5178800023260bad8e75cdccdb8e4827a2977a37c820', + [eEthereumNetwork.hardhat]: + '0xa14895ab432a9d0712a041fdcea77f7f65826945dc90bf29ea819c2a01e7c5f9', [eEthereumNetwork.buidlerevm]: - '0x76cbbf8aa4b11a7c207dd79ccf8c394f59475301598c9a083f8258b4fafcfa86', + '0xa14895ab432a9d0712a041fdcea77f7f65826945dc90bf29ea819c2a01e7c5f9', [eEthereumNetwork.kovan]: '', [eEthereumNetwork.ropsten]: '', [eEthereumNetwork.main]: '', }, ProxyPriceProvider: { [eEthereumNetwork.coverage]: '', + [eEthereumNetwork.hardhat]: '', [eEthereumNetwork.buidlerevm]: '', - [eEthereumNetwork.kovan]: '0x276C4793F2EE3D5Bf18C5b879529dD4270BA4814', + [eEthereumNetwork.kovan]: '0xB8bE51E6563BB312Cbb2aa26e352516c25c26ac1', [eEthereumNetwork.ropsten]: '', [eEthereumNetwork.main]: '', }, + WETH: { + [eEthereumNetwork.coverage]: '', // deployed in local evm + [eEthereumNetwork.hardhat]: '', // deployed in local evm + [eEthereumNetwork.buidlerevm]: '', // deployed in local evm + [eEthereumNetwork.kovan]: '0xd0a1e359811322d97991e03f863a0c30c2cf029c', + [eEthereumNetwork.ropsten]: '0xc778417e063141139fce010982780140aa0cd5ab', + [eEthereumNetwork.main]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + }, }; diff --git a/config/reservesConfigs.ts b/config/reservesConfigs.ts new file mode 100644 index 00000000..59369d38 --- /dev/null +++ b/config/reservesConfigs.ts @@ -0,0 +1,214 @@ +import BigNumber from 'bignumber.js'; +import {oneRay} from '../helpers/constants'; +import {IReserveParams} from '../helpers/types'; + +export const strategyBase: IReserveParams = { + baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(), + variableRateSlope1: new BigNumber(0.07).multipliedBy(oneRay).toFixed(), + variableRateSlope2: new BigNumber(3).multipliedBy(oneRay).toFixed(), + stableRateSlope1: new BigNumber(0.1).multipliedBy(oneRay).toFixed(), + stableRateSlope2: new BigNumber(3).multipliedBy(oneRay).toFixed(), + baseLTVAsCollateral: '6000', + liquidationThreshold: '6500', + liquidationBonus: '11000', + borrowingEnabled: true, + stableBorrowRateEnabled: true, + reserveDecimals: '18', +}; + +export const stablecoinStrategyBase: IReserveParams = { + baseVariableBorrowRate: new BigNumber(0.01).multipliedBy(oneRay).toFixed(), + variableRateSlope1: new BigNumber(0.07).multipliedBy(oneRay).toFixed(), + variableRateSlope2: new BigNumber(1.5).multipliedBy(oneRay).toFixed(), + stableRateSlope1: new BigNumber(0.06).multipliedBy(oneRay).toFixed(), + stableRateSlope2: new BigNumber(1.5).multipliedBy(oneRay).toFixed(), + baseLTVAsCollateral: '7500', + liquidationThreshold: '8000', + liquidationBonus: '10500', + borrowingEnabled: true, + stableBorrowRateEnabled: true, + reserveDecimals: '18', +}; + +export const stablecoinStrategyCentralized: IReserveParams = { + baseVariableBorrowRate: new BigNumber(0.01).multipliedBy(oneRay).toFixed(), + variableRateSlope1: new BigNumber(0.07).multipliedBy(oneRay).toFixed(), + variableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), + stableRateSlope1: new BigNumber(0.06).multipliedBy(oneRay).toFixed(), + stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), + baseLTVAsCollateral: '7500', + liquidationThreshold: '8000', + liquidationBonus: '10500', + borrowingEnabled: true, + stableBorrowRateEnabled: true, + reserveDecimals: '6', +}; + +export const strategyGovernanceTokens: IReserveParams = { + ...strategyBase, + baseLTVAsCollateral: '4000', + liquidationBonus: '11500', +}; + +export const stablecoinStrategyBUSD: IReserveParams = { + ...stablecoinStrategyCentralized, + reserveDecimals: '18', + baseLTVAsCollateral: '-1', + liquidationThreshold: '0', + liquidationBonus: '0', + baseVariableBorrowRate: new BigNumber(0.01).multipliedBy(oneRay).toFixed(), + variableRateSlope1: new BigNumber(0.04).multipliedBy(oneRay).toFixed(), + variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), + stableBorrowRateEnabled: false, + stableRateSlope1: new BigNumber(0.14).multipliedBy(oneRay).toFixed(), + stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), +}; + +export const strategyAAVE: IReserveParams = { + ...strategyBase, + baseLTVAsCollateral: '5000', + liquidationThreshold: '6500', + liquidationBonus: '11000', + borrowingEnabled: false, + stableBorrowRateEnabled: false, + reserveDecimals: '18', +}; + +export const stablecoinStrategyDAI: IReserveParams = { + ...stablecoinStrategyBase, +}; + +export const strategyENJ: IReserveParams = { + ...strategyBase, + baseLTVAsCollateral: '5500', + stableBorrowRateEnabled: false, +}; + +export const strategyKNC: IReserveParams = { + ...strategyBase, + variableRateSlope1: new BigNumber(0.08).multipliedBy(oneRay).toFixed(), +}; + +export const strategyLINK: IReserveParams = { + ...strategyBase, + baseLTVAsCollateral: '6500', + liquidationThreshold: '7000', +}; + +export const strategyMANA: IReserveParams = { + ...strategyBase, + variableRateSlope1: new BigNumber(0.08).multipliedBy(oneRay).toFixed(), + variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), + stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), +}; + +export const strategyMKR: IReserveParams = { + ...strategyBase, + baseLTVAsCollateral: '3500', +}; + +export const strategyREN: IReserveParams = { + ...strategyBase, + baseLTVAsCollateral: '5000', + liquidationThreshold: '6500', + liquidationBonus: '11000', + borrowingEnabled: true, + stableBorrowRateEnabled: false, +}; + +export const strategyREP: IReserveParams = { + ...strategyBase, + baseLTVAsCollateral: '3500', + variableRateSlope1: new BigNumber(0.07).multipliedBy(oneRay).toFixed(), + variableRateSlope2: new BigNumber(3).multipliedBy(oneRay).toFixed(), + borrowingEnabled: true, +}; + +export const stablecoinStrategySUSD: IReserveParams = { + baseVariableBorrowRate: new BigNumber(0.01).multipliedBy(oneRay).toFixed(), + variableRateSlope1: new BigNumber(0.04).multipliedBy(oneRay).toFixed(), + variableRateSlope2: new BigNumber(1).multipliedBy(oneRay).toFixed(), + stableRateSlope1: new BigNumber(0.14).multipliedBy(oneRay).toFixed(), + stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), + baseLTVAsCollateral: '-1', + liquidationThreshold: '0', + liquidationBonus: '0', + borrowingEnabled: true, + stableBorrowRateEnabled: false, + reserveDecimals: '18', +}; + +export const strategySNX: IReserveParams = { + ...strategyBase, + baseLTVAsCollateral: '1500', + liquidationThreshold: '4000', + baseVariableBorrowRate: new BigNumber(0.03).multipliedBy(oneRay).toFixed(), + variableRateSlope1: new BigNumber(0.12).multipliedBy(oneRay).toFixed(), + variableRateSlope2: new BigNumber(1).multipliedBy(oneRay).toFixed(), + stableBorrowRateEnabled: false, +}; + +export const stablecoinStrategyTUSD: IReserveParams = { + ...stablecoinStrategyCentralized, + baseVariableBorrowRate: new BigNumber(0.01).multipliedBy(oneRay).toFixed(), + variableRateSlope1: new BigNumber(0.04).multipliedBy(oneRay).toFixed(), + variableRateSlope2: new BigNumber(1.5).multipliedBy(oneRay).toFixed(), + stableRateSlope1: new BigNumber(0.14).multipliedBy(oneRay).toFixed(), + stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), + borrowingEnabled: true, + stableBorrowRateEnabled: false, + reserveDecimals: '18', +}; + +export const strategyUNI: IReserveParams = { + ...strategyGovernanceTokens, + stableBorrowRateEnabled: false, +}; + +export const stablecoinStrategyUSDC: IReserveParams = { + ...stablecoinStrategyBase, + variableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), + reserveDecimals: '6', +}; + +export const stablecoinStrategyUSDT: IReserveParams = { + ...stablecoinStrategyBase, + baseLTVAsCollateral: '-1', + liquidationThreshold: '7000', + liquidationBonus: '0', + borrowingEnabled: true, + stableBorrowRateEnabled: true, + reserveDecimals: '6', +}; + +export const strategyWBTC: IReserveParams = { + baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(), + variableRateSlope1: new BigNumber(0.08).multipliedBy(oneRay).toFixed(), + variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), + stableRateSlope1: new BigNumber(0.1).multipliedBy(oneRay).toFixed(), + stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), + baseLTVAsCollateral: '6000', + liquidationThreshold: '6500', + liquidationBonus: '11500', + borrowingEnabled: true, + stableBorrowRateEnabled: true, + reserveDecimals: '8', +}; + +export const strategyWETH: IReserveParams = { + baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(), + variableRateSlope1: new BigNumber(0.08).multipliedBy(oneRay).toFixed(), + variableRateSlope2: new BigNumber(1).multipliedBy(oneRay).toFixed(), + stableRateSlope1: new BigNumber(0.1).multipliedBy(oneRay).toFixed(), + stableRateSlope2: new BigNumber(1).multipliedBy(oneRay).toFixed(), + baseLTVAsCollateral: '7500', + liquidationThreshold: '8000', + liquidationBonus: '10500', + borrowingEnabled: true, + stableBorrowRateEnabled: true, + reserveDecimals: '18', +}; + +export const strategyYFI: IReserveParams = { + ...strategyGovernanceTokens, +}; diff --git a/config/uniswap.ts b/config/uniswap.ts index 289b4c0b..84a9612f 100644 --- a/config/uniswap.ts +++ b/config/uniswap.ts @@ -12,32 +12,7 @@ export const UniswapConfig: IUniswapConfiguration = { ...CommonsConfig, ConfigName: 'Uniswap', ProviderId: 2, - ReserveSymbols: [ - 'WETH', - 'DAI', - 'USDC', - 'USDT', - 'UNI_DAI_ETH', - 'UNI_USDC_ETH', - 'UNI_SETH_ETH', - 'UNI_LINK_ETH', - 'UNI_MKR_ETH', - 'UNI_LEND_ETH', - ], ReservesConfig: { - WETH: { - baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.08).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.1).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '-1', - liquidationThreshold: '8000', - liquidationBonus: '10500', - borrowingEnabled: true, - stableBorrowRateEnabled: false, - reserveDecimals: '18', - }, DAI: { baseVariableBorrowRate: new BigNumber(0.01).multipliedBy(oneRay).toFixed(), variableRateSlope1: new BigNumber(0.07).multipliedBy(oneRay).toFixed(), @@ -77,6 +52,19 @@ export const UniswapConfig: IUniswapConfiguration = { stableBorrowRateEnabled: false, reserveDecimals: '6', }, + WETH: { + baseVariableBorrowRate: new BigNumber(0).multipliedBy(oneRay).toFixed(), + variableRateSlope1: new BigNumber(0.08).multipliedBy(oneRay).toFixed(), + variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), + stableRateSlope1: new BigNumber(0.1).multipliedBy(oneRay).toFixed(), + stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), + baseLTVAsCollateral: '-1', + liquidationThreshold: '8000', + liquidationBonus: '10500', + borrowingEnabled: true, + stableBorrowRateEnabled: false, + reserveDecimals: '18', + }, UNI_DAI_ETH: { baseVariableBorrowRate: new BigNumber(0.01).multipliedBy(oneRay).toFixed(), variableRateSlope1: new BigNumber(0.04).multipliedBy(oneRay).toFixed(), @@ -90,32 +78,6 @@ export const UniswapConfig: IUniswapConfiguration = { stableBorrowRateEnabled: false, reserveDecimals: '18', }, - UNI_USDC_ETH: { - baseVariableBorrowRate: new BigNumber(0.01).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.04).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.16).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '6800', - liquidationThreshold: '7300', - liquidationBonus: '11000', - borrowingEnabled: false, - stableBorrowRateEnabled: false, - reserveDecimals: '18', - }, - UNI_SETH_ETH: { - baseVariableBorrowRate: new BigNumber(0.01).multipliedBy(oneRay).toFixed(), - variableRateSlope1: new BigNumber(0.04).multipliedBy(oneRay).toFixed(), - variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), - stableRateSlope1: new BigNumber(0.16).multipliedBy(oneRay).toFixed(), - stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), - baseLTVAsCollateral: '4800', - liquidationThreshold: '6600', - liquidationBonus: '11000', - borrowingEnabled: false, - stableBorrowRateEnabled: false, - reserveDecimals: '18', - }, UNI_LEND_ETH: { baseVariableBorrowRate: new BigNumber(0.01).multipliedBy(oneRay).toFixed(), variableRateSlope1: new BigNumber(0.04).multipliedBy(oneRay).toFixed(), @@ -155,82 +117,110 @@ export const UniswapConfig: IUniswapConfiguration = { stableBorrowRateEnabled: false, reserveDecimals: '18', }, + UNI_SETH_ETH: { + baseVariableBorrowRate: new BigNumber(0.01).multipliedBy(oneRay).toFixed(), + variableRateSlope1: new BigNumber(0.04).multipliedBy(oneRay).toFixed(), + variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), + stableRateSlope1: new BigNumber(0.16).multipliedBy(oneRay).toFixed(), + stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), + baseLTVAsCollateral: '4800', + liquidationThreshold: '6600', + liquidationBonus: '11000', + borrowingEnabled: false, + stableBorrowRateEnabled: false, + reserveDecimals: '18', + }, + UNI_USDC_ETH: { + baseVariableBorrowRate: new BigNumber(0.01).multipliedBy(oneRay).toFixed(), + variableRateSlope1: new BigNumber(0.04).multipliedBy(oneRay).toFixed(), + variableRateSlope2: new BigNumber(0.5).multipliedBy(oneRay).toFixed(), + stableRateSlope1: new BigNumber(0.16).multipliedBy(oneRay).toFixed(), + stableRateSlope2: new BigNumber(0.6).multipliedBy(oneRay).toFixed(), + baseLTVAsCollateral: '6800', + liquidationThreshold: '7300', + liquidationBonus: '11000', + borrowingEnabled: false, + stableBorrowRateEnabled: false, + reserveDecimals: '18', + }, }, ChainlinkAggregator: { [eEthereumNetwork.buidlerevm]: {}, + [eEthereumNetwork.hardhat]: {}, [eEthereumNetwork.coverage]: {}, [EthereumNetwork.kovan]: { DAI: '0x6F47077D3B6645Cb6fb7A29D280277EC1e5fFD90', USDC: '0x672c1C0d1130912D83664011E7960a42E8cA05D5', USDT: '0xCC833A6522721B3252e7578c5BCAF65738B75Fc3', UNI_DAI_ETH: '0x0338C40020Bf886c11406115fD1ba205Ef1D9Ff9', - UNI_USDC_ETH: '0x7f5E5D34591e9a70D187BBA94260C30B92aC0961', - UNI_SETH_ETH: '0xc5F1eA001c1570783b3af418fa775237Eb129EDC', UNI_LEND_ETH: '0xB996b1a11BA0aACc4deA57f7f92d1722428f2E90', UNI_LINK_ETH: '0x267490eE9Ad21dfE839aE73A8B1c8C9A36F60d33', UNI_MKR_ETH: '0x6eBF25AB0A18B8F6243619f1AE6b94373169A069', + UNI_SETH_ETH: '0xc5F1eA001c1570783b3af418fa775237Eb129EDC', + UNI_USDC_ETH: '0x7f5E5D34591e9a70D187BBA94260C30B92aC0961', }, [EthereumNetwork.ropsten]: { DAI: '0x64b8e49baded7bfb2fd5a9235b2440c0ee02971b', USDC: '0xe1480303dde539e2c241bdc527649f37c9cbef7d', USDT: '0xc08fe0c4d97ccda6b40649c6da621761b628c288', UNI_DAI_ETH: '0x16048819e3f77b7112eB033624A0bA9d33743028', - UNI_USDC_ETH: '0x6952A2678D574073DB97963886c2F38CD09C8Ba3', - UNI_SETH_ETH: '0x23Ee5188806BD2D31103368B0EA0259bc6706Af1', UNI_LEND_ETH: '0x43c44B27376Afedee06Bae2A003e979FC3B3Da6C', UNI_LINK_ETH: '0xb60c29714146EA3539261f599Eb30f62904108Fa', UNI_MKR_ETH: '0x594ae5421f378b8B4AF9e758C461d2A1FF990BC5', + UNI_SETH_ETH: '0x23Ee5188806BD2D31103368B0EA0259bc6706Af1', + UNI_USDC_ETH: '0x6952A2678D574073DB97963886c2F38CD09C8Ba3', }, [EthereumNetwork.main]: { DAI: '0x037E8F2125bF532F3e228991e051c8A7253B642c', USDC: '0xdE54467873c3BCAA76421061036053e371721708', USDT: '0xa874fe207DF445ff19E7482C746C4D3fD0CB9AcE', UNI_DAI_ETH: '0x1bAB293850289Bf161C5DA79ff3d1F02A950555b', - UNI_USDC_ETH: '0x444315Ee92F2bb3579293C17B07194227fA99bF0', - UNI_SETH_ETH: '0x517D40E49660c7705b2e99eEFA6d7B0E9Ba5BF10', UNI_LEND_ETH: '0xF4C8Db2d999b024bBB6c6022566503eD41f2AC1E', UNI_LINK_ETH: '0xE2A639Beb647d7F709ca805ABa760bBEfdbE37e3', UNI_MKR_ETH: '0xEe40a5E8F3732bE6ECDb5A90e23D0b7bF0D4a73c', + UNI_SETH_ETH: '0x517D40E49660c7705b2e99eEFA6d7B0E9Ba5BF10', + UNI_USDC_ETH: '0x444315Ee92F2bb3579293C17B07194227fA99bF0', }, }, ReserveAssets: { + [eEthereumNetwork.hardhat]: {}, [eEthereumNetwork.buidlerevm]: {}, [eEthereumNetwork.coverage]: {}, [EthereumNetwork.kovan]: { - WETH: '0xd0a1e359811322d97991e03f863a0c30c2cf029c', DAI: '0xFf795577d9AC8bD7D90Ee22b6C1703490b6512FD', USDC: '0xe22da380ee6B445bb8273C81944ADEB6E8450422', USDT: '0x13512979ADE267AB5100878E2e0f485B568328a4', + WETH: '0xd0a1e359811322d97991e03f863a0c30c2cf029c', UNI_DAI_ETH: '0x2e0086b5343101203ADeE40160ca1BD91E29fF75', - UNI_USDC_ETH: '0x34eA1aB2a43ee696914fc3C0d3e517fA666B9e8D', - UNI_SETH_ETH: '0xCF457d8Bb8D8f54Af1ea1B3710231e89bd6CFbfe', UNI_LEND_ETH: '0x7615cd666F867406C64E558B9CCC3883e7EC9BA8', UNI_LINK_ETH: '0xFb9AAc184e79025f936E9C4EF3047Ad4889Df4a8', UNI_MKR_ETH: '0xB31a1c30f38cD68e8177566Ef950d7bc3C81DaCF', + UNI_SETH_ETH: '0xCF457d8Bb8D8f54Af1ea1B3710231e89bd6CFbfe', + UNI_USDC_ETH: '0x34eA1aB2a43ee696914fc3C0d3e517fA666B9e8D', }, [EthereumNetwork.ropsten]: { - WETH: '0xc778417e063141139fce010982780140aa0cd5ab', DAI: '0xf80A32A835F79D7787E8a8ee5721D0fEaFd78108', USDC: '0x851dEf71f0e6A903375C1e536Bd9ff1684BAD802', USDT: '0xB404c51BBC10dcBE948077F18a4B8E553D160084', + WETH: '0xc778417e063141139fce010982780140aa0cd5ab', UNI_DAI_ETH: '0xC245A7d35E652Cae438A1FdB13E474DF53DBB81D', - UNI_USDC_ETH: '0x2BD65323955D08eb600074291305881d1295c4D2', - UNI_SETH_ETH: '0xed4597DCd234867d7A260AD24bAb8253F64940a5', UNI_LEND_ETH: '0xcD5DE1EDD40aBBD6efE2C306276FF56f81Bc3151', UNI_LINK_ETH: '0x8dcf3c8d4d69ca7C188c0A4cf219A1dcE1e510d7', UNI_MKR_ETH: '0xd8b7B99a9205FD0D0abFB6D7a2c13Db2681bff43', + UNI_SETH_ETH: '0xed4597DCd234867d7A260AD24bAb8253F64940a5', + UNI_USDC_ETH: '0x2BD65323955D08eb600074291305881d1295c4D2', }, [EthereumNetwork.main]: { - WETH: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', DAI: '0x6b175474e89094c44da98b954eedeac495271d0f', USDC: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', USDT: '0xdac17f958d2ee523a2206206994597c13d831ec7', + WETH: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', UNI_DAI_ETH: '0x2a1530c4c41db0b0b2bb646cb5eb1a67b7158667', - UNI_USDC_ETH: '0x97dec872013f6b5fb443861090ad931542878126', - UNI_SETH_ETH: '0xe9cf7887b93150d4f2da7dfc6d502b216438f244', UNI_LEND_ETH: '0xcaa7e4656f6a2b59f5f99c745f91ab26d1210dce', UNI_LINK_ETH: '0xf173214c720f58e03e194085b1db28b50acdeead', UNI_MKR_ETH: '0x2c4bd064b998838076fa341a83d007fc2fa50957', + UNI_SETH_ETH: '0xe9cf7887b93150d4f2da7dfc6d502b216438f244', + UNI_USDC_ETH: '0x97dec872013f6b5fb443861090ad931542878126', }, }, }; diff --git a/contracts/configuration/LendingPoolAddressesProvider.sol b/contracts/configuration/LendingPoolAddressesProvider.sol index 38aa1280..43796d36 100644 --- a/contracts/configuration/LendingPoolAddressesProvider.sol +++ b/contracts/configuration/LendingPoolAddressesProvider.sol @@ -2,9 +2,10 @@ pragma solidity ^0.6.8; import {Ownable} from '../dependencies/openzeppelin/contracts/Ownable.sol'; -import { - InitializableImmutableAdminUpgradeabilityProxy -} from '../libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; + +// Prettier ignore to prevent buidler flatter bug +// prettier-ignore +import {InitializableImmutableAdminUpgradeabilityProxy} from '../libraries/aave-upgradeability/InitializableImmutableAdminUpgradeabilityProxy.sol'; import {ILendingPoolAddressesProvider} from '../interfaces/ILendingPoolAddressesProvider.sol'; @@ -20,30 +21,37 @@ contract LendingPoolAddressesProvider is Ownable, ILendingPoolAddressesProvider bytes32 private constant LENDING_POOL = 'LENDING_POOL'; bytes32 private constant LENDING_POOL_CONFIGURATOR = 'LENDING_POOL_CONFIGURATOR'; - bytes32 private constant AAVE_ADMIN = 'AAVE_ADMIN'; + bytes32 private constant POOL_ADMIN = 'POOL_ADMIN'; + bytes32 private constant EMERGENCY_ADMIN = 'EMERGENCY_ADMIN'; bytes32 private constant LENDING_POOL_COLLATERAL_MANAGER = 'COLLATERAL_MANAGER'; bytes32 private constant PRICE_ORACLE = 'PRICE_ORACLE'; bytes32 private constant LENDING_RATE_ORACLE = 'LENDING_RATE_ORACLE'; /** - * @dev Sets an address for an id, allowing to cover it or not with a proxy + * @dev Sets an address for an id by updating a proxy implementation * @param id The id - * @param newAddress The address to set, pass address(0) if a proxy is needed * @param implementationAddress The address of the implementation if we want it covered by a proxy * address(0) if we don't want a proxy covering */ - function setAddress( + function setAddressAsProxy( bytes32 id, - address newAddress, address implementationAddress ) external override onlyOwner { - if (implementationAddress != address(0)) { - _updateImpl(id, implementationAddress); - emit AddressSet(id, implementationAddress, true); - } else { - _addresses[id] = newAddress; - emit AddressSet(id, newAddress, false); - } + _updateImpl(id, implementationAddress); + emit AddressSet(id, implementationAddress, true); + } + + /** + * @dev Sets an address for an id replacing the address saved in the addresses map + * @param id The id + * @param newAddress The address to set, pass address(0) if a proxy is needed + */ + function setAddress( + bytes32 id, + address newAddress + ) external override onlyOwner { + _addresses[id] = newAddress; + emit AddressSet(id, newAddress, false); } /** @@ -113,13 +121,22 @@ contract LendingPoolAddressesProvider is Ownable, ILendingPoolAddressesProvider * hence the upgradable proxy pattern is not used **/ - function getAaveAdmin() external override view returns (address) { - return getAddress(AAVE_ADMIN); + function getPoolAdmin() external override view returns (address) { + return getAddress(POOL_ADMIN); } - function setAaveAdmin(address aaveAdmin) external override onlyOwner { - _addresses[AAVE_ADMIN] = aaveAdmin; - emit AaveAdminUpdated(aaveAdmin); + function setPoolAdmin(address admin) external override onlyOwner { + _addresses[POOL_ADMIN] = admin; + emit ConfigurationAdminUpdated(admin); + } + + function getEmergencyAdmin() external override view returns (address) { + return getAddress(EMERGENCY_ADMIN); + } + + function setEmergencyAdmin(address emergencyAdmin) external override onlyOwner { + _addresses[EMERGENCY_ADMIN] = emergencyAdmin; + emit EmergencyAdminUpdated(emergencyAdmin); } function getPriceOracle() external override view returns (address) { diff --git a/contracts/deployments/ATokensAndRatesHelper.sol b/contracts/deployments/ATokensAndRatesHelper.sol index f39cdaa2..a44d5071 100644 --- a/contracts/deployments/ATokensAndRatesHelper.sol +++ b/contracts/deployments/ATokensAndRatesHelper.sol @@ -36,7 +36,6 @@ contract ATokensAndRatesHelper is Ownable { ) external onlyOwner { require(tokens.length == symbols.length, 't Arrays not same length'); require(rates.length == symbols.length, 'r Arrays not same length'); - for (uint256 i = 0; i < tokens.length; i++) { emit deployedContracts( address( diff --git a/contracts/interfaces/ILendingPool.sol b/contracts/interfaces/ILendingPool.sol index c6da3c32..17be5799 100644 --- a/contracts/interfaces/ILendingPool.sol +++ b/contracts/interfaces/ILendingPool.sol @@ -4,6 +4,7 @@ pragma solidity ^0.6.8; import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; import {UserConfiguration} from '../libraries/configuration/UserConfiguration.sol'; import {ReserveLogic} from '../libraries/logic/ReserveLogic.sol'; +import {ILendingPoolAddressesProvider} from './ILendingPoolAddressesProvider.sol'; pragma experimental ABIEncoderV2; @@ -32,13 +33,6 @@ interface ILendingPool { **/ event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); - event BorrowAllowanceDelegated( - address indexed fromUser, - address indexed toUser, - address[] assets, - uint256[] interestRateModes, - uint256[] amounts - ); /** * @dev emitted on borrow * @param reserve the address of the reserve @@ -195,27 +189,6 @@ interface ILendingPool { address to ) external; - /** - * @dev Sets allowance to borrow on a certain type of debt assets for a certain user address - * @param assets The underlying asset of each debt token - * @param user The user to give allowance to - * @param interestRateModes Types of debt: 1 for stable, 2 for variable - * @param amounts Allowance amounts to borrow - **/ - function delegateBorrowAllowance( - address[] calldata assets, - address user, - uint256[] calldata interestRateModes, - uint256[] calldata amounts - ) external; - - function getBorrowAllowance( - address fromUser, - address toUser, - address asset, - uint256 interestRateMode - ) external view returns (uint256); - /** * @dev Allows users to borrow a specific amount of the reserve currency, provided that the borrower * already deposited enough collateral. @@ -368,6 +341,8 @@ interface ILendingPool { function getReservesList() external view returns (address[] memory); + function getAddressesProvider() external view returns (ILendingPoolAddressesProvider); + /** * @dev Set the _pause state * @param val the boolean value to set the current pause state of LendingPool diff --git a/contracts/interfaces/ILendingPoolAddressesProvider.sol b/contracts/interfaces/ILendingPoolAddressesProvider.sol index 53ed9873..c1a7ab78 100644 --- a/contracts/interfaces/ILendingPoolAddressesProvider.sol +++ b/contracts/interfaces/ILendingPoolAddressesProvider.sol @@ -8,7 +8,8 @@ pragma solidity ^0.6.8; interface ILendingPoolAddressesProvider { event LendingPoolUpdated(address indexed newAddress); - event AaveAdminUpdated(address indexed newAddress); + event ConfigurationAdminUpdated(address indexed newAddress); + event EmergencyAdminUpdated(address indexed newAddress); event LendingPoolConfiguratorUpdated(address indexed newAddress); event LendingPoolCollateralManagerUpdated(address indexed newAddress); event EthereumAddressUpdated(address indexed newAddress); @@ -19,7 +20,11 @@ interface ILendingPoolAddressesProvider { function setAddress( bytes32 id, - address newAddress, + address newAddress + ) external; + + function setAddressAsProxy( + bytes32 id, address impl ) external; @@ -37,9 +42,13 @@ interface ILendingPoolAddressesProvider { function setLendingPoolCollateralManager(address manager) external; - function getAaveAdmin() external view returns (address); + function getPoolAdmin() external view returns (address); - function setAaveAdmin(address aaveAdmin) external; + function setPoolAdmin(address admin) external; + + function getEmergencyAdmin() external view returns (address); + + function setEmergencyAdmin(address admin) external; function getPriceOracle() external view returns (address); diff --git a/contracts/lendingpool/LendingPool.sol b/contracts/lendingpool/LendingPool.sol index 23bf3e94..ebeecab9 100644 --- a/contracts/lendingpool/LendingPool.sol +++ b/contracts/lendingpool/LendingPool.sol @@ -25,7 +25,7 @@ import {IPriceOracleGetter} from '../interfaces/IPriceOracleGetter.sol'; import {SafeERC20} from '../dependencies/openzeppelin/contracts/SafeERC20.sol'; import {ILendingPool} from '../interfaces/ILendingPool.sol'; import {LendingPoolStorage} from './LendingPoolStorage.sol'; -import {IReserveInterestRateStrategy} from '../interfaces/IReserveInterestRateStrategy.sol'; +import {Address} from '../dependencies/openzeppelin/contracts/Address.sol'; /** * @title LendingPool contract @@ -39,13 +39,27 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage using SafeERC20 for IERC20; //main configuration parameters - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 4000; - uint256 public constant REBALANCE_UP_USAGE_RATIO_THRESHOLD = 0.95 * 1e27; //usage ratio of 95% uint256 public constant MAX_STABLE_RATE_BORROW_SIZE_PERCENT = 2500; uint256 public constant FLASHLOAN_PREMIUM_TOTAL = 9; uint256 public constant MAX_NUMBER_RESERVES = 128; uint256 public constant LENDINGPOOL_REVISION = 0x2; + /** + * @dev functions marked by this modifier can only be called when the protocol is not paused + **/ + modifier whenNotPaused() { + _whenNotPaused(); + _; + } + + /** + * @dev functions marked by this modifier can only be called by the LendingPoolConfigurator + **/ + modifier onlyLendingPoolConfigurator() { + _onlyLendingPoolConfigurator(); + _; + } + /** * @dev only lending pools configurator can use functions affected by this modifier **/ @@ -92,8 +106,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage uint256 amount, address onBehalfOf, uint16 referralCode - ) external override { - _whenNotPaused(); + ) external override whenNotPaused { ReserveLogic.ReserveData storage reserve = _reserves[asset]; ValidationLogic.validateDeposit(reserve, amount); @@ -107,6 +120,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage if (isFirstDeposit) { _usersConfig[onBehalfOf].setUsingAsCollateral(reserve.id, true); + emit ReserveUsedAsCollateralEnabled(asset, onBehalfOf); } //transfer to the aToken contract @@ -125,8 +139,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage address asset, uint256 amount, address to - ) external override { - _whenNotPaused(); + ) external override whenNotPaused { ReserveLogic.ReserveData storage reserve = _reserves[asset]; address aToken = reserve.aTokenAddress; @@ -157,6 +170,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage if (amountToWithdraw == userBalance) { _usersConfig[msg.sender].setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(asset, msg.sender); } IAToken(aToken).burn(msg.sender, to, amountToWithdraw, reserve.liquidityIndex); @@ -164,53 +178,6 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage emit Withdraw(asset, msg.sender, to, amountToWithdraw); } - /** - * @dev returns the borrow allowance of the user - * @param asset The underlying asset of the debt token - * @param fromUser The user to giving allowance - * @param toUser The user to give allowance to - * @param interestRateMode Type of debt: 1 for stable, 2 for variable - * @return the current allowance of toUser - **/ - function getBorrowAllowance( - address fromUser, - address toUser, - address asset, - uint256 interestRateMode - ) external override view returns (uint256) { - return - _borrowAllowance[_reserves[asset].getDebtTokenAddress(interestRateMode)][fromUser][toUser]; - } - - /** - * @dev Sets allowance to borrow on a certain type of debt assets for a certain user address - * @param assets The underlying asset of each debt token - * @param user The user to give allowance to - * @param interestRateModes Types of debt: 1 for stable, 2 for variable - * @param amounts Allowance amounts to borrow - **/ - function delegateBorrowAllowance( - address[] calldata assets, - address user, - uint256[] calldata interestRateModes, - uint256[] calldata amounts - ) external override { - _whenNotPaused(); - - uint256 countAssets = assets.length; - require( - countAssets == interestRateModes.length && countAssets == amounts.length, - Errors.LP_INCONSISTENT_PARAMS_LENGTH - ); - - for (uint256 i = 0; i < countAssets; i++) { - address debtToken = _reserves[assets[i]].getDebtTokenAddress(interestRateModes[i]); - _borrowAllowance[debtToken][msg.sender][user] = amounts[i]; - } - - emit BorrowAllowanceDelegated(msg.sender, user, assets, interestRateModes, amounts); - } - /** * @dev Allows users to borrow a specific amount of the reserve currency, provided that the borrower * already deposited enough collateral. @@ -226,19 +193,9 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage uint256 interestRateMode, uint16 referralCode, address onBehalfOf - ) external override { - _whenNotPaused(); + ) external override whenNotPaused { ReserveLogic.ReserveData storage reserve = _reserves[asset]; - if (onBehalfOf != msg.sender) { - address debtToken = reserve.getDebtTokenAddress(interestRateMode); - - _borrowAllowance[debtToken][onBehalfOf][msg - .sender] = _borrowAllowance[debtToken][onBehalfOf][msg.sender].sub( - amount, - Errors.LP_BORROW_ALLOWANCE_ARE_NOT_ENOUGH - ); - } _executeBorrow( ExecuteBorrowParams( asset, @@ -266,9 +223,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage uint256 amount, uint256 rateMode, address onBehalfOf - ) external override { - _whenNotPaused(); - + ) external override whenNotPaused { ReserveLogic.ReserveData storage reserve = _reserves[asset]; (uint256 stableDebt, uint256 variableDebt) = Helpers.getUserCurrentDebt(onBehalfOf, reserve); @@ -323,8 +278,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage * @param asset the address of the reserve on which the user borrowed * @param rateMode the rate mode that the user wants to swap **/ - function swapBorrowRateMode(address asset, uint256 rateMode) external override { - _whenNotPaused(); + function swapBorrowRateMode(address asset, uint256 rateMode) external override whenNotPaused { ReserveLogic.ReserveData storage reserve = _reserves[asset]; (uint256 stableDebt, uint256 variableDebt) = Helpers.getUserCurrentDebt(msg.sender, reserve); @@ -345,6 +299,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage //burn stable rate tokens, mint variable rate tokens IStableDebtToken(reserve.stableDebtTokenAddress).burn(msg.sender, stableDebt); IVariableDebtToken(reserve.variableDebtTokenAddress).mint( + msg.sender, msg.sender, stableDebt, reserve.variableBorrowIndex @@ -357,6 +312,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage reserve.variableBorrowIndex ); IStableDebtToken(reserve.stableDebtTokenAddress).mint( + msg.sender, msg.sender, variableDebt, reserve.currentStableBorrowRate @@ -376,50 +332,30 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage * @param asset the address of the reserve * @param user the address of the user to be rebalanced **/ - function rebalanceStableBorrowRate(address asset, address user) external override { - _whenNotPaused(); - + function rebalanceStableBorrowRate(address asset, address user) external override whenNotPaused { ReserveLogic.ReserveData storage reserve = _reserves[asset]; IERC20 stableDebtToken = IERC20(reserve.stableDebtTokenAddress); IERC20 variableDebtToken = IERC20(reserve.variableDebtTokenAddress); address aTokenAddress = reserve.aTokenAddress; - uint256 stableBorrowBalance = IERC20(stableDebtToken).balanceOf(user); + uint256 stableDebt = IERC20(stableDebtToken).balanceOf(user); - //if the usage ratio is below 95%, no rebalances are needed - uint256 totalBorrows = stableDebtToken - .totalSupply() - .add(variableDebtToken.totalSupply()) - .wadToRay(); - uint256 availableLiquidity = IERC20(asset).balanceOf(aTokenAddress).wadToRay(); - uint256 usageRatio = totalBorrows == 0 - ? 0 - : totalBorrows.rayDiv(availableLiquidity.add(totalBorrows)); - - //if the liquidity rate is below REBALANCE_UP_THRESHOLD of the max variable APR at 95% usage, - //then we allow rebalancing of the stable rate positions. - - uint256 currentLiquidityRate = reserve.currentLiquidityRate; - uint256 maxVariableBorrowRate = IReserveInterestRateStrategy( - reserve - .interestRateStrategyAddress - ) - .getMaxVariableBorrowRate(); - - require( - usageRatio >= REBALANCE_UP_USAGE_RATIO_THRESHOLD && - currentLiquidityRate <= - maxVariableBorrowRate.percentMul(REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD), - Errors.LP_INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET + ValidationLogic.validateRebalanceStableBorrowRate( + reserve, + asset, + stableDebtToken, + variableDebtToken, + aTokenAddress ); reserve.updateState(); - IStableDebtToken(address(stableDebtToken)).burn(user, stableBorrowBalance); + IStableDebtToken(address(stableDebtToken)).burn(user, stableDebt); IStableDebtToken(address(stableDebtToken)).mint( user, - stableBorrowBalance, + user, + stableDebt, reserve.currentStableBorrowRate ); @@ -433,13 +369,17 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage * @param asset the address of the reserve * @param useAsCollateral true if the user wants to use the deposit as collateral, false otherwise. **/ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external override { - _whenNotPaused(); + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) + external + override + whenNotPaused + { ReserveLogic.ReserveData storage reserve = _reserves[asset]; ValidationLogic.validateSetUseReserveAsCollateral( reserve, asset, + useAsCollateral, _reserves, _usersConfig[msg.sender], _reservesList, @@ -471,8 +411,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage address user, uint256 purchaseAmount, bool receiveAToken - ) external override { - _whenNotPaused(); + ) external override whenNotPaused { address collateralManager = _addressesProvider.getLendingPoolCollateralManager(); //solium-disable-next-line @@ -490,10 +429,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage (uint256 returnCode, string memory returnMessage) = abi.decode(result, (uint256, string)); - if (returnCode != 0) { - //error found - revert(string(abi.encodePacked(returnMessage))); - } + require(returnCode == 0, string(abi.encodePacked(returnMessage))); } struct FlashLoanLocalVars { @@ -528,9 +464,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage address onBehalfOf, bytes calldata params, uint16 referralCode - ) external override { - _whenNotPaused(); - + ) external override whenNotPaused { FlashLoanLocalVars memory vars; ValidationLogic.validateFlashloan(assets, amounts); @@ -581,14 +515,6 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage vars.currentAmountPlusPremium ); } else { - if (msg.sender != onBehalfOf) { - vars.debtToken = _reserves[vars.currentAsset].getDebtTokenAddress(modes[vars.i]); - - _borrowAllowance[vars.debtToken][onBehalfOf][msg.sender] = _borrowAllowance[vars - .debtToken][onBehalfOf][msg.sender] - .sub(vars.currentAmount, Errors.LP_BORROW_ALLOWANCE_ARE_NOT_ENOUGH); - } - //if the user didn't choose to return the funds, the system checks if there //is enough collateral and eventually open a position _executeBorrow( @@ -753,7 +679,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage /** * @dev returns the addresses provider **/ - function getAddressesProvider() external view returns (ILendingPoolAddressesProvider) { + function getAddressesProvider() external override view returns (ILendingPoolAddressesProvider) { return _addressesProvider; } @@ -773,9 +699,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage uint256 amount, uint256 balanceFromBefore, uint256 balanceToBefore - ) external override { - _whenNotPaused(); - + ) external override whenNotPaused { require(msg.sender == _reserves[asset].aTokenAddress, Errors.LP_CALLER_MUST_BE_AN_ATOKEN); ValidationLogic.validateTransfer( @@ -793,22 +717,17 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage if (balanceFromBefore.sub(amount) == 0) { UserConfiguration.Map storage fromConfig = _usersConfig[from]; fromConfig.setUsingAsCollateral(reserveId, false); + emit ReserveUsedAsCollateralDisabled(asset, from); } if (balanceToBefore == 0 && amount != 0) { UserConfiguration.Map storage toConfig = _usersConfig[to]; toConfig.setUsingAsCollateral(reserveId, true); + emit ReserveUsedAsCollateralEnabled(asset, to); } } } - /** - * @dev avoids direct transfers of ETH - **/ - receive() external payable { - revert(); - } - /** * @dev initializes a reserve * @param asset the address of the reserve @@ -821,8 +740,8 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage address stableDebtAddress, address variableDebtAddress, address interestRateStrategyAddress - ) external override { - _onlyLendingPoolConfigurator(); + ) external override onlyLendingPoolConfigurator { + require(Address.isContract(asset), Errors.LP_NOT_CONTRACT); _reserves[asset].init( aTokenAddress, stableDebtAddress, @@ -840,8 +759,8 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress) external override + onlyLendingPoolConfigurator { - _onlyLendingPoolConfigurator(); _reserves[asset].interestRateStrategyAddress = rateStrategyAddress; } @@ -850,8 +769,11 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage * @param asset the address of the reserve * @param configuration the configuration map **/ - function setConfiguration(address asset, uint256 configuration) external override { - _onlyLendingPoolConfigurator(); + function setConfiguration(address asset, uint256 configuration) + external + override + onlyLendingPoolConfigurator + { _reserves[asset].configuration.data = configuration; } @@ -859,9 +781,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage * @dev Set the _pause state * @param val the boolean value to set the current pause state of LendingPool */ - function setPause(bool val) external override { - _onlyLendingPoolConfigurator(); - + function setPause(bool val) external override onlyLendingPoolConfigurator { _paused = val; if (_paused) { emit Paused(); @@ -923,12 +843,14 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage currentStableRate = reserve.currentStableBorrowRate; isFirstBorrowing = IStableDebtToken(reserve.stableDebtTokenAddress).mint( + vars.user, vars.onBehalfOf, vars.amount, currentStableRate ); } else { isFirstBorrowing = IVariableDebtToken(reserve.variableDebtTokenAddress).mint( + vars.user, vars.onBehalfOf, vars.amount, reserve.variableBorrowIndex @@ -977,7 +899,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage _reserves[asset].id = uint8(reservesCount); _reservesList[reservesCount] = asset; - _reservesCount++; + _reservesCount = reservesCount + 1; } } } diff --git a/contracts/lendingpool/LendingPoolCollateralManager.sol b/contracts/lendingpool/LendingPoolCollateralManager.sol index 993f7fe5..729895de 100644 --- a/contracts/lendingpool/LendingPoolCollateralManager.sol +++ b/contracts/lendingpool/LendingPoolCollateralManager.sol @@ -57,6 +57,13 @@ contract LendingPoolCollateralManager is VersionedInitializable, LendingPoolStor bool receiveAToken ); + /** + * @dev emitted when a user disables a reserve as collateral + * @param reserve the address of the reserve + * @param user the address of the user + **/ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + struct LiquidationCallLocalVars { uint256 userCollateralBalance; uint256 userStableDebt; @@ -120,7 +127,7 @@ contract LendingPoolCollateralManager is VersionedInitializable, LendingPoolStor (, , , , vars.healthFactor) = GenericLogic.calculateUserAccountData( user, _reserves, - _usersConfig[user], + userConfig, _reservesList, _reservesCount, _addressesProvider.getPriceOracle() @@ -246,6 +253,14 @@ contract LendingPoolCollateralManager is VersionedInitializable, LendingPoolStor ); } + //if the collateral being liquidated is equal to the user balance, + //we set the currency as not being used as collateral anymore + + if (vars.maxCollateralToLiquidate == vars.userCollateralBalance) { + userConfig.setUsingAsCollateral(collateralReserve.id, false); + emit ReserveUsedAsCollateralDisabled(collateral, user); + } + //transfers the principal currency to the aToken IERC20(principal).safeTransferFrom( msg.sender, diff --git a/contracts/lendingpool/LendingPoolConfigurator.sol b/contracts/lendingpool/LendingPoolConfigurator.sol index 8f9c28dd..de091dbb 100644 --- a/contracts/lendingpool/LendingPoolConfigurator.sol +++ b/contracts/lendingpool/LendingPoolConfigurator.sol @@ -188,10 +188,21 @@ contract LendingPoolConfigurator is VersionedInitializable { ILendingPool internal pool; /** - * @dev only the lending pool manager can call functions affected by this modifier + * @dev only the pool admin can call functions affected by this modifier **/ - modifier onlyAaveAdmin { - require(addressesProvider.getAaveAdmin() == msg.sender, Errors.LPC_CALLER_NOT_AAVE_ADMIN); + modifier onlyPoolAdmin { + require(addressesProvider.getPoolAdmin() == msg.sender, Errors.CALLER_NOT_POOL_ADMIN); + _; + } + + /** + * @dev only the emergency admin can call functions affected by this modifier + **/ + modifier onlyEmergencyAdmin { + require( + addressesProvider.getEmergencyAdmin() == msg.sender, + Errors.LPC_CALLER_NOT_EMERGENCY_ADMIN + ); _; } @@ -220,7 +231,7 @@ contract LendingPoolConfigurator is VersionedInitializable { address variableDebtTokenImpl, uint8 underlyingAssetDecimals, address interestRateStrategyAddress - ) public onlyAaveAdmin { + ) public onlyPoolAdmin { address asset = ITokenConfiguration(aTokenImpl).UNDERLYING_ASSET_ADDRESS(); require( @@ -287,7 +298,7 @@ contract LendingPoolConfigurator is VersionedInitializable { * @param asset the address of the reserve to be updated * @param implementation the address of the new aToken implementation **/ - function updateAToken(address asset, address implementation) external onlyAaveAdmin { + function updateAToken(address asset, address implementation) external onlyPoolAdmin { ReserveLogic.ReserveData memory reserveData = pool.getReserveData(asset); _upgradeTokenImplementation(asset, reserveData.aTokenAddress, implementation); @@ -300,7 +311,7 @@ contract LendingPoolConfigurator is VersionedInitializable { * @param asset the address of the reserve to be updated * @param implementation the address of the new aToken implementation **/ - function updateStableDebtToken(address asset, address implementation) external onlyAaveAdmin { + function updateStableDebtToken(address asset, address implementation) external onlyPoolAdmin { ReserveLogic.ReserveData memory reserveData = pool.getReserveData(asset); _upgradeTokenImplementation(asset, reserveData.stableDebtTokenAddress, implementation); @@ -313,7 +324,7 @@ contract LendingPoolConfigurator is VersionedInitializable { * @param asset the address of the reserve to be updated * @param implementation the address of the new aToken implementation **/ - function updateVariableDebtToken(address asset, address implementation) external onlyAaveAdmin { + function updateVariableDebtToken(address asset, address implementation) external onlyPoolAdmin { ReserveLogic.ReserveData memory reserveData = pool.getReserveData(asset); _upgradeTokenImplementation(asset, reserveData.variableDebtTokenAddress, implementation); @@ -328,7 +339,7 @@ contract LendingPoolConfigurator is VersionedInitializable { **/ function enableBorrowingOnReserve(address asset, bool stableBorrowRateEnabled) external - onlyAaveAdmin + onlyPoolAdmin { ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset); @@ -344,7 +355,7 @@ contract LendingPoolConfigurator is VersionedInitializable { * @dev disables borrowing on a reserve * @param asset the address of the reserve **/ - function disableBorrowingOnReserve(address asset) external onlyAaveAdmin { + function disableBorrowingOnReserve(address asset) external onlyPoolAdmin { ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset); currentConfig.setBorrowingEnabled(false); @@ -354,18 +365,20 @@ contract LendingPoolConfigurator is VersionedInitializable { } /** - * @dev configures the reserve collateralization parameters + * @dev configures the reserve collateralization parameters. + * all the values are expressed in percentages with two decimals of precision. A valid value is 10000, which means 100.00% * @param asset the address of the reserve * @param ltv the loan to value of the asset when used as collateral * @param liquidationThreshold the threshold at which loans using this asset as collateral will be considered undercollateralized - * @param liquidationBonus the bonus liquidators receive to liquidate this asset + * @param liquidationBonus the bonus liquidators receive to liquidate this asset. The values is always above 100%. A value of 105% + * means the liquidator will receive a 5% bonus **/ function configureReserveAsCollateral( address asset, uint256 ltv, uint256 liquidationThreshold, uint256 liquidationBonus - ) external onlyAaveAdmin { + ) external onlyPoolAdmin { ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset); //validation of the parameters: the LTV can @@ -375,11 +388,14 @@ contract LendingPoolConfigurator is VersionedInitializable { if (liquidationThreshold != 0) { //liquidation bonus must be bigger than 100.00%, otherwise the liquidator would receive less - //collateral than needed to cover the debt - require( - liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, - Errors.LPC_INVALID_CONFIGURATION - ); + //collateral than needed to cover the debt. + uint256 absoluteBonus = liquidationBonus.sub(PercentageMath.PERCENTAGE_FACTOR, Errors.LPC_INVALID_CONFIGURATION); + require(absoluteBonus > 0, Errors.LPC_INVALID_CONFIGURATION); + + //we also need to require that the liq threshold is lower or equal than the liquidation bonus, to ensure that + //there is always enough margin for liquidators to receive the bonus. + require(liquidationThreshold.add(absoluteBonus) <= PercentageMath.PERCENTAGE_FACTOR, Errors.LPC_INVALID_CONFIGURATION); + } else { require(liquidationBonus == 0, Errors.LPC_INVALID_CONFIGURATION); //if the liquidation threshold is being set to 0, @@ -401,7 +417,7 @@ contract LendingPoolConfigurator is VersionedInitializable { * @dev enable stable rate borrowing on a reserve * @param asset the address of the reserve **/ - function enableReserveStableRate(address asset) external onlyAaveAdmin { + function enableReserveStableRate(address asset) external onlyPoolAdmin { ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset); currentConfig.setStableRateBorrowingEnabled(true); @@ -415,7 +431,7 @@ contract LendingPoolConfigurator is VersionedInitializable { * @dev disable stable rate borrowing on a reserve * @param asset the address of the reserve **/ - function disableReserveStableRate(address asset) external onlyAaveAdmin { + function disableReserveStableRate(address asset) external onlyPoolAdmin { ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset); currentConfig.setStableRateBorrowingEnabled(false); @@ -429,7 +445,7 @@ contract LendingPoolConfigurator is VersionedInitializable { * @dev activates a reserve * @param asset the address of the reserve **/ - function activateReserve(address asset) external onlyAaveAdmin { + function activateReserve(address asset) external onlyPoolAdmin { ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset); currentConfig.setActive(true); @@ -443,7 +459,7 @@ contract LendingPoolConfigurator is VersionedInitializable { * @dev deactivates a reserve * @param asset the address of the reserve **/ - function deactivateReserve(address asset) external onlyAaveAdmin { + function deactivateReserve(address asset) external onlyPoolAdmin { _checkNoLiquidity(asset); ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset); @@ -459,7 +475,7 @@ contract LendingPoolConfigurator is VersionedInitializable { * @dev freezes a reserve. A frozen reserve doesn't accept any new deposit, borrow or rate swap, but can accept repayments, liquidations, rate rebalances and redeems * @param asset the address of the reserve **/ - function freezeReserve(address asset) external onlyAaveAdmin { + function freezeReserve(address asset) external onlyPoolAdmin { ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset); currentConfig.setFrozen(true); @@ -473,7 +489,7 @@ contract LendingPoolConfigurator is VersionedInitializable { * @dev unfreezes a reserve * @param asset the address of the reserve **/ - function unfreezeReserve(address asset) external onlyAaveAdmin { + function unfreezeReserve(address asset) external onlyPoolAdmin { ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset); currentConfig.setFrozen(false); @@ -488,7 +504,7 @@ contract LendingPoolConfigurator is VersionedInitializable { * @param asset the address of the reserve * @param ltv the new value for the loan to value **/ - function setLtv(address asset, uint256 ltv) external onlyAaveAdmin { + function setLtv(address asset, uint256 ltv) external onlyPoolAdmin { ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset); currentConfig.setLtv(ltv); @@ -503,7 +519,7 @@ contract LendingPoolConfigurator is VersionedInitializable { * @param asset the address of the reserve * @param reserveFactor the new reserve factor of the reserve **/ - function setReserveFactor(address asset, uint256 reserveFactor) external onlyAaveAdmin { + function setReserveFactor(address asset, uint256 reserveFactor) external onlyPoolAdmin { ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset); currentConfig.setReserveFactor(reserveFactor); @@ -518,7 +534,7 @@ contract LendingPoolConfigurator is VersionedInitializable { * @param asset the address of the reserve * @param threshold the new value for the liquidation threshold **/ - function setLiquidationThreshold(address asset, uint256 threshold) external onlyAaveAdmin { + function setLiquidationThreshold(address asset, uint256 threshold) external onlyPoolAdmin { ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset); currentConfig.setLiquidationThreshold(threshold); @@ -533,7 +549,7 @@ contract LendingPoolConfigurator is VersionedInitializable { * @param asset the address of the reserve * @param bonus the new value for the liquidation bonus **/ - function setLiquidationBonus(address asset, uint256 bonus) external onlyAaveAdmin { + function setLiquidationBonus(address asset, uint256 bonus) external onlyPoolAdmin { ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset); currentConfig.setLiquidationBonus(bonus); @@ -543,21 +559,6 @@ contract LendingPoolConfigurator is VersionedInitializable { emit ReserveLiquidationBonusChanged(asset, bonus); } - /** - * @dev updates the reserve decimals - * @param asset the address of the reserve - * @param decimals the new number of decimals - **/ - function setReserveDecimals(address asset, uint256 decimals) external onlyAaveAdmin { - ReserveConfiguration.Map memory currentConfig = pool.getConfiguration(asset); - - currentConfig.setDecimals(decimals); - - pool.setConfiguration(asset, currentConfig.data); - - emit ReserveDecimalsChanged(asset, decimals); - } - /** * @dev sets the interest rate strategy of a reserve * @param asset the address of the reserve @@ -565,7 +566,7 @@ contract LendingPoolConfigurator is VersionedInitializable { **/ function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress) external - onlyAaveAdmin + onlyPoolAdmin { pool.setReserveInterestRateStrategyAddress(asset, rateStrategyAddress); emit ReserveInterestRateStrategyChanged(asset, rateStrategyAddress); @@ -620,7 +621,7 @@ contract LendingPoolConfigurator is VersionedInitializable { * @dev pauses or unpauses LendingPool actions * @param val the boolean value to set the current pause state of LendingPool **/ - function setPoolPause(bool val) external onlyAaveAdmin { + function setPoolPause(bool val) external onlyEmergencyAdmin { pool.setPause(val); } diff --git a/contracts/lendingpool/LendingPoolStorage.sol b/contracts/lendingpool/LendingPoolStorage.sol index ceeadd39..5ea45c6e 100644 --- a/contracts/lendingpool/LendingPoolStorage.sol +++ b/contracts/lendingpool/LendingPoolStorage.sol @@ -15,8 +15,6 @@ contract LendingPoolStorage { mapping(address => ReserveLogic.ReserveData) internal _reserves; mapping(address => UserConfiguration.Map) internal _usersConfig; - // debt token address => user who gives allowance => user who receives allowance => amount - mapping(address => mapping(address => mapping(address => uint256))) internal _borrowAllowance; // the list of the available reserves, structured as a mapping for gas savings reasons mapping(uint256 => address) internal _reservesList; diff --git a/contracts/libraries/configuration/ReserveConfiguration.sol b/contracts/libraries/configuration/ReserveConfiguration.sol index 7951d91a..71c64bde 100644 --- a/contracts/libraries/configuration/ReserveConfiguration.sol +++ b/contracts/libraries/configuration/ReserveConfiguration.sol @@ -86,7 +86,7 @@ library ReserveConfiguration { } /** - * @dev gets the Loan to Value of the reserve + * @dev gets the liquidation threshold of the reserve * @param self the reserve configuration * @return the liquidation threshold **/ diff --git a/contracts/libraries/configuration/UserConfiguration.sol b/contracts/libraries/configuration/UserConfiguration.sol index 71c28f0e..8679390e 100644 --- a/contracts/libraries/configuration/UserConfiguration.sol +++ b/contracts/libraries/configuration/UserConfiguration.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: agpl-3.0 pragma solidity ^0.6.8; +import {Errors} from '../helpers/Errors.sol'; /** * @title UserConfiguration library * @author Aave @@ -24,6 +25,7 @@ library UserConfiguration { uint256 reserveIndex, bool borrowing ) internal { + require(reserveIndex < 128, Errors.UL_INVALID_INDEX); self.data = (self.data & ~(1 << (reserveIndex * 2))) | (uint256(borrowing ? 1 : 0) << (reserveIndex * 2)); @@ -40,6 +42,7 @@ library UserConfiguration { uint256 reserveIndex, bool _usingAsCollateral ) internal { + require(reserveIndex < 128, Errors.UL_INVALID_INDEX); self.data = (self.data & ~(1 << (reserveIndex * 2 + 1))) | (uint256(_usingAsCollateral ? 1 : 0) << (reserveIndex * 2 + 1)); @@ -56,6 +59,7 @@ library UserConfiguration { pure returns (bool) { + require(reserveIndex < 128, Errors.UL_INVALID_INDEX); return (self.data >> (reserveIndex * 2)) & 3 != 0; } @@ -70,6 +74,7 @@ library UserConfiguration { pure returns (bool) { + require(reserveIndex < 128, Errors.UL_INVALID_INDEX); return (self.data >> (reserveIndex * 2)) & 1 != 0; } @@ -84,6 +89,7 @@ library UserConfiguration { pure returns (bool) { + require(reserveIndex < 128, Errors.UL_INVALID_INDEX); return (self.data >> (reserveIndex * 2 + 1)) & 1 != 0; } diff --git a/contracts/libraries/helpers/Errors.sol b/contracts/libraries/helpers/Errors.sol index 3b37e91a..3f044b17 100644 --- a/contracts/libraries/helpers/Errors.sol +++ b/contracts/libraries/helpers/Errors.sol @@ -17,7 +17,12 @@ pragma solidity ^0.6.8; * - P = Pausable */ library Errors { - string public constant VL_AMOUNT_NOT_GREATER_THAN_0 = '1'; // 'Amount must be greater than 0' + //common errors + string public constant CALLER_NOT_POOL_ADMIN = '33'; // 'The caller must be the pool admin' + string public constant BORROW_ALLOWANCE_NOT_ENOUGH = '59'; // User borrows on behalf, but allowance are too small + + //contract specific errors + string public constant VL_INVALID_AMOUNT = '1'; // 'Amount must be greater than 0' string public constant VL_NO_ACTIVE_RESERVE = '2'; // 'Action requires an active reserve' string public constant VL_RESERVE_FROZEN = '3'; // 'Action cannot be performed because the reserve is frozen' string public constant VL_CURRENT_AVAILABLE_LIQUIDITY_NOT_ENOUGH = '4'; // 'The current liquidity is not enough' @@ -43,13 +48,12 @@ library Errors { string public constant LP_NOT_ENOUGH_LIQUIDITY_TO_BORROW = '24'; // 'There is not enough liquidity available to borrow' string public constant LP_REQUESTED_AMOUNT_TOO_SMALL = '25'; // 'The requested amount is too small for a FlashLoan.' string public constant LP_INCONSISTENT_PROTOCOL_ACTUAL_BALANCE = '26'; // 'The actual balance of the protocol is inconsistent' - string public constant LP_CALLER_NOT_LENDING_POOL_CONFIGURATOR = '27'; // 'The actual balance of the protocol is inconsistent' + string public constant LP_CALLER_NOT_LENDING_POOL_CONFIGURATOR = '27'; // 'The caller of the function is not the lending pool configurator' string public constant LP_INCONSISTENT_FLASHLOAN_PARAMS = '28'; string public constant AT_CALLER_MUST_BE_LENDING_POOL = '29'; // 'The caller of this function must be a lending pool' string public constant AT_CANNOT_GIVE_ALLVWANCE_TO_HIMSELF = '30'; // 'User cannot give allowance to himself' string public constant AT_TRANSFER_AMOUNT_NOT_GT_0 = '31'; // 'Transferred amount needs to be greater than zero' string public constant RL_RESERVE_ALREADY_INITIALIZED = '32'; // 'Reserve has already been initialized' - string public constant LPC_CALLER_NOT_AAVE_ADMIN = '33'; // 'The caller must be the aave admin' string public constant LPC_RESERVE_LIQUIDITY_NOT_0 = '34'; // 'The liquidity of the reserve needs to be 0' string public constant LPC_INVALID_ATOKEN_POOL_ADDRESS = '35'; // 'The liquidity of the reserve needs to be 0' string public constant LPC_INVALID_STABLE_DEBT_TOKEN_POOL_ADDRESS = '36'; // 'The liquidity of the reserve needs to be 0' @@ -58,6 +62,7 @@ library Errors { string public constant LPC_INVALID_VARIABLE_DEBT_TOKEN_UNDERLYING_ADDRESS = '39'; // 'The liquidity of the reserve needs to be 0' string public constant LPC_INVALID_ADDRESSES_PROVIDER_ID = '40'; // 'The liquidity of the reserve needs to be 0' string public constant LPC_INVALID_CONFIGURATION = '75'; // 'Invalid risk parameters for the reserve' + string public constant LPC_CALLER_NOT_EMERGENCY_ADMIN = '76'; // 'The caller must be the emergency admin' string public constant LPAPR_PROVIDER_NOT_REGISTERED = '41'; // 'Provider is not registered' string public constant LPCM_HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '42'; // 'Health factor is not below the threshold' string public constant LPCM_COLLATERAL_CANNOT_BE_LIQUIDATED = '43'; // 'The collateral chosen cannot be liquidated' @@ -76,7 +81,6 @@ library Errors { string public constant AT_INVALID_MINT_AMOUNT = '56'; //invalid amount to mint string public constant LP_FAILED_REPAY_WITH_COLLATERAL = '57'; string public constant AT_INVALID_BURN_AMOUNT = '58'; //invalid amount to burn - string public constant LP_BORROW_ALLOWANCE_ARE_NOT_ENOUGH = '59'; // User borrows on behalf, but allowance are too small string public constant LP_FAILED_COLLATERAL_SWAP = '60'; string public constant LP_INVALID_EQUAL_ASSETS_TO_SWAP = '61'; string public constant LP_REENTRANCY_NOT_ALLOWED = '62'; @@ -92,6 +96,8 @@ library Errors { string public constant LPAPR_INVALID_ADDRESSES_PROVIDER_ID = '72'; string public constant VL_INCONSISTENT_FLASHLOAN_PARAMS = '73'; string public constant LP_INCONSISTENT_PARAMS_LENGTH = '74'; + string public constant UL_INVALID_INDEX = '77'; + string public constant LP_NOT_CONTRACT = '78'; enum CollateralManagerErrors { NO_ERROR, diff --git a/contracts/libraries/helpers/Helpers.sol b/contracts/libraries/helpers/Helpers.sol index e1d65502..ba8be90c 100644 --- a/contracts/libraries/helpers/Helpers.sol +++ b/contracts/libraries/helpers/Helpers.sol @@ -26,4 +26,15 @@ library Helpers { DebtTokenBase(reserve.variableDebtTokenAddress).balanceOf(user) ); } + + function getUserCurrentDebtMemory(address user, ReserveLogic.ReserveData memory reserve) + internal + view + returns (uint256, uint256) + { + return ( + DebtTokenBase(reserve.stableDebtTokenAddress).balanceOf(user), + DebtTokenBase(reserve.variableDebtTokenAddress).balanceOf(user) + ); + } } diff --git a/contracts/libraries/logic/ReserveLogic.sol b/contracts/libraries/logic/ReserveLogic.sol index f3d13628..85fbe28a 100644 --- a/contracts/libraries/logic/ReserveLogic.sol +++ b/contracts/libraries/logic/ReserveLogic.sol @@ -76,7 +76,7 @@ library ReserveLogic { /** * @dev returns the ongoing normalized income for the reserve. * a value of 1e27 means there is no income. As time passes, the income is accrued. - * A value of 2*1e27 means for each unit of assset two units of income have been accrued. + * A value of 2*1e27 means for each unit of asset one unit of income has been accrued. * @param reserve the reserve object * @return the normalized income. expressed in ray **/ @@ -119,28 +119,6 @@ library ReserveLogic { return cumulated; } - /** - * @dev returns an address of the debt token used for particular interest rate mode on asset. - * @param reserve the reserve object - * @param interestRateMode - STABLE or VARIABLE from ReserveLogic.InterestRateMode enum - * @return an address of the corresponding debt token from reserve configuration - **/ - function getDebtTokenAddress(ReserveLogic.ReserveData storage reserve, uint256 interestRateMode) - external - view - returns (address) - { - require( - ReserveLogic.InterestRateMode.STABLE == ReserveLogic.InterestRateMode(interestRateMode) || - ReserveLogic.InterestRateMode.VARIABLE == ReserveLogic.InterestRateMode(interestRateMode), - Errors.VL_INVALID_INTEREST_RATE_MODE_SELECTED - ); - return - ReserveLogic.InterestRateMode.STABLE == ReserveLogic.InterestRateMode(interestRateMode) - ? reserve.stableDebtTokenAddress - : reserve.variableDebtTokenAddress; - } - /** * @dev Updates the liquidity cumulative index Ci and variable borrow cumulative index Bvc. Refer to the whitepaper for * a formal specification. @@ -207,15 +185,9 @@ library ReserveLogic { address interestRateStrategyAddress ) external { require(reserve.aTokenAddress == address(0), Errors.RL_RESERVE_ALREADY_INITIALIZED); - if (reserve.liquidityIndex == 0) { - //if the reserve has not been initialized yet - reserve.liquidityIndex = uint128(WadRayMath.ray()); - } - - if (reserve.variableBorrowIndex == 0) { - reserve.variableBorrowIndex = uint128(WadRayMath.ray()); - } - + + reserve.liquidityIndex = uint128(WadRayMath.ray()); + reserve.variableBorrowIndex = uint128(WadRayMath.ray()); reserve.aTokenAddress = aTokenAddress; reserve.stableDebtTokenAddress = stableDebtTokenAddress; reserve.variableDebtTokenAddress = variableDebtTokenAddress; diff --git a/contracts/libraries/logic/ValidationLogic.sol b/contracts/libraries/logic/ValidationLogic.sol index 47bf3fd8..4388d9c2 100644 --- a/contracts/libraries/logic/ValidationLogic.sol +++ b/contracts/libraries/logic/ValidationLogic.sol @@ -13,6 +13,7 @@ import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; import {UserConfiguration} from '../configuration/UserConfiguration.sol'; import {Errors} from '../helpers/Errors.sol'; import {Helpers} from '../helpers/Helpers.sol'; +import {IReserveInterestRateStrategy} from '../../interfaces/IReserveInterestRateStrategy.sol'; /** * @title ReserveLogic library @@ -28,6 +29,9 @@ library ValidationLogic { using ReserveConfiguration for ReserveConfiguration.Map; using UserConfiguration for UserConfiguration.Map; + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 4000; + uint256 public constant REBALANCE_UP_USAGE_RATIO_THRESHOLD = 0.95 * 1e27; //usage ratio of 95% + /** * @dev validates a deposit. * @param reserve the reserve state on which the user is depositing @@ -36,7 +40,7 @@ library ValidationLogic { function validateDeposit(ReserveLogic.ReserveData storage reserve, uint256 amount) external view { (bool isActive, bool isFrozen, , ) = reserve.configuration.getFlags(); - require(amount > 0, Errors.VL_AMOUNT_NOT_GREATER_THAN_0); + require(amount != 0, Errors.VL_INVALID_AMOUNT); require(isActive, Errors.VL_NO_ACTIVE_RESERVE); require(!isFrozen, Errors.VL_RESERVE_FROZEN); } @@ -62,10 +66,13 @@ library ValidationLogic { uint256 reservesCount, address oracle ) external view { - require(amount > 0, Errors.VL_AMOUNT_NOT_GREATER_THAN_0); + require(amount != 0, Errors.VL_INVALID_AMOUNT); require(amount <= userBalance, Errors.VL_NOT_ENOUGH_AVAILABLE_USER_BALANCE); + (bool isActive,, , ) = reservesData[reserveAddress].configuration.getFlags(); + require(isActive, Errors.VL_NO_ACTIVE_RESERVE); + require( GenericLogic.balanceDecreaseAllowed( reserveAddress, @@ -139,6 +146,7 @@ library ValidationLogic { require(vars.isActive, Errors.VL_NO_ACTIVE_RESERVE); require(!vars.isFrozen, Errors.VL_RESERVE_FROZEN); + require(amount != 0, Errors.VL_INVALID_AMOUNT); require(vars.borrowingEnabled, Errors.VL_BORROWING_NOT_ENABLED); @@ -232,7 +240,7 @@ library ValidationLogic { require(isActive, Errors.VL_NO_ACTIVE_RESERVE); - require(amountSent > 0, Errors.VL_AMOUNT_NOT_GREATER_THAN_0); + require(amountSent > 0, Errors.VL_INVALID_AMOUNT); require( (stableDebt > 0 && @@ -292,6 +300,54 @@ library ValidationLogic { } } + /** + * @dev validates a stable borrow rate rebalance + * @param reserve the reserve state on which the user is getting rebalanced + * @param reserveAddress the address of the reserve + * @param stableDebtToken the stable debt token instance + * @param variableDebtToken the variable debt token instance + * @param aTokenAddress the address of the aToken contract + */ + function validateRebalanceStableBorrowRate( + ReserveLogic.ReserveData storage reserve, + address reserveAddress, + IERC20 stableDebtToken, + IERC20 variableDebtToken, + address aTokenAddress) external view { + + (bool isActive,,, ) = reserve.configuration.getFlags(); + + require(isActive, Errors.VL_NO_ACTIVE_RESERVE); + + //if the usage ratio is below 95%, no rebalances are needed + uint256 totalDebt = stableDebtToken + .totalSupply() + .add(variableDebtToken.totalSupply()) + .wadToRay(); + uint256 availableLiquidity = IERC20(reserveAddress).balanceOf(aTokenAddress).wadToRay(); + uint256 usageRatio = totalDebt == 0 + ? 0 + : totalDebt.rayDiv(availableLiquidity.add(totalDebt)); + + //if the liquidity rate is below REBALANCE_UP_THRESHOLD of the max variable APR at 95% usage, + //then we allow rebalancing of the stable rate positions. + + uint256 currentLiquidityRate = reserve.currentLiquidityRate; + uint256 maxVariableBorrowRate = IReserveInterestRateStrategy( + reserve + .interestRateStrategyAddress + ) + .getMaxVariableBorrowRate(); + + require( + usageRatio >= REBALANCE_UP_USAGE_RATIO_THRESHOLD && + currentLiquidityRate <= + maxVariableBorrowRate.percentMul(REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD), + Errors.LP_INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET + ); + + } + /** * @dev validates the choice of a user of setting (or not) an asset as collateral * @param reserve the state of the reserve that the user is enabling or disabling as collateral @@ -304,6 +360,7 @@ library ValidationLogic { function validateSetUseReserveAsCollateral( ReserveLogic.ReserveData storage reserve, address reserveAddress, + bool useAsCollateral, mapping(address => ReserveLogic.ReserveData) storage reservesData, UserConfiguration.Map storage userConfig, mapping(uint256 => address) storage reserves, @@ -315,6 +372,7 @@ library ValidationLogic { require(underlyingBalance > 0, Errors.VL_UNDERLYING_BALANCE_NOT_GREATER_THAN_0); require( + useAsCollateral || GenericLogic.balanceDecreaseAllowed( reserveAddress, msg.sender, diff --git a/contracts/misc/AaveProtocolTestHelpers.sol b/contracts/misc/AaveProtocolDataProvider.sol similarity index 99% rename from contracts/misc/AaveProtocolTestHelpers.sol rename to contracts/misc/AaveProtocolDataProvider.sol index 37732e07..cc35f17d 100644 --- a/contracts/misc/AaveProtocolTestHelpers.sol +++ b/contracts/misc/AaveProtocolDataProvider.sol @@ -11,7 +11,7 @@ import {UserConfiguration} from '../libraries/configuration/UserConfiguration.so import {IStableDebtToken} from '../tokenization/interfaces/IStableDebtToken.sol'; import {IVariableDebtToken} from '../tokenization/interfaces/IVariableDebtToken.sol'; -contract AaveProtocolTestHelpers { +contract AaveProtocolDataProvider { using ReserveConfiguration for ReserveConfiguration.Map; using UserConfiguration for UserConfiguration.Map; diff --git a/contracts/misc/ChainlinkProxyPriceProvider.sol b/contracts/misc/ChainlinkProxyPriceProvider.sol index a259ba50..f6516abc 100644 --- a/contracts/misc/ChainlinkProxyPriceProvider.sol +++ b/contracts/misc/ChainlinkProxyPriceProvider.sol @@ -18,11 +18,13 @@ import {SafeERC20} from '../dependencies/openzeppelin/contracts/SafeERC20.sol'; contract ChainlinkProxyPriceProvider is IPriceOracleGetter, Ownable { using SafeERC20 for IERC20; + event WethSet(address indexed weth); event AssetSourceUpdated(address indexed asset, address indexed source); event FallbackOracleUpdated(address indexed fallbackOracle); mapping(address => IChainlinkAggregator) private assetsSources; IPriceOracleGetter private _fallbackOracle; + address public immutable WETH; /// @notice Constructor /// @param assets The addresses of the assets @@ -32,10 +34,13 @@ contract ChainlinkProxyPriceProvider is IPriceOracleGetter, Ownable { constructor( address[] memory assets, address[] memory sources, - address fallbackOracle + address fallbackOracle, + address weth ) public { _setFallbackOracle(fallbackOracle); _setAssetsSources(assets, sources); + WETH = weth; + emit WethSet(weth); } /// @notice External function called by the Aave governance to set or replace sources of assets @@ -77,8 +82,10 @@ contract ChainlinkProxyPriceProvider is IPriceOracleGetter, Ownable { /// @param asset The asset address function getAssetPrice(address asset) public override view returns (uint256) { IChainlinkAggregator source = assetsSources[asset]; - // If there is no registered source for the asset, call the fallbackOracle - if (address(source) == address(0)) { + + if (asset == WETH) { + return 1 ether; + } else if (address(source) == address(0)) { return _fallbackOracle.getAssetPrice(asset); } else { int256 price = IChainlinkAggregator(source).latestAnswer(); diff --git a/contracts/misc/UiPoolDataProvider.sol b/contracts/misc/UiPoolDataProvider.sol new file mode 100644 index 00000000..ff731fff --- /dev/null +++ b/contracts/misc/UiPoolDataProvider.sol @@ -0,0 +1,163 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity ^0.6.8; +pragma experimental ABIEncoderV2; + +import {ILendingPoolAddressesProvider} from '../interfaces/ILendingPoolAddressesProvider.sol'; +import {IUiPoolDataProvider} from './interfaces/IUiPoolDataProvider.sol'; +import {ILendingPool} from '../interfaces/ILendingPool.sol'; +import {IERC20Detailed} from '../dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {IPriceOracleGetter} from '../interfaces/IPriceOracleGetter.sol'; +import {IAToken} from '../tokenization/interfaces/IAToken.sol'; +import {IVariableDebtToken} from '../tokenization/interfaces/IVariableDebtToken.sol'; +import {IStableDebtToken} from '../tokenization/interfaces/IStableDebtToken.sol'; + +import {WadRayMath} from '../libraries/math/WadRayMath.sol'; +import {ReserveLogic} from '../libraries/logic/ReserveLogic.sol'; +import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../libraries/configuration/UserConfiguration.sol'; +import { + DefaultReserveInterestRateStrategy +} from '../lendingpool/DefaultReserveInterestRateStrategy.sol'; + +contract UiPoolDataProvider is IUiPoolDataProvider { + using WadRayMath for uint256; + using ReserveConfiguration for ReserveConfiguration.Map; + using UserConfiguration for UserConfiguration.Map; + + address public constant MOCK_USD_ADDRESS = 0x10F7Fc1F91Ba351f9C629c5947AD69bD03C05b96; + + function getInterestRateStrategySlopes(DefaultReserveInterestRateStrategy interestRateStrategy) + internal + view + returns ( + uint256, + uint256, + uint256, + uint256 + ) + { + return ( + interestRateStrategy.variableRateSlope1(), + interestRateStrategy.variableRateSlope2(), + interestRateStrategy.stableRateSlope1(), + interestRateStrategy.stableRateSlope2() + ); + } + + function getReservesData(ILendingPoolAddressesProvider provider, address user) + external + override + view + returns ( + AggregatedReserveData[] memory, + UserReserveData[] memory, + uint256 + ) + { + ILendingPool lendingPool = ILendingPool(provider.getLendingPool()); + IPriceOracleGetter oracle = IPriceOracleGetter(provider.getPriceOracle()); + address[] memory reserves = lendingPool.getReservesList(); + UserConfiguration.Map memory userConfig = lendingPool.getUserConfiguration(user); + + AggregatedReserveData[] memory reservesData = new AggregatedReserveData[](reserves.length); + UserReserveData[] memory userReservesData = new UserReserveData[]( + user != address(0) ? reserves.length : 0 + ); + + for (uint256 i = 0; i < reserves.length; i++) { + AggregatedReserveData memory reserveData = reservesData[i]; + reserveData.underlyingAsset = reserves[i]; + + // reserve current state + ReserveLogic.ReserveData memory baseData = lendingPool.getReserveData( + reserveData.underlyingAsset + ); + reserveData.liquidityIndex = baseData.liquidityIndex; + reserveData.variableBorrowIndex = baseData.variableBorrowIndex; + reserveData.liquidityRate = baseData.currentLiquidityRate; + reserveData.variableBorrowRate = baseData.currentVariableBorrowRate; + reserveData.stableBorrowRate = baseData.currentStableBorrowRate; + reserveData.lastUpdateTimestamp = baseData.lastUpdateTimestamp; + reserveData.aTokenAddress = baseData.aTokenAddress; + reserveData.stableDebtTokenAddress = baseData.stableDebtTokenAddress; + reserveData.variableDebtTokenAddress = baseData.variableDebtTokenAddress; + reserveData.interestRateStrategyAddress = baseData.interestRateStrategyAddress; + reserveData.priceInEth = oracle.getAssetPrice(reserveData.underlyingAsset); + + reserveData.availableLiquidity = IERC20Detailed(reserveData.underlyingAsset).balanceOf( + reserveData.aTokenAddress + ); + ( + reserveData.totalPrincipalStableDebt, + , + reserveData.averageStableRate, + reserveData.stableDebtLastUpdateTimestamp + ) = IStableDebtToken(reserveData.stableDebtTokenAddress).getSupplyData(); + reserveData.totalScaledVariableDebt = IVariableDebtToken(reserveData.variableDebtTokenAddress) + .scaledTotalSupply(); + + // reserve configuration + + // we're getting this info from the aToken, because some of assets can be not compliant with ETC20Detailed + reserveData.symbol = IERC20Detailed(reserveData.aTokenAddress).symbol(); + reserveData.name = ''; + + ( + reserveData.baseLTVasCollateral, + reserveData.reserveLiquidationThreshold, + reserveData.reserveLiquidationBonus, + reserveData.decimals, + reserveData.reserveFactor + ) = baseData.configuration.getParamsMemory(); + ( + reserveData.isActive, + reserveData.isFrozen, + reserveData.borrowingEnabled, + reserveData.stableBorrowRateEnabled + ) = baseData.configuration.getFlagsMemory(); + reserveData.usageAsCollateralEnabled = reserveData.baseLTVasCollateral != 0; + ( + reserveData.variableRateSlope1, + reserveData.variableRateSlope2, + reserveData.stableRateSlope1, + reserveData.stableRateSlope2 + ) = getInterestRateStrategySlopes( + DefaultReserveInterestRateStrategy(reserveData.interestRateStrategyAddress) + ); + + if (user != address(0)) { + // user reserve data + userReservesData[i].underlyingAsset = reserveData.underlyingAsset; + userReservesData[i].scaledATokenBalance = IAToken(reserveData.aTokenAddress) + .scaledBalanceOf(user); + userReservesData[i].usageAsCollateralEnabledOnUser = userConfig.isUsingAsCollateral(i); + + if (userConfig.isBorrowing(i)) { + userReservesData[i].scaledVariableDebt = IVariableDebtToken( + reserveData + .variableDebtTokenAddress + ) + .scaledBalanceOf(user); + userReservesData[i].principalStableDebt = IStableDebtToken( + reserveData + .stableDebtTokenAddress + ) + .principalBalanceOf(user); + if (userReservesData[i].principalStableDebt != 0) { + userReservesData[i].stableBorrowRate = IStableDebtToken( + reserveData + .stableDebtTokenAddress + ) + .getUserStableRate(user); + userReservesData[i].stableBorrowLastUpdateTimestamp = IStableDebtToken( + reserveData + .stableDebtTokenAddress + ) + .getUserLastUpdated(user); + } + } + } + } + return (reservesData, userReservesData, oracle.getAssetPrice(MOCK_USD_ADDRESS)); + } +} diff --git a/contracts/misc/WETHGateway.sol b/contracts/misc/WETHGateway.sol new file mode 100644 index 00000000..a976bb0e --- /dev/null +++ b/contracts/misc/WETHGateway.sol @@ -0,0 +1,184 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity ^0.6.8; +pragma experimental ABIEncoderV2; + +import {IWETH} from './interfaces/IWETH.sol'; +import {IWETHGateway} from './interfaces/IWETHGateway.sol'; +import {ILendingPool} from '../interfaces/ILendingPool.sol'; +import {IAToken} from '../tokenization/interfaces/IAToken.sol'; +import {ReserveLogic} from '../libraries/logic/ReserveLogic.sol'; +import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; +import {UserConfiguration} from '../libraries/configuration/UserConfiguration.sol'; +import {Helpers} from '../libraries/helpers/Helpers.sol'; +import {Ownable} from '../dependencies/openzeppelin/contracts/Ownable.sol'; +import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; + +contract WETHGateway is IWETHGateway, Ownable { + using ReserveConfiguration for ReserveConfiguration.Map; + using UserConfiguration for UserConfiguration.Map; + + IWETH internal immutable WETH; + ILendingPool internal immutable POOL; + IAToken internal immutable aWETH; + + /** + * @dev Sets the WETH address and the LendingPoolAddressesProvider address. Infinite approves lending pool. + * @param weth Address of the Wrapped Ether contract + * @param pool Address of the LendingPool contract + **/ + constructor(address weth, address pool) public { + ILendingPool poolInstance = ILendingPool(pool); + WETH = IWETH(weth); + POOL = poolInstance; + aWETH = IAToken(poolInstance.getReserveData(weth).aTokenAddress); + IWETH(weth).approve(pool, uint256(-1)); + } + + /** + * @dev deposits WETH into the reserve, using native ETH. A corresponding amount of the overlying asset (aTokens) + * is minted. + * @param onBehalfOf address of the user who will receive the aTokens representing the deposit + * @param referralCode integrators are assigned a referral code and can potentially receive rewards. + **/ + function depositETH(address onBehalfOf, uint16 referralCode) external override payable { + WETH.deposit{value: msg.value}(); + POOL.deposit(address(WETH), msg.value, onBehalfOf, referralCode); + } + + /** + * @dev withdraws the WETH _reserves of msg.sender. + * @param amount amount of aWETH to withdraw and receive native ETH + * @param to address of the user who will receive native ETH + */ + function withdrawETH(uint256 amount, address to) external override { + uint256 userBalance = aWETH.balanceOf(msg.sender); + uint256 amountToWithdraw = amount; + + // if amount is equal to uint(-1), the user wants to redeem everything + if (amount == type(uint256).max) { + amountToWithdraw = userBalance; + } + aWETH.transferFrom(msg.sender, address(this), amountToWithdraw); + POOL.withdraw(address(WETH), amountToWithdraw, address(this)); + WETH.withdraw(amountToWithdraw); + _safeTransferETH(to, amountToWithdraw); + } + + /** + * @dev repays a borrow on the WETH reserve, for the specified amount (or for the whole amount, if uint256(-1) is specified). + * @param amount the amount to repay, or uint256(-1) if the user wants to repay everything + * @param rateMode the rate mode to repay + * @param onBehalfOf the address for which msg.sender is repaying + */ + function repayETH( + uint256 amount, + uint256 rateMode, + address onBehalfOf + ) external override payable { + (uint256 stableDebt, uint256 variableDebt) = Helpers.getUserCurrentDebtMemory( + onBehalfOf, + POOL.getReserveData(address(WETH)) + ); + + uint256 paybackAmount = ReserveLogic.InterestRateMode(rateMode) == + ReserveLogic.InterestRateMode.STABLE + ? stableDebt + : variableDebt; + + if (amount < paybackAmount) { + paybackAmount = amount; + } + require(msg.value >= paybackAmount, 'msg.value is less than repayment amount'); + WETH.deposit{value: paybackAmount}(); + POOL.repay(address(WETH), msg.value, rateMode, onBehalfOf); + + // refund remaining dust eth + if (msg.value > paybackAmount) _safeTransferETH(msg.sender, msg.value - paybackAmount); + } + + /** + * @dev borrow WETH, unwraps to ETH and send both the ETH and DebtTokens to msg.sender, via `approveDelegation` and onBehalf argument in `LendingPool.borrow`. + * @param amount the amount of ETH to borrow + * @param interesRateMode the interest rate mode + * @param referralCode integrators are assigned a referral code and can potentially receive rewards + */ + function borrowETH( + uint256 amount, + uint256 interesRateMode, + uint16 referralCode + ) external override { + POOL.borrow(address(WETH), amount, interesRateMode, referralCode, msg.sender); + WETH.withdraw(amount); + _safeTransferETH(msg.sender, amount); + } + + /** + * @dev transfer ETH to an address, revert if it fails. + * @param to recipient of the transfer + * @param value the amount to send + */ + function _safeTransferETH(address to, uint256 value) internal { + (bool success, ) = to.call{value: value}(new bytes(0)); + require(success, 'ETH_TRANSFER_FAILED'); + } + + /** + * @dev transfer ERC20 from the utility contract, for ERC20 recovery in case of stuck tokens due + * direct transfers to the contract address. + * @param token token to transfer + * @param to recipient of the transfer + * @param amount amount to send + */ + function emergencyTokenTransfer( + address token, + address to, + uint256 amount + ) external onlyOwner { + IERC20(token).transfer(to, amount); + } + + /** + * @dev transfer native Ether from the utility contract, for native Ether recovery in case of stuck Ether + * due selfdestructs or transfer ether to pre-computated contract address before deployment. + * @param to recipient of the transfer + * @param amount amount to send + */ + function emergencyEtherTransfer(address to, uint256 amount) external onlyOwner { + _safeTransferETH(to, amount); + } + + /** + * @dev Get WETH address used by WETHGateway + */ + function getWETHAddress() external view returns (address) { + return address(WETH); + } + + /** + * @dev Get aWETH address used by WETHGateway + */ + function getAWETHAddress() external view returns (address) { + return address(aWETH); + } + + /** + * @dev Get LendingPool address used by WETHGateway + */ + function getLendingPoolAddress() external view returns (address) { + return address(POOL); + } + + /** + * @dev Only WETH contract is allowed to transfer ETH here. Prevent other addresses to send Ether to this contract. + */ + receive() external payable { + require(msg.sender == address(WETH), 'Receive not allowed'); + } + + /** + * @dev Revert fallback calls + */ + fallback() external payable { + revert('Fallback not allowed'); + } +} diff --git a/contracts/misc/WalletBalanceProvider.sol b/contracts/misc/WalletBalanceProvider.sol index 6bbb2970..c3f5dd7f 100644 --- a/contracts/misc/WalletBalanceProvider.sol +++ b/contracts/misc/WalletBalanceProvider.sol @@ -6,7 +6,7 @@ pragma experimental ABIEncoderV2; import {Address} from '../dependencies/openzeppelin/contracts/Address.sol'; import {IERC20} from '../dependencies/openzeppelin/contracts/IERC20.sol'; -import {LendingPoolAddressesProvider} from '../configuration/LendingPoolAddressesProvider.sol'; +import {ILendingPoolAddressesProvider} from '../interfaces/ILendingPoolAddressesProvider.sol'; import {ILendingPool} from '../interfaces/ILendingPool.sol'; import {SafeERC20} from '../dependencies/openzeppelin/contracts/SafeERC20.sol'; import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol'; @@ -24,9 +24,10 @@ contract WalletBalanceProvider { using SafeERC20 for IERC20; using ReserveConfiguration for ReserveConfiguration.Map; - LendingPoolAddressesProvider internal immutable _provider; + ILendingPoolAddressesProvider internal immutable _provider; + address constant MOCK_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; - constructor(LendingPoolAddressesProvider provider) public { + constructor(ILendingPoolAddressesProvider provider) public { _provider = provider; } @@ -45,12 +46,13 @@ contract WalletBalanceProvider { - return 0 on non-contract address **/ function balanceOf(address user, address token) public view returns (uint256) { - // check if token is actually a contract - if (token.isContract()) { + if (token == MOCK_ETH_ADDRESS) { + return user.balance; // ETH balance + // check if token is actually a contract + } else if (token.isContract()) { return IERC20(token).balanceOf(user); - } else { - return 0; } + revert('INVALID_TOKEN'); } /** @@ -68,12 +70,7 @@ contract WalletBalanceProvider { for (uint256 i = 0; i < users.length; i++) { for (uint256 j = 0; j < tokens.length; j++) { - uint256 _offset = i * tokens.length; - if (!tokens[j].isContract()) { - revert('INVALID_TOKEN'); - } else { - balances[_offset + j] = balanceOf(users[i], tokens[j]); - } + balances[i * tokens.length + j] = balanceOf(users[i], tokens[j]); } } @@ -91,11 +88,16 @@ contract WalletBalanceProvider { ILendingPool pool = ILendingPool(_provider.getLendingPool()); address[] memory reserves = pool.getReservesList(); + address[] memory reservesWithEth = new address[](reserves.length + 1); + for (uint256 i = 0; i < reserves.length; i++) { + reservesWithEth[i] = reserves[i]; + } + reservesWithEth[reserves.length] = MOCK_ETH_ADDRESS; - uint256[] memory balances = new uint256[](reserves.length); + uint256[] memory balances = new uint256[](reservesWithEth.length); for (uint256 j = 0; j < reserves.length; j++) { - ReserveConfiguration.Map memory configuration = pool.getConfiguration(reserves[j]); + ReserveConfiguration.Map memory configuration = pool.getConfiguration(reservesWithEth[j]); (bool isActive, , , ) = configuration.getFlagsMemory(); @@ -103,9 +105,10 @@ contract WalletBalanceProvider { balances[j] = 0; continue; } - balances[j] = balanceOf(user, reserves[j]); + balances[j] = balanceOf(user, reservesWithEth[j]); } + balances[reserves.length] = balanceOf(user, MOCK_ETH_ADDRESS); - return (reserves, balances); + return (reservesWithEth, balances); } } diff --git a/contracts/misc/IERC20DetailedBytes.sol b/contracts/misc/interfaces/IERC20DetailedBytes.sol similarity index 100% rename from contracts/misc/IERC20DetailedBytes.sol rename to contracts/misc/interfaces/IERC20DetailedBytes.sol diff --git a/contracts/misc/interfaces/IUiPoolDataProvider.sol b/contracts/misc/interfaces/IUiPoolDataProvider.sol new file mode 100644 index 00000000..d1ca0269 --- /dev/null +++ b/contracts/misc/interfaces/IUiPoolDataProvider.sol @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity ^0.6.8; +pragma experimental ABIEncoderV2; + +import {ILendingPoolAddressesProvider} from '../../interfaces/ILendingPoolAddressesProvider.sol'; +import {ReserveLogic} from '../../libraries/logic/ReserveLogic.sol'; + +interface IUiPoolDataProvider { + struct AggregatedReserveData { + address underlyingAsset; + string name; + string symbol; + uint256 decimals; + uint256 baseLTVasCollateral; + uint256 reserveLiquidationThreshold; + uint256 reserveLiquidationBonus; + uint256 reserveFactor; + bool usageAsCollateralEnabled; + bool borrowingEnabled; + bool stableBorrowRateEnabled; + bool isActive; + bool isFrozen; + // base data + uint128 liquidityIndex; + uint128 variableBorrowIndex; + uint128 liquidityRate; + uint128 variableBorrowRate; + uint128 stableBorrowRate; + uint40 lastUpdateTimestamp; + address aTokenAddress; + address stableDebtTokenAddress; + address variableDebtTokenAddress; + address interestRateStrategyAddress; + // + uint256 availableLiquidity; + uint256 totalPrincipalStableDebt; + uint256 averageStableRate; + uint256 stableDebtLastUpdateTimestamp; + uint256 totalScaledVariableDebt; + uint256 priceInEth; + uint256 variableRateSlope1; + uint256 variableRateSlope2; + uint256 stableRateSlope1; + uint256 stableRateSlope2; + } + // + // struct ReserveData { + // uint256 averageStableBorrowRate; + // uint256 totalLiquidity; + // } + + struct UserReserveData { + address underlyingAsset; + uint256 scaledATokenBalance; + bool usageAsCollateralEnabledOnUser; + uint256 stableBorrowRate; + uint256 scaledVariableDebt; + uint256 principalStableDebt; + uint256 stableBorrowLastUpdateTimestamp; + } + + // + // struct ATokenSupplyData { + // string name; + // string symbol; + // uint8 decimals; + // uint256 totalSupply; + // address aTokenAddress; + // } + + function getReservesData(ILendingPoolAddressesProvider provider, address user) + external + view + returns ( + AggregatedReserveData[] memory, + UserReserveData[] memory, + uint256 + ); + + // function getUserReservesData(ILendingPoolAddressesProvider provider, address user) + // external + // view + // returns (UserReserveData[] memory); + // + // function getAllATokenSupply(ILendingPoolAddressesProvider provider) + // external + // view + // returns (ATokenSupplyData[] memory); + // + // function getATokenSupply(address[] calldata aTokens) + // external + // view + // returns (ATokenSupplyData[] memory); +} diff --git a/contracts/misc/interfaces/IWETH.sol b/contracts/misc/interfaces/IWETH.sol new file mode 100644 index 00000000..cb661927 --- /dev/null +++ b/contracts/misc/interfaces/IWETH.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity ^0.6.8; + +interface IWETH { + function deposit() external payable; + + function withdraw(uint256) external; + + function approve(address guy, uint256 wad) external returns (bool); + + function transferFrom( + address src, + address dst, + uint256 wad + ) external returns (bool); +} diff --git a/contracts/misc/interfaces/IWETHGateway.sol b/contracts/misc/interfaces/IWETHGateway.sol new file mode 100644 index 00000000..fae7a1e8 --- /dev/null +++ b/contracts/misc/interfaces/IWETHGateway.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity ^0.6.8; + +interface IWETHGateway { + function depositETH(address onBehalfOf, uint16 referralCode) external payable; + + function withdrawETH(uint256 amount, address onBehalfOf) external; + + function repayETH( + uint256 amount, + uint256 rateMode, + address onBehalfOf + ) external payable; + + function borrowETH( + uint256 amount, + uint256 interesRateMode, + uint16 referralCode + ) external; +} diff --git a/contracts/mocks/attacks/SefldestructTransfer.sol b/contracts/mocks/attacks/SefldestructTransfer.sol new file mode 100644 index 00000000..5c8750c1 --- /dev/null +++ b/contracts/mocks/attacks/SefldestructTransfer.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity ^0.6.8; + +contract SelfdestructTransfer { + function destroyAndTransfer(address payable to) external payable { + selfdestruct(to); + } +} diff --git a/contracts/mocks/dependencies/weth/WETH9.sol b/contracts/mocks/dependencies/weth/WETH9.sol new file mode 100644 index 00000000..1907b736 --- /dev/null +++ b/contracts/mocks/dependencies/weth/WETH9.sol @@ -0,0 +1,758 @@ +// Copyright (C) 2015, 2016, 2017 Dapphub + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +pragma solidity >=0.4.22 <=0.6.8; + +contract WETH9 { + string public name = 'Wrapped Ether'; + string public symbol = 'WETH'; + uint8 public decimals = 18; + + event Approval(address indexed src, address indexed guy, uint256 wad); + event Transfer(address indexed src, address indexed dst, uint256 wad); + event Deposit(address indexed dst, uint256 wad); + event Withdrawal(address indexed src, uint256 wad); + + mapping(address => uint256) public balanceOf; + mapping(address => mapping(address => uint256)) public allowance; + + receive() external payable { + deposit(); + } + + function deposit() public payable { + balanceOf[msg.sender] += msg.value; + emit Deposit(msg.sender, msg.value); + } + + function withdraw(uint256 wad) public { + require(balanceOf[msg.sender] >= wad); + balanceOf[msg.sender] -= wad; + msg.sender.transfer(wad); + emit Withdrawal(msg.sender, wad); + } + + function totalSupply() public view returns (uint256) { + return address(this).balance; + } + + function approve(address guy, uint256 wad) public returns (bool) { + allowance[msg.sender][guy] = wad; + emit Approval(msg.sender, guy, wad); + return true; + } + + function transfer(address dst, uint256 wad) public returns (bool) { + return transferFrom(msg.sender, dst, wad); + } + + function transferFrom( + address src, + address dst, + uint256 wad + ) public returns (bool) { + require(balanceOf[src] >= wad); + + if (src != msg.sender && allowance[src][msg.sender] != uint256(-1)) { + require(allowance[src][msg.sender] >= wad); + allowance[src][msg.sender] -= wad; + } + + balanceOf[src] -= wad; + balanceOf[dst] += wad; + + emit Transfer(src, dst, wad); + + return true; + } +} + +/* + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + +*/ diff --git a/contracts/mocks/flashloan/MockFlashLoanReceiver.sol b/contracts/mocks/flashloan/MockFlashLoanReceiver.sol index 215746ae..cfd16c28 100644 --- a/contracts/mocks/flashloan/MockFlashLoanReceiver.sol +++ b/contracts/mocks/flashloan/MockFlashLoanReceiver.sol @@ -72,7 +72,6 @@ contract MockFlashLoanReceiver is FlashLoanReceiverBase { ? _amountToApprove : amounts[i].add(premiums[i]); //execution does not fail - mint tokens and return them to the _destination - //note: if the reserve is eth, the mock contract must receive at least _fee ETH before calling executeOperation token.mint(premiums[i]); diff --git a/contracts/mocks/tokens/MintableDelegationERC20.sol b/contracts/mocks/tokens/MintableDelegationERC20.sol new file mode 100644 index 00000000..1b3088d5 --- /dev/null +++ b/contracts/mocks/tokens/MintableDelegationERC20.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity ^0.6.8; + +import {ERC20} from '../../dependencies/openzeppelin/contracts/ERC20.sol'; + +/** + * @title ERC20Mintable + * @dev ERC20 minting logic + */ +contract MintableDelegationERC20 is ERC20 { + address public delegatee; + + constructor( + string memory name, + string memory symbol, + uint8 decimals + ) public ERC20(name, symbol) { + _setupDecimals(decimals); + } + + /** + * @dev Function to mint tokensp + * @param value The amount of tokens to mint. + * @return A boolean that indicates if the operation was successful. + */ + function mint(uint256 value) public returns (bool) { + _mint(msg.sender, value); + return true; + } + + function delegate(address delegateeAddress) external { + delegatee = delegateeAddress; + } +} diff --git a/contracts/mocks/tokens/WETH9Mocked.sol b/contracts/mocks/tokens/WETH9Mocked.sol new file mode 100644 index 00000000..edcb1ca5 --- /dev/null +++ b/contracts/mocks/tokens/WETH9Mocked.sol @@ -0,0 +1,11 @@ +pragma solidity >=0.4.22 <=0.6.8; + +import {WETH9} from '../dependencies/weth/WETH9.sol'; + +contract WETH9Mocked is WETH9 { + // Mint not backed by Ether: only for testing purposes + function mint(uint256 value) public returns (bool) { + balanceOf[msg.sender] += value; + emit Transfer(address(0), msg.sender, value); + } +} diff --git a/contracts/tokenization/AToken.sol b/contracts/tokenization/AToken.sol index 0454f908..2f2be6cb 100644 --- a/contracts/tokenization/AToken.sol +++ b/contracts/tokenization/AToken.sol @@ -13,7 +13,7 @@ import {SafeERC20} from '../dependencies/openzeppelin/contracts/SafeERC20.sol'; /** * @title Aave ERC20 AToken * - * @dev Implementation of the interest bearing token for the DLP protocol. + * @dev Implementation of the interest bearing token for the Aave protocol. * @author Aave */ contract AToken is VersionedInitializable, IncentivizedERC20, IAToken { @@ -108,7 +108,7 @@ contract AToken is VersionedInitializable, IncentivizedERC20, IAToken { //transfer event to track balances emit Transfer(user, address(0), amount); - emit Burn(_msgSender(), receiverOfUnderlying, amount, index); + emit Burn(user, receiverOfUnderlying, amount, index); } /** @@ -175,6 +175,8 @@ contract AToken is VersionedInitializable, IncentivizedERC20, IAToken { //being a normal transfer, the Transfer() and BalanceTransfer() are emitted //so no need to emit a specific event here _transfer(from, to, value, false); + + emit Transfer(from, to, value); } /** diff --git a/contracts/tokenization/DelegationAwareAToken.sol b/contracts/tokenization/DelegationAwareAToken.sol new file mode 100644 index 00000000..794fd4f5 --- /dev/null +++ b/contracts/tokenization/DelegationAwareAToken.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity ^0.6.8; + +import {AToken} from './AToken.sol'; +import {ILendingPool} from '../interfaces/ILendingPool.sol'; +import {Errors} from '../libraries/helpers/Errors.sol'; + +/** + * @title IDelegationToken + * @dev implements an interface for tokens that have a delegation function + **/ +interface IDelegationToken { + function delegate(address delegatee) external; +} + +/** + * @title Aave AToken with delegation capabilities + * + * @dev Implementation of the interest bearing token for the Aave protocol. This version of the aToken + * adds a function which gives the Aave protocol the ability to delegate voting power of the underlying asset. + * The underlying asset needs to be compatible with the COMP delegation interface + * @author Aave + */ +contract DelegationAwareAToken is AToken { + /** + * @dev only the aave admin can call this function + **/ + modifier onlyPoolAdmin { + require( + _msgSender() == ILendingPool(POOL).getAddressesProvider().getPoolAdmin(), + Errors.CALLER_NOT_POOL_ADMIN + ); + _; + } + + constructor( + ILendingPool pool, + address underlyingAssetAddress, + address reserveTreasury, + string memory tokenName, + string memory tokenSymbol, + address incentivesController + ) + public + AToken( + pool, + underlyingAssetAddress, + reserveTreasury, + tokenName, + tokenSymbol, + incentivesController + ) + {} + + function initialize( + uint8 _underlyingAssetDecimals, + string calldata _tokenName, + string calldata _tokenSymbol + ) external virtual override initializer { + _setName(_tokenName); + _setSymbol(_tokenSymbol); + _setDecimals(_underlyingAssetDecimals); + } + + /** + * @dev delegates voting power of the underlying asset to a specific address + * @param delegatee the address that will receive the delegation + **/ + function delegateUnderlyingTo(address delegatee) external onlyPoolAdmin { + IDelegationToken(UNDERLYING_ASSET_ADDRESS).delegate(delegatee); + } +} diff --git a/contracts/tokenization/StableDebtToken.sol b/contracts/tokenization/StableDebtToken.sol index d7c76857..ca76237c 100644 --- a/contracts/tokenization/StableDebtToken.sol +++ b/contracts/tokenization/StableDebtToken.sol @@ -16,9 +16,10 @@ contract StableDebtToken is IStableDebtToken, DebtTokenBase { uint256 public constant DEBT_TOKEN_REVISION = 0x1; - uint256 private _avgStableRate; - mapping(address => uint40) _timestamps; - uint40 _totalSupplyTimestamp; + uint256 internal _avgStableRate; + mapping(address => uint40) internal _timestamps; + mapping(address => uint256) internal _usersStableRate; + uint40 internal _totalSupplyTimestamp; constructor( address pool, @@ -58,7 +59,7 @@ contract StableDebtToken is IStableDebtToken, DebtTokenBase { * @return the stable rate of user **/ function getUserStableRate(address user) external virtual override view returns (uint256) { - return _usersData[user]; + return _usersStableRate[user]; } /** @@ -67,7 +68,7 @@ contract StableDebtToken is IStableDebtToken, DebtTokenBase { **/ function balanceOf(address account) public virtual override view returns (uint256) { uint256 accountBalance = super.balanceOf(account); - uint256 stableRate = _usersData[account]; + uint256 stableRate = _usersStableRate[account]; if (accountBalance == 0) { return 0; } @@ -95,17 +96,18 @@ contract StableDebtToken is IStableDebtToken, DebtTokenBase { **/ function mint( address user, + address onBehalfOf, uint256 amount, uint256 rate ) external override onlyLendingPool returns (bool) { MintLocalVars memory vars; + if (user != onBehalfOf) { + _decreaseBorrowAllowance(onBehalfOf, user, amount); + } + //cumulates the user debt - ( - uint256 previousBalance, - uint256 currentBalance, - uint256 balanceIncrease - ) = _calculateBalanceIncrease(user); + (, uint256 currentBalance, uint256 balanceIncrease) = _calculateBalanceIncrease(onBehalfOf); //accrueing the interest accumulation to the stored total supply and caching it vars.previousSupply = totalSupply(); @@ -115,17 +117,17 @@ contract StableDebtToken is IStableDebtToken, DebtTokenBase { vars.amountInRay = amount.wadToRay(); //calculates the new stable rate for the user - vars.newStableRate = _usersData[user] + vars.newStableRate = _usersStableRate[onBehalfOf] .rayMul(currentBalance.wadToRay()) .add(vars.amountInRay.rayMul(rate)) .rayDiv(currentBalance.add(amount).wadToRay()); require(vars.newStableRate < (1 << 128), 'Debt token: stable rate overflow'); - _usersData[user] = vars.newStableRate; + _usersStableRate[onBehalfOf] = vars.newStableRate; //updating the user and supply timestamp //solium-disable-next-line - _totalSupplyTimestamp = _timestamps[user] = uint40(block.timestamp); + _totalSupplyTimestamp = _timestamps[onBehalfOf] = uint40(block.timestamp); //calculates the updated average stable rate vars.currentAvgStableRate = _avgStableRate = vars @@ -134,19 +136,20 @@ contract StableDebtToken is IStableDebtToken, DebtTokenBase { .add(rate.rayMul(vars.amountInRay)) .rayDiv(vars.nextSupply.wadToRay()); - _mint(user, amount.add(balanceIncrease), vars.previousSupply); + _mint(onBehalfOf, amount.add(balanceIncrease), vars.previousSupply); // transfer event to track balances - emit Transfer(address(0), user, amount); + emit Transfer(address(0), onBehalfOf, amount); emit Mint( user, + onBehalfOf, amount, - previousBalance, currentBalance, balanceIncrease, vars.newStableRate, - vars.currentAvgStableRate + vars.currentAvgStableRate, + vars.nextSupply ); return currentBalance == 0; @@ -158,32 +161,37 @@ contract StableDebtToken is IStableDebtToken, DebtTokenBase { * @param amount the amount of debt tokens to mint **/ function burn(address user, uint256 amount) external override onlyLendingPool { - ( - uint256 previousBalance, - uint256 currentBalance, - uint256 balanceIncrease - ) = _calculateBalanceIncrease(user); + (, uint256 currentBalance, uint256 balanceIncrease) = _calculateBalanceIncrease(user); uint256 previousSupply = totalSupply(); uint256 newStableRate = 0; + uint256 nextSupply = 0; + uint256 userStableRate = _usersStableRate[user]; //since the total supply and each single user debt accrue separately, //there might be accumulation errors so that the last borrower repaying //might actually try to repay more than the available debt supply. //in this case we simply set the total supply and the avg stable rate to 0 if (previousSupply <= amount) { - newStableRate = _avgStableRate = 0; + _avgStableRate = 0; _totalSupply = 0; } else { - uint256 nextSupply = _totalSupply = previousSupply.sub(amount); - newStableRate = _avgStableRate = _avgStableRate - .rayMul(previousSupply.wadToRay()) - .sub(_usersData[user].rayMul(amount.wadToRay())) - .rayDiv(nextSupply.wadToRay()); + nextSupply = _totalSupply = previousSupply.sub(amount); + uint256 firstTerm = _avgStableRate.rayMul(previousSupply.wadToRay()); + uint256 secondTerm = userStableRate.rayMul(amount.wadToRay()); + + //for the same reason described above, when the last user is repaying it might + //happen that user rate * user balance > avg rate * total supply. In that case, + //we simply set the avg rate to 0 + if (secondTerm >= firstTerm) { + newStableRate = _avgStableRate = _totalSupply = 0; + } else { + newStableRate = _avgStableRate = firstTerm.sub(secondTerm).rayDiv(nextSupply.wadToRay()); + } } if (amount == currentBalance) { - _usersData[user] = 0; + _usersStableRate[user] = 0; _timestamps[user] = 0; } else { //solium-disable-next-line @@ -201,7 +209,7 @@ contract StableDebtToken is IStableDebtToken, DebtTokenBase { // transfer event to track balances emit Transfer(user, address(0), amount); - emit Burn(user, amount, previousBalance, currentBalance, balanceIncrease, newStableRate); + emit Burn(user, amount, currentBalance, balanceIncrease, newStableRate, nextSupply); } /** diff --git a/contracts/tokenization/VariableDebtToken.sol b/contracts/tokenization/VariableDebtToken.sol index 6f16082b..ef429b53 100644 --- a/contracts/tokenization/VariableDebtToken.sol +++ b/contracts/tokenization/VariableDebtToken.sol @@ -55,17 +55,22 @@ contract VariableDebtToken is DebtTokenBase, IVariableDebtToken { **/ function mint( address user, + address onBehalfOf, uint256 amount, uint256 index ) external override onlyLendingPool returns (bool) { - uint256 previousBalance = super.balanceOf(user); + if (user != onBehalfOf) { + _decreaseBorrowAllowance(onBehalfOf, user, amount); + } + + uint256 previousBalance = super.balanceOf(onBehalfOf); uint256 amountScaled = amount.rayDiv(index); require(amountScaled != 0, Errors.AT_INVALID_MINT_AMOUNT); - _mint(user, amountScaled); + _mint(onBehalfOf, amountScaled); - emit Transfer(address(0), user, amount); - emit Mint(user, amount, index); + emit Transfer(address(0), onBehalfOf, amount); + emit Mint(user, onBehalfOf, amount, index); return previousBalance == 0; } diff --git a/contracts/tokenization/base/DebtTokenBase.sol b/contracts/tokenization/base/DebtTokenBase.sol index 723bb5d2..b1b9963c 100644 --- a/contracts/tokenization/base/DebtTokenBase.sol +++ b/contracts/tokenization/base/DebtTokenBase.sol @@ -15,9 +15,17 @@ import {Errors} from '../../libraries/helpers/Errors.sol'; */ abstract contract DebtTokenBase is IncentivizedERC20, VersionedInitializable { + event BorrowAllowanceDelegated( + address indexed fromUser, + address indexed toUser, + address asset, + uint256 amount + ); + address public immutable UNDERLYING_ASSET_ADDRESS; ILendingPool public immutable POOL; - mapping(address => uint256) internal _usersData; + + mapping(address => mapping(address => uint256)) internal _borrowAllowances; /** * @dev Only lending pool can call functions marked by this modifier @@ -58,6 +66,28 @@ abstract contract DebtTokenBase is IncentivizedERC20, VersionedInitializable { _setDecimals(decimals); } + /** + * @dev delegates borrowing power to a user on the specific debt token + * @param delegatee the address receiving the delegated borrowing power + * @param amount the maximum amount being delegated. Delegation will still + * respect the liquidation constraints (even if delegated, a delegatee cannot + * force a delegator HF to go below 1) + **/ + function approveDelegation(address delegatee, uint256 amount) external { + _borrowAllowances[_msgSender()][delegatee] = amount; + emit BorrowAllowanceDelegated(_msgSender(), delegatee, UNDERLYING_ASSET_ADDRESS, amount); + } + + /** + * @dev returns the borrow allowance of the user + * @param fromUser The user to giving allowance + * @param toUser The user to give allowance to + * @return the current allowance of toUser + **/ + function borrowAllowance(address fromUser, address toUser) external view returns (uint256) { + return _borrowAllowances[fromUser][toUser]; + } + /** * @dev Being non transferrable, the debt token does not implement any of the * standard ERC20 functions for transfer and allowance. @@ -118,4 +148,19 @@ abstract contract DebtTokenBase is IncentivizedERC20, VersionedInitializable { subtractedValue; revert('ALLOWANCE_NOT_SUPPORTED'); } + + function _decreaseBorrowAllowance( + address delegator, + address delegatee, + uint256 amount + ) internal { + uint256 newAllowance = _borrowAllowances[delegator][delegatee].sub( + amount, + Errors.BORROW_ALLOWANCE_NOT_ENOUGH + ); + + _borrowAllowances[delegator][delegatee] = newAllowance; + + emit BorrowAllowanceDelegated(delegator, delegatee, UNDERLYING_ASSET_ADDRESS, newAllowance); + } } diff --git a/contracts/tokenization/interfaces/IAToken.sol b/contracts/tokenization/interfaces/IAToken.sol index 055e3f5d..13cf6cb7 100644 --- a/contracts/tokenization/interfaces/IAToken.sol +++ b/contracts/tokenization/interfaces/IAToken.sol @@ -5,6 +5,27 @@ import {IERC20} from '../../dependencies/openzeppelin/contracts/IERC20.sol'; import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; interface IAToken is IERC20, IScaledBalanceToken { + /** + * @dev emitted after the mint action + * @param from the address performing the mint + * @param value the amount to be minted + * @param index the last index of the reserve + **/ + event Mint(address indexed from, uint256 value, uint256 index); + + /** + * @dev mints aTokens to user + * only lending pools can call this function + * @param user the address receiving the minted tokens + * @param amount the amount of tokens to mint + * @param index the liquidity index + */ + function mint( + address user, + uint256 amount, + uint256 index + ) external returns (bool); + /** * @dev emitted after aTokens are burned * @param from the address performing the redeem diff --git a/contracts/tokenization/interfaces/IScaledBalanceToken.sol b/contracts/tokenization/interfaces/IScaledBalanceToken.sol index 604706c2..ee1a132c 100644 --- a/contracts/tokenization/interfaces/IScaledBalanceToken.sol +++ b/contracts/tokenization/interfaces/IScaledBalanceToken.sol @@ -2,27 +2,6 @@ pragma solidity ^0.6.8; interface IScaledBalanceToken { - /** - * @dev emitted after the mint action - * @param from the address performing the mint - * @param value the amount to be minted - * @param index the last index of the reserve - **/ - event Mint(address indexed from, uint256 value, uint256 index); - - /** - * @dev mints aTokens to user - * only lending pools can call this function - * @param user the address receiving the minted tokens - * @param amount the amount of tokens to mint - * @param index the liquidity index - */ - function mint( - address user, - uint256 amount, - uint256 index - ) external returns (bool); - /** * @dev returns the principal balance of the user. The principal balance is the last * updated stored balance, which does not consider the perpetually accruing interest. diff --git a/contracts/tokenization/interfaces/IStableDebtToken.sol b/contracts/tokenization/interfaces/IStableDebtToken.sol index 7a6e5f5b..af71aab2 100644 --- a/contracts/tokenization/interfaces/IStableDebtToken.sol +++ b/contracts/tokenization/interfaces/IStableDebtToken.sol @@ -15,40 +15,42 @@ pragma solidity ^0.6.8; interface IStableDebtToken { /** * @dev emitted when new stable debt is minted - * @param user the address of the user + * @param user the address of the user who triggered the minting + * @param onBehalfOf the address of the user * @param amount the amount minted - * @param previousBalance the previous balance of the user * @param currentBalance the current balance of the user - * @param balanceIncrease the debt increase since the last update + * @param balanceIncrease the the increase in balance since the last action of the user * @param newRate the rate of the debt after the minting * @param avgStableRate the new average stable rate after the minting + * @param newTotalSupply the new total supply of the stable debt token after the action **/ event Mint( address indexed user, + address indexed onBehalfOf, uint256 amount, - uint256 previousBalance, uint256 currentBalance, uint256 balanceIncrease, uint256 newRate, - uint256 avgStableRate + uint256 avgStableRate, + uint256 newTotalSupply ); /** * @dev emitted when new stable debt is burned * @param user the address of the user * @param amount the amount minted - * @param previousBalance the previous balance of the user * @param currentBalance the current balance of the user - * @param balanceIncrease the debt increase since the last update + * @param balanceIncrease the the increase in balance since the last action of the user * @param avgStableRate the new average stable rate after the minting + * @param newTotalSupply the new total supply of the stable debt token after the action **/ event Burn( address indexed user, uint256 amount, - uint256 previousBalance, uint256 currentBalance, uint256 balanceIncrease, - uint256 avgStableRate + uint256 avgStableRate, + uint256 newTotalSupply ); /** @@ -60,6 +62,7 @@ interface IStableDebtToken { **/ function mint( address user, + address onBehalfOf, uint256 amount, uint256 rate ) external returns (bool); diff --git a/contracts/tokenization/interfaces/IVariableDebtToken.sol b/contracts/tokenization/interfaces/IVariableDebtToken.sol index f1988be8..c01b50ce 100644 --- a/contracts/tokenization/interfaces/IVariableDebtToken.sol +++ b/contracts/tokenization/interfaces/IVariableDebtToken.sol @@ -9,6 +9,29 @@ import {IScaledBalanceToken} from './IScaledBalanceToken.sol'; * @notice defines the basic interface for a variable debt token. **/ interface IVariableDebtToken is IScaledBalanceToken { + /** + * @dev emitted after the mint action + * @param from the address performing the mint + * @param onBehalfOf the address of the user on which behalf minting has been performed + * @param value the amount to be minted + * @param index the last index of the reserve + **/ + event Mint(address indexed from, address indexed onBehalfOf, uint256 value, uint256 index); + + /** + * @dev mints aTokens to user + * only lending pools can call this function + * @param user the address receiving the minted tokens + * @param amount the amount of tokens to mint + * @param index the liquidity index + */ + function mint( + address user, + address onBehalfOf, + uint256 amount, + uint256 index + ) external returns (bool); + /** * @dev emitted when variable debt is burnt * @param user the user which debt has been burned diff --git a/coverage.json b/coverage.json index a5225afd..2b521a35 100644 --- a/coverage.json +++ b/coverage.json @@ -107,7 +107,7 @@ "loc": {"start": {"line": 82, "column": 2}, "end": {"line": 85, "column": 2}} }, "7": { - "name": "getAaveAdmin", + "name": "getPoolAdmin", "line": 92, "loc": {"start": {"line": 92, "column": 2}, "end": {"line": 94, "column": 2}} }, @@ -5449,7 +5449,7 @@ } } }, - "contracts/misc/AaveProtocolTestHelpers.sol": { + "contracts/misc/AaveProtocolDataProvider.sol": { "l": { "18": 3, "22": 1, @@ -5466,7 +5466,7 @@ "42": 34, "47": 2 }, - "path": "/src/contracts/misc/AaveProtocolTestHelpers.sol", + "path": "/src/contracts/misc/AaveProtocolDataProvider.sol", "s": { "1": 3, "2": 1, diff --git a/deployed-contracts.json b/deployed-contracts.json index a2173231..67361d8c 100644 --- a/deployed-contracts.json +++ b/deployed-contracts.json @@ -1,7 +1,11 @@ { "MintableERC20": { "buidlerevm": { - "address": "0x58F132FBB86E21545A4Bace3C19f1C05d86d7A22", + "address": "0x18b9306737eaf6E8FC8e737F488a1AE077b18053", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x18b9306737eaf6E8FC8e737F488a1AE077b18053", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, @@ -9,6 +13,10 @@ "buidlerevm": { "address": "0x7c2C195CD6D34B8F845992d380aADB2730bB9C6F", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x7c2C195CD6D34B8F845992d380aADB2730bB9C6F", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "LEND": { @@ -21,249 +29,1260 @@ "buidlerevm": { "address": "0x0078371BDeDE8aAc7DeBfFf451B74c5EDB385Af7", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x0078371BDeDE8aAc7DeBfFf451B74c5EDB385Af7", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "BAT": { "buidlerevm": { "address": "0xf4e77E5Da47AC3125140c470c71cBca77B5c638c", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0xf4e77E5Da47AC3125140c470c71cBca77B5c638c", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "WETH": { "buidlerevm": { "address": "0xf784709d2317D872237C4bC22f867d1BAe2913AB", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0xf784709d2317D872237C4bC22f867d1BAe2913AB", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "USDC": { "buidlerevm": { "address": "0x3619DbE27d7c1e7E91aA738697Ae7Bc5FC3eACA5", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x3619DbE27d7c1e7E91aA738697Ae7Bc5FC3eACA5", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "USDT": { "buidlerevm": { "address": "0x038B86d9d8FAFdd0a02ebd1A476432877b0107C8", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x038B86d9d8FAFdd0a02ebd1A476432877b0107C8", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "SUSD": { "buidlerevm": { "address": "0x1A1FEe7EeD918BD762173e4dc5EfDB8a78C924A8", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x1A1FEe7EeD918BD762173e4dc5EfDB8a78C924A8", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "ZRX": { "buidlerevm": { "address": "0x500D1d6A4c7D8Ae28240b47c8FCde034D827fD5e", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x500D1d6A4c7D8Ae28240b47c8FCde034D827fD5e", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "MKR": { "buidlerevm": { "address": "0xc4905364b78a742ccce7B890A89514061E47068D", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0xc4905364b78a742ccce7B890A89514061E47068D", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "WBTC": { "buidlerevm": { "address": "0xD6C850aeBFDC46D7F4c207e445cC0d6B0919BDBe", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0xD6C850aeBFDC46D7F4c207e445cC0d6B0919BDBe", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "LINK": { "buidlerevm": { "address": "0x8B5B7a6055E54a36fF574bbE40cf2eA68d5554b3", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x8B5B7a6055E54a36fF574bbE40cf2eA68d5554b3", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "KNC": { "buidlerevm": { "address": "0xEcc0a6dbC0bb4D51E4F84A315a9e5B0438cAD4f0", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0xEcc0a6dbC0bb4D51E4F84A315a9e5B0438cAD4f0", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "MANA": { "buidlerevm": { "address": "0x20Ce94F404343aD2752A2D01b43fa407db9E0D00", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x20Ce94F404343aD2752A2D01b43fa407db9E0D00", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "REP": { "buidlerevm": { "address": "0x1d80315fac6aBd3EfeEbE97dEc44461ba7556160", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x1d80315fac6aBd3EfeEbE97dEc44461ba7556160", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "SNX": { "buidlerevm": { - "address": "0x2D8553F9ddA85A9B3259F6Bf26911364B85556F5", + "address": "0x52d3b94181f8654db2530b0fEe1B19173f519C52", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x52d3b94181f8654db2530b0fEe1B19173f519C52", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "BUSD": { "buidlerevm": { - "address": "0x52d3b94181f8654db2530b0fEe1B19173f519C52", + "address": "0xd15468525c35BDBC1eD8F2e09A00F8a173437f2f", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0xd15468525c35BDBC1eD8F2e09A00F8a173437f2f", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "USD": { "buidlerevm": { - "address": "0xd15468525c35BDBC1eD8F2e09A00F8a173437f2f", + "address": "0x7e35Eaf7e8FBd7887ad538D4A38Df5BbD073814a", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x7e35Eaf7e8FBd7887ad538D4A38Df5BbD073814a", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "UNI_DAI_ETH": { "buidlerevm": { - "address": "0x7e35Eaf7e8FBd7887ad538D4A38Df5BbD073814a", + "address": "0xB00cC45B4a7d3e1FEE684cFc4417998A1c183e6d", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0xB00cC45B4a7d3e1FEE684cFc4417998A1c183e6d", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "UNI_USDC_ETH": { "buidlerevm": { - "address": "0x5bcb88A0d20426e451332eE6C4324b0e663c50E0", + "address": "0x58F132FBB86E21545A4Bace3C19f1C05d86d7A22", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x58F132FBB86E21545A4Bace3C19f1C05d86d7A22", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "UNI_SETH_ETH": { "buidlerevm": { - "address": "0x3521eF8AaB0323004A6dD8b03CE890F4Ea3A13f5", + "address": "0xa4bcDF64Cdd5451b6ac3743B414124A6299B65FF", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0xa4bcDF64Cdd5451b6ac3743B414124A6299B65FF", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "UNI_LINK_ETH": { "buidlerevm": { - "address": "0x53369fd4680FfE3DfF39Fc6DDa9CfbfD43daeA2E", + "address": "0x22474D350EC2dA53D717E30b96e9a2B7628Ede5b", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x22474D350EC2dA53D717E30b96e9a2B7628Ede5b", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "UNI_MKR_ETH": { "buidlerevm": { - "address": "0xB00cC45B4a7d3e1FEE684cFc4417998A1c183e6d", + "address": "0x5A0773Ff307Bf7C71a832dBB5312237fD3437f9F", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x5A0773Ff307Bf7C71a832dBB5312237fD3437f9F", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "UNI_LEND_ETH": { "buidlerevm": { - "address": "0x58F132FBB86E21545A4Bace3C19f1C05d86d7A22", + "address": "0x18b9306737eaf6E8FC8e737F488a1AE077b18053", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x18b9306737eaf6E8FC8e737F488a1AE077b18053", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "LendingPoolAddressesProvider": { "buidlerevm": { - "address": "0xa4bcDF64Cdd5451b6ac3743B414124A6299B65FF", + "address": "0xFAe0fd738dAbc8a0426F47437322b6d026A9FD95", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "kovan": { + "address": "0x2ed9F124cF9b079DDBbFb68D352FB83bdeFc39Ee", + "deployer": "0x85e4A467343c0dc4aDAB74Af84448D9c45D8ae6F" + }, + "hardhat": { + "address": "0xFAe0fd738dAbc8a0426F47437322b6d026A9FD95", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "LendingPoolAddressesProviderRegistry": { "buidlerevm": { - "address": "0x5A0773Ff307Bf7C71a832dBB5312237fD3437f9F", + "address": "0x18b9306737eaf6E8FC8e737F488a1AE077b18053", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "kovan": { + "address": "0xAA14619F08ADe8109F47905CAda9EDDee0c876c3", + "deployer": "0x85e4A467343c0dc4aDAB74Af84448D9c45D8ae6F" + }, + "hardhat": { + "address": "0x12080583C4F0211eC382d33a273E6D0f9fAb0F75", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "ReserveLogic": { "buidlerevm": { - "address": "0x78Ee8Fb9fE5abD5e347Fc94c2fb85596d1f60e3c", + "address": "0x920d847fE49E54C19047ba8bc236C45A8068Bca7", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "kovan": { + "address": "0x89b33E0CB2294f5c09ACB6281B37DED90Cd8025F", + "deployer": "0x85e4A467343c0dc4aDAB74Af84448D9c45D8ae6F" + }, + "hardhat": { + "address": "0x2cBbbBE1B75Ad7848F0844215816F551f429c64f", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "GenericLogic": { "buidlerevm": { - "address": "0x920d847fE49E54C19047ba8bc236C45A8068Bca7", + "address": "0xA4765Ff72A9F3CfE73089bb2c3a41B838DF71574", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "kovan": { + "address": "0x86EB6F23b497320742eb1dDab598fD04c3E11682", + "deployer": "0x85e4A467343c0dc4aDAB74Af84448D9c45D8ae6F" + }, + "hardhat": { + "address": "0xbAc762e2000b6815268587b081Fd17aC25519aD5", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "ValidationLogic": { "buidlerevm": { - "address": "0xA4765Ff72A9F3CfE73089bb2c3a41B838DF71574", + "address": "0x35c1419Da7cf0Ff885B8Ef8EA9242FEF6800c99b", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "kovan": { + "address": "0xe0bd0Adcca9de46aE8fe8E50276A13b4c1dfE931", + "deployer": "0x85e4A467343c0dc4aDAB74Af84448D9c45D8ae6F" + }, + "hardhat": { + "address": "0xa43Ba00FCA75B805D17f67F9433b971E9a398690", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "LendingPool": { "buidlerevm": { - "address": "0x35c1419Da7cf0Ff885B8Ef8EA9242FEF6800c99b", + "address": "0xe2607EabC87fd0A4856840bF23da8458cDF0434F", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "kovan": { + "address": "0x212B0b733BFbc58D3B62b79Da1B38E915057039f" + }, + "hardhat": { + "address": "0xAa7BC1924711B77A0F3Aaebdd550BfeDDDbaf3cd", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "LendingPoolConfigurator": { "buidlerevm": { - "address": "0x6642B57e4265BAD868C17Fc1d1F4F88DBBA04Aa8" + "address": "0xdbaA15927b1463EdD14Cf51D082BD7703Fd1C238" + }, + "kovan": { + "address": "0xD57c7ad0F079EbA38B0c1972d68d13f78719FC00" + }, + "hardhat": { + "address": "0xdbaA15927b1463EdD14Cf51D082BD7703Fd1C238" } }, "StableAndVariableTokensHelper": { "buidlerevm": { - "address": "0x0C6c3C47A1f650809B0D1048FDf9603e09473D7E", + "address": "0x06bA8d8af0dF898D0712DffFb0f862cC51AF45c2", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "kovan": { + "address": "0xF67bbFB9265b7eA7c450F405673690A11a20748D", + "deployer": "0x85e4A467343c0dc4aDAB74Af84448D9c45D8ae6F" + }, + "hardhat": { + "address": "0x099d9fF8F818290C8b5B7Db5bFca84CEebd2714c", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "ATokensAndRatesHelper": { "buidlerevm": { - "address": "0x920d847fE49E54C19047ba8bc236C45A8068Bca7", + "address": "0xA4765Ff72A9F3CfE73089bb2c3a41B838DF71574", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "kovan": { + "address": "0x8177E36Fc8Cb12c31F0e463F39394fC417345B56", + "deployer": "0x85e4A467343c0dc4aDAB74Af84448D9c45D8ae6F" + }, + "hardhat": { + "address": "0x85bdE212E66e2BAE510E44Ed59116c1eC712795b", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "PriceOracle": { "buidlerevm": { - "address": "0xb682dEEf4f8e298d86bFc3e21f50c675151FB974", + "address": "0x1750499D05Ed1674d822430FB960d5F6731fDf64", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0xe1B3b8F6b298b52bCd15357ED29e65e66a4045fF", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "MockAggregator": { "buidlerevm": { - "address": "0x3D8FFB457fedDFBc760F3F243283F52692b579B1", + "address": "0xEC1C93A9f6a9e18E97784c76aC52053587FcDB89", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0xfA9dbd706c674801F50169f4B5862cCe045408E6", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "ChainlinkProxyPriceProvider": { "buidlerevm": { - "address": "0xEC1C93A9f6a9e18E97784c76aC52053587FcDB89", + "address": "0x7B6C3e5486D9e6959441ab554A889099eed76290", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0xCeEa6148D75268b6E930AE41d7a31baE1CA318d8", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "LendingRateOracle": { "buidlerevm": { - "address": "0xAF6BA11790D1942625C0c2dA07da19AB63845cfF", + "address": "0xD83D2773a7873ae2b5f8Fb92097e20a8C64F691E", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x98B40aAC844674B2287556E75b3ef5530DfCfcB7", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, - "AaveProtocolTestHelpers": { + "AaveProtocolDataProvider": { "buidlerevm": { - "address": "0xf4830d6b1D70C8595d3BD8A63f9ed9F636DB9ef2" + "address": "0x93472C0e03215F9c33DA240Eb16703C8244eAa8c" + }, + "kovan": { + "address": "0x2457cE7EFe23B8887B08006004C3Fdb4E3252094", + "deployer": "0x85e4A467343c0dc4aDAB74Af84448D9c45D8ae6F" + }, + "hardhat": { + "address": "0x3392c115Ff2CE1A782B4a965fF770da61e69228E" } }, "LendingPoolCollateralManager": { "buidlerevm": { - "address": "0x8D0206fEBEB380486729b64bB4cfEDC5b354a6D6", + "address": "0x3c5408De7435Dfa3eB2aF2Edf5E39385f68F69b2", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "kovan": { + "address": "0x15fF71A8F0B1E43AF2A0D3554c9F8E41601bCE6b", + "deployer": "0x85e4A467343c0dc4aDAB74Af84448D9c45D8ae6F" + }, + "hardhat": { + "address": "0x8BFFF31B1757da579Bb5B118489568526F7fb6D4", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "MockFlashLoanReceiver": { "buidlerevm": { - "address": "0xfC88832bac6AbdF216BC5A67be68E9DE94aD5ba2" + "address": "0x0459c841b02Aee8730730C737582c53B20a27288" + }, + "hardhat": { + "address": "0x2530ce07D254eA185E8e0bCC37a39e2FbA3bE548" } }, "WalletBalanceProvider": { "buidlerevm": { - "address": "0x1256eBA4d0a7A38D10BaF4F61775ba491Ce7EE25", + "address": "0x77B0b5636fEA30eA79BB65AeCCdb599997A849A8", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "kovan": { + "address": "0x3aCd4b30bC70647620989B9f98C4E21867Bd753A", + "deployer": "0x85e4A467343c0dc4aDAB74Af84448D9c45D8ae6F" + }, + "hardhat": { + "address": "0x0Cf45557d25a4e4c0F1aC65EF6c48ae67c61a0E6", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "MockAToken": { "buidlerevm": { - "address": "0x77B0b5636fEA30eA79BB65AeCCdb599997A849A8", + "address": "0x0EBCa695959e5f138Af772FAa44ce1A9C7aEd921", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x33958cC3535Fc328369EAC2B2Bebd120D67C7fa1", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "MockStableDebtToken": { "buidlerevm": { - "address": "0x78Ee8Fb9fE5abD5e347Fc94c2fb85596d1f60e3c", + "address": "0x417fc1038b2AF553D65F4fF2839efE9f93Ec1eac", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x2cBbbBE1B75Ad7848F0844215816F551f429c64f", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } }, "MockVariableDebtToken": { "buidlerevm": { - "address": "0x920d847fE49E54C19047ba8bc236C45A8068Bca7", + "address": "0x8BFFF31B1757da579Bb5B118489568526F7fb6D4", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0xbAc762e2000b6815268587b081Fd17aC25519aD5", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" } + }, + "WETHGateway": { + "buidlerevm": { + "address": "0x0Cf45557d25a4e4c0F1aC65EF6c48ae67c61a0E6", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "kovan": { + "address": "0x7d8B46401dC07ccA3f65F0FBBfE834D61C76C54f", + "deployer": "0x85e4A467343c0dc4aDAB74Af84448D9c45D8ae6F" + }, + "hardhat": { + "address": "0x7fAeC7791277Ff512c41CA903c177B2Ed952dDAc", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + } + }, + "WETHMocked": { + "buidlerevm": { + "address": "0xf784709d2317D872237C4bC22f867d1BAe2913AB", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0xf784709d2317D872237C4bC22f867d1BAe2913AB", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + } + }, + "MintableDelegationERC20": { + "buidlerevm": { + "address": "0x7fAeC7791277Ff512c41CA903c177B2Ed952dDAc", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x33958cC3535Fc328369EAC2B2Bebd120D67C7fa1", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + } + }, + "AAVE": { + "buidlerevm": { + "address": "0x8858eeB3DfffA017D4BCE9801D340D36Cf895CCf", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x8858eeB3DfffA017D4BCE9801D340D36Cf895CCf", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + } + }, + "REN": { + "buidlerevm": { + "address": "0x2D8553F9ddA85A9B3259F6Bf26911364B85556F5", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x2D8553F9ddA85A9B3259F6Bf26911364B85556F5", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + } + }, + "YFI": { + "buidlerevm": { + "address": "0x5bcb88A0d20426e451332eE6C4324b0e663c50E0", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x5bcb88A0d20426e451332eE6C4324b0e663c50E0", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + } + }, + "UNI": { + "buidlerevm": { + "address": "0x3521eF8AaB0323004A6dD8b03CE890F4Ea3A13f5", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x3521eF8AaB0323004A6dD8b03CE890F4Ea3A13f5", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + } + }, + "AToken": { + "buidlerevm": { + "address": "0x33958cC3535Fc328369EAC2B2Bebd120D67C7fa1", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x2cBbbBE1B75Ad7848F0844215816F551f429c64f", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + } + }, + "SelfdestructTransferMock": { + "buidlerevm": { + "address": "0x920d847fE49E54C19047ba8bc236C45A8068Bca7", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x2cBbbBE1B75Ad7848F0844215816F551f429c64f", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + } + }, + "ENJ": { + "buidlerevm": { + "address": "0x53369fd4680FfE3DfF39Fc6DDa9CfbfD43daeA2E", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "hardhat": { + "address": "0x53369fd4680FfE3DfF39Fc6DDa9CfbfD43daeA2E", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + } + }, + "LendingPoolImpl": { + "kovan": { + "address": "0x301F889146aaFEfD88d5D442eEcd12AeAC3D1Fc3" + }, + "hardhat": { + "address": "0xAa7BC1924711B77A0F3Aaebdd550BfeDDDbaf3cd" + } + }, + "LendingPoolConfiguratorImpl": { + "kovan": { + "address": "0x25d9A07E6a749488f36e3c89A38C8235adb33AA2" + }, + "hardhat": { + "address": "0x1750499D05Ed1674d822430FB960d5F6731fDf64" + } + }, + "LendingPoolCollateralManagerImpl": { + "kovan": { + "address": "0x15fF71A8F0B1E43AF2A0D3554c9F8E41601bCE6b" + }, + "hardhat": { + "address": "0x8BFFF31B1757da579Bb5B118489568526F7fb6D4" + } + }, + "stableDebtAAVE": { + "kovan": { + "address": "0x9d6cD3e0cb7A916dD788BE8937Db2E28E653083F" + }, + "hardhat": { + "address": "0xcFB79d2c986Ca61Dbd288f80108b9e8C4cC6522b" + } + }, + "variableDebtAAVE": { + "kovan": { + "address": "0x7069766BAEAE5042eF9Efa25D423853Fa244e03D" + }, + "hardhat": { + "address": "0x1073981e3D3Af966a1137a3460dB881AAED7ae7a" + } + }, + "stableDebtBAT": { + "kovan": { + "address": "0x7bA20003bc65A551aAc9670b96520F544556025D" + }, + "hardhat": { + "address": "0x4c90c5Fa9C907F2C993E66446E022260e2AfC8d1" + } + }, + "variableDebtBAT": { + "kovan": { + "address": "0x25bfFB7E493bAAd885Ad7EE676E5e32c6F85D6FE" + }, + "hardhat": { + "address": "0x86BAB8904c2969DE5EF732F8BC1D805C1aD56ddD" + } + }, + "stableDebtBUSD": { + "kovan": { + "address": "0xA5bb990BA8c1367dF8b34a7628Db1786790782E8" + }, + "hardhat": { + "address": "0xa279C092B779bD051DA5333978e30647501AA958" + } + }, + "variableDebtBUSD": { + "kovan": { + "address": "0xa75EF57f21484029bA17cb31A59176500dA95Bf0" + }, + "hardhat": { + "address": "0xeB24f8Dff752f099AA106207b8f49818ca78D02e" + } + }, + "stableDebtDAI": { + "kovan": { + "address": "0x83B7666885dAC6D68f9f32569EC0F4585979d74B" + }, + "hardhat": { + "address": "0x7cc0483c098d4e36f2f0AF72a7B13E40E13cd613" + } + }, + "variableDebtDAI": { + "kovan": { + "address": "0x897d762EF8fe013a824503d5Eda2a329Ad98f7E0" + }, + "hardhat": { + "address": "0x38E82417A3b37f7faA75d2DD6260d5C24f529e1e" + } + }, + "aAAVE": { + "kovan": { + "address": "0x74A4A2a5437bF9152A1abfa08f0E83D0737C588C" + }, + "hardhat": { + "address": "0x6e5d1a9C405DF46a8503893DBa99c3af5Dc1FB5A" + } + }, + "strategyAAVE": { + "kovan": { + "address": "0xeD83FCcA01A74690c9d0Bc75283F612655347f67" + }, + "hardhat": { + "address": "0xCDfa18cdFEFCa96D6c79628c6ef941201b63faE4" + } + }, + "aBAT": { + "kovan": { + "address": "0x35bCbf4f3d63dC55b79178A423b0e601b4ef5FD2" + }, + "hardhat": { + "address": "0xCaA841b61FfEf4017209311f2B0B2e2f88eBA3bc" + } + }, + "strategyBAT": { + "kovan": { + "address": "0x277b52f138647392496355d87bF03a1aB6c83024" + }, + "hardhat": { + "address": "0x8225B75F6eed9415D3FEABAa5B53628c6c7D29E2" + } + }, + "aBUSD": { + "kovan": { + "address": "0x9E709c81c73eEcE90766B277babCfa66F1965565" + }, + "hardhat": { + "address": "0x7EebA31C65BCceBF0F2ef6eFf9edf170De96A139" + } + }, + "strategyBUSD": { + "kovan": { + "address": "0xe302038c6E3f7541ACe4DcCF08D666F845450166" + }, + "hardhat": { + "address": "0x66D0d53519B4A06f007A2Da43599EB844f6F4a7e" + } + }, + "aDAI": { + "kovan": { + "address": "0x9edb979F40cA59f759e9Eca68a6dFeA56B8d299b" + }, + "hardhat": { + "address": "0xf72805fA3E8Bd360bCBA4d069FC3B882001bB017" + } + }, + "strategyDAI": { + "kovan": { + "address": "0xa43a28500d79C25bf83ACAF5E90a46b689b3EB16" + }, + "hardhat": { + "address": "0xB79EcFC3ea936e0e904DA3190CD1C8b8cc5F99B5" + } + }, + "stableDebtENJ": { + "kovan": { + "address": "0x9fBE02f08e79f8aA129a46a23E8A18e027B6e2EF" + }, + "hardhat": { + "address": "0xFE6c73d2880c7F5D2CDfe495C500AF94fECd09E9" + } + }, + "variableDebtENJ": { + "kovan": { + "address": "0xFA80B658A4bacD6282267428206Afaa3Cf888cd6" + }, + "hardhat": { + "address": "0x1890c00253FbD4130A4191CDA13e443b8708DEAF" + } + }, + "stableDebtKNC": { + "kovan": { + "address": "0xAF9EfC82E89a872F8AEf28c81258dfEa712AfFfE" + }, + "hardhat": { + "address": "0xfdAA87AfAF7F617F84480eDc705d8Fd4B78EDEcB" + } + }, + "variableDebtKNC": { + "kovan": { + "address": "0xa371C49E252d3c11e050A47ff88d8D15cDf114A1" + }, + "hardhat": { + "address": "0x8A420528eC19177Deb9f1F0e2965964018f896c7" + } + }, + "stableDebtLINK": { + "kovan": { + "address": "0xdF0812bdf765E3b77746e961C501313083b1aFa5" + }, + "hardhat": { + "address": "0x8a8eB2979316f4F173A97ff91E0e1Dd106039ad4" + } + }, + "variableDebtLINK": { + "kovan": { + "address": "0x3f7389a4e2A351Fd9107d645108a6535Ed1232E4" + }, + "hardhat": { + "address": "0xa0207cf18d773Bae5F5d816fc674fF8FFd0D6fE6" + } + }, + "stableDebtMANA": { + "kovan": { + "address": "0x217013C9bFE969979eB8efe94f3dfAeE35492C50" + }, + "hardhat": { + "address": "0xE5107B38FFB21AD61185785816559f8B3aA54Ac5" + } + }, + "variableDebtMANA": { + "kovan": { + "address": "0x5945e37b1ef058c5847b048786ac3fCdd40e56DE" + }, + "hardhat": { + "address": "0x1259DA780FF797C1a11d534b0BaC534eD2b3F109" + } + }, + "aENJ": { + "kovan": { + "address": "0xc8fad67D303D8fCF6abe3206E4BF94D797Ef71f3" + }, + "hardhat": { + "address": "0xa9DFb142061Ef496F48078d9eA39A2D992236D0f" + } + }, + "strategyENJ": { + "kovan": { + "address": "0x537d2F788d0B598D5a921532D4086EDE3B2cEd64" + }, + "hardhat": { + "address": "0xaaE80234037A18Ee462b1727ed0621b54dFcEDA6" + } + }, + "aKNC": { + "kovan": { + "address": "0x49c9eC52427E9ccd13eF0702d5b2e028Ce99A217" + }, + "hardhat": { + "address": "0x8076E5d426aa3B5C4c98570b3a9033EE67aFe849" + } + }, + "strategyKNC": { + "kovan": { + "address": "0x1308fCd27933fF5639C9f51c86A17A3645c5dED9" + }, + "hardhat": { + "address": "0x87809db6234f27E3AacDEb316c00DbFCA77B11B3" + } + }, + "aLINK": { + "kovan": { + "address": "0x917e32953DA5eA01fb7FAEB90A19aeb51Cd42c23" + }, + "hardhat": { + "address": "0xe90Ad292698ddaE3Dc305Eb98Ff5FD7341c8a637" + } + }, + "strategyLINK": { + "kovan": { + "address": "0xA891181D5dca4b6a8F5d2607E456CFa9EB9D1D20" + }, + "hardhat": { + "address": "0x436d1eE2EDa1F7a98f2418709d10465c98Ed3828" + } + }, + "aMANA": { + "kovan": { + "address": "0x2419b9D71F42D8C72176bA5C2c7bF152F0692814" + }, + "hardhat": { + "address": "0x8599378fE42e4FB26Ad214FB1545076EB19b8b0f" + } + }, + "strategyMANA": { + "kovan": { + "address": "0x886e231f0ca34deF2dBf091AA5d6be4cFa06B557" + }, + "hardhat": { + "address": "0x487E219628bb5227b2B490CaEE2E2b47ec06D204" + } + }, + "stableDebtMKR": { + "kovan": { + "address": "0x2a8617F6802a1CCA29f2974837eaBD6630E80994" + }, + "hardhat": { + "address": "0x3deF3E7577D5Ddf0ea10fB58730fECdA673711C8" + } + }, + "variableDebtMKR": { + "kovan": { + "address": "0xF75cC2a6C928198681D35c8117df83699189169D" + }, + "hardhat": { + "address": "0x509B355B5d665a209e888B20B818e53fAdEb47B7" + } + }, + "stableDebtREN": { + "kovan": { + "address": "0x598F59917d13269D8D81ab21Ea37F4B8e099e875" + }, + "hardhat": { + "address": "0x2A7C4a4D6b7db3beF0e277D950192c421aF4BD69" + } + }, + "variableDebtREN": { + "kovan": { + "address": "0x3140a105ede15FEc9391fef89e6d14b62B86C39B" + }, + "hardhat": { + "address": "0x5d1B59460fa295F6B4DEB74C74F4D11f4de60517" + } + }, + "stableDebtREP": { + "kovan": { + "address": "0x33160b3737a1869264601C4B8D97e98725920c16" + }, + "hardhat": { + "address": "0x80288A583c216fB0F6a7ccA1Fbc22d7727E2135a" + } + }, + "variableDebtREP": { + "kovan": { + "address": "0x995487BB75AEc2375fdB216BfcB37b53f6Ab2abb" + }, + "hardhat": { + "address": "0xd7E287c1B79c7DA0F6fF7cdEA1026f1223c24F8a" + } + }, + "stableDebtSNX": { + "kovan": { + "address": "0x77E8Addb01e36c5d754E89d0E5Da951e202d9CE3" + }, + "hardhat": { + "address": "0x0Aa250b8A76d9228Cc7609013cc77c500Ee802E7" + } + }, + "variableDebtSNX": { + "kovan": { + "address": "0x969e82694032cc0C346f855e52c5503B4e42F850" + }, + "hardhat": { + "address": "0xf45700a9EAD19BFA6770802E3807E3eE37E8E492" + } + }, + "aMKR": { + "kovan": { + "address": "0xc3b70569D534C3E17B06C4a25980Ab349b534263" + }, + "hardhat": { + "address": "0x05EDF38bB3D948E96745f39072d59dCc915194Dd" + } + }, + "strategyMKR": { + "kovan": { + "address": "0x81DB8B1f3612FdAAA7A211d073dB4C8dcc5a98e7" + }, + "hardhat": { + "address": "0x90D5cff61508785557eaA45DeED1297809F49371" + } + }, + "aREN": { + "kovan": { + "address": "0x2Bed39d993276E548987e4271475696897254a17" + }, + "hardhat": { + "address": "0xB436Db1757e0c474DaF67666BC35F5fF7062541D" + } + }, + "strategyREN": { + "kovan": { + "address": "0x49a4CDd903A6644cF696F7E1d4404BBBC973470E" + }, + "hardhat": { + "address": "0x26eC70DcA80E8dBDaAcBff415aCdcF791C89CEBe" + } + }, + "aREP": { + "kovan": { + "address": "0x04adf3717C2066cd338804909467e67C968B7Dd7" + }, + "hardhat": { + "address": "0xfcD974Cec976c536745bBB30e6C7E083a1Ab82EC" + } + }, + "strategyREP": { + "kovan": { + "address": "0x5D271675dA68679DB9a8A8E3501cB7c21fd84cE3" + }, + "hardhat": { + "address": "0x0E7f0c6Bf3bA63A28e1EFdDb7F3186A24b90566D" + } + }, + "aSNX": { + "kovan": { + "address": "0x023eba3646A08BA06CfCCB5c8F684048d1B654bb" + }, + "hardhat": { + "address": "0x21FA83fB5d14301B53Efc6e44C565C80063d1c50" + } + }, + "strategySNX": { + "kovan": { + "address": "0x866a1F54F13a00B9747C7832881a15234284D38C" + }, + "hardhat": { + "address": "0x5806cCA75C8fEf151881d93E7e81EB103F23fb7b" + } + }, + "stableDebtSUSD": { + "kovan": { + "address": "0x5Eac7b30C376081f293d5671f1B4a789a36Ba8C8" + }, + "hardhat": { + "address": "0xDfD96D3cac8b157176292c547A61eD7586713527" + } + }, + "variableDebtSUSD": { + "kovan": { + "address": "0x34939cC14762b4993E0679231ECE9aC51836c071" + }, + "hardhat": { + "address": "0xcc94Ce18B9a7522d12675cA3fFC1A862Ac0373C1" + } + }, + "stableDebtTUSD": { + "kovan": { + "address": "0xc3031590B298aB7591a59e467c944215236f7878" + }, + "hardhat": { + "address": "0x2C4ec78AD3Ff19F35e0dbF35837490C4f7b4224E" + } + }, + "variableDebtTUSD": { + "kovan": { + "address": "0x1E913eCe8FFcC67d86671ba3Ae7676F385722941" + }, + "hardhat": { + "address": "0xC9C2c855fA6EAFc5780B661b2CD1c8985c45D720" + } + }, + "stableDebtUNI": { + "kovan": { + "address": "0x6C9ee95b637c44322C6fA244D0106a52Dc2cB6F9" + }, + "hardhat": { + "address": "0x1a2f37C5Ed6bEA450Ac31E10ED682994C7C77835" + } + }, + "variableDebtUNI": { + "kovan": { + "address": "0xFEbef6B52C72A49CD8150284aD7277a7454373e0" + }, + "hardhat": { + "address": "0x83D129a2efFa0ba0d5B09f7CdfBEaDE1F847201E" + } + }, + "stableDebtUSDC": { + "kovan": { + "address": "0xaD56D9738Aa70D518298c37Cd7C5Fc81ba987023" + }, + "hardhat": { + "address": "0xBb78BcaB8e39C38C6E019fe49E43b2591FAa6a58" + } + }, + "variableDebtUSDC": { + "kovan": { + "address": "0x38CA9234844ADBceB823462CC8666569883b9701" + }, + "hardhat": { + "address": "0xF5B3b70cb53852617B1fde19242bED043A885B4B" + } + }, + "aSUSD": { + "kovan": { + "address": "0x6EFA6906A391B4F62914f6Ae4650aC2154f89bE7" + }, + "hardhat": { + "address": "0x4bb47D17F31181c8BE088CE21574B4e973212C39" + } + }, + "strategySUSD": { + "kovan": { + "address": "0x144E8b18609B2dF30AD96789Db5c6feb9259626c" + }, + "hardhat": { + "address": "0x632a0Cf1e008011CC3185c9989205aa29BF267Df" + } + }, + "aTUSD": { + "kovan": { + "address": "0x88ab5455013e2c00De2ABA5F48DEff10CFEDb490" + }, + "hardhat": { + "address": "0x2A3CcaB4Fb2A3B34f6A819Cfc50918fe96D64122" + } + }, + "strategyTUSD": { + "kovan": { + "address": "0xF862594F5C4061ac21547A9868716e12f0B59AC2" + }, + "hardhat": { + "address": "0x8B151819355Bfb7dE62e5b1D7580F43B34ed86e8" + } + }, + "aUNI": { + "kovan": { + "address": "0x5aEE290afe3778d218DcD59C61A18Bacfa22bBae" + }, + "hardhat": { + "address": "0x388e76350476e23A80eA6403B525aDa86ed7af6E" + } + }, + "strategyUNI": { + "kovan": { + "address": "0x21Fe360f849358e991Ea60Bd5C7569598788f46A" + }, + "hardhat": { + "address": "0xf86115c55192beb063C4c494E2C9CFB990235ecF" + } + }, + "aUSDC": { + "kovan": { + "address": "0x4E2e684aA8fB7E15c487F2d922508dBCfdAfC921" + }, + "hardhat": { + "address": "0xa8d4DF7C220903a4018C3A81BEc702fb54623bd5" + } + }, + "strategyUSDC": { + "kovan": { + "address": "0x8480DFf825B99622d0598826F5EE3B5d79bA92c5" + }, + "hardhat": { + "address": "0x936b5f546a6405012AC1DC4713f29B7CE43Fb4A2" + } + }, + "stableDebtUSDT": { + "kovan": { + "address": "0x953Ae6D846feB7112Be1DD0a2c996CD37c51f127" + }, + "hardhat": { + "address": "0x47167e26421017FD2a619D99Cf747b5eB58371B2" + } + }, + "variableDebtUSDT": { + "kovan": { + "address": "0x443005Fad27A870ED9BCF4B048FdD6b79a7d2B15" + }, + "hardhat": { + "address": "0xBfd65BbF3fbF0bFB0f0053e092EB690904eC6876" + } + }, + "stableDebtWBTC": { + "kovan": { + "address": "0xa5E61884083c243345449eAD5c70158F016F4df0" + }, + "hardhat": { + "address": "0xae18C8d1A389E005faBf3234f5F81C35561c1811" + } + }, + "variableDebtWBTC": { + "kovan": { + "address": "0xFD5194F07E652865671b1a8310Ac54a853985547" + }, + "hardhat": { + "address": "0x7B3CAbCa23FafF9f02382Bc5A7BB73D46c2BE1ee" + } + }, + "stableDebtWETH": { + "kovan": { + "address": "0xcb19776e2B69595b6a3Ce4F44acb63e506bd8C1b" + }, + "hardhat": { + "address": "0x1A06De035FA3e4339f1a41C9008Ed6ba6c8f2a15" + } + }, + "variableDebtWETH": { + "kovan": { + "address": "0x755d5C1a5d82f26a92dFb793d0Da14eEd8Ec7435" + }, + "hardhat": { + "address": "0x61641145904737b907B4e31DBdAd829B606eB111" + } + }, + "stableDebtYFI": { + "kovan": { + "address": "0xd72a6AdE1ba573DA8398ff05426B8450Daeaa3e7" + }, + "hardhat": { + "address": "0x3049AA46A60B4253d6Cf122a25bBd26a0CCb6CAd" + } + }, + "variableDebtYFI": { + "kovan": { + "address": "0xa0cE46eA00e4ccE66d93e8465DCEDE0f5470d2A4" + }, + "hardhat": { + "address": "0x1Af371fA93aFAB4F461b6f978E7918B79510896A" + } + }, + "aUSDT": { + "kovan": { + "address": "0x5109D69A94c7754251567aD12E0096368f6abcE5" + }, + "hardhat": { + "address": "0x6A45383E16554222D9AFf39c4deAd7EF598ddb95" + } + }, + "strategyUSDT": { + "kovan": { + "address": "0x35716131aA6957eEF88c476a6a7e5f3cb6e2B4be" + }, + "hardhat": { + "address": "0x08fd990609A0Ed943858a7493c7105E2CC784784" + } + }, + "aWBTC": { + "kovan": { + "address": "0xe53a364A541fC87eecab96365C4BC3b4BA7Ad55f" + }, + "hardhat": { + "address": "0xEDE8C583A3fB6DcfC1a991E5B1F9C1b0b29ca60d" + } + }, + "strategyWBTC": { + "kovan": { + "address": "0xD1A6A373A52FddceD8Eb630A6c230f39a53C15Ca" + }, + "hardhat": { + "address": "0x763b103B7EFEbb21Acc2b50b134681E0b5ecB247" + } + }, + "aWETH": { + "kovan": { + "address": "0xcBb1352688efC3B5741B60545F0A79B62A629702" + }, + "hardhat": { + "address": "0x24aAB62Ae5595aACae2A0fC10aA31006Cb7dC4ef" + } + }, + "strategyWETH": { + "kovan": { + "address": "0xE05AA3A5A5Db7085A5A69402b1f7C033e4BC73d7" + }, + "hardhat": { + "address": "0x75e2e836409aF032Fc182F2e9D6212336E2E7026" + } + }, + "aYFI": { + "kovan": { + "address": "0x0C26B8dD7c55c4d090FBCD96c135e12f542Aef83" + }, + "hardhat": { + "address": "0xE4b29Db05C1A3749d085E9eF41dC2378eE530dF0" + } + }, + "strategyYFI": { + "kovan": { + "address": "0x4a26cc7002e3ca88D8d3f72b9b6e7C7C4bF8923c" + }, + "hardhat": { + "address": "0x8c82e998506DCF9ef46518182DaF18ae962d4b3C" + } + }, + "stableDebtZRX": { + "kovan": { + "address": "0xBA1EFBca9B5b4C7718A4374ec29c1671D972118A" + }, + "hardhat": { + "address": "0x929ef1D4eB03724462e59219506CbD5Bcf2Cce38" + } + }, + "variableDebtZRX": { + "kovan": { + "address": "0xfdf0AF23449181c404C15d0aA80D1355DC3FA460" + }, + "hardhat": { + "address": "0xDf5E00D37C010cE5FA334234c8E391F82e90fA2e" + } + }, + "aZRX": { + "kovan": { + "address": "0x9952c8EbFf001915a504D3E2B54D3bFD205C104B" + }, + "hardhat": { + "address": "0x255AE9d92694fE823D099b42ff8088770B700029" + } + }, + "strategyZRX": { + "kovan": { + "address": "0x2944f4c8b54410b61D3b305651a93547D24d691f" + }, + "hardhat": { + "address": "0xaDF23b1cAa6a7B3b077c432794FfF80A4b935cdF" + } } -} +} \ No newline at end of file diff --git a/hardhat.config.ts b/hardhat.config.ts new file mode 100644 index 00000000..a6458c51 --- /dev/null +++ b/hardhat.config.ts @@ -0,0 +1,117 @@ +import path from 'path'; +import fs from 'fs'; +import {HardhatUserConfig} from 'hardhat/config'; +// @ts-ignore +import {accounts} from './test-wallets.js'; +import {eEthereumNetwork} from './helpers/types'; +import {BUIDLEREVM_CHAINID, COVERAGE_CHAINID} from './helpers/buidler-constants'; + +import '@nomiclabs/hardhat-ethers'; +import '@nomiclabs/hardhat-waffle'; +import 'temp-hardhat-etherscan'; +import 'hardhat-gas-reporter'; +import 'hardhat-typechain'; + +const SKIP_LOAD = process.env.SKIP_LOAD === 'true'; +const DEFAULT_BLOCK_GAS_LIMIT = 12450000; +const DEFAULT_GAS_MUL = 2; +const DEFAULT_GAS_PRICE = 2000000000; +const HARDFORK = 'istanbul'; +const INFURA_KEY = process.env.INFURA_KEY || ''; +const ETHERSCAN_KEY = process.env.ETHERSCAN_KEY || ''; +const MNEMONIC_PATH = "m/44'/60'/0'/0"; +const MNEMONIC = process.env.MNEMONIC || ''; + +// Prevent to load scripts before compilation and typechain +if (!SKIP_LOAD) { + ['misc', 'migrations', 'dev', 'full', 'verifications'].forEach((folder) => { + const tasksPath = path.join(__dirname, 'tasks', folder); + fs.readdirSync(tasksPath) + .filter((pth) => pth.includes('.ts')) + .forEach((task) => { + require(`${tasksPath}/${task}`); + }); + }); +} + +require(`${path.join(__dirname, 'tasks/misc')}/set-bre.ts`); + +const getCommonNetworkConfig = (networkName: eEthereumNetwork, networkId: number) => { + return { + url: `https://${networkName}.infura.io/v3/${INFURA_KEY}`, + hardfork: HARDFORK, + blockGasLimit: DEFAULT_BLOCK_GAS_LIMIT, + gasMultiplier: DEFAULT_GAS_MUL, + gasPrice: DEFAULT_GAS_PRICE, + chainId: networkId, + accounts: { + mnemonic: MNEMONIC, + path: MNEMONIC_PATH, + initialIndex: 0, + count: 20, + }, + }; +}; + +const buidlerConfig: HardhatUserConfig = { + solidity: { + version: '0.6.8', + settings: { + optimizer: {enabled: true, runs: 200}, + evmVersion: 'istanbul', + }, + }, + typechain: { + outDir: 'types', + target: 'ethers-v5', + }, + etherscan: { + apiKey: ETHERSCAN_KEY, + }, + mocha: { + timeout: 0, + }, + networks: { + coverage: { + url: 'http://localhost:8555', + chainId: COVERAGE_CHAINID, + }, + kovan: getCommonNetworkConfig(eEthereumNetwork.kovan, 42), + ropsten: getCommonNetworkConfig(eEthereumNetwork.ropsten, 3), + main: getCommonNetworkConfig(eEthereumNetwork.main, 1), + hardhat: { + hardfork: 'istanbul', + blockGasLimit: DEFAULT_BLOCK_GAS_LIMIT, + gas: DEFAULT_BLOCK_GAS_LIMIT, + gasPrice: 8000000000, + chainId: BUIDLEREVM_CHAINID, + throwOnTransactionFailures: true, + throwOnCallFailures: true, + accounts: accounts.map(({secretKey, balance}: {secretKey: string; balance: string}) => ({ + privateKey: secretKey, + balance, + })), + }, + buidlerevm_docker: { + hardfork: 'istanbul', + blockGasLimit: 9500000, + gas: 9500000, + gasPrice: 8000000000, + chainId: BUIDLEREVM_CHAINID, + throwOnTransactionFailures: true, + throwOnCallFailures: true, + url: 'http://localhost:8545', + }, + ganache: { + url: 'http://ganache:8545', + accounts: { + mnemonic: 'fox sight canyon orphan hotel grow hedgehog build bless august weather swarm', + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + }, +}; + +export default buidlerConfig; diff --git a/helpers/configuration.ts b/helpers/configuration.ts index 1665d4a0..68c2db4e 100644 --- a/helpers/configuration.ts +++ b/helpers/configuration.ts @@ -12,9 +12,10 @@ import {AaveConfig} from '../config/aave'; import {UniswapConfig} from '../config/uniswap'; import {CommonsConfig} from '../config/commons'; import {ZERO_ADDRESS} from './constants'; -import {BRE} from './misc-utils'; +import {DRE} from './misc-utils'; import {tEthereumAddress} from './types'; import {getParamPerNetwork} from './contracts-helpers'; +import {deployWETHMocked} from './contracts-deployments'; export enum ConfigNames { Commons = 'Commons', @@ -52,27 +53,33 @@ export const getReservesConfigByPool = (pool: AavePools): iMultiPoolsAssets { - const receivers = [receiver, ZERO_ADDRESS]; - const percentages = ['2000', '8000']; - return { - receivers, - percentages, - }; -}; - -export const getGenesisAaveAdmin = async (config: ICommonConfiguration) => { - const currentNetwork = BRE.network.name; - const targetAddress = getParamPerNetwork(config.AaveAdmin, currentNetwork); +export const getGenesisPoolAdmin = async ( + config: ICommonConfiguration +): Promise => { + const currentNetwork = DRE.network.name; + const targetAddress = getParamPerNetwork(config.PoolAdmin, currentNetwork); if (targetAddress) { return targetAddress; } const addressList = await Promise.all( - (await BRE.ethers.getSigners()).map((signer) => signer.getAddress()) + (await DRE.ethers.getSigners()).map((signer) => signer.getAddress()) ); - const addressIndex = config.AaveAdminIndex; + const addressIndex = config.PoolAdminIndex; + return addressList[addressIndex]; +}; + +export const getEmergencyAdmin = async ( + config: ICommonConfiguration +): Promise => { + const currentNetwork = DRE.network.name; + const targetAddress = getParamPerNetwork(config.EmergencyAdmin, currentNetwork); + if (targetAddress) { + return targetAddress; + } + const addressList = await Promise.all( + (await DRE.ethers.getSigners()).map((signer) => signer.getAddress()) + ); + const addressIndex = config.EmergencyAdminIndex; return addressList[addressIndex]; }; @@ -80,3 +87,16 @@ export const getATokenDomainSeparatorPerNetwork = ( network: eEthereumNetwork, config: ICommonConfiguration ): tEthereumAddress => getParamPerNetwork(config.ATokenDomainSeparator, network); + +export const getWethAddress = async (config: ICommonConfiguration) => { + const currentNetwork = DRE.network.name; + const wethAddress = getParamPerNetwork(config.WETH, currentNetwork); + if (wethAddress) { + return wethAddress; + } + if (currentNetwork.includes('main')) { + throw new Error('WETH not set at mainnet configuration.'); + } + const weth = await deployWETHMocked(); + return weth.address; +}; diff --git a/helpers/contracts-deployments.ts b/helpers/contracts-deployments.ts index 90561b28..0887e9b7 100644 --- a/helpers/contracts-deployments.ts +++ b/helpers/contracts-deployments.ts @@ -1,5 +1,5 @@ import {Contract} from 'ethers'; -import {BRE} from './misc-utils'; +import {DRE} from './misc-utils'; import { tEthereumAddress, eContractid, @@ -9,20 +9,21 @@ import { iMultiPoolsAssets, IReserveParams, PoolConfiguration, + eEthereumNetwork, } from './types'; import {MintableErc20 as MintableERC20} from '../types/MintableErc20'; -import {readArtifact} from '@nomiclabs/buidler/plugins'; import {MockContract} from 'ethereum-waffle'; import {getReservesConfigByPool} from './configuration'; import {getFirstSigner} from './contracts-getters'; import {ZERO_ADDRESS} from './constants'; import { - AaveProtocolTestHelpersFactory, + AaveProtocolDataProviderFactory, ATokenFactory, ATokensAndRatesHelperFactory, ChainlinkProxyPriceProviderFactory, DefaultReserveInterestRateStrategyFactory, + DelegationAwareATokenFactory, InitializableAdminUpgradeabilityProxyFactory, LendingPoolAddressesProviderFactory, LendingPoolAddressesProviderRegistryFactory, @@ -31,6 +32,7 @@ import { LendingPoolFactory, LendingPoolLibraryAddresses, LendingRateOracleFactory, + MintableDelegationErc20Factory, MintableErc20Factory, MockAggregatorFactory, MockATokenFactory, @@ -39,15 +41,30 @@ import { MockVariableDebtTokenFactory, PriceOracleFactory, ReserveLogicFactory, + SelfdestructTransferFactory, StableDebtTokenFactory, VariableDebtTokenFactory, WalletBalanceProviderFactory, + Weth9MockedFactory, + WethGatewayFactory, } from '../types'; -import {withSaveAndVerify, registerContractInJsonDb, linkBytecode} from './contracts-helpers'; +import { + withSaveAndVerify, + registerContractInJsonDb, + linkBytecode, + insertContractAddressInDb, +} from './contracts-helpers'; import {StableAndVariableTokensHelperFactory} from '../types/StableAndVariableTokensHelperFactory'; -import {MockStableDebtToken} from '../types/MockStableDebtToken'; -import {MockVariableDebtToken} from '../types/MockVariableDebtToken'; +import {MintableDelegationErc20} from '../types/MintableDelegationErc20'; +import {readArtifact as buidlerReadArtifact} from '@nomiclabs/buidler/plugins'; +import {HardhatRuntimeEnvironment} from 'hardhat/types'; +const readArtifact = async (id: string) => { + if (DRE.network.name === eEthereumNetwork.buidlerevm) { + return buidlerReadArtifact(DRE.config.paths.artifacts, id); + } + return (DRE as HardhatRuntimeEnvironment).artifacts.readArtifact(id); +}; export const deployLendingPoolAddressesProvider = async (verify?: boolean) => withSaveAndVerify( await new LendingPoolAddressesProviderFactory(await getFirstSigner()).deploy(), @@ -64,13 +81,21 @@ export const deployLendingPoolAddressesProviderRegistry = async (verify?: boolea verify ); -export const deployLendingPoolConfigurator = async (verify?: boolean) => - withSaveAndVerify( - await new LendingPoolConfiguratorFactory(await getFirstSigner()).deploy(), +export const deployLendingPoolConfigurator = async (verify?: boolean) => { + const lendingPoolConfiguratorImpl = await new LendingPoolConfiguratorFactory( + await getFirstSigner() + ).deploy(); + await insertContractAddressInDb( + eContractid.LendingPoolConfiguratorImpl, + lendingPoolConfiguratorImpl.address + ); + return withSaveAndVerify( + lendingPoolConfiguratorImpl, eContractid.LendingPoolConfigurator, [], verify ); +}; export const deployReserveLogicLibrary = async (verify?: boolean) => withSaveAndVerify( @@ -81,16 +106,13 @@ export const deployReserveLogicLibrary = async (verify?: boolean) => ); export const deployGenericLogic = async (reserveLogic: Contract, verify?: boolean) => { - const genericLogicArtifact = await readArtifact( - BRE.config.paths.artifacts, - eContractid.GenericLogic - ); + const genericLogicArtifact = await readArtifact(eContractid.GenericLogic); const linkedGenericLogicByteCode = linkBytecode(genericLogicArtifact, { [eContractid.ReserveLogic]: reserveLogic.address, }); - const genericLogicFactory = await BRE.ethers.getContractFactory( + const genericLogicFactory = await DRE.ethers.getContractFactory( genericLogicArtifact.abi, linkedGenericLogicByteCode ); @@ -104,17 +126,14 @@ export const deployValidationLogic = async ( genericLogic: Contract, verify?: boolean ) => { - const validationLogicArtifact = await readArtifact( - BRE.config.paths.artifacts, - eContractid.ValidationLogic - ); + const validationLogicArtifact = await readArtifact(eContractid.ValidationLogic); const linkedValidationLogicByteCode = linkBytecode(validationLogicArtifact, { [eContractid.ReserveLogic]: reserveLogic.address, [eContractid.GenericLogic]: genericLogic.address, }); - const validationLogicFactory = await BRE.ethers.getContractFactory( + const validationLogicFactory = await DRE.ethers.getContractFactory( validationLogicArtifact.abi, linkedValidationLogicByteCode ); @@ -150,12 +169,9 @@ export const deployAaveLibraries = async ( export const deployLendingPool = async (verify?: boolean) => { const libraries = await deployAaveLibraries(verify); - return withSaveAndVerify( - await new LendingPoolFactory(libraries, await getFirstSigner()).deploy(), - eContractid.LendingPool, - [], - verify - ); + const lendingPoolImpl = await new LendingPoolFactory(libraries, await getFirstSigner()).deploy(); + await insertContractAddressInDb(eContractid.LendingPoolImpl, lendingPoolImpl.address); + return withSaveAndVerify(lendingPoolImpl, eContractid.LendingPool, [], verify); }; export const deployPriceOracle = async (verify?: boolean) => @@ -183,7 +199,7 @@ export const deployMockAggregator = async (price: tStringTokenSmallUnits, verify ); export const deployChainlinkProxyPriceProvider = async ( - args: [tEthereumAddress[], tEthereumAddress[], tEthereumAddress], + args: [tEthereumAddress[], tEthereumAddress[], tEthereumAddress, tEthereumAddress], verify?: boolean ) => withSaveAndVerify( @@ -194,8 +210,15 @@ export const deployChainlinkProxyPriceProvider = async ( ); export const deployLendingPoolCollateralManager = async (verify?: boolean) => { + const collateralManagerImpl = await new LendingPoolCollateralManagerFactory( + await getFirstSigner() + ).deploy(); + await insertContractAddressInDb( + eContractid.LendingPoolCollateralManagerImpl, + collateralManagerImpl.address + ); return withSaveAndVerify( - await new LendingPoolCollateralManagerFactory(await getFirstSigner()).deploy(), + collateralManagerImpl, eContractid.LendingPoolCollateralManager, [], verify @@ -232,13 +255,13 @@ export const deployWalletBalancerProvider = async ( verify ); -export const deployAaveProtocolTestHelpers = async ( +export const deployAaveProtocolDataProvider = async ( addressesProvider: tEthereumAddress, verify?: boolean ) => withSaveAndVerify( - await new AaveProtocolTestHelpersFactory(await getFirstSigner()).deploy(addressesProvider), - eContractid.AaveProtocolTestHelpers, + await new AaveProtocolDataProviderFactory(await getFirstSigner()).deploy(addressesProvider), + eContractid.AaveProtocolDataProvider, [addressesProvider], verify ); @@ -254,6 +277,16 @@ export const deployMintableERC20 = async ( verify ); +export const deployMintableDelegationERC20 = async ( + args: [string, string, string], + verify?: boolean +): Promise => + withSaveAndVerify( + await new MintableDelegationErc20Factory(await getFirstSigner()).deploy(...args), + eContractid.MintableDelegationERC20, + args, + verify + ); export const deployDefaultReserveInterestRateStrategy = async ( args: [tEthereumAddress, string, string, string, string, string], verify: boolean @@ -313,6 +346,32 @@ export const deployGenericAToken = async ( ); }; +export const deployDelegationAwareAToken = async ( + [poolAddress, underlyingAssetAddress, name, symbol, incentivesController]: [ + tEthereumAddress, + tEthereumAddress, + string, + string, + tEthereumAddress + ], + verify: boolean +) => { + const args: [ + tEthereumAddress, + tEthereumAddress, + tEthereumAddress, + string, + string, + tEthereumAddress + ] = [poolAddress, underlyingAssetAddress, ZERO_ADDRESS, name, symbol, incentivesController]; + return withSaveAndVerify( + await new DelegationAwareATokenFactory(await getFirstSigner()).deploy(...args), + eContractid.AToken, + args, + verify + ); +}; + export const deployAllMockTokens = async (verify?: boolean) => { const tokens: {[symbol: string]: MockContract | MintableERC20} = {}; @@ -342,7 +401,7 @@ export const deployMockTokens = async (config: PoolConfiguration, verify?: boole const configData = config.ReservesConfig; - for (const tokenSymbol of Object.keys(config.ReserveSymbols)) { + for (const tokenSymbol of Object.keys(configData)) { tokens[tokenSymbol] = await deployMintableERC20( [ tokenSymbol, @@ -379,24 +438,43 @@ export const deployATokensAndRatesHelper = async ( verify ); +export const deployWETHGateway = async ( + args: [tEthereumAddress, tEthereumAddress], + verify?: boolean +) => + withSaveAndVerify( + await new WethGatewayFactory(await getFirstSigner()).deploy(...args), + eContractid.WETHGateway, + args, + verify + ); + export const deployMockStableDebtToken = async ( args: [tEthereumAddress, tEthereumAddress, string, string, tEthereumAddress], verify?: boolean ) => withSaveAndVerify( await new MockStableDebtTokenFactory(await getFirstSigner()).deploy(...args), - eContractid.ATokensAndRatesHelper, + eContractid.MockStableDebtToken, args, verify ); +export const deployWETHMocked = async (verify?: boolean) => + withSaveAndVerify( + await new Weth9MockedFactory(await getFirstSigner()).deploy(), + eContractid.WETHMocked, + [], + verify + ); + export const deployMockVariableDebtToken = async ( args: [tEthereumAddress, tEthereumAddress, string, string, tEthereumAddress], verify?: boolean ) => withSaveAndVerify( await new MockVariableDebtTokenFactory(await getFirstSigner()).deploy(...args), - eContractid.ATokensAndRatesHelper, + eContractid.MockVariableDebtToken, args, verify ); @@ -407,7 +485,15 @@ export const deployMockAToken = async ( ) => withSaveAndVerify( await new MockATokenFactory(await getFirstSigner()).deploy(...args), - eContractid.ATokensAndRatesHelper, + eContractid.MockAToken, args, verify ); + +export const deploySelfdestructTransferMock = async (verify?: boolean) => + withSaveAndVerify( + await new SelfdestructTransferFactory(await getFirstSigner()).deploy(), + eContractid.SelfdestructTransferMock, + [], + verify + ); diff --git a/helpers/contracts-getters.ts b/helpers/contracts-getters.ts index 7fa9fdee..fa220c28 100644 --- a/helpers/contracts-getters.ts +++ b/helpers/contracts-getters.ts @@ -1,11 +1,13 @@ import { - AaveProtocolTestHelpersFactory, + AaveProtocolDataProviderFactory, ATokenFactory, ATokensAndRatesHelperFactory, DefaultReserveInterestRateStrategyFactory, GenericLogicFactory, + InitializableAdminUpgradeabilityProxyFactory, LendingPoolAddressesProviderFactory, LendingPoolAddressesProviderRegistryFactory, + LendingPoolCollateralManagerFactory, LendingPoolConfiguratorFactory, LendingPoolFactory, LendingRateOracleFactory, @@ -16,21 +18,27 @@ import { MockVariableDebtTokenFactory, PriceOracleFactory, ReserveLogicFactory, + SelfdestructTransferFactory, StableAndVariableTokensHelperFactory, StableDebtTokenFactory, VariableDebtTokenFactory, + WalletBalanceProviderFactory, + Weth9Factory, + Weth9MockedFactory, + WethGatewayFactory, } from '../types'; import {Ierc20DetailedFactory} from '../types/Ierc20DetailedFactory'; +import {UpgradeabilityProxy} from '../types/UpgradeabilityProxy'; import {MockTokenMap} from './contracts-helpers'; -import {BRE, getDb} from './misc-utils'; +import {DRE, getDb} from './misc-utils'; import {eContractid, PoolConfiguration, tEthereumAddress, TokenContractId} from './types'; -export const getFirstSigner = async () => (await BRE.ethers.getSigners())[0]; +export const getFirstSigner = async () => (await DRE.ethers.getSigners())[0]; export const getLendingPoolAddressesProvider = async (address?: tEthereumAddress) => await LendingPoolAddressesProviderFactory.connect( address || - (await getDb().get(`${eContractid.LendingPoolAddressesProvider}.${BRE.network.name}`).value()) + (await getDb().get(`${eContractid.LendingPoolAddressesProvider}.${DRE.network.name}`).value()) .address, await getFirstSigner() ); @@ -38,7 +46,7 @@ export const getLendingPoolAddressesProvider = async (address?: tEthereumAddress export const getLendingPoolConfiguratorProxy = async (address?: tEthereumAddress) => { return await LendingPoolConfiguratorFactory.connect( address || - (await getDb().get(`${eContractid.LendingPoolConfigurator}.${BRE.network.name}`).value()) + (await getDb().get(`${eContractid.LendingPoolConfigurator}.${DRE.network.name}`).value()) .address, await getFirstSigner() ); @@ -47,55 +55,55 @@ export const getLendingPoolConfiguratorProxy = async (address?: tEthereumAddress export const getLendingPool = async (address?: tEthereumAddress) => await LendingPoolFactory.connect( address || - (await getDb().get(`${eContractid.LendingPool}.${BRE.network.name}`).value()).address, + (await getDb().get(`${eContractid.LendingPool}.${DRE.network.name}`).value()).address, await getFirstSigner() ); export const getPriceOracle = async (address?: tEthereumAddress) => await PriceOracleFactory.connect( address || - (await getDb().get(`${eContractid.PriceOracle}.${BRE.network.name}`).value()).address, + (await getDb().get(`${eContractid.PriceOracle}.${DRE.network.name}`).value()).address, await getFirstSigner() ); export const getAToken = async (address?: tEthereumAddress) => await ATokenFactory.connect( - address || (await getDb().get(`${eContractid.AToken}.${BRE.network.name}`).value()).address, + address || (await getDb().get(`${eContractid.AToken}.${DRE.network.name}`).value()).address, await getFirstSigner() ); export const getStableDebtToken = async (address?: tEthereumAddress) => await StableDebtTokenFactory.connect( address || - (await getDb().get(`${eContractid.StableDebtToken}.${BRE.network.name}`).value()).address, + (await getDb().get(`${eContractid.StableDebtToken}.${DRE.network.name}`).value()).address, await getFirstSigner() ); export const getVariableDebtToken = async (address?: tEthereumAddress) => await VariableDebtTokenFactory.connect( address || - (await getDb().get(`${eContractid.VariableDebtToken}.${BRE.network.name}`).value()).address, + (await getDb().get(`${eContractid.VariableDebtToken}.${DRE.network.name}`).value()).address, await getFirstSigner() ); export const getMintableErc20 = async (address: tEthereumAddress) => await MintableErc20Factory.connect( address || - (await getDb().get(`${eContractid.MintableERC20}.${BRE.network.name}`).value()).address, + (await getDb().get(`${eContractid.MintableERC20}.${DRE.network.name}`).value()).address, await getFirstSigner() ); export const getIErc20Detailed = async (address: tEthereumAddress) => await Ierc20DetailedFactory.connect( address || - (await getDb().get(`${eContractid.IERC20Detailed}.${BRE.network.name}`).value()).address, + (await getDb().get(`${eContractid.IERC20Detailed}.${DRE.network.name}`).value()).address, await getFirstSigner() ); -export const getAaveProtocolTestHelpers = async (address?: tEthereumAddress) => - await AaveProtocolTestHelpersFactory.connect( +export const getAaveProtocolDataProvider = async (address?: tEthereumAddress) => + await AaveProtocolDataProviderFactory.connect( address || - (await getDb().get(`${eContractid.AaveProtocolTestHelpers}.${BRE.network.name}`).value()) + (await getDb().get(`${eContractid.AaveProtocolDataProvider}.${DRE.network.name}`).value()) .address, await getFirstSigner() ); @@ -105,7 +113,7 @@ export const getInterestRateStrategy = async (address?: tEthereumAddress) => address || ( await getDb() - .get(`${eContractid.DefaultReserveInterestRateStrategy}.${BRE.network.name}`) + .get(`${eContractid.DefaultReserveInterestRateStrategy}.${DRE.network.name}`) .value() ).address, await getFirstSigner() @@ -114,7 +122,7 @@ export const getInterestRateStrategy = async (address?: tEthereumAddress) => export const getMockFlashLoanReceiver = async (address?: tEthereumAddress) => await MockFlashLoanReceiverFactory.connect( address || - (await getDb().get(`${eContractid.MockFlashLoanReceiver}.${BRE.network.name}`).value()) + (await getDb().get(`${eContractid.MockFlashLoanReceiver}.${DRE.network.name}`).value()) .address, await getFirstSigner() ); @@ -122,17 +130,17 @@ export const getMockFlashLoanReceiver = async (address?: tEthereumAddress) => export const getLendingRateOracle = async (address?: tEthereumAddress) => await LendingRateOracleFactory.connect( address || - (await getDb().get(`${eContractid.LendingRateOracle}.${BRE.network.name}`).value()).address, + (await getDb().get(`${eContractid.LendingRateOracle}.${DRE.network.name}`).value()).address, await getFirstSigner() ); export const getMockedTokens = async (config: PoolConfiguration) => { - const tokenSymbols = config.ReserveSymbols; + const tokenSymbols = Object.keys(config.ReservesConfig); const db = getDb(); const tokens: MockTokenMap = await tokenSymbols.reduce>( async (acc, tokenSymbol) => { const accumulator = await acc; - const address = db.get(`${tokenSymbol.toUpperCase()}.${BRE.network.name}`).value().address; + const address = db.get(`${tokenSymbol.toUpperCase()}.${DRE.network.name}`).value().address; accumulator[tokenSymbol] = await getMintableErc20(address); return Promise.resolve(acc); }, @@ -146,7 +154,7 @@ export const getAllMockedTokens = async () => { const tokens: MockTokenMap = await Object.keys(TokenContractId).reduce>( async (acc, tokenSymbol) => { const accumulator = await acc; - const address = db.get(`${tokenSymbol.toUpperCase()}.${BRE.network.name}`).value().address; + const address = db.get(`${tokenSymbol.toUpperCase()}.${DRE.network.name}`).value().address; accumulator[tokenSymbol] = await getMintableErc20(address); return Promise.resolve(acc); }, @@ -187,7 +195,7 @@ export const getLendingPoolAddressesProviderRegistry = async (address?: tEthereu address || ( await getDb() - .get(`${eContractid.LendingPoolAddressesProviderRegistry}.${BRE.network.name}`) + .get(`${eContractid.LendingPoolAddressesProviderRegistry}.${DRE.network.name}`) .value() ).address, await getFirstSigner() @@ -196,14 +204,14 @@ export const getLendingPoolAddressesProviderRegistry = async (address?: tEthereu export const getReserveLogic = async (address?: tEthereumAddress) => await ReserveLogicFactory.connect( address || - (await getDb().get(`${eContractid.ReserveLogic}.${BRE.network.name}`).value()).address, + (await getDb().get(`${eContractid.ReserveLogic}.${DRE.network.name}`).value()).address, await getFirstSigner() ); export const getGenericLogic = async (address?: tEthereumAddress) => await GenericLogicFactory.connect( address || - (await getDb().get(`${eContractid.GenericLogic}.${BRE.network.name}`).value()).address, + (await getDb().get(`${eContractid.GenericLogic}.${DRE.network.name}`).value()).address, await getFirstSigner() ); @@ -212,7 +220,7 @@ export const getStableAndVariableTokensHelper = async (address?: tEthereumAddres address || ( await getDb() - .get(`${eContractid.StableAndVariableTokensHelper}.${BRE.network.name}`) + .get(`${eContractid.StableAndVariableTokensHelper}.${DRE.network.name}`) .value() ).address, await getFirstSigner() @@ -221,27 +229,97 @@ export const getStableAndVariableTokensHelper = async (address?: tEthereumAddres export const getATokensAndRatesHelper = async (address?: tEthereumAddress) => await ATokensAndRatesHelperFactory.connect( address || - (await getDb().get(`${eContractid.ATokensAndRatesHelper}.${BRE.network.name}`).value()) + (await getDb().get(`${eContractid.ATokensAndRatesHelper}.${DRE.network.name}`).value()) .address, await getFirstSigner() ); +export const getWETHGateway = async (address?: tEthereumAddress) => + await WethGatewayFactory.connect( + address || + (await getDb().get(`${eContractid.WETHGateway}.${DRE.network.name}`).value()).address, + await getFirstSigner() + ); + +export const getWETHMocked = async (address?: tEthereumAddress) => + await Weth9MockedFactory.connect( + address || (await getDb().get(`${eContractid.WETHMocked}.${DRE.network.name}`).value()).address, + await getFirstSigner() + ); + export const getMockAToken = async (address?: tEthereumAddress) => await MockATokenFactory.connect( - address || (await getDb().get(`${eContractid.MockAToken}.${BRE.network.name}`).value()).address, + address || (await getDb().get(`${eContractid.MockAToken}.${DRE.network.name}`).value()).address, await getFirstSigner() ); export const getMockVariableDebtToken = async (address?: tEthereumAddress) => await MockVariableDebtTokenFactory.connect( address || - (await getDb().get(`${eContractid.MockVariableDebtToken}.${BRE.network.name}`).value()) + (await getDb().get(`${eContractid.MockVariableDebtToken}.${DRE.network.name}`).value()) .address, await getFirstSigner() ); + export const getMockStableDebtToken = async (address?: tEthereumAddress) => await MockStableDebtTokenFactory.connect( address || - (await getDb().get(`${eContractid.MockStableDebtToken}.${BRE.network.name}`).value()).address, + (await getDb().get(`${eContractid.MockStableDebtToken}.${DRE.network.name}`).value()).address, await getFirstSigner() ); + +export const getSelfdestructTransferMock = async (address?: tEthereumAddress) => + await SelfdestructTransferFactory.connect( + address || + (await getDb().get(`${eContractid.SelfdestructTransferMock}.${DRE.network.name}`).value()) + .address, + await getFirstSigner() + ); + +export const getProxy = async (address: tEthereumAddress) => + await InitializableAdminUpgradeabilityProxyFactory.connect(address, await getFirstSigner()); + +export const getLendingPoolImpl = async (address?: tEthereumAddress) => + await LendingPoolFactory.connect( + address || + (await getDb().get(`${eContractid.LendingPoolImpl}.${DRE.network.name}`).value()).address, + await getFirstSigner() + ); + +export const getLendingPoolConfiguratorImpl = async (address?: tEthereumAddress) => + await LendingPoolConfiguratorFactory.connect( + address || + (await getDb().get(`${eContractid.LendingPoolConfiguratorImpl}.${DRE.network.name}`).value()) + .address, + await getFirstSigner() + ); + +export const getLendingPoolCollateralManagerImpl = async (address?: tEthereumAddress) => + await LendingPoolCollateralManagerFactory.connect( + address || + ( + await getDb() + .get(`${eContractid.LendingPoolCollateralManagerImpl}.${DRE.network.name}`) + .value() + ).address, + await getFirstSigner() + ); + +export const getWalletProvider = async (address?: tEthereumAddress) => + await WalletBalanceProviderFactory.connect( + address || + (await getDb().get(`${eContractid.WalletBalanceProvider}.${DRE.network.name}`).value()) + .address, + await getFirstSigner() + ); + +export const getLendingPoolCollateralManager = async (address?: tEthereumAddress) => + await LendingPoolCollateralManagerFactory.connect( + address || + (await getDb().get(`${eContractid.LendingPoolCollateralManager}.${DRE.network.name}`).value()) + .address, + await getFirstSigner() + ); + +export const getAddressById = async (id: string) => + (await getDb().get(`${id}.${DRE.network.name}`).value()).address; diff --git a/helpers/contracts-helpers.ts b/helpers/contracts-helpers.ts index cbe2b69c..ba8ee5d1 100644 --- a/helpers/contracts-helpers.ts +++ b/helpers/contracts-helpers.ts @@ -2,7 +2,7 @@ import {Contract, Signer, utils, ethers} from 'ethers'; import {signTypedData_v4} from 'eth-sig-util'; import {fromRpcSig, ECDSASignature} from 'ethereumjs-util'; import BigNumber from 'bignumber.js'; -import {getDb, BRE, waitForTx} from './misc-utils'; +import {getDb, DRE, waitForTx} from './misc-utils'; import { tEthereumAddress, eContractid, @@ -13,15 +13,16 @@ import { iParamsPerPool, } from './types'; import {MintableErc20 as MintableERC20} from '../types/MintableErc20'; -import {Artifact} from '@nomiclabs/buidler/types'; +import {Artifact} from 'hardhat/types'; +import {Artifact as BuidlerArtifact} from '@nomiclabs/buidler/types'; import {verifyContract} from './etherscan-verification'; import {getIErc20Detailed} from './contracts-getters'; export type MockTokenMap = {[symbol: string]: MintableERC20}; export const registerContractInJsonDb = async (contractId: string, contractInstance: Contract) => { - const currentNetwork = BRE.network.name; - if (currentNetwork !== 'buidlerevm' && !currentNetwork.includes('coverage')) { + const currentNetwork = DRE.network.name; + if (currentNetwork !== 'hardhat' && !currentNetwork.includes('coverage')) { console.log(`*** ${contractId} ***\n`); console.log(`Network: ${currentNetwork}`); console.log(`tx: ${contractInstance.deployTransaction.hash}`); @@ -43,19 +44,26 @@ export const registerContractInJsonDb = async (contractId: string, contractInsta export const insertContractAddressInDb = async (id: eContractid, address: tEthereumAddress) => await getDb() - .set(`${id}.${BRE.network.name}`, { + .set(`${id}.${DRE.network.name}`, { + address, + }) + .write(); + +export const rawInsertContractAddressInDb = async (id: string, address: tEthereumAddress) => + await getDb() + .set(`${id}.${DRE.network.name}`, { address, }) .write(); export const getEthersSigners = async (): Promise => - await Promise.all(await BRE.ethers.getSigners()); + await Promise.all(await DRE.ethers.getSigners()); export const getEthersSignersAddresses = async (): Promise => - await Promise.all((await BRE.ethers.getSigners()).map((signer) => signer.getAddress())); + await Promise.all((await DRE.ethers.getSigners()).map((signer) => signer.getAddress())); export const getCurrentBlock = async () => { - return BRE.ethers.provider.getBlockNumber(); + return DRE.ethers.provider.getBlockNumber(); }; export const decodeAbiNumber = (data: string): number => @@ -65,7 +73,7 @@ export const deployContract = async ( contractName: string, args: any[] ): Promise => { - const contract = (await (await BRE.ethers.getContractFactory(contractName)).deploy( + const contract = (await (await DRE.ethers.getContractFactory(contractName)).deploy( ...args )) as ContractType; await waitForTx(contract.deployTransaction); @@ -82,7 +90,7 @@ export const withSaveAndVerify = async ( await waitForTx(instance.deployTransaction); await registerContractInJsonDb(id, instance); if (verify) { - await verifyContract(id, instance.address, args); + await verifyContract(instance.address, args); } return instance; }; @@ -90,9 +98,9 @@ export const withSaveAndVerify = async ( export const getContract = async ( contractName: string, address: string -): Promise => (await BRE.ethers.getContractAt(contractName, address)) as ContractType; +): Promise => (await DRE.ethers.getContractAt(contractName, address)) as ContractType; -export const linkBytecode = (artifact: Artifact, libraries: any) => { +export const linkBytecode = (artifact: BuidlerArtifact | Artifact, libraries: any) => { let bytecode = artifact.bytecode; for (const [fileName, fileReferences] of Object.entries(artifact.linkReferences)) { @@ -124,14 +132,14 @@ export const getParamPerNetwork = ( return coverage; case eEthereumNetwork.buidlerevm: return buidlerevm; + case eEthereumNetwork.hardhat: + return buidlerevm; case eEthereumNetwork.kovan: return kovan; case eEthereumNetwork.ropsten: return ropsten; case eEthereumNetwork.main: return main; - default: - return main; } }; diff --git a/helpers/etherscan-verification.ts b/helpers/etherscan-verification.ts index a7393f0a..902cb2fe 100644 --- a/helpers/etherscan-verification.ts +++ b/helpers/etherscan-verification.ts @@ -1,41 +1,31 @@ import {exit} from 'process'; import fs from 'fs'; -import globby from 'globby'; import {file} from 'tmp-promise'; -import {BRE} from './misc-utils'; - -const listSolidityFiles = (dir: string) => globby(`${dir}/**/*.sol`); +import {DRE} from './misc-utils'; const fatalErrors = [ `The address provided as argument contains a contract, but its bytecode`, `Daily limit of 100 source code submissions reached`, + `has no bytecode. Is the contract deployed to this network`, + `The constructor for`, ]; +const okErrors = [`Contract source code already verified`]; + +const unableVerifyError = 'Fail - Unable to verify'; + export const SUPPORTED_ETHERSCAN_NETWORKS = ['main', 'ropsten', 'kovan']; -export const getEtherscanPath = async (contractName: string) => { - const paths = await listSolidityFiles(BRE.config.paths.sources); - const path = paths.find((p) => p.includes(contractName)); - if (!path) { - throw new Error( - `Contract path not found for ${contractName}. Check if smart contract file is equal to contractName input.` - ); - } - - return `${path}:${contractName}`; -}; - function delay(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); } export const verifyContract = async ( - contractName: string, address: string, constructorArguments: (string | string[])[], libraries?: string ) => { - const currentNetwork = BRE.network.name; + const currentNetwork = DRE.network.name; if (!process.env.ETHERSCAN_KEY) { throw Error('Missing process.env.ETHERSCAN_KEY.'); @@ -45,14 +35,13 @@ export const verifyContract = async ( `Current network ${currentNetwork} not supported. Please change to one of the next networks: ${SUPPORTED_ETHERSCAN_NETWORKS.toString()}` ); } - const etherscanPath = await getEtherscanPath(contractName); try { console.log( '[ETHERSCAN][WARNING] Delaying Etherscan verification due their API can not find newly deployed contracts' ); const msDelay = 3000; - const times = 60; + const times = 4; // Write a temporal file to host complex parameters for buidler-etherscan https://github.com/nomiclabs/buidler/tree/development/packages/buidler-etherscan#complex-arguments const {fd, path, cleanup} = await file({ prefix: 'verify-params-', @@ -61,10 +50,10 @@ export const verifyContract = async ( fs.writeSync(fd, `module.exports = ${JSON.stringify([...constructorArguments])};`); const params = { - contractName: etherscanPath, address: address, libraries, constructorArgs: path, + relatedSources: true, }; await runTaskWithRetry('verify', params, times, msDelay, cleanup); } catch (error) {} @@ -81,8 +70,13 @@ export const runTaskWithRetry = async ( await delay(msDelay); try { - if (times) { - await BRE.run(task, params); + if (times > 1) { + await DRE.run(task, params); + cleanup(); + } else if (times === 1) { + console.log('[ETHERSCAN][WARNING] Trying to verify via uploading all sources.'); + delete params.relatedSources; + await DRE.run(task, params); cleanup(); } else { cleanup(); @@ -92,22 +86,32 @@ export const runTaskWithRetry = async ( } } catch (error) { counter--; - console.info(`[ETHERSCAN][[INFO] Retrying attemps: ${counter}.`); - console.error('[ETHERSCAN][[ERROR]', error.message); - if (fatalErrors.some((fatalError) => error.message.includes(fatalError))) { - console.error( - '[ETHERSCAN][[ERROR] Fatal error detected, skip retries and resume deployment.' - ); + if (okErrors.some((okReason) => error.message.includes(okReason))) { + console.info('[ETHERSCAN][INFO] Skipping due OK response: ', error.message); return; } + if (fatalErrors.some((fatalError) => error.message.includes(fatalError))) { + console.error( + '[ETHERSCAN][ERROR] Fatal error detected, skip retries and resume deployment.', + error.message + ); + return; + } + console.error('[ETHERSCAN][ERROR]', error.message); + console.log(); + console.info(`[ETHERSCAN][[INFO] Retrying attemps: ${counter}.`); + if (error.message.includes(unableVerifyError)) { + console.log('[ETHERSCAN][WARNING] Trying to verify via uploading all sources.'); + delete params.relatedSources; + } await runTaskWithRetry(task, params, counter, msDelay, cleanup); } }; export const checkVerification = () => { - const currentNetwork = BRE.network.name; + const currentNetwork = DRE.network.name; if (!process.env.ETHERSCAN_KEY) { console.error('Missing process.env.ETHERSCAN_KEY.'); exit(3); diff --git a/helpers/init-helpers.ts b/helpers/init-helpers.ts index b33e3b9a..2391f26f 100644 --- a/helpers/init-helpers.ts +++ b/helpers/init-helpers.ts @@ -1,6 +1,6 @@ -import {iMultiPoolsAssets, IReserveParams, tEthereumAddress} from './types'; +import {eContractid, iMultiPoolsAssets, IReserveParams, tEthereumAddress} from './types'; import {LendingPoolConfigurator} from '../types/LendingPoolConfigurator'; -import {AaveProtocolTestHelpers} from '../types/AaveProtocolTestHelpers'; +import {AaveProtocolDataProvider} from '../types/AaveProtocolDataProvider'; import { deployATokensAndRatesHelper, deployStableAndVariableTokensHelper, @@ -11,6 +11,7 @@ import { getLendingPoolAddressesProvider, getStableAndVariableTokensHelper, } from './contracts-getters'; +import {insertContractAddressInDb, rawInsertContractAddressInDb} from './contracts-helpers'; export const initReservesByHelper = async ( reservesParams: iMultiPoolsAssets, @@ -24,7 +25,7 @@ export const initReservesByHelper = async ( const addressProvider = await getLendingPoolAddressesProvider(); // Set aTokenAndRatesDeployer as temporal admin - await waitForTx(await addressProvider.setAaveAdmin(atokenAndRatesDeployer.address)); + await waitForTx(await addressProvider.setPoolAdmin(atokenAndRatesDeployer.address)); // CHUNK CONFIGURATION const tokensChunks = 4; @@ -89,12 +90,15 @@ export const initReservesByHelper = async ( reservesDecimals.push(reserveDecimals); } - // Deploy stable and variable deployers + // Deploy stable and variable deployers and save implementations const tx1 = await waitForTx( await stableAndVariableDeployer.initDeployment(tokens, symbols, incentivesController) ); - - // Deploy atokens and rate strategies + tx1.events?.forEach((event, index) => { + rawInsertContractAddressInDb(`stableDebt${symbols[index]}`, event?.args?.stableToken); + rawInsertContractAddressInDb(`variableDebt${symbols[index]}`, event?.args?.variableToken); + }); + // Deploy atokens and rate strategies and save implementations const tx2 = await waitForTx( await atokenAndRatesDeployer.initDeployment( tokens, @@ -103,6 +107,11 @@ export const initReservesByHelper = async ( incentivesController ) ); + tx2.events?.forEach((event, index) => { + rawInsertContractAddressInDb(`a${symbols[index]}`, event?.args?.aToken); + rawInsertContractAddressInDb(`strategy${symbols[index]}`, event?.args?.strategy); + }); + console.log(` - Deployed aToken, DebtTokens and Strategy for: ${symbols.join(', ')} `); const stableTokens: string[] = tx1.events?.map((e) => e.args?.stableToken) || []; const variableTokens: string[] = tx1.events?.map((e) => e.args?.variableToken) || []; @@ -140,7 +149,7 @@ export const initReservesByHelper = async ( } // Set deployer back as admin - await waitForTx(await addressProvider.setAaveAdmin(admin)); + await waitForTx(await addressProvider.setPoolAdmin(admin)); }; export const getPairsTokenAggregator = ( @@ -173,7 +182,7 @@ export const getPairsTokenAggregator = ( export const enableReservesToBorrowByHelper = async ( reservesParams: iMultiPoolsAssets, tokenAddresses: {[symbol: string]: tEthereumAddress}, - helpers: AaveProtocolTestHelpers, + helpers: AaveProtocolDataProvider, admin: tEthereumAddress ) => { const addressProvider = await getLendingPoolAddressesProvider(); @@ -207,7 +216,7 @@ export const enableReservesToBorrowByHelper = async ( } if (tokens.length) { // Set aTokenAndRatesDeployer as temporal admin - await waitForTx(await addressProvider.setAaveAdmin(atokenAndRatesDeployer.address)); + await waitForTx(await addressProvider.setPoolAdmin(atokenAndRatesDeployer.address)); // Deploy init per chunks const stableChunks = 20; @@ -233,14 +242,14 @@ export const enableReservesToBorrowByHelper = async ( console.log(` - Init for: ${chunkedSymbols[chunkIndex].join(', ')}`); } // Set deployer back as admin - await waitForTx(await addressProvider.setAaveAdmin(admin)); + await waitForTx(await addressProvider.setPoolAdmin(admin)); } }; export const enableReservesAsCollateralByHelper = async ( reservesParams: iMultiPoolsAssets, tokenAddresses: {[symbol: string]: tEthereumAddress}, - helpers: AaveProtocolTestHelpers, + helpers: AaveProtocolDataProvider, admin: tEthereumAddress ) => { const addressProvider = await getLendingPoolAddressesProvider(); @@ -280,7 +289,7 @@ export const enableReservesAsCollateralByHelper = async ( } if (tokens.length) { // Set aTokenAndRatesDeployer as temporal admin - await waitForTx(await addressProvider.setAaveAdmin(atokenAndRatesDeployer.address)); + await waitForTx(await addressProvider.setPoolAdmin(atokenAndRatesDeployer.address)); // Deploy init per chunks const enableChunks = 20; @@ -304,6 +313,6 @@ export const enableReservesAsCollateralByHelper = async ( console.log(` - Init for: ${chunkedSymbols[chunkIndex].join(', ')}`); } // Set deployer back as admin - await waitForTx(await addressProvider.setAaveAdmin(admin)); + await waitForTx(await addressProvider.setPoolAdmin(admin)); } }; diff --git a/helpers/misc-utils.ts b/helpers/misc-utils.ts index 3df0e7d8..0356fef4 100644 --- a/helpers/misc-utils.ts +++ b/helpers/misc-utils.ts @@ -4,9 +4,8 @@ import low from 'lowdb'; import FileSync from 'lowdb/adapters/FileSync'; import {WAD} from './constants'; import {Wallet, ContractTransaction} from 'ethers'; +import {HardhatRuntimeEnvironment} from 'hardhat/types'; import {BuidlerRuntimeEnvironment} from '@nomiclabs/buidler/types'; -import path from 'path'; -import fs from 'fs'; export const toWad = (value: string | number) => new BigNumber(value).times(WAD).toFixed(); @@ -15,9 +14,11 @@ export const stringToBigNumber = (amount: string): BigNumber => new BigNumber(am export const getDb = () => low(new FileSync('./deployed-contracts.json')); -export let BRE: BuidlerRuntimeEnvironment = {} as BuidlerRuntimeEnvironment; -export const setBRE = (_BRE: BuidlerRuntimeEnvironment) => { - BRE = _BRE; +export let DRE: + | HardhatRuntimeEnvironment + | BuidlerRuntimeEnvironment = {} as HardhatRuntimeEnvironment; +export const setDRE = (_DRE: HardhatRuntimeEnvironment | BuidlerRuntimeEnvironment) => { + DRE = _DRE; }; export const sleep = (milliseconds: number) => { @@ -26,21 +27,21 @@ export const sleep = (milliseconds: number) => { export const createRandomAddress = () => Wallet.createRandom().address; -export const evmSnapshot = async () => await BRE.ethereum.send('evm_snapshot', []); +export const evmSnapshot = async () => await DRE.ethers.provider.send('evm_snapshot', []); -export const evmRevert = async (id: string) => BRE.ethereum.send('evm_revert', [id]); +export const evmRevert = async (id: string) => DRE.ethers.provider.send('evm_revert', [id]); export const timeLatest = async () => { - const block = await BRE.ethers.provider.getBlock('latest'); + const block = await DRE.ethers.provider.getBlock('latest'); return new BigNumber(block.timestamp); }; export const advanceBlock = async (timestamp: number) => - await BRE.ethers.provider.send('evm_mine', [timestamp]); + await DRE.ethers.provider.send('evm_mine', [timestamp]); export const increaseTime = async (secondsToIncrease: number) => { - await BRE.ethers.provider.send('evm_increaseTime', [secondsToIncrease]); - await BRE.ethers.provider.send('evm_mine', []); + await DRE.ethers.provider.send('evm_increaseTime', [secondsToIncrease]); + await DRE.ethers.provider.send('evm_mine', []); }; export const waitForTx = async (tx: ContractTransaction) => await tx.wait(1); @@ -62,3 +63,26 @@ export const chunk = (arr: Array, chunkSize: number): Array> => { [] ); }; + +interface DbEntry { + [network: string]: { + deployer: string; + address: string; + }; +} + +export const printContracts = () => { + const network = DRE.network.name; + const db = getDb(); + console.log('Contracts deployed at', network); + console.log('---------------------------------'); + + const entries = Object.entries(db.getState()).filter(([_k, value]) => !!value[network]); + + const contractsPrint = entries.map( + ([key, value]: [string, DbEntry]) => `${key}: ${value[network].address}` + ); + + console.log('N# Contracts:', entries.length); + console.log(contractsPrint.join('\n'), '\n'); +}; diff --git a/helpers/types.ts b/helpers/types.ts index 7c4da1f4..c9aac797 100644 --- a/helpers/types.ts +++ b/helpers/types.ts @@ -1,5 +1,4 @@ import BigNumber from 'bignumber.js'; -import {MockTokenMap} from './contracts-helpers'; export interface SymbolMap { [symbol: string]: T; @@ -11,6 +10,7 @@ export enum eEthereumNetwork { ropsten = 'ropsten', main = 'main', coverage = 'coverage', + hardhat = 'hardhat', } export enum EthereumNetworkNames { @@ -28,6 +28,7 @@ export enum eContractid { Example = 'Example', LendingPoolAddressesProvider = 'LendingPoolAddressesProvider', MintableERC20 = 'MintableERC20', + MintableDelegationERC20 = 'MintableDelegationERC20', LendingPoolAddressesProviderRegistry = 'LendingPoolAddressesProviderRegistry', LendingPoolParametersProvider = 'LendingPoolParametersProvider', LendingPoolConfigurator = 'LendingPoolConfigurator', @@ -47,9 +48,10 @@ export enum eContractid { WalletBalanceProvider = 'WalletBalanceProvider', AToken = 'AToken', MockAToken = 'MockAToken', + DelegationAwareAToken = 'DelegationAwareAToken', MockStableDebtToken = 'MockStableDebtToken', MockVariableDebtToken = 'MockVariableDebtToken', - AaveProtocolTestHelpers = 'AaveProtocolTestHelpers', + AaveProtocolDataProvider = 'AaveProtocolDataProvider', IERC20Detailed = 'IERC20Detailed', StableDebtToken = 'StableDebtToken', VariableDebtToken = 'VariableDebtToken', @@ -57,6 +59,14 @@ export enum eContractid { TokenDistributor = 'TokenDistributor', StableAndVariableTokensHelper = 'StableAndVariableTokensHelper', ATokensAndRatesHelper = 'ATokensAndRatesHelper', + UiPoolDataProvider = 'UiPoolDataProvider', + WETHGateway = 'WETHGateway', + WETH = 'WETH', + WETHMocked = 'WETHMocked', + SelfdestructTransferMock = 'SelfdestructTransferMock', + LendingPoolImpl = 'LendingPoolImpl', + LendingPoolConfiguratorImpl = 'LendingPoolConfiguratorImpl', + LendingPoolCollateralManagerImpl = 'LendingPoolCollateralManagerImpl', } /* @@ -72,7 +82,11 @@ export enum eContractid { * - P = Pausable */ export enum ProtocolErrors { - VL_AMOUNT_NOT_GREATER_THAN_0 = '1', // 'Amount must be greater than 0' + //common errors + CALLER_NOT_POOL_ADMIN = '33', // 'The caller must be the pool admin' + + //contract specific errors + VL_INVALID_AMOUNT = '1', // 'Amount must be greater than 0' VL_NO_ACTIVE_RESERVE = '2', // 'Action requires an active reserve' VL_RESERVE_FROZEN = '3', // 'Action requires an unfrozen reserve' VL_CURRENT_AVAILABLE_LIQUIDITY_NOT_ENOUGH = '4', // 'The current liquidity is not enough' @@ -98,13 +112,12 @@ export enum ProtocolErrors { LP_NOT_ENOUGH_LIQUIDITY_TO_BORROW = '24', // 'There is not enough liquidity available to borrow' LP_REQUESTED_AMOUNT_TOO_SMALL = '25', // 'The requested amount is too small for a FlashLoan.' LP_INCONSISTENT_PROTOCOL_ACTUAL_BALANCE = '26', // 'The actual balance of the protocol is inconsistent' - LP_CALLER_NOT_LENDING_POOL_CONFIGURATOR = '27', // 'The actual balance of the protocol is inconsistent' + LP_CALLER_NOT_LENDING_POOL_CONFIGURATOR = '27', // 'The caller is not the lending pool configurator' LP_INCONSISTENT_FLASHLOAN_PARAMS = '28', AT_CALLER_MUST_BE_LENDING_POOL = '29', // 'The caller of this function must be a lending pool' AT_CANNOT_GIVE_ALLVWANCE_TO_HIMSELF = '30', // 'User cannot give allowance to himself' AT_TRANSFER_AMOUNT_NOT_GT_0 = '31', // 'Transferred amount needs to be greater than zero' RL_RESERVE_ALREADY_INITIALIZED = '32', // 'Reserve has already been initialized' - LPC_CALLER_NOT_AAVE_ADMIN = '33', // 'The caller must be the aave admin' LPC_RESERVE_LIQUIDITY_NOT_0 = '34', // 'The liquidity of the reserve needs to be 0' LPC_INVALID_ATOKEN_POOL_ADDRESS = '35', // 'The liquidity of the reserve needs to be 0' LPC_INVALID_STABLE_DEBT_TOKEN_POOL_ADDRESS = '36', // 'The liquidity of the reserve needs to be 0' @@ -112,6 +125,7 @@ export enum ProtocolErrors { LPC_INVALID_STABLE_DEBT_TOKEN_UNDERLYING_ADDRESS = '38', // 'The liquidity of the reserve needs to be 0' LPC_INVALID_VARIABLE_DEBT_TOKEN_UNDERLYING_ADDRESS = '39', // 'The liquidity of the reserve needs to be 0' LPC_INVALID_ADDRESSES_PROVIDER_ID = '40', // 'The liquidity of the reserve needs to be 0' + LPC_CALLER_NOT_EMERGENCY_ADMIN = '76', // 'The caller must be the emergencya admin' LPAPR_PROVIDER_NOT_REGISTERED = '41', // 'Provider is not registered' LPCM_HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '42', // 'Health factor is not below the threshold' LPCM_COLLATERAL_CANNOT_BE_LIQUIDATED = '43', // 'The collateral chosen cannot be liquidated' @@ -130,7 +144,7 @@ export enum ProtocolErrors { AT_INVALID_MINT_AMOUNT = '56', //invalid amount to mint LP_FAILED_REPAY_WITH_COLLATERAL = '57', AT_INVALID_BURN_AMOUNT = '58', //invalid amount to burn - LP_BORROW_ALLOWANCE_ARE_NOT_ENOUGH = '59', // User borrows on behalf, but allowance are too small + LP_BORROW_ALLOWANCE_NOT_ENOUGH = '59', // User borrows on behalf, but allowance are too small LP_FAILED_COLLATERAL_SWAP = '60', LP_INVALID_EQUAL_ASSETS_TO_SWAP = '61', LP_REENTRANCY_NOT_ALLOWED = '62', @@ -171,7 +185,7 @@ export interface iAssetBase { USDC: T; USDT: T; SUSD: T; - LEND: T; + AAVE: T; BAT: T; REP: T; MKR: T; @@ -182,8 +196,11 @@ export interface iAssetBase { ZRX: T; SNX: T; BUSD: T; - + YFI: T; + UNI: T; USD: T; + REN: T; + ENJ: T; UNI_DAI_ETH: T; UNI_USDC_ETH: T; @@ -204,7 +221,7 @@ export type iAavePoolAssets = Pick< | 'USDC' | 'USDT' | 'SUSD' - | 'LEND' + | 'AAVE' | 'BAT' | 'REP' | 'MKR' @@ -216,6 +233,10 @@ export type iAavePoolAssets = Pick< | 'SNX' | 'BUSD' | 'WETH' + | 'YFI' + | 'UNI' + | 'REN' + | 'ENJ' >; export type iUniAssets = Pick< @@ -245,7 +266,7 @@ export type iAssetAggregatorBase = iAssetsWithoutETH; export enum TokenContractId { DAI = 'DAI', - LEND = 'LEND', + AAVE = 'AAVE', TUSD = 'TUSD', BAT = 'BAT', WETH = 'WETH', @@ -259,9 +280,13 @@ export enum TokenContractId { KNC = 'KNC', MANA = 'MANA', REP = 'REP', + REN = 'REN', SNX = 'SNX', BUSD = 'BUSD', USD = 'USD', + YFI = 'YFI', + UNI = 'UNI', + ENJ = 'ENJ', UNI_DAI_ETH = 'UNI_DAI_ETH', UNI_USDC_ETH = 'UNI_USDC_ETH', UNI_SETH_ETH = 'UNI_SETH_ETH', @@ -298,6 +323,7 @@ export interface iParamsPerNetwork { [eEthereumNetwork.kovan]: T; [eEthereumNetwork.ropsten]: T; [eEthereumNetwork.main]: T; + [eEthereumNetwork.hardhat]: T; } export interface iParamsPerPool { @@ -357,7 +383,6 @@ export interface ILendingRate { export interface ICommonConfiguration { ConfigName: string; ProviderId: number; - ReserveSymbols: string[]; ProtocolGlobalParams: IProtocolGlobalConfig; Mocks: IMocksConfig; ProviderRegistry: iParamsPerNetwork; @@ -367,12 +392,15 @@ export interface ICommonConfiguration { ChainlinkProxyPriceProvider: iParamsPerNetwork; FallbackOracle: iParamsPerNetwork; ChainlinkAggregator: iParamsPerNetwork; - AaveAdmin: iParamsPerNetwork; - AaveAdminIndex: number; + PoolAdmin: iParamsPerNetwork; + PoolAdminIndex: number; + EmergencyAdmin: iParamsPerNetwork; + EmergencyAdminIndex: number; ReserveAssets: iParamsPerNetwork>; ReservesConfig: iMultiPoolsAssets; ATokenDomainSeparator: iParamsPerNetwork; ProxyPriceProvider: iParamsPerNetwork; + WETH: iParamsPerNetwork; } export interface IAaveConfiguration extends ICommonConfiguration { diff --git a/package-lock.json b/package-lock.json index de4f3707..602312e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1109,6 +1109,22 @@ } } }, + "@nomiclabs/hardhat-ethers": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.0.tgz", + "integrity": "sha512-fIi6XP9PgKqwSNVcLDr6S5hvGlc21PendaLD5eGdXEXc9aYQ0OJX8Mk3evs+p78x7W9n9U3ZcKtTiGc1+YScDw==", + "dev": true + }, + "@nomiclabs/hardhat-waffle": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.0.tgz", + "integrity": "sha512-CnG9JC0rgqa68LTgyETxBUEWYAovvNGVs5abqaXjG80eF7iMLjDjM8IjOM87siAaxaxFCf6VBMJmtueqVq7jZw==", + "dev": true, + "requires": { + "@types/sinon-chai": "^3.2.3", + "@types/web3": "1.0.19" + } + }, "@openzeppelin/contracts": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.1.0.tgz", @@ -2246,6 +2262,12 @@ "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", @@ -2888,15 +2910,6 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "buidler-gas-reporter": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/buidler-gas-reporter/-/buidler-gas-reporter-0.1.4.tgz", - "integrity": "sha512-objSu/tGggxKDmlpZViM9uEKRSo7vXxBsPv+vXegre1AWapJXQNfJPtBmrNvnT5Ixl8pecWSRXsfO95nJAn4yw==", - "dev": true, - "requires": { - "eth-gas-reporter": "^0.2.18" - } - }, "buidler-typechain": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/buidler-typechain/-/buidler-typechain-0.1.1.tgz", @@ -3763,6 +3776,12 @@ "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", "dev": true }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "dev": true + }, "download": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", @@ -4108,9 +4127,9 @@ } }, "eth-gas-reporter": { - "version": "0.2.18", - "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.18.tgz", - "integrity": "sha512-P6LQ1QmU9bqU4zmd01Ws/b2EWAD5rT771U0wyJ/c+fKE6RdE9ks8KzjdR1zjosV2uilMfqVTtrBrXveCOnaTyQ==", + "version": "0.2.19", + "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.19.tgz", + "integrity": "sha512-yQmbAa6O9/Yl/syNml2A0R+ZLQnJ9m9jogFXHzjMWVBMUVnAcEskOVyxaMYddkclZdYIMxE99tQy830C2jLsAQ==", "dev": true, "requires": { "@ethersproject/abi": "^5.0.0-beta.146", @@ -4131,9 +4150,9 @@ }, "dependencies": { "@solidity-parser/parser": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.8.1.tgz", - "integrity": "sha512-DF7H6T8I4lo2IZOE2NZwt3631T8j1gjpQLjmvY2xBNK50c4ltslR4XPKwT6RkeSd4+xCAK0GHC/k7sbRDBE4Yw==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.8.2.tgz", + "integrity": "sha512-8LySx3qrNXPgB5JiULfG10O3V7QTxI/TLzSw5hFQhXWSkVxZBAv4rZQ0sYgLEbc8g3L2lmnujj1hKul38Eu5NQ==", "dev": true }, "elliptic": { @@ -5116,6 +5135,12 @@ "integrity": "sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s=", "dev": true }, + "follow-redirects": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "dev": true + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -6051,403 +6076,19 @@ "websocket": "1.0.29" }, "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/core": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", - "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.1", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.0", - "@babel/types": "^7.11.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "requires": { - "minimist": "^1.2.5" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/generator": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", - "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", - "requires": { - "@babel/types": "^7.11.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - } - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.2.tgz", - "integrity": "sha512-Vuj/+7vLo6l1Vi7uuO+1ngCDNeVmNbTngcJFKCR/oEtz8tKz0CJxZEGmPt9KcIloZhOZ3Zit6xbpXT2MDlS9Vw==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - } - } - }, - "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, - "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=" - } - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "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==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "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==" - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" - }, - "@samverschueren/stream-to-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", - "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", - "requires": { - "any-observable": "^0.3.0" - } - }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + "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" } @@ -6456,6 +6097,8 @@ "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, + "optional": true, "requires": { "bignumber.js": "*" } @@ -6464,29 +6107,16 @@ "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/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, - "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==" - }, "@types/node": { "version": "14.0.27", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", - "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==" - }, - "@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==" + "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==", + "dev": true }, "@types/pbkdf2": { "version": "3.1.0", @@ -6506,18 +6136,12 @@ "@types/node": "*" } }, - "@types/web3": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/web3/-/web3-1.2.2.tgz", - "integrity": "sha512-eFiYJKggNrOl0nsD+9cMh2MLk4zVBfXfGnVeRFbpiZzBE20eet4KLA3fXcjSuHaBn0RnQzwLAGdgzgzdet4C0A==", - "requires": { - "web3": "*" - } - }, "@web3-js/scrypt-shim": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@web3-js/scrypt-shim/-/scrypt-shim-0.1.0.tgz", "integrity": "sha512-ZtZeWCc/s0nMcdx/+rZwY1EcuRdemOK9ag21ty9UsHkFxsNb/AaoucUz0iPuyGe0Ku+PFuRmWZG7Z7462p9xPw==", + "dev": true, + "optional": true, "requires": { "scryptsy": "^2.1.0", "semver": "^6.3.0" @@ -6526,12 +6150,16 @@ "scryptsy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", - "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" + "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==", + "dev": true, + "optional": true }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "optional": true } } }, @@ -6539,6 +6167,8 @@ "version": "1.0.30", "resolved": "https://registry.npmjs.org/@web3-js/websocket/-/websocket-1.0.30.tgz", "integrity": "sha512-fDwrD47MiDrzcJdSeTLF75aCcxVVt8B1N74rA+vh2XCAvFy4tEWJjtnUtj2QG7/zlQ6g9cQ88bZFBxwd9/FmtA==", + "dev": true, + "optional": true, "requires": { "debug": "^2.2.0", "es5-ext": "^0.10.50", @@ -6551,6 +6181,8 @@ "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" } @@ -6558,178 +6190,12 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true } } }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", - "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==" - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==" - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==" - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", - "requires": { - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==" - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==" - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==" - }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "@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==" - }, "abstract-leveldown": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz", @@ -6743,21 +6209,13 @@ "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" } }, - "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==" - }, - "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==" - }, "aes-js": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", @@ -6765,26 +6223,11 @@ "dev": true, "optional": true }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "dependencies": { - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - } - } - }, "ajv": { "version": "6.12.3", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6792,16 +6235,6 @@ "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==" - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" - }, "ansi-colors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", @@ -6811,21 +6244,6 @@ "ansi-wrap": "^0.1.0" } }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" - } - } - }, "ansi-gray": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", @@ -6838,12 +6256,14 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "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=" + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true }, "ansi-wrap": { "version": "0.1.0", @@ -6851,20 +6271,18 @@ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", "dev": true }, - "any-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", - "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==" - }, "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true, + "optional": true }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -6874,6 +6292,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, "requires": { "remove-trailing-separator": "^1.0.1" } @@ -6889,36 +6308,17 @@ "buffer-equal": "^1.0.0" } }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true }, "arr-filter": { "version": "1.1.2", @@ -6932,7 +6332,8 @@ "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==" + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true }, "arr-map": { "version": "2.0.2", @@ -6946,7 +6347,8 @@ "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true }, "array-each": { "version": "1.0.1", @@ -6957,17 +6359,9 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" - } + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true, + "optional": true }, "array-initial": { "version": "1.1.0", @@ -7032,21 +6426,14 @@ "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } + "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" } @@ -7055,51 +6442,31 @@ "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "optional": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "assert-match": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/assert-match/-/assert-match-1.1.1.tgz", - "integrity": "sha512-c0QY2kpYVrH/jis6cCq9Mnt4/bIdGALDh1N8HY9ZARZedsMs5LSbgywxkjd5A1uNVLN0L8evANxBPxKiabVoZw==", - "requires": { - "assert": "^1.4.1", - "babel-runtime": "^6.23.0", - "es-to-primitive": "^1.1.1", - "lodash.merge": "^4.6.0" - } - }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "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=" - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + "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" } @@ -7119,7 +6486,8 @@ "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==" + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true }, "async-eventemitter": { "version": "0.2.4", @@ -7133,7 +6501,8 @@ "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==" + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true }, "async-settle": { "version": "1.0.0", @@ -7147,22 +6516,26 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "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==" + "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=" + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true }, "aws4": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", + "dev": true }, "babel-code-frame": { "version": "6.26.0", @@ -7794,6 +7167,7 @@ "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" @@ -7903,12 +7277,14 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "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", @@ -7923,6 +7299,7 @@ "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" } @@ -7931,6 +7308,7 @@ "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" } @@ -7939,6 +7317,7 @@ "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" } @@ -7947,6 +7326,7 @@ "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", @@ -7967,12 +7347,14 @@ "base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "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" }, @@ -7980,29 +7362,29 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "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==" - }, "bignumber.js": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "dev": true, + "optional": true }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "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" } @@ -8024,6 +7406,7 @@ "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" } @@ -8032,6 +7415,8 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "dev": true, + "optional": true, "requires": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" @@ -8040,12 +7425,16 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -8059,7 +7448,9 @@ "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==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true } } }, @@ -8067,6 +7458,8 @@ "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, + "optional": true, "requires": { "safe-buffer": "~5.1.0" }, @@ -8074,7 +7467,9 @@ "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==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true } } } @@ -8089,17 +7484,22 @@ "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "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==" + "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", @@ -8117,6 +7517,8 @@ "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" } @@ -8124,7 +7526,9 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true } } }, @@ -8132,6 +7536,7 @@ "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" @@ -8141,6 +7546,7 @@ "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", @@ -8158,6 +7564,7 @@ "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" } @@ -8167,26 +7574,14 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" - }, - "browserfs": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/browserfs/-/browserfs-1.4.3.tgz", - "integrity": "sha512-tz8HClVrzTJshcyIu8frE15cjqjcBIu15Bezxsvl/i+6f59iNCN3kznlWjz0FEb3DlnDx3gW5szxeT6D1x0s0w==", - "requires": { - "async": "^2.1.4", - "pako": "^1.0.4" - } + "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", @@ -8200,6 +7595,8 @@ "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", @@ -8210,6 +7607,8 @@ "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", @@ -8221,6 +7620,8 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "optional": true, "requires": { "bn.js": "^4.1.0", "randombytes": "^2.0.1" @@ -8230,6 +7631,8 @@ "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", @@ -8245,18 +7648,12 @@ "bn.js": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==" + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", + "dev": true, + "optional": 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==", - "requires": { - "pako": "~1.0.5" - } - }, "browserslist": { "version": "3.2.8", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", @@ -8291,6 +7688,7 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "dev": true, "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4" @@ -8300,6 +7698,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "optional": true, "requires": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" @@ -8308,12 +7708,16 @@ "buffer-alloc-unsafe": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "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=" + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true, + "optional": true }, "buffer-equal": { "version": "1.0.0", @@ -8324,32 +7728,35 @@ "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true, + "optional": 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==" + "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=" + "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=" - }, - "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=" + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "optional": true }, "bytewise": { "version": "1.1.0", @@ -8370,74 +7777,11 @@ "typewise-core": "^1.2" } }, - "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", - "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", - "requires": { - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, "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", @@ -8454,6 +7798,8 @@ "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", @@ -8465,9 +7811,11 @@ }, "dependencies": { "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "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" } @@ -8475,7 +7823,9 @@ "lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "optional": true } } }, @@ -8509,37 +7859,6 @@ } } }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", @@ -8555,12 +7874,14 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "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", @@ -8569,11 +7890,6 @@ "supports-color": "^2.0.0" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, "checkpoint-store": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", @@ -8587,6 +7903,7 @@ "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, "requires": { "anymatch": "^2.0.0", "async-each": "^1.0.1", @@ -8605,25 +7922,15 @@ "chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "requires": { - "tslib": "^1.9.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "optional": true }, "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" @@ -8633,6 +7940,7 @@ "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", @@ -8644,46 +7952,13 @@ "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-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", - "requires": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" - }, - "dependencies": { - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=" - } - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" - }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", @@ -8711,6 +7986,8 @@ "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" } @@ -8773,7 +8050,8 @@ "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=" + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true }, "collection-map": { "version": "1.0.0", @@ -8790,24 +8068,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, "color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", @@ -8818,39 +8084,35 @@ "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==" - }, "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==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": 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==" + "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=" + "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", @@ -8861,12 +8123,14 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -8880,37 +8144,26 @@ "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==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "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" } } } }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" - }, "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" }, @@ -8918,19 +8171,24 @@ "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==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true } } }, "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==" + "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" }, @@ -8938,52 +8196,37 @@ "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==" + "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==" + "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=" + "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==" - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "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": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - } - } + "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=" + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true }, "copy-props": { "version": "2.0.4", @@ -8998,7 +8241,8 @@ "core-js": { "version": "2.6.11", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true }, "core-js-pure": { "version": "3.6.5", @@ -9009,63 +8253,26 @@ "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=" + "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" } }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "dependencies": { - "parse-json": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", - "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - } - } - }, - "coveralls": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.0.tgz", - "integrity": "sha512-sHxOu2ELzW8/NC1UP5XVLbZDzO4S3VxfFye3XYCznopHy02YjNkHcj5bKaVw2O7hVaBdBjEdQGpie4II1mWhuQ==", - "requires": { - "js-yaml": "^3.13.1", - "lcov-parse": "^1.0.0", - "log-driver": "^1.2.7", - "minimist": "^1.2.5", - "request": "^2.88.2" - } - }, "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" @@ -9075,6 +8282,7 @@ "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", @@ -9087,6 +8295,7 @@ "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", @@ -9096,14 +8305,6 @@ "sha.js": "^2.4.8" } }, - "cross-env": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz", - "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==", - "requires": { - "cross-spawn": "^7.0.0" - } - }, "cross-fetch": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.3.tgz", @@ -9114,30 +8315,12 @@ "whatwg-fetch": "2.0.4" } }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "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==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "optional": true, "requires": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -9152,15 +8335,11 @@ "randomfill": "^1.0.3" } }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" - }, "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" @@ -9170,19 +8349,16 @@ "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" } }, - "date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" - }, "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" } @@ -9190,17 +8366,21 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true }, "decompress": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "dev": true, + "optional": true, "requires": { "decompress-tar": "^4.0.0", "decompress-tarbz2": "^4.0.0", @@ -9215,7 +8395,9 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "optional": true } } }, @@ -9223,6 +8405,8 @@ "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" } @@ -9231,6 +8415,8 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, + "optional": true, "requires": { "file-type": "^5.2.0", "is-stream": "^1.1.0", @@ -9241,6 +8427,8 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dev": true, + "optional": true, "requires": { "decompress-tar": "^4.1.0", "file-type": "^6.1.0", @@ -9252,7 +8440,9 @@ "file-type": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true, + "optional": true } } }, @@ -9260,6 +8450,8 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dev": true, + "optional": true, "requires": { "decompress-tar": "^4.1.1", "file-type": "^5.2.0", @@ -9270,6 +8462,8 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "dev": true, + "optional": true, "requires": { "file-type": "^3.8.0", "get-stream": "^2.2.0", @@ -9280,12 +8474,16 @@ "file-type": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "dev": true, + "optional": true }, "get-stream": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "dev": true, + "optional": true, "requires": { "object-assign": "^4.0.1", "pinkie-promise": "^2.0.0" @@ -9294,15 +8492,12 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "optional": true } } }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" - }, "deep-equal": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", @@ -9325,11 +8520,6 @@ } } }, - "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=" - }, "default-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", @@ -9347,21 +8537,6 @@ } } }, - "default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "requires": { - "strip-bom": "^4.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" - } - } - }, "default-resolution": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", @@ -9371,7 +8546,9 @@ "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==" + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true, + "optional": true }, "deferred-leveldown": { "version": "1.2.2", @@ -9397,6 +8574,7 @@ "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" }, @@ -9404,7 +8582,8 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true } } }, @@ -9412,6 +8591,7 @@ "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" @@ -9421,6 +8601,7 @@ "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" } @@ -9429,6 +8610,7 @@ "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" } @@ -9437,6 +8619,7 @@ "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", @@ -9454,17 +8637,22 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "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=" + "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" @@ -9473,12 +8661,15 @@ "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true, + "optional": true }, "detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true }, "detect-indent": { "version": "4.0.0", @@ -9489,38 +8680,23 @@ "repeating": "^2.0.0" } }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" - }, "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" } }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "requires": { - "esutils": "^2.0.2" - } - }, "dom-walk": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" - }, - "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==" + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true }, "dotignore": { "version": "0.1.2", @@ -9535,6 +8711,7 @@ "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", @@ -9544,12 +8721,15 @@ "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true, + "optional": 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", @@ -9560,12 +8740,14 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -9579,12 +8761,14 @@ "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==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "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" } @@ -9605,6 +8789,7 @@ "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" @@ -9613,7 +8798,9 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true, + "optional": true }, "electron-to-chromium": { "version": "1.3.521", @@ -9621,15 +8808,11 @@ "integrity": "sha512-7/Cf5jUuAfLRY8SjfRES/6+9BDvmHAB2YQotCAaXK0IEacpjoSlyosPoC4s7lfb7vIOBubXvsssu8+8qaRGjcg==", "dev": true }, - "elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=" - }, "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", @@ -9640,20 +8823,12 @@ "minimalistic-crypto-utils": "^1.0.0" } }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "optional": true }, "encoding": { "version": "0.1.13", @@ -9703,67 +8878,16 @@ "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" } }, - "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "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==", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, "requires": { "prr": "~1.0.1" } @@ -9772,6 +8896,7 @@ "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" } @@ -9780,6 +8905,7 @@ "version": "1.17.6", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", @@ -9797,7 +8923,8 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true } } }, @@ -9805,6 +8932,7 @@ "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", @@ -9815,21 +8943,18 @@ "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-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" - }, "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", @@ -9840,6 +8965,7 @@ "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" @@ -9860,470 +8986,28 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "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=" - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "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==" - } - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "requires": { - "type-fest": "^0.8.1" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "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=" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "eslint-config-standard": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.0.tgz", - "integrity": "sha512-EF6XkrrGVbvv8hL/kYa/m6vnvmUT+K82pJJc4JJVMM6+Qgqh0pnwprSxdduDLB9p/7bIxD+YV5O0wfb8lmcPbA==" - }, - "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", - "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" - } - } - }, - "eslint-plugin-import": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.0.tgz", - "integrity": "sha512-NK42oA0mUc8Ngn4kONOPsPB1XhbUvNHqF+g307dPV28aknPoiNnKLFd9em4nkswwepdF5ouieqv5Th/63U7YJQ==", - "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.1", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.0", - "read-pkg-up": "^2.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - } - } - }, - "eslint-plugin-node": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.0.0.tgz", - "integrity": "sha512-chUs/NVID+sknFiJzxoN9lM7uKSOEta8GC8365hw1nDfwIPIjjpRSwwPvQanWv8dt/pDe9EV4anmVSwdiSndNg==", - "requires": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "eslint-plugin-promise": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", - "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==" - }, - "eslint-plugin-standard": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz", - "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==" - }, - "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", - "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==", - "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==" - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", - "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==" - } - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "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==" + "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=" + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true, + "optional": true }, "eth-block-tracker": { "version": "3.0.1", @@ -10377,6 +9061,8 @@ "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" @@ -10385,7 +9071,9 @@ "js-sha3": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", + "dev": true, + "optional": true } } }, @@ -10567,6 +9255,8 @@ "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", @@ -10848,6 +9538,8 @@ "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" } @@ -10953,12 +9645,14 @@ "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==" + "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" @@ -10968,6 +9662,7 @@ "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", @@ -10982,6 +9677,7 @@ "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", @@ -10993,6 +9689,7 @@ "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", @@ -11047,76 +9744,12 @@ "uuid": "^3.3.2" } }, - "ethers": { - "version": "4.0.43", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.43.tgz", - "integrity": "sha512-VjQRVgPrlU12jSMvypdE1yEqYQccdVbH8bbiz67dLF7raHlRV4+zW70GlxHcZYqgsnz0XYWrn6C06gqTQRb5tw==", - "requires": { - "aes-js": "3.0.0", - "bn.js": "^4.4.0", - "elliptic": "6.5.2", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - }, - "dependencies": { - "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" - }, - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - }, - "scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" - }, - "setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" - } - } - }, "ethjs-unit": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", + "dev": true, + "optional": true, "requires": { "bn.js": "4.11.6", "number-to-bn": "1.7.0" @@ -11125,7 +9758,9 @@ "bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", + "dev": true, + "optional": true } } }, @@ -11133,6 +9768,7 @@ "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" @@ -11141,63 +9777,31 @@ "eventemitter3": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true, + "optional": true }, "events": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==" + "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" } }, - "execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==" - } - } - }, "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", @@ -11212,6 +9816,7 @@ "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" } @@ -11220,6 +9825,7 @@ "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" } @@ -11228,6 +9834,7 @@ "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" } @@ -11235,7 +9842,8 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -11243,6 +9851,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, "requires": { "homedir-polyfill": "^1.0.1" } @@ -11251,6 +9860,8 @@ "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", @@ -11288,6 +9899,8 @@ "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" } @@ -11295,12 +9908,16 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "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==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true } } }, @@ -11308,6 +9925,7 @@ "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" }, @@ -11315,19 +9933,22 @@ "type": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", + "dev": true } } }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "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" @@ -11337,36 +9958,18 @@ "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==", - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - } - } - }, "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", @@ -11382,6 +9985,7 @@ "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" } @@ -11390,6 +9994,7 @@ "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" } @@ -11398,6 +10003,7 @@ "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" } @@ -11406,6 +10012,7 @@ "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" } @@ -11414,6 +10021,7 @@ "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", @@ -11425,7 +10033,8 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true }, "fake-merkle-patricia-tree": { "version": "1.0.1", @@ -11451,22 +10060,21 @@ "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==" + "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==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "optional": true, "requires": { "pend": "~1.2.0" } @@ -11492,46 +10100,24 @@ } } }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "requires": { - "flat-cache": "^2.0.1" - } - }, "file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true, + "optional": 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==" - }, - "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", - "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -11543,6 +10129,7 @@ "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" } @@ -11553,6 +10140,8 @@ "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", @@ -11567,6 +10156,8 @@ "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" } @@ -11574,83 +10165,9 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.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==", - "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==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "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==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true } } }, @@ -11668,6 +10185,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, "requires": { "detect-file": "^1.0.0", "is-glob": "^4.0.0", @@ -11694,46 +10212,6 @@ "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", "dev": true }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "requires": { - "is-buffer": "~2.0.3" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" - } - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" - }, "flow-stoplight": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/flow-stoplight/-/flow-stoplight-1.0.0.tgz", @@ -11744,6 +10222,7 @@ "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" @@ -11752,12 +10231,14 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -11771,12 +10252,14 @@ "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==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "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" } @@ -11795,7 +10278,8 @@ "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true }, "for-own": { "version": "1.0.0", @@ -11806,24 +10290,17 @@ "for-in": "^1.0.1" } }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "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", @@ -11833,12 +10310,15 @@ "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "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" } @@ -11846,65 +10326,23 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "fromentries": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.1.tgz", - "integrity": "sha512-Xu2Qh8yqYuDhQGOhD5iJGninErSfI9A3FrriD3tjUgV5VbJFeH8vfgZ9HnC6jWN80QDVNQK5vmxRAmEAp7Mevw==" + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "optional": true }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "optional": true }, "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", @@ -11915,6 +10353,8 @@ "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" } @@ -11929,60 +10369,17 @@ "through2": "^2.0.3" } }, - "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=", - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "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", @@ -11992,22 +10389,14 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "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=" - }, - "generic-pool": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.0.4.tgz", - "integrity": "sha1-+XGN7agvoSXtXEPjQcmiFadm2aM=" - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true }, "get-caller-file": { "version": "1.0.3", @@ -12015,20 +10404,12 @@ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" - }, "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" } @@ -12036,12 +10417,14 @@ "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + "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" } @@ -12050,6 +10433,7 @@ "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", @@ -12063,6 +10447,7 @@ "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" @@ -12072,6 +10457,7 @@ "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" } @@ -12153,6 +10539,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "dev": true, "requires": { "min-document": "^2.19.0", "process": "~0.5.1" @@ -12162,6 +10549,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, "requires": { "global-prefix": "^1.0.1", "is-windows": "^1.0.1", @@ -12172,6 +10560,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, "requires": { "expand-tilde": "^2.0.2", "homedir-polyfill": "^1.0.1", @@ -12199,6 +10588,8 @@ "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", @@ -12216,12 +10607,8 @@ "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==" - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true }, "gulp": { "version": "4.0.2", @@ -12275,12 +10662,14 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "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" @@ -12290,6 +10679,7 @@ "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" } @@ -12298,29 +10688,30 @@ "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" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, "has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" + "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==" + "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" } @@ -12329,6 +10720,7 @@ "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", @@ -12339,6 +10731,7 @@ "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" @@ -12348,6 +10741,7 @@ "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" } @@ -12358,6 +10752,7 @@ "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", @@ -12368,27 +10763,12 @@ "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": "5.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", - "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "dependencies": { - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - } - } - }, "hdkey": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-1.1.2.tgz", @@ -12420,11 +10800,6 @@ } } }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, "heap": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.6.tgz", @@ -12435,6 +10810,7 @@ "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", @@ -12455,6 +10831,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, "requires": { "parse-passwd": "^1.0.0" } @@ -12462,22 +10839,22 @@ "hosted-git-info": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true }, "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==" + "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", @@ -12489,161 +10866,36 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "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=" + "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" } }, - "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=" - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" - }, - "humanize": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/humanize/-/humanize-0.0.9.tgz", - "integrity": "sha1-GZT/rs3+nEQe0r2sdFK3u0yeQaQ=" - }, - "husky": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.0.10.tgz", - "integrity": "sha512-Ptm4k2DqOwxeK/kzu5RaJmNRoGvESrgDXObFcZ8aJZcyXyMBHhM2FqZj6zYKdetadmP3wCwxEHCBuB9xGlRp8A==", - "requires": { - "chalk": "^3.0.0", - "ci-info": "^2.0.0", - "cosmiconfig": "^6.0.0", - "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^4.2.0", - "please-upgrade-node": "^3.2.0", - "slash": "^3.0.0", - "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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==", - "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==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.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==" - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "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==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "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==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "optional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -12652,6 +10904,8 @@ "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" }, @@ -12659,24 +10913,17 @@ "punycode": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "dev": true, + "optional": true } } }, "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true }, "immediate": { "version": "3.3.0", @@ -12684,96 +10931,11 @@ "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", "dev": true }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.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==", - "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==", - "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==", - "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==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "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==", - "requires": { - "find-up": "^3.0.0" - } - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" - }, - "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==" - }, "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" @@ -12782,111 +10944,14 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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==", - "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==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "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==" - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^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==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true }, "interpret": { "version": "1.4.0", @@ -12912,7 +10977,9 @@ "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==" + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "optional": true }, "is-absolute": { "version": "1.0.0", @@ -12928,6 +10995,7 @@ "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" }, @@ -12936,6 +11004,7 @@ "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" } @@ -12951,12 +11020,14 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, "requires": { "binary-extensions": "^1.0.0" } @@ -12964,17 +11035,20 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true }, "is-callable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "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" }, @@ -12983,6 +11057,7 @@ "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" } @@ -12992,12 +11067,14 @@ "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==" + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -13007,19 +11084,22 @@ "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==" + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "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=" + "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=" + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true }, "is-finite": { "version": "1.1.0", @@ -13037,6 +11117,7 @@ "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" } @@ -13044,12 +11125,14 @@ "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==" + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", + "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" } @@ -13057,12 +11140,15 @@ "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=" + "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=", + "dev": true }, "is-natural-number": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", + "dev": true, + "optional": true }, "is-negated-glob": { "version": "1.0.0", @@ -13074,6 +11160,7 @@ "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" }, @@ -13082,61 +11169,45 @@ "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-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, "is-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" - }, - "is-observable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", - "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", - "requires": { - "symbol-observable": "^1.1.0" - } + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", + "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=" + "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-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" - }, "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-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" - }, "is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", @@ -13149,22 +11220,21 @@ "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==" + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true, + "optional": true }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, "requires": { "has-symbols": "^1.0.1" } @@ -13172,7 +11242,8 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true }, "is-unc-path": { "version": "1.0.0", @@ -13198,12 +11269,8 @@ "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==" - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true }, "isarray": { "version": "0.0.1", @@ -13214,201 +11281,38 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "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=" + "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=" - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "requires": { - "append-transform": "^2.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } + "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" } }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "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==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "js-scrypt": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/js-scrypt/-/js-scrypt-0.2.0.tgz", - "integrity": "sha1-emK3AbRhbnCtDN5URiequ5nX/jk=", - "requires": { - "generic-pool": "~2.0.4" - } - }, "js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "dev": true, + "optional": true }, "js-tokens": { "version": "3.0.2", @@ -13416,19 +11320,11 @@ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true }, "jsesc": { "version": "0.5.0", @@ -13439,12 +11335,9 @@ "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, - "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==" + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true, + "optional": true }, "json-rpc-engine": { "version": "3.8.0", @@ -13478,12 +11371,14 @@ "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "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==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "json-stable-stringify": { "version": "1.0.1", @@ -13497,12 +11392,14 @@ "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=" + "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=" + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true }, "json5": { "version": "0.5.1", @@ -13514,6 +11411,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "optional": true, "requires": { "graceful-fs": "^4.1.6" } @@ -13528,6 +11427,7 @@ "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", @@ -13555,6 +11455,8 @@ "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" } @@ -13562,15 +11464,8 @@ "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==" - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "^4.1.9" - } + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true }, "last-run": { "version": "1.1.1", @@ -13638,11 +11533,6 @@ "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=" - }, "lead": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", @@ -13661,11 +11551,6 @@ "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==" - }, "level-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", @@ -13855,14 +11740,6 @@ } } }, - "level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "requires": { - "xtend": "^4.0.2" - } - }, "level-ws": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", @@ -13982,15 +11859,6 @@ } } }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, "liftoff": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", @@ -14007,259 +11875,6 @@ "resolve": "^1.1.7" } }, - "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=" - }, - "lint-staged": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.0.0.tgz", - "integrity": "sha512-/MrZOLMnljjMHakxlRd1Z5Kr8wWWlrWFasye7HaTv5tx56icwzT/STRty8flMKsyzBGTfTa9QszNVPsDS/yOug==", - "requires": { - "chalk": "^3.0.0", - "commander": "^4.0.1", - "cosmiconfig": "^6.0.0", - "debug": "^4.1.1", - "dedent": "^0.7.0", - "execa": "^3.4.0", - "listr": "^0.14.3", - "log-symbols": "^3.0.0", - "micromatch": "^4.0.2", - "normalize-path": "^3.0.0", - "please-upgrade-node": "^3.2.0", - "stringify-object": "^3.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "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==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "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==", - "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==" - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "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==", - "requires": { - "to-regex-range": "^5.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==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "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==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "listr": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", - "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", - "requires": { - "@samverschueren/stream-to-observable": "^0.3.0", - "is-observable": "^1.1.0", - "is-promise": "^2.1.0", - "is-stream": "^1.1.0", - "listr-silent-renderer": "^1.1.1", - "listr-update-renderer": "^0.5.0", - "listr-verbose-renderer": "^0.5.0", - "p-map": "^2.0.0", - "rxjs": "^6.3.3" - } - }, - "listr-silent-renderer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=" - }, - "listr-update-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", - "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", - "requires": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "elegant-spinner": "^1.0.1", - "figures": "^1.7.0", - "indent-string": "^3.0.0", - "log-symbols": "^1.0.2", - "log-update": "^2.3.0", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "requires": { - "chalk": "^1.0.0" - } - } - } - }, - "listr-verbose-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", - "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", - "requires": { - "chalk": "^2.4.1", - "cli-cursor": "^2.1.0", - "date-fns": "^1.27.2", - "figures": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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=", - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "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==" - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^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=", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -14281,185 +11896,11 @@ } } }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" - }, - "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==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } - }, "lodash": { "version": "4.17.14", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", - "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==" - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=" - }, - "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==" - }, - "log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==" - }, - "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==", - "requires": { - "chalk": "^2.4.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "log-update": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", - "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", - "requires": { - "ansi-escapes": "^3.0.0", - "cli-cursor": "^2.0.0", - "wrap-ansi": "^3.0.1" - }, - "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==" - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "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=", - "requires": { - "restore-cursor": "^2.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=" - }, - "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==" - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^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=", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" - } - } - } + "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==", + "dev": true }, "looper": { "version": "2.0.0", @@ -14479,12 +11920,15 @@ "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + "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" } @@ -14492,12 +11936,15 @@ "ltgt": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=" + "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, + "optional": true, "requires": { "pify": "^3.0.0" }, @@ -14505,7 +11952,9 @@ "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "optional": true } } }, @@ -14518,28 +11967,17 @@ "kind-of": "^6.0.2" } }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "requires": { - "p-defer": "^1.0.0" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + "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" } @@ -14583,6 +12021,7 @@ "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", @@ -14592,107 +12031,16 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "memdown": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", - "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", - "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==", - "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=" - } - } - }, - "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=", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=" + "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=" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true, + "optional": true }, "merkle-patricia-tree": { "version": "2.3.2", @@ -14849,12 +12197,15 @@ "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, + "optional": 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", @@ -14875,6 +12226,7 @@ "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" @@ -14883,35 +12235,37 @@ "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true }, "mime-db": { "version": "1.44.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true }, "mime-types": { "version": "2.1.27", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, "requires": { "mime-db": "1.44.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + "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" } @@ -14919,17 +12273,20 @@ "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==" + "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=" + "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" } @@ -14937,115 +12294,35 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "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, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, "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" } }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "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" @@ -15055,6 +12332,7 @@ "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" } @@ -15064,408 +12342,32 @@ "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "optional": true }, "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": "*" } }, - "mocha": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.0.0.tgz", - "integrity": "sha512-CirsOPbO3jU86YKjjMzFLcXIb5YiGLUrjrXFHoJ3e2z9vWiaZVCZQ2+gtRGMPWF+nFhN6AWwLM/juzAQ6KRkbA==", - "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": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "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.0", - "yargs-parser": "13.1.1", - "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==" - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "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==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "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==", - "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==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "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.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "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==", - "requires": { - "binary-extensions": "^2.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=" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "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==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "requires": { - "chalk": "^2.0.1" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "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==" - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "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==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", - "requires": { - "picomatch": "^2.0.4" - } - }, - "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==" - }, - "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==", - "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==", - "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=" - }, - "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==", - "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==", - "requires": { - "is-number": "^7.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "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==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "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.1" - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "mocha-lcov-reporter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mocha-lcov-reporter/-/mocha-lcov-reporter-1.3.0.tgz", - "integrity": "sha1-Rpve9PivyaEWBW8HnfYYLQr7A4Q=" - }, "mock-fs": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.12.0.tgz", - "integrity": "sha512-/P/HtrlvBxY4o/PzXY9cCNBrdylDNxg7gnrv2sMNxj+UJ2m8jSpl0/A6fuJeNAWr99ZvGWH8XCbE0vmnM5KupQ==" - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "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": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - } - } + "integrity": "sha512-/P/HtrlvBxY4o/PzXY9cCNBrdylDNxg7gnrv2sMNxj+UJ2m8jSpl0/A6fuJeNAWr99ZvGWH8XCbE0vmnM5KupQ==", + "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==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "mute-stdout": { "version": "1.0.1", @@ -15473,25 +12375,24 @@ "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", "dev": true }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, "nan": { "version": "2.14.1", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "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=" + "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", @@ -15506,30 +12407,18 @@ "to-regex": "^3.0.1" } }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "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==" + "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=" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true }, "node-addon-api": { "version": "2.0.2", @@ -15537,22 +12426,6 @@ "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", "dev": true }, - "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==", - "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==" - } - } - }, "node-fetch": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", @@ -15565,119 +12438,11 @@ "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==", "dev": true }, - "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==", - "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==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "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==" - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - } - } - }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "requires": { - "process-on-spawn": "^1.0.0" - } - }, "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, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -15688,19 +12453,23 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "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==" + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true, + "optional": true }, "now-and-later": { "version": "2.0.1", @@ -15711,23 +12480,18 @@ "once": "^1.3.2" } }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + "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, + "optional": true, "requires": { "bn.js": "4.11.6", "strip-hex-prefix": "1.0.0" @@ -15736,259 +12500,29 @@ "bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "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==" - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "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==", - "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==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "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==" - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.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==", - "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==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "requires": { - "aggregate-error": "^3.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==" - }, - "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==" - }, - "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==" - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^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==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "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==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "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==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "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==" + "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=" + "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", @@ -15999,6 +12533,7 @@ "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" } @@ -16007,6 +12542,7 @@ "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" } @@ -16016,7 +12552,8 @@ "object-inspect": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true }, "object-is": { "version": "1.1.2", @@ -16038,6 +12575,7 @@ "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" } @@ -16046,6 +12584,7 @@ "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", @@ -16056,7 +12595,8 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true } } }, @@ -16076,6 +12616,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1" @@ -16095,6 +12636,7 @@ "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" } @@ -16109,21 +12651,12 @@ "make-iterator": "^1.0.0" } }, - "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, "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" } @@ -16132,6 +12665,8 @@ "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" } @@ -16140,36 +12675,11 @@ "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": "5.1.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.1.tgz", - "integrity": "sha512-ZpZpjcJeugQfWsfyQlshVoowIIQ1qBGSVll4rfDq6JJVO//fesjoX808hXWfBjY+ROZgpKDI5TRSRBSoJiZ8eg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "opencollective-postinstall": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", - "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==" - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "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" - } - }, "ordered-read-streams": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", @@ -16217,11 +12727,6 @@ } } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -16240,134 +12745,39 @@ "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=" + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "optional": true }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "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" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "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==", - "requires": { - "callsites": "^3.0.0" - } - }, "parse-asn1": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "optional": true, "requires": { "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", @@ -16391,12 +12801,14 @@ "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==" + "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==", + "dev": true }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, "requires": { "error-ex": "^1.2.0" } @@ -16410,27 +12822,27 @@ "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + "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=" - }, - "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==" + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true }, "path-exists": { "version": "2.1.0", @@ -16444,17 +12856,14 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "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==" + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true }, "path-root": { "version": "0.1.1", @@ -16474,7 +12883,9 @@ "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=" + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true, + "optional": true }, "path-type": { "version": "1.1.0", @@ -16499,6 +12910,7 @@ "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", @@ -16510,86 +12922,36 @@ "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true, + "optional": true }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + "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-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - } - } - }, - "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==", - "requires": { - "semver-compare": "^1.0.0" - } - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - } - } - }, "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=" + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true }, "precond": { "version": "0.2.3", @@ -16597,20 +12959,12 @@ "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=", "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=" - }, "prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==" + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true, + "optional": true }, "pretty-hrtime": { "version": "1.0.3", @@ -16627,30 +12981,14 @@ "process": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", + "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==" - }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "requires": { - "fromentries": "^1.2.0" - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true }, "promise-to-callback": { "version": "1.0.0", @@ -16666,6 +13004,8 @@ "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" @@ -16674,7 +13014,8 @@ "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true }, "pseudomap": { "version": "1.0.2", @@ -16685,12 +13026,15 @@ "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "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", @@ -16762,6 +13106,8 @@ "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" @@ -16771,6 +13117,7 @@ "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", @@ -16781,6 +13128,7 @@ "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" @@ -16791,37 +13139,33 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "optional": 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" } }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, "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" } @@ -16830,6 +13174,8 @@ "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" @@ -16838,12 +13184,16 @@ "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==" + "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", @@ -16876,6 +13226,7 @@ "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", @@ -16886,6 +13237,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, "requires": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", @@ -16895,12 +13247,14 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -16914,12 +13268,14 @@ "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==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "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" } @@ -16944,7 +13300,8 @@ "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true }, "regenerator-transform": { "version": "0.10.1", @@ -16961,6 +13318,7 @@ "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" @@ -16976,11 +13334,6 @@ "es-abstract": "^1.17.0-next.1" } }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" - }, "regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", @@ -17007,14 +13360,6 @@ "jsesc": "~0.5.0" } }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "requires": { - "es6-error": "^4.0.1" - } - }, "remove-bom-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", @@ -17039,17 +13384,20 @@ "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=" + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + "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=" + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true }, "repeating": { "version": "2.0.1", @@ -17081,6 +13429,7 @@ "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", @@ -17107,19 +13456,16 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true } } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "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==" + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true }, "require-main-filename": { "version": "1.0.1", @@ -17131,39 +13477,21 @@ "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-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "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=" - } - } - }, "resolve-dir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, "requires": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" } }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, "resolve-options": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", @@ -17176,25 +13504,19 @@ "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + "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" } }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, "resumer": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", @@ -17207,12 +13529,14 @@ "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true }, "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" } @@ -17221,6 +13545,7 @@ "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" @@ -17230,41 +13555,22 @@ "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" } }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "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.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", - "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", - "requires": { - "tslib": "^1.9.0" - } - }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true }, "safe-event-emitter": { "version": "1.0.1", @@ -17279,6 +13585,7 @@ "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" } @@ -17286,17 +13593,8 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - } + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "scrypt-js": { "version": "3.0.1", @@ -17346,6 +13644,8 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "dev": true, + "optional": true, "requires": { "commander": "^2.8.1" } @@ -17356,16 +13656,6 @@ "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", "dev": true }, - "semver": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.1.tgz", - "integrity": "sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A==" - }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" - }, "semver-greatest-satisfied-range": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", @@ -17379,6 +13669,8 @@ "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", @@ -17399,6 +13691,8 @@ "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" }, @@ -17406,26 +13700,27 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "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==" + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true, + "optional": true } } }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==" - }, "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", @@ -17437,6 +13732,8 @@ "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", @@ -17448,7 +13745,8 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true }, "set-immediate-shim": { "version": "1.0.1", @@ -17460,6 +13758,7 @@ "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", @@ -17471,6 +13770,7 @@ "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" } @@ -17480,49 +13780,39 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "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==" + "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" } }, - "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==", - "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==" - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, "simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + "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", @@ -17535,35 +13825,11 @@ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - } - } - }, "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", @@ -17579,6 +13845,7 @@ "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" } @@ -17587,6 +13854,7 @@ "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" } @@ -17595,6 +13863,7 @@ "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" } @@ -17602,12 +13871,14 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -17615,6 +13886,7 @@ "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", @@ -17625,6 +13897,7 @@ "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" } @@ -17633,6 +13906,7 @@ "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" } @@ -17641,6 +13915,7 @@ "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" } @@ -17649,6 +13924,7 @@ "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", @@ -17661,6 +13937,7 @@ "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" }, @@ -17669,81 +13946,24 @@ "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" } } } }, - "solc": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.6.1.tgz", - "integrity": "sha512-iKqNYps2p++x8L9sBg7JeAJb7EmW8VJ/2asAzwlLYcUhj86AzuWLe94UTSQHv1SSCCj/x6lya8twvXkZtlTbIQ==", - "requires": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "dependencies": { - "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" - }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - } - } - }, - "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==" - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true }, "source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, "requires": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", @@ -17756,6 +13976,7 @@ "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" @@ -17764,7 +13985,8 @@ "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=" + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true }, "sparkles": { "version": "1.0.1", @@ -17772,54 +13994,11 @@ "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", "dev": true }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -17828,12 +14007,14 @@ "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==" + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": 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, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -17842,25 +14023,23 @@ "spdx-license-ids": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "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" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, "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", @@ -17876,31 +14055,8 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - } - } - }, - "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", - "requires": { - "figgy-pudding": "^3.5.1", - "minipass": "^3.1.1" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true } } }, @@ -17914,6 +14070,7 @@ "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" @@ -17923,6 +14080,7 @@ "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" } @@ -17932,59 +14090,9 @@ "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "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==", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "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==", - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "optional": true }, "stream-exhaust": { "version": "1.0.2", @@ -17992,56 +14100,11 @@ "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", "dev": true }, - "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==", - "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" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "stream-shift": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true }, "stream-to-pull-stream": { "version": "1.7.3", @@ -18064,12 +14127,15 @@ "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=" + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "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, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -18091,6 +14157,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" @@ -18100,6 +14167,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" @@ -18109,24 +14177,16 @@ "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, "requires": { "safe-buffer": "~5.2.0" } }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.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" } @@ -18144,37 +14204,26 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dev": true, + "optional": true, "requires": { "is-natural-number": "^4.0.1" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, "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-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==" - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true }, "sver-compat": { "version": "1.5.0", @@ -18190,6 +14239,8 @@ "version": "0.1.39", "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.39.tgz", "integrity": "sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg==", + "dev": true, + "optional": true, "requires": { "bluebird": "^3.5.0", "buffer": "^5.0.5", @@ -18208,12 +14259,16 @@ "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + "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", @@ -18234,79 +14289,29 @@ "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==" + "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=" + "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" } } } }, - "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==" - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.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==" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "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=" - }, - "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==", - "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==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" - }, "tape": { "version": "4.13.3", "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.3.tgz", @@ -18351,6 +14356,8 @@ "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", @@ -18365,6 +14372,8 @@ "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, + "optional": true, "requires": { "minimist": "^1.2.5" } @@ -18375,6 +14384,8 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "optional": true, "requires": { "bl": "^1.0.0", "buffer-alloc": "^1.2.0", @@ -18388,12 +14399,16 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -18407,85 +14422,33 @@ "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==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true }, "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, + "optional": true, "requires": { "safe-buffer": "~5.1.0" } } } }, - "temp": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.1.tgz", - "integrity": "sha512-WMuOgiua1xb5R56lE0eH6ivpVmg/lq2OHm4+LtT/xtEtPQ+sz6N3bBM6WZ5FvO1lO4IKIOb43qnhoc4qxP5OeA==", - "requires": { - "rimraf": "~2.6.2" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "terser-webpack-plugin": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.2.tgz", - "integrity": "sha512-SmvB/6gtEPv+CJ88MH5zDOsZdKXPS/Uzv2//e90+wM1IHFUhsguPKEILgzqrM1nQ4acRXN/SV4Obr55SXC+0oA==", - "requires": { - "cacache": "^13.0.1", - "find-cache-dir": "^3.2.0", - "jest-worker": "^24.9.0", - "schema-utils": "^2.6.1", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.4.3", - "webpack-sources": "^1.4.3" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "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" @@ -18494,12 +14457,14 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -18513,12 +14478,14 @@ "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==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "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" } @@ -18544,15 +14511,9 @@ "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=" - }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", - "requires": { - "setimmediate": "^1.0.4" - } + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true, + "optional": true }, "tmp": { "version": "0.1.0", @@ -18573,15 +14534,12 @@ "is-negated-glob": "^1.0.0" } }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - }, "to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true, + "optional": true }, "to-fast-properties": { "version": "1.0.3", @@ -18593,6 +14551,7 @@ "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" }, @@ -18601,6 +14560,7 @@ "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" } @@ -18610,12 +14570,15 @@ "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==" + "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", @@ -18627,6 +14590,7 @@ "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" @@ -18644,12 +14608,15 @@ "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "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" @@ -18661,20 +14628,11 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, "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" } @@ -18694,25 +14652,15 @@ "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + "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" @@ -18721,12 +14669,14 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + "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" } @@ -18755,12 +14705,16 @@ "ultron": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true, + "optional": true }, "unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "optional": true, "requires": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -18775,7 +14729,9 @@ "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==" + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", + "dev": true, + "optional": true }, "undertaker": { "version": "1.2.1", @@ -18804,6 +14760,7 @@ "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", @@ -18811,22 +14768,6 @@ "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==", - "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==", - "requires": { - "imurmurhash": "^0.1.4" - } - }, "unique-stream": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", @@ -18840,7 +14781,9 @@ "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "optional": true }, "unorm": { "version": "1.6.0", @@ -18851,12 +14794,15 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "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" @@ -18866,6 +14812,7 @@ "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", @@ -18876,6 +14823,7 @@ "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" } @@ -18885,24 +14833,28 @@ "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true } } }, "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, "requires": { "punycode": "^2.1.0" } @@ -18910,28 +14862,15 @@ "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "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=" - } - } + "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" } @@ -18939,42 +14878,35 @@ "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=" + "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=" + "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==" + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true }, "utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - } - } + "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=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "util.promisify": { "version": "1.0.1", @@ -18991,17 +14923,15 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "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==" - }, - "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==" + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true }, "v8flags": { "version": "3.2.0", @@ -19016,6 +14946,7 @@ "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, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -19030,12 +14961,15 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "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", @@ -19145,128 +15079,12 @@ } } }, - "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==" - }, - "watchpack": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", - "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "optional": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz", - "integrity": "sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==", - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "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==", - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "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==", - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "optional": true - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "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==", - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", - "optional": true, - "requires": { - "chokidar": "^2.1.8" - } - }, "web3": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.4.tgz", "integrity": "sha512-xPXGe+w0x0t88Wj+s/dmAdASr3O9wmA9mpZRtixGZxmBexAF0MjfqYM+MS4tVl5s11hMTN3AZb8cDD4VLfC57A==", + "dev": true, + "optional": true, "requires": { "@types/node": "^12.6.1", "web3-bzz": "1.2.4", @@ -19279,9 +15097,11 @@ }, "dependencies": { "@types/node": { - "version": "12.12.53", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.53.tgz", - "integrity": "sha512-51MYTDTyCziHb70wtGNFRwB4l+5JNvdqzFSkbDvpbftEgVUBEE+T5f7pROhWMp/fxp07oNIEQZd5bbfAH22ohQ==" + "version": "12.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.3.tgz", + "integrity": "sha512-8Jduo8wvvwDzEVJCOvS/G6sgilOLvvhn1eMmK3TW8/T217O7u1jdrK6ImKLv80tVryaPSVeKu6sjDEiFjd4/eg==", + "dev": true, + "optional": true } } }, @@ -19289,6 +15109,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.4.tgz", "integrity": "sha512-MqhAo/+0iQSMBtt3/QI1rU83uvF08sYq8r25+OUZ+4VtihnYsmkkca+rdU0QbRyrXY2/yGIpI46PFdh0khD53A==", + "dev": true, + "optional": true, "requires": { "@types/node": "^10.12.18", "got": "9.6.0", @@ -19299,7 +15121,9 @@ "@types/node": { "version": "10.17.28", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.28.tgz", - "integrity": "sha512-dzjES1Egb4c1a89C7lKwQh8pwjYmlOAG9dW1pBgxEk57tMrLnssOfEthz8kdkNaBd7lIqQx7APm5+mZ619IiCQ==" + "integrity": "sha512-dzjES1Egb4c1a89C7lKwQh8pwjYmlOAG9dW1pBgxEk57tMrLnssOfEthz8kdkNaBd7lIqQx7APm5+mZ619IiCQ==", + "dev": true, + "optional": true } } }, @@ -19307,6 +15131,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.4.tgz", "integrity": "sha512-CHc27sMuET2cs1IKrkz7xzmTdMfZpYswe7f0HcuyneTwS1yTlTnHyqjAaTy0ZygAb/x4iaVox+Gvr4oSAqSI+A==", + "dev": true, + "optional": true, "requires": { "@types/bignumber.js": "^5.0.0", "@types/bn.js": "^4.11.4", @@ -19320,7 +15146,9 @@ "@types/node": { "version": "12.12.53", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.53.tgz", - "integrity": "sha512-51MYTDTyCziHb70wtGNFRwB4l+5JNvdqzFSkbDvpbftEgVUBEE+T5f7pROhWMp/fxp07oNIEQZd5bbfAH22ohQ==" + "integrity": "sha512-51MYTDTyCziHb70wtGNFRwB4l+5JNvdqzFSkbDvpbftEgVUBEE+T5f7pROhWMp/fxp07oNIEQZd5bbfAH22ohQ==", + "dev": true, + "optional": true } } }, @@ -19328,6 +15156,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.4.tgz", "integrity": "sha512-U7wbsK8IbZvF3B7S+QMSNP0tni/6VipnJkB0tZVEpHEIV2WWeBHYmZDnULWcsS/x/jn9yKhJlXIxWGsEAMkjiw==", + "dev": true, + "optional": true, "requires": { "underscore": "1.9.1", "web3-eth-iban": "1.2.4", @@ -19338,6 +15168,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.4.tgz", "integrity": "sha512-8p9kpL7di2qOVPWgcM08kb+yKom0rxRCMv6m/K+H+yLSxev9TgMbCgMSbPWAHlyiF3SJHw7APFKahK5Z+8XT5A==", + "dev": true, + "optional": true, "requires": { "underscore": "1.9.1", "web3-core-helpers": "1.2.4", @@ -19350,6 +15182,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.4.tgz", "integrity": "sha512-gEUlm27DewUsfUgC3T8AxkKi8Ecx+e+ZCaunB7X4Qk3i9F4C+5PSMGguolrShZ7Zb6717k79Y86f3A00O0VAZw==", + "dev": true, + "optional": true, "requires": { "any-promise": "1.3.0", "eventemitter3": "3.1.2" @@ -19359,6 +15193,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.4.tgz", "integrity": "sha512-eZJDjyNTDtmSmzd3S488nR/SMJtNnn/GuwxnMh3AzYCqG3ZMfOylqTad2eYJPvc2PM5/Gj1wAMQcRpwOjjLuPg==", + "dev": true, + "optional": true, "requires": { "underscore": "1.9.1", "web3-core-helpers": "1.2.4", @@ -19371,6 +15207,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.4.tgz", "integrity": "sha512-3D607J2M8ymY9V+/WZq4MLlBulwCkwEjjC2U+cXqgVO1rCyVqbxZNCmHyNYHjDDCxSEbks9Ju5xqJxDSxnyXEw==", + "dev": true, + "optional": true, "requires": { "eventemitter3": "3.1.2", "underscore": "1.9.1", @@ -19381,6 +15219,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.4.tgz", "integrity": "sha512-+j+kbfmZsbc3+KJpvHM16j1xRFHe2jBAniMo1BHKc3lho6A8Sn9Buyut6odubguX2AxoRArCdIDCkT9hjUERpA==", + "dev": true, + "optional": true, "requires": { "underscore": "1.9.1", "web3-core": "1.2.4", @@ -19401,6 +15241,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.4.tgz", "integrity": "sha512-8eLIY4xZKoU3DSVu1pORluAw9Ru0/v4CGdw5so31nn+7fR8zgHMgwbFe0aOqWQ5VU42PzMMXeIJwt4AEi2buFg==", + "dev": true, + "optional": true, "requires": { "ethers": "4.0.0-beta.3", "underscore": "1.9.1", @@ -19410,17 +15252,23 @@ "@types/node": { "version": "10.17.28", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.28.tgz", - "integrity": "sha512-dzjES1Egb4c1a89C7lKwQh8pwjYmlOAG9dW1pBgxEk57tMrLnssOfEthz8kdkNaBd7lIqQx7APm5+mZ619IiCQ==" + "integrity": "sha512-dzjES1Egb4c1a89C7lKwQh8pwjYmlOAG9dW1pBgxEk57tMrLnssOfEthz8kdkNaBd7lIqQx7APm5+mZ619IiCQ==", + "dev": true, + "optional": true }, "aes-js": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" + "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=", + "dev": true, + "optional": true }, "elliptic": { "version": "6.3.3", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", + "dev": true, + "optional": true, "requires": { "bn.js": "^4.4.0", "brorand": "^1.0.1", @@ -19432,6 +15280,8 @@ "version": "4.0.0-beta.3", "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.3.tgz", "integrity": "sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog==", + "dev": true, + "optional": true, "requires": { "@types/node": "^10.3.2", "aes-js": "3.0.0", @@ -19449,6 +15299,8 @@ "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, + "optional": true, "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.0" @@ -19457,22 +15309,30 @@ "js-sha3": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", + "dev": true, + "optional": true }, "scrypt-js": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", - "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=" + "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=", + "dev": true, + "optional": true }, "setimmediate": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" + "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=", + "dev": true, + "optional": true }, "uuid": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", + "dev": true, + "optional": true } } }, @@ -19480,6 +15340,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.4.tgz", "integrity": "sha512-04LzT/UtWmRFmi4hHRewP5Zz43fWhuHiK5XimP86sUQodk/ByOkXQ3RoXyGXFMNoRxdcAeRNxSfA2DpIBc9xUw==", + "dev": true, + "optional": true, "requires": { "@web3-js/scrypt-shim": "^0.1.0", "any-promise": "1.3.0", @@ -19499,6 +15361,8 @@ "version": "0.2.7", "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", + "dev": true, + "optional": true, "requires": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", @@ -19508,7 +15372,9 @@ "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true, + "optional": true } } }, @@ -19516,6 +15382,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.4.tgz", "integrity": "sha512-b/9zC0qjVetEYnzRA1oZ8gF1OSSUkwSYi5LGr4GeckLkzXP7osEnp9lkO/AQcE4GpG+l+STnKPnASXJGZPgBRQ==", + "dev": true, + "optional": true, "requires": { "@types/bn.js": "^4.11.4", "underscore": "1.9.1", @@ -19532,6 +15400,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.4.tgz", "integrity": "sha512-g8+JxnZlhdsCzCS38Zm6R/ngXhXzvc3h7bXlxgKU4coTzLLoMpgOAEz71GxyIJinWTFbLXk/WjNY0dazi9NwVw==", + "dev": true, + "optional": true, "requires": { "eth-ens-namehash": "2.0.8", "underscore": "1.9.1", @@ -19547,6 +15417,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.4.tgz", "integrity": "sha512-D9HIyctru/FLRpXakRwmwdjb5bWU2O6UE/3AXvRm6DCOf2e+7Ve11qQrPtaubHfpdW3KWjDKvlxV9iaFv/oTMQ==", + "dev": true, + "optional": true, "requires": { "bn.js": "4.11.8", "web3-utils": "1.2.4" @@ -19555,7 +15427,9 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true, + "optional": true } } }, @@ -19563,6 +15437,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.4.tgz", "integrity": "sha512-5Russ7ZECwHaZXcN3DLuLS7390Vzgrzepl4D87SD6Sn1DHsCZtvfdPIYwoTmKNp69LG3mORl7U23Ga5YxqkICw==", + "dev": true, + "optional": true, "requires": { "@types/node": "^12.6.1", "web3-core": "1.2.4", @@ -19575,7 +15451,9 @@ "@types/node": { "version": "12.12.53", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.53.tgz", - "integrity": "sha512-51MYTDTyCziHb70wtGNFRwB4l+5JNvdqzFSkbDvpbftEgVUBEE+T5f7pROhWMp/fxp07oNIEQZd5bbfAH22ohQ==" + "integrity": "sha512-51MYTDTyCziHb70wtGNFRwB4l+5JNvdqzFSkbDvpbftEgVUBEE+T5f7pROhWMp/fxp07oNIEQZd5bbfAH22ohQ==", + "dev": true, + "optional": true } } }, @@ -19583,6 +15461,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.4.tgz", "integrity": "sha512-wKOsqhyXWPSYTGbp7ofVvni17yfRptpqoUdp3SC8RAhDmGkX6irsiT9pON79m6b3HUHfLoBilFQyt/fTUZOf7A==", + "dev": true, + "optional": true, "requires": { "web3-core": "1.2.4", "web3-core-method": "1.2.4", @@ -19853,6 +15733,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.4.tgz", "integrity": "sha512-dzVCkRrR/cqlIrcrWNiPt9gyt0AZTE0J+MfAu9rR6CyIgtnm1wFUVVGaxYRxuTGQRO4Dlo49gtoGwaGcyxqiTw==", + "dev": true, + "optional": true, "requires": { "web3-core-helpers": "1.2.4", "xhr2-cookies": "1.1.0" @@ -19862,6 +15744,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.4.tgz", "integrity": "sha512-8J3Dguffin51gckTaNrO3oMBo7g+j0UNk6hXmdmQMMNEtrYqw4ctT6t06YOf9GgtOMjSAc1YEh3LPrvgIsR7og==", + "dev": true, + "optional": true, "requires": { "oboe": "2.1.4", "underscore": "1.9.1", @@ -19872,6 +15756,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.4.tgz", "integrity": "sha512-F/vQpDzeK+++oeeNROl1IVTufFCwCR2hpWe5yRXN0ApLwHqXrMI7UwQNdJ9iyibcWjJf/ECbauEEQ8CHgE+MYQ==", + "dev": true, + "optional": true, "requires": { "@web3-js/websocket": "^1.0.29", "underscore": "1.9.1", @@ -19882,6 +15768,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.4.tgz", "integrity": "sha512-z+9SCw0dE+69Z/Hv8809XDbLj7lTfEv9Sgu8eKEIdGntZf4v7ewj5rzN5bZZSz8aCvfK7Y6ovz1PBAu4QzS4IQ==", + "dev": true, + "optional": true, "requires": { "web3-core": "1.2.4", "web3-core-method": "1.2.4", @@ -19893,6 +15781,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.4.tgz", "integrity": "sha512-+S86Ip+jqfIPQWvw2N/xBQq5JNqCO0dyvukGdJm8fEWHZbckT4WxSpHbx+9KLEWY4H4x9pUwnoRkK87pYyHfgQ==", + "dev": true, + "optional": true, "requires": { "bn.js": "4.11.8", "eth-lib": "0.2.7", @@ -19907,12 +15797,16 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true, + "optional": 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, + "optional": true, "requires": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", @@ -19921,568 +15815,6 @@ } } }, - "webpack": { - "version": "4.41.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", - "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.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.1", - "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.6.0", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "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" - } - }, - "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==", - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "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==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "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==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "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==", - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "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==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "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==", - "requires": { - "find-up": "^3.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==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "terser-webpack-plugin": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", - "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^3.1.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - } - } - }, - "webpack-bundle-size-analyzer": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-size-analyzer/-/webpack-bundle-size-analyzer-3.1.0.tgz", - "integrity": "sha512-8WlTT6uuCxZgZYNnCB0pRGukWRGH+Owg+HsqQUe1Zexakdno1eDYO+lE7ihBo9G0aCCZCJa8JWjYr9eLYfZrBA==", - "requires": { - "commander": "^2.19.0", - "filesize": "^3.6.1", - "humanize": "0.0.9" - } - }, - "webpack-cli": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.10.tgz", - "integrity": "sha512-u1dgND9+MXaEt74sJR4PR7qkPxXUSQ0RXYq8x1L6Jg1MYVEmGPrH6Ah6C4arD4r0J1P5HKjRqpab36k0eIzPqg==", - "requires": { - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", - "findup-sync": "3.0.0", - "global-modules": "2.0.0", - "import-local": "2.0.0", - "interpret": "1.2.0", - "loader-utils": "1.2.3", - "supports-color": "6.1.0", - "v8-compile-cache": "2.0.3", - "yargs": "13.2.4" - }, - "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==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "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", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "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==", - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" - }, - "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=" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "requires": { - "invert-kv": "^2.0.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "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=", - "requires": { - "path-key": "^2.0.0" - } - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.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==", - "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==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "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==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "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=" - }, - "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==", - "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==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "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==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==" - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "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==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - }, - "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", - "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", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, "websocket": { "version": "1.0.29", "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.29.tgz", @@ -20523,6 +15855,7 @@ "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" } @@ -20533,32 +15866,6 @@ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "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=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "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==" - }, - "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==", - "requires": { - "errno": "~0.1.7" - } - }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -20572,41 +15879,15 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "requires": { - "mkdirp": "^0.5.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } + "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", @@ -20616,7 +15897,9 @@ "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==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true } } }, @@ -20624,6 +15907,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", + "dev": true, "requires": { "global": "~4.3.0", "is-function": "^1.0.1", @@ -20635,6 +15919,8 @@ "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", @@ -20649,6 +15935,8 @@ "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" } @@ -20657,6 +15945,8 @@ "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" } @@ -20664,12 +15954,15 @@ "xmlhttprequest": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", + "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==" + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true }, "y18n": { "version": "3.2.1", @@ -20680,17 +15973,14 @@ "yaeti": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" + "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==" - }, - "yaml": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==" + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true }, "yargs": { "version": "7.1.1", @@ -20723,182 +16013,12 @@ "object.assign": "^4.1.0" } }, - "yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.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==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "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=" - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "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==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "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==" - }, - "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==", - "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==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "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==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "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" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "optional": true, "requires": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" @@ -21105,6 +16225,183 @@ "har-schema": "^2.0.0" } }, + "hardhat": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.0.2.tgz", + "integrity": "sha512-P8SMYsWeC0OakmHUAgL9STalidQ1bAHFHFroPyvnfljei7EPHaIQpS6QursoZ+KVNkPTnKC+9m1Lky8nnKIjuw==", + "dev": true, + "requires": { + "@nomiclabs/ethereumjs-vm": "^4.1.1", + "@sentry/node": "^5.18.1", + "@solidity-parser/parser": "^0.7.1", + "@types/bn.js": "^4.11.5", + "@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-account": "^3.0.0", + "ethereumjs-block": "^2.2.0", + "ethereumjs-common": "^1.5.0", + "ethereumjs-tx": "^2.1.1", + "ethereumjs-util": "^6.1.0", + "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": "^3.0.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.7.1", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.7.1.tgz", + "integrity": "sha512-5ma2uuwPAEX1TPl2rAPAAuGlBkKnn2oUKQvnhTFlDIB8U/KDWX77FpHtL6Rcz+OwqSCWx9IClxACgyIEJ/GhIw==", + "dev": true + }, + "chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "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.5.0" + } + }, + "commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + } + } + }, + "hardhat-gas-reporter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.0.tgz", + "integrity": "sha512-ckGLu62GSZDqTemO5EgSUdjn+Dyk4X20nryZ0gutgVnjfrTwpV7/AXoDIj93cxIGMLmui09EQR0QB0D0OIssdA==", + "dev": true, + "requires": { + "eth-gas-reporter": "^0.2.19" + } + }, + "hardhat-typechain": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/hardhat-typechain/-/hardhat-typechain-0.3.3.tgz", + "integrity": "sha512-NrqP7Zng28prV3YT0lXoo1pXtZxoNCMfiZIWkf1HXjjID42JLLfSOTsvlb0okDMpz4tJaEEkgADJO69sKZxw+Q==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -21232,9 +16529,9 @@ }, "dependencies": { "@types/node": { - "version": "10.17.42", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.42.tgz", - "integrity": "sha512-HElxYF7C/MSkuvlaHB2c+82zhXiuO49Cq056Dol8AQuTph7oJtduo2n6J8rFa+YhJyNgQ/Lm20ZaxqD0vxU0+Q==", + "version": "10.17.44", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.44.tgz", + "integrity": "sha512-vHPAyBX1ffLcy4fQHmDyIUMUb42gHZjPHU66nhvbMzAWJqHnySGZ6STwN3rwrnSd1FHB0DI/RWgGELgKSYRDmw==", "dev": true } } @@ -21374,6 +16671,12 @@ "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.2.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", @@ -24364,6 +19667,23 @@ } } }, + "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 + } + } + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -24697,6 +20017,254 @@ } } }, + "temp-hardhat-etherscan": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/temp-hardhat-etherscan/-/temp-hardhat-etherscan-2.0.2.tgz", + "integrity": "sha512-q9+OMPXlsXZ+2fnF+Xmvv0J9vNJChwOXVGJIATiDJr7Qe8LzTwgs55C4l4NKMWPLe4PE9UjcQMVntRfXGTF9vA==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.0.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^5.0.2", + "fs-extra": "^7.0.1", + "lodash": "^4.17.11", + "node-fetch": "^2.6.0", + "semver": "^6.3.0" + }, + "dependencies": { + "@ethersproject/abi": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz", + "integrity": "sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==", + "dev": true, + "requires": { + "@ethersproject/address": "^5.0.4", + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/constants": "^5.0.4", + "@ethersproject/hash": "^5.0.4", + "@ethersproject/keccak256": "^5.0.3", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/strings": "^5.0.4" + } + }, + "@ethersproject/abstract-provider": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.0.5.tgz", + "integrity": "sha512-i/CjElAkzV7vQBAeoz+IpjGfcFYEP9eD7j3fzZ0fzTq03DO7PPnR+xkEZ1IoDXGwDS+55aLM1xvLDwB/Lx6IOQ==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/networks": "^5.0.3", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/transactions": "^5.0.5", + "@ethersproject/web": "^5.0.6" + } + }, + "@ethersproject/abstract-signer": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.0.7.tgz", + "integrity": "sha512-8W8gy/QutEL60EoMEpvxZ8MFAEWs/JvH5nmZ6xeLXoZvmBCasGmxqHdYjo2cxg0nevkPkq9SeenSsBBZSCx+SQ==", + "dev": true, + "requires": { + "@ethersproject/abstract-provider": "^5.0.4", + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3" + } + }, + "@ethersproject/address": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.5.tgz", + "integrity": "sha512-DpkQ6rwk9jTefrRsJzEm6nhRiJd9pvhn1xN0rw5N/jswXG5r7BLk/GVA0mMAVWAsYfvi2xSc5L41FMox43RYEA==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/keccak256": "^5.0.3", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/rlp": "^5.0.3", + "bn.js": "^4.4.0" + } + }, + "@ethersproject/base64": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.0.4.tgz", + "integrity": "sha512-4KRykQ7BQMeOXfvio1YITwHjxwBzh92UoXIdzxDE1p53CK28bbHPdsPNYo0wl0El7lJAMpT2SOdL0hhbWRnyIA==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.0.4" + } + }, + "@ethersproject/bignumber": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.8.tgz", + "integrity": "sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/logger": "^5.0.5", + "bn.js": "^4.4.0" + } + }, + "@ethersproject/bytes": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", + "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", + "dev": true, + "requires": { + "@ethersproject/logger": "^5.0.5" + } + }, + "@ethersproject/constants": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.5.tgz", + "integrity": "sha512-foaQVmxp2+ik9FrLUCtVrLZCj4M3Ibgkqvh+Xw/vFRSerkjVSYePApaVE5essxhoSlF1U9oXfWY09QI2AXtgKA==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.0.7" + } + }, + "@ethersproject/hash": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.0.6.tgz", + "integrity": "sha512-Gvh57v6BWhwnud6l7tMfQm32PRQ2DYx2WaAAQmAxAfYvmzUkpQCBstnGeNMXIL8/2wdkvcB2u+WZRWaZtsFuUQ==", + "dev": true, + "requires": { + "@ethersproject/abstract-signer": "^5.0.6", + "@ethersproject/address": "^5.0.5", + "@ethersproject/bignumber": "^5.0.8", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/keccak256": "^5.0.3", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.4", + "@ethersproject/strings": "^5.0.4" + } + }, + "@ethersproject/keccak256": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.4.tgz", + "integrity": "sha512-GNpiOUm9PGUxFNqOxYKDQBM0u68bG9XC9iOulEQ8I0tOx/4qUpgVzvgXL6ugxr0RY554Gz/NQsVqknqPzUcxpQ==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.0.4", + "js-sha3": "0.5.7" + } + }, + "@ethersproject/logger": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", + "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", + "dev": true + }, + "@ethersproject/networks": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.0.4.tgz", + "integrity": "sha512-/wHDTRms5mpJ09BoDrbNdFWINzONe05wZRgohCXvEv39rrH/Gd/yAnct8wC0RsW3tmFOgjgQxuBvypIxuUynTw==", + "dev": true, + "requires": { + "@ethersproject/logger": "^5.0.5" + } + }, + "@ethersproject/properties": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.4.tgz", + "integrity": "sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A==", + "dev": true, + "requires": { + "@ethersproject/logger": "^5.0.5" + } + }, + "@ethersproject/rlp": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.4.tgz", + "integrity": "sha512-5qrrZad7VTjofxSsm7Zg/7Dr4ZOln4S2CqiDdOuTv6MBKnXj0CiBojXyuDy52M8O3wxH0CyE924hXWTDV1PQWQ==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/logger": "^5.0.5" + } + }, + "@ethersproject/signing-key": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.5.tgz", + "integrity": "sha512-Z1wY7JC1HVO4CvQWY2TyTTuAr8xK3bJijZw1a9G92JEmKdv1j255R/0YLBBcFTl2J65LUjtXynNJ2GbArPGi5g==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3", + "elliptic": "6.5.3" + } + }, + "@ethersproject/strings": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.0.5.tgz", + "integrity": "sha512-JED6WaIV00xM/gvj8vSnd+0VWtDYdidTmavFRCTQakqfz+4tDo6Jz5LHgG+dd45h7ah7ykCHW0C7ZXWEDROCXQ==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/constants": "^5.0.4", + "@ethersproject/logger": "^5.0.5" + } + }, + "@ethersproject/transactions": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.6.tgz", + "integrity": "sha512-htsFhOD+NMBxx676A8ehSuwVV49iqpSB+CkjPZ02tpNew0K6p8g0CZ46Z1ZP946gIHAU80xQ0NACHYrjIUaCFA==", + "dev": true, + "requires": { + "@ethersproject/address": "^5.0.4", + "@ethersproject/bignumber": "^5.0.7", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/constants": "^5.0.4", + "@ethersproject/keccak256": "^5.0.3", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/rlp": "^5.0.3", + "@ethersproject/signing-key": "^5.0.4" + } + }, + "@ethersproject/web": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.0.9.tgz", + "integrity": "sha512-//QNlv1MSkOII1hv3+HQwWoiVFS+BMVGI0KYeUww4cyrEktnx1QIez5bTSab9s9fWTFaWKNmQNBwMbxAqPuYDw==", + "dev": true, + "requires": { + "@ethersproject/base64": "^5.0.3", + "@ethersproject/bytes": "^5.0.4", + "@ethersproject/logger": "^5.0.5", + "@ethersproject/properties": "^5.0.3", + "@ethersproject/strings": "^5.0.4" + } + }, + "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" + } + }, + "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 + } + } + }, "test-value": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz", @@ -24744,9 +20312,9 @@ }, "dependencies": { "@types/node": { - "version": "8.10.65", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.65.tgz", - "integrity": "sha512-xdcqtQl1g3p/49kmcj7ZixPWOcNHA1tYNz+uN0PJEcgtN6zywK74aacTnd3eFGPuBpD7kK8vowmMRkUt6jHU/Q==", + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", "dev": true } } @@ -24844,6 +20412,12 @@ "escape-string-regexp": "^1.0.2" } }, + "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 + }, "ts-essentials": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-2.0.12.tgz", diff --git a/package.json b/package.json index 931b1186..cdcb78dd 100644 --- a/package.json +++ b/package.json @@ -4,56 +4,70 @@ "description": "Aave Protocol V2 smart contracts", "scripts": { "run-env": "npm i && tail -f /dev/null", - "buidler": "buidler", - "buidler:kovan": "buidler --network kovan", - "buidler:ropsten": "buidler--network ropsten", - "buidler:main": "buidler --network main", - "buidler:docker": "buidler --network buidlerevm_docker", - "buidler help": "buidler help", - "compile": "SKIP_LOAD=true buidler compile", - "types-gen": "npm run compile -- --force && typechain --target ethers-v5 --outDir ./types './artifacts/*.json'", - "test": "buidler test", - "test-scenarios": "buidler test test/__setup.spec.ts test/scenario.spec.ts", - "aave:evm:dev:migration": "buidler aave:dev", - "aave:evm:full:migration": "buidler aave:full", - "aave:docker:dev:migration": "npm run buidler:docker -- aave:dev", - "aave:docker:full:migration": "npm run buidler:docker -- aave:full", - "aave:kovan:dev:migration": "npm run buidler:kovan -- aave:dev --verify", - "aave:kovan:full:migration": "npm run buidler:kovan -- aave:full --verify", - "aave:ropsten:dev:migration": "npm run buidler:ropsten -- aave:dev --verify", - "aave:ropsten:full:migration": "npm run buidler:ropsten -- aave:full --verify", - "aave:main:dev:migration": "npm run buidler:main -- aave:dev --verify", - "aave:main:full:migration": "npm run buidler:main -- aave:full --verify", - "uniswap:evm:dev:migration": "buidler uniswap:dev", - "uniswap:evm:full:migration": "buidler uniswap:full --verify", - "uniswap:kovan:dev:migration": "npm run buidler:kovan -- uniswap:dev --verify", - "uniswap:kovan:full:migration": "npm run buidler:kovan -- uniswap:full --verify", - "uniswap:ropsten:dev:migration": "npm run buidler:ropsten -- uniswap:dev --verify", - "uniswap:ropsten:full:migration": "npm run buidler:ropsten -- uniswap:full --verify", - "uniswap:main:dev:migration": "npm run buidler:main -- uniswap:dev --verify", - "uniswap:main:full:migration": "npm run buidler:main -- uniswap:full --verify", - "test-repay-with-collateral": "buidler test test/__setup.spec.ts test/repay-with-collateral.spec.ts", - "test-liquidate-with-collateral": "buidler test test/__setup.spec.ts test/flash-liquidation-with-collateral.spec.ts", - "test-transfers": "buidler test test/__setup.spec.ts test/atoken-transfer.spec.ts", - "test-flash": "buidler test test/__setup.spec.ts test/flashloan.spec.ts", - "test-liquidate": "buidler test test/__setup.spec.ts test/liquidation-atoken.spec.ts", - "test-deploy": "buidler test test/__setup.spec.ts test/test-init.spec.ts", - "test-pausable": "buidler test test/__setup.spec.ts test/pausable-functions.spec.ts", - "test-permit": "buidler test test/__setup.spec.ts test/atoken-permit.spec.ts", - "test-stable-and-atokens": "buidler test test/__setup.spec.ts test/atoken-transfer.spec.ts test/stable-token.spec.ts", - "test-subgraph:scenarios": "buidler --network buidlerevm_docker test test/__setup.spec.ts test/subgraph-scenarios.spec.ts", - "dev:coverage": "buidler coverage --network coverage", - "dev:deployment": "buidler dev-deployment", - "dev:deployExample": "buidler deploy-Example", + "hardhat": "hardhat", + "hardhat:kovan": "hardhat --network kovan", + "hardhat:ropsten": "hardhat--network ropsten", + "hardhat:main": "hardhat --network main", + "hardhat:docker": "hardhat --network hardhatevm_docker", + "compile": "SKIP_LOAD=true hardhat compile", + "test": "SKIP_LOAD=true TS_NODE_TRANSPILE_ONLY=1 hardhat test", + "test-scenarios": "npm run test -- test/__setup.spec.ts test/scenario.spec.ts", + "aave:evm:dev:migration": "hardhat aave:dev", + "aave:evm:full:migration": "hardhat aave:full", + "aave:docker:dev:migration": "npm run hardhat:docker -- aave:dev", + "aave:docker:full:migration": "npm run hardhat:docker -- aave:full", + "aave:kovan:dev:migration": "npm run hardhat:kovan -- aave:dev --verify", + "aave:kovan:full:migration": "npm run hardhat:kovan -- aave:full --verify", + "aave:kovan:full:initialize": "npm run hardhat:kovan -- full:initialize-lending-pool --verify --pool Aave", + "aave:ropsten:dev:migration": "npm run hardhat:ropsten -- aave:dev --verify", + "aave:ropsten:full:migration": "npm run hardhat:ropsten -- aave:full --verify", + "aave:main:dev:migration": "npm run hardhat:main -- aave:dev --verify", + "aave:main:full:migration": "npm run hardhat:main -- aave:full --verify", + "uniswap:evm:dev:migration": "hardhat uniswap:dev", + "uniswap:evm:full:migration": "hardhat uniswap:full --verify", + "uniswap:kovan:dev:migration": "npm run hardhat:kovan -- uniswap:dev --verify", + "uniswap:kovan:full:migration": "npm run hardhat:kovan -- uniswap:full --verify", + "uniswap:ropsten:dev:migration": "npm run hardhat:ropsten -- uniswap:dev --verify", + "uniswap:ropsten:full:migration": "npm run hardhat:ropsten -- uniswap:full --verify", + "uniswap:main:dev:migration": "npm run hardhat:main -- uniswap:dev --verify", + "uniswap:main:full:migration": "npm run hardhat:main -- uniswap:full --verify", + "test-repay-with-collateral": "hardhat test test/__setup.spec.ts test/repay-with-collateral.spec.ts", + "test-liquidate-with-collateral": "hardhat test test/__setup.spec.ts test/flash-liquidation-with-collateral.spec.ts", + "test-liquidate-underlying": "hardhat test test/__setup.spec.ts test/liquidation-underlying.spec.ts", + "test-configurator": "hardhat test test/__setup.spec.ts test/configurator.spec.ts", + "test-transfers": "hardhat test test/__setup.spec.ts test/atoken-transfer.spec.ts", + "test-flash": "hardhat test test/__setup.spec.ts test/flashloan.spec.ts", + "test-liquidate": "hardhat test test/__setup.spec.ts test/liquidation-atoken.spec.ts", + "test-deploy": "hardhat test test/__setup.spec.ts test/test-init.spec.ts", + "test-pausable": "hardhat test test/__setup.spec.ts test/pausable-functions.spec.ts", + "test-permit": "hardhat test test/__setup.spec.ts test/atoken-permit.spec.ts", + "test-stable-and-atokens": "hardhat test test/__setup.spec.ts test/atoken-transfer.spec.ts test/stable-token.spec.ts", + "test-subgraph:scenarios": "hardhat --network hardhatevm_docker test test/__setup.spec.ts test/subgraph-scenarios.spec.ts", + "test-weth": "hardhat test test/__setup.spec.ts test/weth-gateway.spec.ts", + "dev:coverage": "buidler compile --force && buidler coverage --network coverage", + "dev:deployment": "hardhat dev-deployment", + "dev:deployExample": "hardhat deploy-Example", "dev:prettier": "prettier --write .", - "ci:test": "npm run compile && npm run types-gen && npm run test", - "ci:clean": "rm -rf ./artifacts ./cache ./types" + "ci:test": "npm run compile && npm run test", + "ci:clean": "rm -rf ./artifacts ./cache ./types", + "print-contracts:kovan": "npm run hardhat:kovan -- print-contracts", + "print-contracts:main": "npm run hardhat:main -- print-contracts", + "print-contracts:ropsten": "npm run hardhat:main -- print-contracts", + "dev:deployUIProvider": "npm run hardhat:kovan deploy-UiPoolDataProvider", + "kovan:verify": "npm run hardhat:kovan verify:general -- --all --pool Aave", + "ropsten:verify": "npm run hardhat:ropsten verify:general -- --all --pool Aave", + "mainnet:verify": "npm run hardhat:main verify:general -- --all --pool Aave", + "kovan:verify:tokens": "npm run hardhat:kovan verify:tokens -- --pool Aave", + "ropsten:verify:tokens": "npm run hardhat:ropsten verify:tokens -- --pool Aave", + "mainnet:verify:tokens": "npm run hardhat:main verify:tokens -- --pool Aave" }, "devDependencies": { "@nomiclabs/buidler": "^1.4.7", "@nomiclabs/buidler-ethers": "2.0.0", "@nomiclabs/buidler-etherscan": "^2.1.0", "@nomiclabs/buidler-waffle": "2.0.0", + "@nomiclabs/hardhat-ethers": "^2.0.0", + "@nomiclabs/hardhat-waffle": "^2.0.0", "@openzeppelin/contracts": "3.1.0", "@typechain/ethers-v4": "1.0.0", "@typechain/ethers-v5": "^1.0.0", @@ -65,29 +79,33 @@ "@types/mocha": "7.0.2", "@types/node": "14.0.5", "bignumber.js": "9.0.0", - "buidler-gas-reporter": "^0.1.4", "buidler-typechain": "0.1.1", "chai": "4.2.0", "chai-bignumber": "3.0.0", "chai-bn": "^0.2.1", + "dotenv": "^8.2.0", "eth-sig-util": "2.5.3", "ethereum-waffle": "3.0.2", "ethereumjs-util": "7.0.2", "ethers": "5.0.8", "globby": "^11.0.1", + "hardhat": "^2.0.2", + "hardhat-gas-reporter": "^1.0.0", + "hardhat-typechain": "^0.3.3", "husky": "^4.2.5", "lowdb": "1.0.0", "prettier": "^2.0.5", "prettier-plugin-solidity": "^1.0.0-alpha.53", "pretty-quick": "^2.0.1", "solidity-coverage": "0.7.10", + "temp-hardhat-etherscan": "^2.0.2", "ts-generator": "0.0.8", - "ts-node": "8.10.2", + "ts-node": "^8.10.2", "tslint": "^6.1.2", "tslint-config-prettier": "^1.18.0", "tslint-plugin-prettier": "^2.3.0", "typechain": "2.0.0", - "typescript": "3.9.3" + "typescript": "^3.9.3" }, "husky": { "hooks": { diff --git a/specs/harness/LendingPoolHarnessForVariableDebtToken.sol b/specs/harness/LendingPoolHarnessForVariableDebtToken.sol index 7ecde340..f5ea9be1 100644 --- a/specs/harness/LendingPoolHarnessForVariableDebtToken.sol +++ b/specs/harness/LendingPoolHarnessForVariableDebtToken.sol @@ -8,6 +8,9 @@ import {UserConfiguration} from '../../contracts/libraries/configuration/UserCon import {ReserveLogic} from '../../contracts/libraries/logic/ReserveLogic.sol'; import {ILendingPool} from '../../contracts/interfaces/ILendingPool.sol'; import {LendingPool} from '../../contracts/lendingpool/LendingPool.sol'; +import { + ILendingPoolAddressesProvider +} from '../../contracts/interfaces/ILendingPoolAddressesProvider.sol'; /* Certora: Harness that delegates calls to the original LendingPool. @@ -24,27 +27,13 @@ contract LendingPoolHarnessForVariableDebtToken is ILendingPool { ) external override { originalPool.deposit(asset, amount, onBehalfOf, referralCode); } - - function withdraw(address reserve, uint256 amount, address to) external override { - originalPool.withdraw(reserve, amount, to); - } - function getBorrowAllowance( - address fromUser, - address toUser, + function withdraw( address asset, - uint256 interestRateMode - ) external override view returns (uint256) { - return originalPool.getBorrowAllowance(fromUser, toUser, asset, interestRateMode); - } - - function delegateBorrowAllowance( - address asset, - address user, - uint256 interestRateMode, - uint256 amount + uint256 amount, + address to ) external override { - originalPool.delegateBorrowAllowance(asset, user, interestRateMode, amount); + originalPool.withdraw(asset, amount, to); } function borrow( @@ -193,12 +182,12 @@ contract LendingPoolHarnessForVariableDebtToken is ILendingPool { address receiver, address[] calldata assets, uint256[] calldata amounts, - uint256 mode, + uint256[] calldata modes, address onBehalfOf, bytes calldata params, uint16 referralCode ) external override { - originalPool.flashLoan(receiver, assets, amounts, mode, onBehalfOf, params, referralCode); + originalPool.flashLoan(receiver, assets, amounts, modes, onBehalfOf, params, referralCode); } function finalizeTransfer( @@ -211,4 +200,8 @@ contract LendingPoolHarnessForVariableDebtToken is ILendingPool { ) external override { originalPool.finalizeTransfer(asset, from, to, amount, balanceFromAfter, balanceToBefore); } + + function getAddressesProvider() external override view returns (ILendingPoolAddressesProvider) { + return originalPool.getAddressesProvider(); + } } diff --git a/tasks/deployments/deploy-UiPoolDataProvider.ts b/tasks/deployments/deploy-UiPoolDataProvider.ts new file mode 100644 index 00000000..b03ca70d --- /dev/null +++ b/tasks/deployments/deploy-UiPoolDataProvider.ts @@ -0,0 +1,27 @@ +import {task} from '@nomiclabs/buidler/config'; + +import {UiPoolDataProviderFactory} from '../../types'; +import {verifyContract} from '../../helpers/etherscan-verification'; +import {eContractid} from '../../helpers/types'; + +task(`deploy-${eContractid.UiPoolDataProvider}`, `Deploys the UiPoolDataProvider contract`) + .addFlag('verify', 'Verify UiPoolDataProvider contract via Etherscan API.') + .setAction(async ({verify}, localBRE) => { + await localBRE.run('set-bre'); + + if (!localBRE.network.config.chainId) { + throw new Error('INVALID_CHAIN_ID'); + } + + console.log(`\n- UiPoolDataProvider deployment`); + + console.log(`\tDeploying UiPoolDataProvider implementation ...`); + const uiPoolDataProvider = await new UiPoolDataProviderFactory( + await localBRE.ethers.provider.getSigner() + ).deploy(); + await uiPoolDataProvider.deployTransaction.wait(); + console.log('uiPoolDataProvider.address', uiPoolDataProvider.address); + await verifyContract(eContractid.UiPoolDataProvider, uiPoolDataProvider.address, []); + + console.log(`\tFinished UiPoolDataProvider proxy and implementation deployment`); + }); diff --git a/tasks/dev/1_mock_tokens.ts b/tasks/dev/1_mock_tokens.ts index efa3ca04..550135f5 100644 --- a/tasks/dev/1_mock_tokens.ts +++ b/tasks/dev/1_mock_tokens.ts @@ -1,8 +1,9 @@ -import {task} from '@nomiclabs/buidler/config'; +import {task} from 'hardhat/config'; import {deployAllMockTokens} from '../../helpers/contracts-deployments'; + task('dev:deploy-mock-tokens', 'Deploy mock tokens for dev enviroment') - .addOptionalParam('verify', 'Verify contracts at Etherscan') + .addFlag('verify', 'Verify contracts at Etherscan') .setAction(async ({verify}, localBRE) => { - await localBRE.run('set-bre'); + await localBRE.run('set-DRE'); await deployAllMockTokens(verify); }); diff --git a/tasks/dev/2_address_provider_registry.ts b/tasks/dev/2_address_provider_registry.ts index 1c3da96d..c386b8cf 100644 --- a/tasks/dev/2_address_provider_registry.ts +++ b/tasks/dev/2_address_provider_registry.ts @@ -1,4 +1,4 @@ -import {task} from '@nomiclabs/buidler/config'; +import {task} from 'hardhat/config'; import { deployLendingPoolAddressesProvider, deployLendingPoolAddressesProviderRegistry, @@ -9,14 +9,14 @@ task( 'dev:deploy-address-provider', 'Deploy address provider, registry and fee provider for dev enviroment' ) - .addOptionalParam('verify', 'Verify contracts at Etherscan') + .addFlag('verify', 'Verify contracts at Etherscan') .setAction(async ({verify}, localBRE) => { - await localBRE.run('set-bre'); + await localBRE.run('set-DRE'); const admin = await (await localBRE.ethers.getSigners())[0].getAddress(); const addressesProvider = await deployLendingPoolAddressesProvider(verify); - await waitForTx(await addressesProvider.setAaveAdmin(admin)); + await waitForTx(await addressesProvider.setPoolAdmin(admin)); const addressesProviderRegistry = await deployLendingPoolAddressesProviderRegistry(verify); await waitForTx( diff --git a/tasks/dev/3_lending_pool.ts b/tasks/dev/3_lending_pool.ts index 866bd6b7..b1aeb58c 100644 --- a/tasks/dev/3_lending_pool.ts +++ b/tasks/dev/3_lending_pool.ts @@ -1,4 +1,4 @@ -import {task} from '@nomiclabs/buidler/config'; +import {task} from 'hardhat/config'; import { deployATokensAndRatesHelper, deployLendingPool, @@ -15,9 +15,9 @@ import { import {insertContractAddressInDb} from '../../helpers/contracts-helpers'; task('dev:deploy-lending-pool', 'Deploy lending pool for dev enviroment') - .addOptionalParam('verify', 'Verify contracts at Etherscan') + .addFlag('verify', 'Verify contracts at Etherscan') .setAction(async ({verify}, localBRE) => { - await localBRE.run('set-bre'); + await localBRE.run('set-DRE'); const addressesProvider = await getLendingPoolAddressesProvider(); diff --git a/tasks/dev/4_oracles.ts b/tasks/dev/4_oracles.ts index a20e2381..c315491d 100644 --- a/tasks/dev/4_oracles.ts +++ b/tasks/dev/4_oracles.ts @@ -1,4 +1,4 @@ -import {task} from '@nomiclabs/buidler/config'; +import {task} from 'hardhat/config'; import { deployPriceOracle, deployChainlinkProxyPriceProvider, @@ -13,7 +13,7 @@ import { import {ICommonConfiguration, iAssetBase, TokenContractId} from '../../helpers/types'; import {waitForTx} from '../../helpers/misc-utils'; import {getAllAggregatorsAddresses, getAllTokenAddresses} from '../../helpers/mock-helpers'; -import {ConfigNames, loadPoolConfig} from '../../helpers/configuration'; +import {ConfigNames, loadPoolConfig, getWethAddress} from '../../helpers/configuration'; import { getAllMockedTokens, getLendingPoolAddressesProvider, @@ -21,10 +21,10 @@ import { } from '../../helpers/contracts-getters'; task('dev:deploy-oracles', 'Deploy oracles for dev enviroment') - .addOptionalParam('verify', 'Verify contracts at Etherscan') + .addFlag('verify', 'Verify contracts at Etherscan') .addParam('pool', `Pool name to retrieve configuration, supported: ${Object.values(ConfigNames)}`) .setAction(async ({verify, pool}, localBRE) => { - await localBRE.run('set-bre'); + await localBRE.run('set-DRE'); const poolConfig = loadPoolConfig(pool); const { Mocks: {ChainlinkAggregatorPrices, AllAssetsInitialPrices}, @@ -42,7 +42,7 @@ task('dev:deploy-oracles', 'Deploy oracles for dev enviroment') return prev; }, defaultTokenList); const addressesProvider = await getLendingPoolAddressesProvider(); - const admin = await addressesProvider.getAaveAdmin(); + const admin = await addressesProvider.getPoolAdmin(); const fallbackOracle = await deployPriceOracle(verify); await waitForTx(await fallbackOracle.setEthUsdPrice(MockUsdPriceInWei)); @@ -58,7 +58,10 @@ task('dev:deploy-oracles', 'Deploy oracles for dev enviroment') allAggregatorsAddresses ); - await deployChainlinkProxyPriceProvider([tokens, aggregators, fallbackOracle.address], verify); + await deployChainlinkProxyPriceProvider( + [tokens, aggregators, fallbackOracle.address, await getWethAddress(poolConfig)], + verify + ); await waitForTx(await addressesProvider.setPriceOracle(fallbackOracle.address)); const lendingRateOracle = await deployLendingRateOracle(verify); diff --git a/tasks/dev/5_initialize.ts b/tasks/dev/5_initialize.ts index d4ce0c5d..11d25729 100644 --- a/tasks/dev/5_initialize.ts +++ b/tasks/dev/5_initialize.ts @@ -1,11 +1,17 @@ -import {task} from '@nomiclabs/buidler/config'; +import {task} from 'hardhat/config'; import { deployLendingPoolCollateralManager, deployMockFlashLoanReceiver, deployWalletBalancerProvider, - deployAaveProtocolTestHelpers, + deployAaveProtocolDataProvider, + deployWETHGateway, } from '../../helpers/contracts-deployments'; -import {getReservesConfigByPool} from '../../helpers/configuration'; +import { + ConfigNames, + getReservesConfigByPool, + getWethAddress, + loadPoolConfig, +} from '../../helpers/configuration'; import {tEthereumAddress, AavePools, eContractid} from '../../helpers/types'; import {waitForTx, filterMapBy} from '../../helpers/misc-utils'; @@ -16,35 +22,30 @@ import { } from '../../helpers/init-helpers'; import {getAllTokenAddresses} from '../../helpers/mock-helpers'; import {ZERO_ADDRESS} from '../../helpers/constants'; -import { - getAllMockedTokens, - getLendingPool, - getLendingPoolConfiguratorProxy, - getLendingPoolAddressesProvider, -} from '../../helpers/contracts-getters'; +import {getAllMockedTokens, getLendingPoolAddressesProvider} from '../../helpers/contracts-getters'; import {insertContractAddressInDb} from '../../helpers/contracts-helpers'; task('dev:initialize-lending-pool', 'Initialize lending pool configuration.') - .addOptionalParam('verify', 'Verify contracts at Etherscan') - .setAction(async ({verify}, localBRE) => { - await localBRE.run('set-bre'); + .addFlag('verify', 'Verify contracts at Etherscan') + .addParam('pool', `Pool name to retrieve configuration, supported: ${Object.values(ConfigNames)}`) + .setAction(async ({verify, pool}, localBRE) => { + await localBRE.run('set-DRE'); + const poolConfig = loadPoolConfig(pool); const mockTokens = await getAllMockedTokens(); - const lendingPoolProxy = await getLendingPool(); - const lendingPoolConfiguratorProxy = await getLendingPoolConfiguratorProxy(); const allTokenAddresses = getAllTokenAddresses(mockTokens); const addressesProvider = await getLendingPoolAddressesProvider(); const protoPoolReservesAddresses = <{[symbol: string]: tEthereumAddress}>( - filterMapBy(allTokenAddresses, (key: string) => !key.includes('UNI')) + filterMapBy(allTokenAddresses, (key: string) => !key.includes('UNI_')) ); - const testHelpers = await deployAaveProtocolTestHelpers(addressesProvider.address, verify); + const testHelpers = await deployAaveProtocolDataProvider(addressesProvider.address, verify); const reservesParams = getReservesConfigByPool(AavePools.proto); - const admin = await addressesProvider.getAaveAdmin(); + const admin = await addressesProvider.getPoolAdmin(); await initReservesByHelper(reservesParams, protoPoolReservesAddresses, admin, ZERO_ADDRESS); await enableReservesToBorrowByHelper( @@ -76,5 +77,9 @@ task('dev:initialize-lending-pool', 'Initialize lending pool configuration.') await deployWalletBalancerProvider(addressesProvider.address, verify); - await insertContractAddressInDb(eContractid.AaveProtocolTestHelpers, testHelpers.address); + await insertContractAddressInDb(eContractid.AaveProtocolDataProvider, testHelpers.address); + + const lendingPoolAddress = await addressesProvider.getLendingPool(); + const wethAddress = await getWethAddress(poolConfig); + await deployWETHGateway([wethAddress, lendingPoolAddress]); }); diff --git a/tasks/dev/6_wallet_balance_provider.ts b/tasks/dev/6_wallet_balance_provider.ts new file mode 100644 index 00000000..be7f6419 --- /dev/null +++ b/tasks/dev/6_wallet_balance_provider.ts @@ -0,0 +1,13 @@ +import {task} from 'hardhat/config'; +import {deployWalletBalancerProvider} from '../../helpers/contracts-deployments'; + +import {getLendingPoolAddressesProvider} from '../../helpers/contracts-getters'; + +task('dev:wallet-balance-provider', 'Initialize lending pool configuration.') + .addFlag('verify', 'Verify contracts at Etherscan') + .setAction(async ({verify}, localBRE) => { + await localBRE.run('set-DRE'); + + const addressesProvider = await getLendingPoolAddressesProvider(); + await deployWalletBalancerProvider(addressesProvider.address, verify); + }); diff --git a/tasks/full/1_address_provider_registry.ts b/tasks/full/1_address_provider_registry.ts index 4dd84f08..5af922d4 100644 --- a/tasks/full/1_address_provider_registry.ts +++ b/tasks/full/1_address_provider_registry.ts @@ -1,11 +1,16 @@ -import {task} from '@nomiclabs/buidler/config'; +import {task} from 'hardhat/config'; import {getParamPerNetwork} from '../../helpers/contracts-helpers'; import { deployLendingPoolAddressesProvider, deployLendingPoolAddressesProviderRegistry, } from '../../helpers/contracts-deployments'; import {waitForTx} from '../../helpers/misc-utils'; -import {ConfigNames, loadPoolConfig, getGenesisAaveAdmin} from '../../helpers/configuration'; +import { + ConfigNames, + loadPoolConfig, + getGenesisPoolAdmin, + getEmergencyAdmin, +} from '../../helpers/configuration'; import {eEthereumNetwork} from '../../helpers/types'; import {getLendingPoolAddressesProviderRegistry} from '../../helpers/contracts-getters'; @@ -16,7 +21,7 @@ task( .addFlag('verify', 'Verify contracts at Etherscan') .addParam('pool', `Pool name to retrieve configuration, supported: ${Object.values(ConfigNames)}`) .setAction(async ({verify, pool}, localBRE) => { - await localBRE.run('set-bre'); + await localBRE.run('set-DRE'); const network = localBRE.network.name; const poolConfig = loadPoolConfig(pool); const {ProviderId} = poolConfig; @@ -24,7 +29,11 @@ task( const providerRegistryAddress = getParamPerNetwork(poolConfig.ProviderRegistry, network); // Deploy address provider and set genesis manager const addressesProvider = await deployLendingPoolAddressesProvider(verify); - await waitForTx(await addressesProvider.setAaveAdmin(await getGenesisAaveAdmin(poolConfig))); + await waitForTx(await addressesProvider.setPoolAdmin(await getGenesisPoolAdmin(poolConfig))); + const admin = await getEmergencyAdmin(poolConfig); + console.log('Admin is ', admin); + + await waitForTx(await addressesProvider.setEmergencyAdmin(admin)); // If no provider registry is set, deploy lending pool address provider registry and register the address provider const addressesProviderRegistry = !providerRegistryAddress @@ -44,4 +53,11 @@ task( if (proxyProvider && proxyProvider !== '') { await waitForTx(await addressesProvider.setPriceOracle(proxyProvider)); } + + //register the lending rate oracle + const lendingRateOracle = getParamPerNetwork(poolConfig.LendingRateOracle, network); + + if (lendingRateOracle && lendingRateOracle !== '') { + await waitForTx(await addressesProvider.setLendingRateOracle(lendingRateOracle)); + } }); diff --git a/tasks/full/2_lending_pool.ts b/tasks/full/2_lending_pool.ts index 4a10b30c..b8b57344 100644 --- a/tasks/full/2_lending_pool.ts +++ b/tasks/full/2_lending_pool.ts @@ -1,4 +1,4 @@ -import {task} from '@nomiclabs/buidler/config'; +import {task} from 'hardhat/config'; import {insertContractAddressInDb} from '../../helpers/contracts-helpers'; import { deployATokensAndRatesHelper, @@ -17,7 +17,7 @@ import { task('full:deploy-lending-pool', 'Deploy lending pool for dev enviroment') .addFlag('verify', 'Verify contracts at Etherscan') .setAction(async ({verify}, localBRE) => { - await localBRE.run('set-bre'); + await localBRE.run('set-DRE'); const addressesProvider = await getLendingPoolAddressesProvider(); diff --git a/tasks/full/3_oracles.ts b/tasks/full/3_oracles.ts index a7a39a8c..48782dba 100644 --- a/tasks/full/3_oracles.ts +++ b/tasks/full/3_oracles.ts @@ -1,4 +1,4 @@ -import {task} from '@nomiclabs/buidler/config'; +import {task} from 'hardhat/config'; import {getParamPerNetwork} from '../../helpers/contracts-helpers'; import { deployChainlinkProxyPriceProvider, @@ -7,7 +7,7 @@ import { import {setInitialMarketRatesInRatesOracleByHelper} from '../../helpers/oracles-helpers'; import {ICommonConfiguration, eEthereumNetwork, SymbolMap} from '../../helpers/types'; import {waitForTx, filterMapBy} from '../../helpers/misc-utils'; -import {ConfigNames, loadPoolConfig} from '../../helpers/configuration'; +import {ConfigNames, loadPoolConfig, getWethAddress} from '../../helpers/configuration'; import {exit} from 'process'; import { getLendingPoolAddressesProvider, @@ -19,22 +19,21 @@ task('full:deploy-oracles', 'Deploy oracles for dev enviroment') .addParam('pool', `Pool name to retrieve configuration, supported: ${Object.values(ConfigNames)}`) .setAction(async ({verify, pool}, localBRE) => { try { - await localBRE.run('set-bre'); + await localBRE.run('set-DRE'); const network = localBRE.network.name; const poolConfig = loadPoolConfig(pool); const { ProtocolGlobalParams: {UsdAddress}, LendingRateOracleRatesCommon, ReserveAssets, - ReserveSymbols, FallbackOracle, ChainlinkAggregator, } = poolConfig as ICommonConfiguration; const lendingRateOracles = filterMapBy(LendingRateOracleRatesCommon, (key) => - ReserveSymbols.includes(key) + Object.keys(ReserveAssets[network]).includes(key) ); const addressesProvider = await getLendingPoolAddressesProvider(); - const admin = await addressesProvider.getAaveAdmin(); + const admin = await addressesProvider.getPoolAdmin(); const fallbackOracle = await getParamPerNetwork(FallbackOracle, network); const reserveAssets = await getParamPerNetwork(ReserveAssets, network); @@ -47,7 +46,7 @@ task('full:deploy-oracles', 'Deploy oracles for dev enviroment') const [tokens, aggregators] = getPairsTokenAggregator(tokensToWatch, chainlinkAggregators); const chainlinkProviderPriceProvider = await deployChainlinkProxyPriceProvider( - [tokens, aggregators, fallbackOracle], + [tokens, aggregators, fallbackOracle, await getWethAddress(poolConfig)], verify ); await waitForTx( diff --git a/tasks/full/5_initialize.ts b/tasks/full/5_initialize.ts index ddc789d1..99b55f15 100644 --- a/tasks/full/5_initialize.ts +++ b/tasks/full/5_initialize.ts @@ -1,11 +1,12 @@ -import {task} from '@nomiclabs/buidler/config'; +import {task} from 'hardhat/config'; import {getParamPerNetwork} from '../../helpers/contracts-helpers'; import { deployLendingPoolCollateralManager, deployWalletBalancerProvider, - deployAaveProtocolTestHelpers, + deployAaveProtocolDataProvider, + deployWETHGateway, } from '../../helpers/contracts-deployments'; -import {loadPoolConfig, ConfigNames} from '../../helpers/configuration'; +import {loadPoolConfig, ConfigNames, getWethAddress} from '../../helpers/configuration'; import {eEthereumNetwork, ICommonConfiguration} from '../../helpers/types'; import {waitForTx} from '../../helpers/misc-utils'; import { @@ -14,11 +15,7 @@ import { enableReservesAsCollateralByHelper, } from '../../helpers/init-helpers'; import {exit} from 'process'; -import { - getLendingPool, - getLendingPoolConfiguratorProxy, - getLendingPoolAddressesProvider, -} from '../../helpers/contracts-getters'; +import {getLendingPoolAddressesProvider} from '../../helpers/contracts-getters'; import {ZERO_ADDRESS} from '../../helpers/constants'; task('full:initialize-lending-pool', 'Initialize lending pool configuration.') @@ -26,20 +23,18 @@ task('full:initialize-lending-pool', 'Initialize lending pool configuration.') .addParam('pool', `Pool name to retrieve configuration, supported: ${Object.values(ConfigNames)}`) .setAction(async ({verify, pool}, localBRE) => { try { - await localBRE.run('set-bre'); + await localBRE.run('set-DRE'); const network = localBRE.network.name; const poolConfig = loadPoolConfig(pool); const {ReserveAssets, ReservesConfig} = poolConfig as ICommonConfiguration; const reserveAssets = await getParamPerNetwork(ReserveAssets, network); - const lendingPoolProxy = await getLendingPool(); - const lendingPoolConfiguratorProxy = await getLendingPoolConfiguratorProxy(); const addressesProvider = await getLendingPoolAddressesProvider(); - const testHelpers = await deployAaveProtocolTestHelpers(addressesProvider.address, verify); + const testHelpers = await deployAaveProtocolDataProvider(addressesProvider.address, verify); - const admin = await addressesProvider.getAaveAdmin(); + const admin = await addressesProvider.getPoolAdmin(); if (!reserveAssets) { throw 'Reserve assets is undefined. Check ReserveAssets configuration at config directory'; } @@ -54,6 +49,11 @@ task('full:initialize-lending-pool', 'Initialize lending pool configuration.') ); await deployWalletBalancerProvider(addressesProvider.address, verify); + + const wethAddress = await getWethAddress(poolConfig); + const lendingPoolAddress = await addressesProvider.getLendingPool(); + + await deployWETHGateway([wethAddress, lendingPoolAddress]); } catch (err) { console.error(err); exit(1); diff --git a/tasks/full/7_data-provider.ts b/tasks/full/7_data-provider.ts new file mode 100644 index 00000000..4f0954a5 --- /dev/null +++ b/tasks/full/7_data-provider.ts @@ -0,0 +1,19 @@ +import {task} from 'hardhat/config'; +import {deployAaveProtocolDataProvider} from '../../helpers/contracts-deployments'; +import {exit} from 'process'; +import {getLendingPoolAddressesProvider} from '../../helpers/contracts-getters'; + +task('full:data-provider', 'Initialize lending pool configuration.') + .addFlag('verify', 'Verify contracts at Etherscan') + .setAction(async ({verify}, localBRE) => { + try { + await localBRE.run('set-DRE'); + + const addressesProvider = await getLendingPoolAddressesProvider(); + + await deployAaveProtocolDataProvider(addressesProvider.address, verify); + } catch (err) { + console.error(err); + exit(1); + } + }); diff --git a/tasks/migrations/aave.dev.ts b/tasks/migrations/aave.dev.ts index 03bacb94..1892cb53 100644 --- a/tasks/migrations/aave.dev.ts +++ b/tasks/migrations/aave.dev.ts @@ -1,13 +1,14 @@ -import {task} from '@nomiclabs/buidler/config'; +import {task} from 'hardhat/config'; import {checkVerification} from '../../helpers/etherscan-verification'; import {ConfigNames} from '../../helpers/configuration'; +import {printContracts} from '../../helpers/misc-utils'; task('aave:dev', 'Deploy development enviroment') .addOptionalParam('verify', 'Verify contracts at Etherscan') .setAction(async ({verify}, localBRE) => { const POOL_NAME = ConfigNames.Aave; - await localBRE.run('set-bre'); + await localBRE.run('set-DRE'); // Prevent loss of gas verifying all the needed ENVs for Etherscan verification if (verify) { @@ -29,7 +30,8 @@ task('aave:dev', 'Deploy development enviroment') await localBRE.run('dev:deploy-oracles', {verify, pool: POOL_NAME}); console.log('5. Initialize lending pool'); - await localBRE.run('dev:initialize-lending-pool', {verify}); + await localBRE.run('dev:initialize-lending-pool', {verify, pool: POOL_NAME}); console.log('\nFinished migration'); + printContracts(); }); diff --git a/tasks/migrations/aave.full.ts b/tasks/migrations/aave.full.ts index fb119103..203c01f8 100644 --- a/tasks/migrations/aave.full.ts +++ b/tasks/migrations/aave.full.ts @@ -1,7 +1,8 @@ -import {task} from '@nomiclabs/buidler/config'; +import {task} from 'hardhat/config'; import {checkVerification} from '../../helpers/etherscan-verification'; import {ConfigNames} from '../../helpers/configuration'; import {EthereumNetworkNames} from '../../helpers/types'; +import {printContracts} from '../../helpers/misc-utils'; task('aave:full', 'Deploy development enviroment') .addFlag('verify', 'Verify contracts at Etherscan') @@ -9,7 +10,7 @@ task('aave:full', 'Deploy development enviroment') const POOL_NAME = ConfigNames.Aave; const network = localBRE.network.name; - await localBRE.run('set-bre'); + await localBRE.run('set-DRE'); // Prevent loss of gas verifying all the needed ENVs for Etherscan verification if (verify) { @@ -19,13 +20,22 @@ task('aave:full', 'Deploy development enviroment') console.log('Migration started\n'); console.log('1. Deploy address provider'); - await localBRE.run('full:deploy-address-provider', {verify, pool: POOL_NAME}); + await localBRE.run('full:deploy-address-provider', {pool: POOL_NAME}); console.log('2. Deploy lending pool'); - await localBRE.run('full:deploy-lending-pool', {verify}); + await localBRE.run('full:deploy-lending-pool'); console.log('3. Initialize lending pool'); - await localBRE.run('full:initialize-lending-pool', {verify, pool: POOL_NAME}); + await localBRE.run('full:initialize-lending-pool', {pool: POOL_NAME}); + if (verify) { + printContracts(); + console.log('4. Veryfing contracts'); + await localBRE.run('verify:general', {all: true, pool: POOL_NAME}); + + console.log('5. Veryfing aTokens and debtTokens'); + await localBRE.run('verify:tokens', {pool: POOL_NAME}); + } console.log('\nFinished migrations'); + printContracts(); }); diff --git a/tasks/migrations/uniswap.dev.ts b/tasks/migrations/uniswap.dev.ts index e6c5b3e8..70a31f49 100644 --- a/tasks/migrations/uniswap.dev.ts +++ b/tasks/migrations/uniswap.dev.ts @@ -1,4 +1,4 @@ -import {task} from '@nomiclabs/buidler/config'; +import {task} from 'hardhat/config'; import {checkVerification} from '../../helpers/etherscan-verification'; import {ConfigNames} from '../../helpers/configuration'; @@ -7,7 +7,7 @@ task('uniswap:dev', 'Deploy development enviroment') .setAction(async ({verify}, localBRE) => { const POOL_NAME = ConfigNames.Uniswap; - await localBRE.run('set-bre'); + await localBRE.run('set-DRE'); // Prevent loss of gas verifying all the needed ENVs for Etherscan verification if (verify) { @@ -29,7 +29,7 @@ task('uniswap:dev', 'Deploy development enviroment') await localBRE.run('dev:deploy-oracles', {verify, pool: POOL_NAME}); console.log('5. Initialize lending pool'); - await localBRE.run('dev:initialize-lending-pool', {verify}); + await localBRE.run('dev:initialize-lending-pool', {verify, pool: POOL_NAME}); console.log('\nFinished migration'); }); diff --git a/tasks/migrations/uniswap.full.ts b/tasks/migrations/uniswap.full.ts index fef440b1..bca82466 100644 --- a/tasks/migrations/uniswap.full.ts +++ b/tasks/migrations/uniswap.full.ts @@ -1,4 +1,4 @@ -import {task} from '@nomiclabs/buidler/config'; +import {task} from 'hardhat/config'; import {checkVerification} from '../../helpers/etherscan-verification'; import {ConfigNames} from '../../helpers/configuration'; @@ -7,7 +7,7 @@ task('uniswap:full', 'Deploy development enviroment') .setAction(async ({verify}, localBRE) => { const POOL_NAME = ConfigNames.Uniswap; - await localBRE.run('set-bre'); + await localBRE.run('set-DRE'); // Prevent loss of gas verifying all the needed ENVs for Etherscan verification if (verify) { diff --git a/tasks/misc/print-contracts.ts b/tasks/misc/print-contracts.ts new file mode 100644 index 00000000..d3caf0cc --- /dev/null +++ b/tasks/misc/print-contracts.ts @@ -0,0 +1,9 @@ +import {task} from 'hardhat/config'; +import {printContracts} from '../../helpers/misc-utils'; + +task('print-contracts', 'Inits the DRE, to have access to all the plugins').setAction( + async ({}, localBRE) => { + await localBRE.run('set-DRE'); + printContracts(); + } +); diff --git a/tasks/misc/set-bre.ts b/tasks/misc/set-bre.ts index 609ac6b6..a1cb29c5 100644 --- a/tasks/misc/set-bre.ts +++ b/tasks/misc/set-bre.ts @@ -1,9 +1,9 @@ -import {task} from '@nomiclabs/buidler/config'; -import {setBRE} from '../../helpers/misc-utils'; +import {task} from 'hardhat/config'; +import {setDRE} from '../../helpers/misc-utils'; -task(`set-bre`, `Inits the BRE, to have access to all the plugins' objects`).setAction( - async (_, _BRE) => { - setBRE(_BRE); - return _BRE; +task(`set-DRE`, `Inits the DRE, to have access to all the plugins' objects`).setAction( + async (_, _DRE) => { + setDRE(_DRE); + return _DRE; } ); diff --git a/tasks/misc/verify-sc.ts b/tasks/misc/verify-sc.ts index ee1ce0e2..81f0970c 100644 --- a/tasks/misc/verify-sc.ts +++ b/tasks/misc/verify-sc.ts @@ -1,4 +1,4 @@ -import {task} from '@nomiclabs/buidler/config'; +import {task} from 'hardhat/config'; import {verifyContract, checkVerification} from '../../helpers/etherscan-verification'; interface VerifyParams { @@ -8,8 +8,7 @@ interface VerifyParams { libraries: string; } -task('verify-sc', 'Inits the BRE, to have access to all the plugins') - .addParam('contractName', 'Name of the Solidity smart contract') +task('verify-sc', 'Inits the DRE, to have access to all the plugins') .addParam('address', 'Ethereum address of the smart contract') .addOptionalParam( 'libraries', @@ -20,16 +19,11 @@ task('verify-sc', 'Inits the BRE, to have access to all the plugins') 'arguments for contract constructor', [] ) - .setAction( - async ( - {contractName, address, constructorArguments = [], libraries}: VerifyParams, - localBRE - ) => { - await localBRE.run('set-bre'); + .setAction(async ({address, constructorArguments = [], libraries}: VerifyParams, localBRE) => { + await localBRE.run('set-DRE'); - checkVerification(); + checkVerification(); - const result = await verifyContract(contractName, address, constructorArguments, libraries); - return result; - } - ); + const result = await verifyContract(address, constructorArguments, libraries); + return result; + }); diff --git a/tasks/verifications/1_general.ts b/tasks/verifications/1_general.ts new file mode 100644 index 00000000..d5accba8 --- /dev/null +++ b/tasks/verifications/1_general.ts @@ -0,0 +1,175 @@ +import {zeroAddress} from 'ethereumjs-util'; +import {task} from 'hardhat/config'; +import {loadPoolConfig, ConfigNames, getWethAddress} from '../../helpers/configuration'; +import {ZERO_ADDRESS} from '../../helpers/constants'; +import { + getAaveProtocolDataProvider, + getAddressById, + getLendingPool, + getLendingPoolAddressesProvider, + getLendingPoolAddressesProviderRegistry, + getLendingPoolCollateralManager, + getLendingPoolCollateralManagerImpl, + getLendingPoolConfiguratorImpl, + getLendingPoolConfiguratorProxy, + getLendingPoolImpl, + getWalletProvider, + getWETHGateway, +} from '../../helpers/contracts-getters'; +import {getParamPerNetwork} from '../../helpers/contracts-helpers'; +import {verifyContract} from '../../helpers/etherscan-verification'; +import {eEthereumNetwork, ICommonConfiguration} from '../../helpers/types'; + +task('verify:general', 'Deploy oracles for dev enviroment') + .addFlag('all', 'Verify all contracts at Etherscan') + .addParam('pool', `Pool name to retrieve configuration, supported: ${Object.values(ConfigNames)}`) + .setAction(async ({all, pool}, localDRE) => { + await localDRE.run('set-DRE'); + const network = localDRE.network.name as eEthereumNetwork; + const poolConfig = loadPoolConfig(pool); + const {ReserveAssets, ReservesConfig} = poolConfig as ICommonConfiguration; + + const addressesProvider = await getLendingPoolAddressesProvider(); + const addressesProviderRegistry = await getLendingPoolAddressesProviderRegistry(); + const lendingPoolProxy = await getLendingPool(); + const lendingPoolConfigurator = await getLendingPoolConfiguratorProxy(); + const lendingPoolCollateralManager = await getLendingPoolCollateralManager(); + + if (all) { + const lendingPoolImpl = await getLendingPoolImpl(); + const lendingPoolConfiguratorImpl = await getLendingPoolConfiguratorImpl(); + const lendingPoolCollateralManagerImpl = await getLendingPoolCollateralManagerImpl(); + const dataProvider = await getAaveProtocolDataProvider(); + const walletProvider = await getWalletProvider(); + const wethGateway = await getWETHGateway(); + + // Address Provider + console.log('\n- Verifying address provider...\n'); + await verifyContract(addressesProvider.address, []); + + // Address Provider Registry + console.log('\n- Verifying address provider registry...\n'); + await verifyContract(addressesProviderRegistry.address, []); + + // Lending Pool implementation + console.log('\n- Verifying LendingPool Implementation...\n'); + await verifyContract(lendingPoolImpl.address, []); + + // Lending Pool Configurator implementation + console.log('\n- Verifying LendingPool Configurator Implementation...\n'); + await verifyContract(lendingPoolConfiguratorImpl.address, []); + + // Lending Pool Collateral Manager implementation + console.log('\n- Verifying LendingPool Collateral Manager Implementation...\n'); + await verifyContract(lendingPoolCollateralManagerImpl.address, []); + + // Test helpers + console.log('\n- Verifying Aave Provider Helpers...\n'); + await verifyContract(dataProvider.address, [addressesProvider.address]); + + // Wallet balance provider + console.log('\n- Verifying Wallet Balance Provider...\n'); + await verifyContract(walletProvider.address, [addressesProvider.address]); + + // WETHGateway + console.log('\n- Verifying WETHGateway...\n'); + await verifyContract(wethGateway.address, [ + await getWethAddress(poolConfig), + lendingPoolProxy.address, + ]); + } + // Lending Pool proxy + console.log('\n- Verifying Lending Pool Proxy...\n'); + await verifyContract(lendingPoolProxy.address, [addressesProvider.address]); + + // LendingPool Conf proxy + console.log('\n- Verifying Lending Pool Configurator Proxy...\n'); + await verifyContract(lendingPoolConfigurator.address, [addressesProvider.address]); + + // Proxy collateral manager + console.log('\n- Verifying Lending Pool Collateral Manager Proxy...\n'); + await verifyContract(lendingPoolCollateralManager.address, []); + + // Tokens verification + const DAI = getParamPerNetwork(ReserveAssets, network).DAI; + const stableDebtDai = await getAddressById('stableDebtDAI'); + const variableDebtDai = await getAddressById('variableDebtDAI'); + const aDAI = await getAddressById('aDAI'); + const { + stableDebtTokenAddress, + variableDebtTokenAddress, + aTokenAddress, + interestRateStrategyAddress, + } = await lendingPoolProxy.getReserveData(DAI); + const { + baseVariableBorrowRate, + variableRateSlope1, + variableRateSlope2, + stableRateSlope1, + stableRateSlope2, + } = ReservesConfig.DAI; + + // Proxy Stable Debt + console.log('\n- Verifying DAI Stable Debt Token proxy...\n'); + await verifyContract(stableDebtTokenAddress, [lendingPoolConfigurator.address]); + + // Proxy Variable Debt + console.log('\n- Verifying DAI Variable Debt Token proxy...\n'); + await verifyContract(variableDebtTokenAddress, [lendingPoolConfigurator.address]); + + // Proxy aToken + console.log('\n- Verifying aDAI Token proxy...\n'); + await verifyContract(aTokenAddress, [lendingPoolConfigurator.address]); + + // Strategy Rate + console.log('\n- Verifying Strategy rate...\n'); + await verifyContract(interestRateStrategyAddress, [ + addressesProvider.address, + baseVariableBorrowRate, + variableRateSlope1, + variableRateSlope2, + stableRateSlope1, + stableRateSlope2, + ]); + + // aToken + console.log('\n- Verifying aToken...\n'); + await verifyContract(aDAI, [ + lendingPoolProxy.address, + DAI, + ZERO_ADDRESS, + 'Aave interest bearing DAI', + 'aDAI', + ZERO_ADDRESS, + ]); + // stableDebtToken + console.log('\n- Verifying StableDebtToken...\n'); + await verifyContract(stableDebtDai, [ + lendingPoolProxy.address, + DAI, + 'Aave stable debt bearing DAI', + 'stableDebtDAI', + ZERO_ADDRESS, + ]); + // variableDebtToken + console.log('\n- Verifying VariableDebtToken...\n'); + await verifyContract(variableDebtDai, [ + lendingPoolProxy.address, + DAI, + 'Aave variable debt bearing DAI', + 'variableDebtDAI', + ZERO_ADDRESS, + ]); + // DelegatedAwareAToken + console.log('\n- Verifying DelegatedAwareAToken...\n'); + const UNI = getParamPerNetwork(ReserveAssets, network).UNI; + const aUNI = await getAddressById('aUNI'); + await verifyContract(aUNI, [ + lendingPoolProxy.address, + UNI, + ZERO_ADDRESS, + 'Aave interest bearing UNI', + 'aUNI', + ZERO_ADDRESS, + ]); + }); diff --git a/tasks/verifications/2_tokens.ts b/tasks/verifications/2_tokens.ts new file mode 100644 index 00000000..032135ad --- /dev/null +++ b/tasks/verifications/2_tokens.ts @@ -0,0 +1,109 @@ +import {task} from 'hardhat/config'; +import {loadPoolConfig, ConfigNames, getWethAddress} from '../../helpers/configuration'; +import {ZERO_ADDRESS} from '../../helpers/constants'; +import { + getAddressById, + getLendingPool, + getLendingPoolAddressesProvider, + getLendingPoolConfiguratorProxy, +} from '../../helpers/contracts-getters'; +import {getParamPerNetwork} from '../../helpers/contracts-helpers'; +import {verifyContract} from '../../helpers/etherscan-verification'; +import {eEthereumNetwork, ICommonConfiguration, IReserveParams} from '../../helpers/types'; + +task('verify:tokens', 'Deploy oracles for dev enviroment') + .addParam('pool', `Pool name to retrieve configuration, supported: ${Object.values(ConfigNames)}`) + .setAction(async ({verify, all, pool}, localDRE) => { + await localDRE.run('set-DRE'); + const network = localDRE.network.name as eEthereumNetwork; + const poolConfig = loadPoolConfig(pool); + const {ReserveAssets, ReservesConfig} = poolConfig as ICommonConfiguration; + + const addressesProvider = await getLendingPoolAddressesProvider(); + const lendingPoolProxy = await getLendingPool(); + const lendingPoolConfigurator = await getLendingPoolConfiguratorProxy(); + + const configs = Object.entries(ReservesConfig) as [string, IReserveParams][]; + for (const entry of Object.entries(getParamPerNetwork(ReserveAssets, network))) { + const [token, tokenAddress] = entry; + console.log(`- Verifying ${token} token related contracts`); + const { + stableDebtTokenAddress, + variableDebtTokenAddress, + aTokenAddress, + interestRateStrategyAddress, + } = await lendingPoolProxy.getReserveData(tokenAddress); + + const tokenConfig = configs.find(([symbol]) => symbol === token); + if (!tokenConfig) { + throw `ReservesConfig not found for ${token} token`; + } + + const { + baseVariableBorrowRate, + variableRateSlope1, + variableRateSlope2, + stableRateSlope1, + stableRateSlope2, + } = tokenConfig[1]; + + console.log; + // Proxy Stable Debt + console.log(`\n- Verifying Stable Debt Token proxy...\n`); + await verifyContract(stableDebtTokenAddress, [lendingPoolConfigurator.address]); + + // Proxy Variable Debt + console.log(`\n- Verifying Debt Token proxy...\n`); + await verifyContract(variableDebtTokenAddress, [lendingPoolConfigurator.address]); + + // Proxy aToken + console.log('\n- Verifying aToken proxy...\n'); + await verifyContract(aTokenAddress, [lendingPoolConfigurator.address]); + + // Strategy Rate + console.log(`\n- Verifying Strategy rate...\n`); + await verifyContract(interestRateStrategyAddress, [ + addressesProvider.address, + baseVariableBorrowRate, + variableRateSlope1, + variableRateSlope2, + stableRateSlope1, + stableRateSlope2, + ]); + + const stableDebt = await getAddressById(`stableDebt${token}`); + const variableDebt = await getAddressById(`variableDebt${token}`); + const aToken = await getAddressById(`a${token}`); + + // aToken + console.log('\n- Verifying aToken...\n'); + await verifyContract(aToken, [ + lendingPoolProxy.address, + tokenAddress, + ZERO_ADDRESS, + `Aave interest bearing ${token}`, + `a${token}`, + ZERO_ADDRESS, + ]); + + // stableDebtToken + console.log('\n- Verifying StableDebtToken...\n'); + await verifyContract(stableDebt, [ + lendingPoolProxy.address, + tokenAddress, + `Aave stable debt bearing ${token}`, + `stableDebt${token}`, + ZERO_ADDRESS, + ]); + + // variableDebtToken + console.log('\n- Verifying VariableDebtToken...\n'); + await verifyContract(variableDebt, [ + lendingPoolProxy.address, + tokenAddress, + `Aave variable debt bearing ${token}`, + `variableDebt${token}`, + ZERO_ADDRESS, + ]); + } + }); diff --git a/test/__setup.spec.ts b/test/__setup.spec.ts index 4e6f24f8..559a8d08 100644 --- a/test/__setup.spec.ts +++ b/test/__setup.spec.ts @@ -1,4 +1,4 @@ -import rawBRE from '@nomiclabs/buidler'; +import rawBRE from 'hardhat'; import {MockContract} from 'ethereum-waffle'; import { insertContractAddressInDb, @@ -16,15 +16,17 @@ import { deployLendingPoolCollateralManager, deployMockFlashLoanReceiver, deployWalletBalancerProvider, - deployAaveProtocolTestHelpers, + deployAaveProtocolDataProvider, deployLendingRateOracle, deployStableAndVariableTokensHelper, deployATokensAndRatesHelper, + deployWETHGateway, + deployWETHMocked, } from '../helpers/contracts-deployments'; import {Signer} from 'ethers'; import {TokenContractId, eContractid, tEthereumAddress, AavePools} from '../helpers/types'; import {MintableErc20 as MintableERC20} from '../types/MintableErc20'; -import {getReservesConfigByPool} from '../helpers/configuration'; +import {getEmergencyAdmin, getReservesConfigByPool} from '../helpers/configuration'; import {initializeMakeSuite} from './helpers/make-suite'; import { @@ -32,7 +34,7 @@ import { deployAllMockAggregators, setInitialMarketRatesInRatesOracleByHelper, } from '../helpers/oracles-helpers'; -import {waitForTx} from '../helpers/misc-utils'; +import {DRE, waitForTx} from '../helpers/misc-utils'; import { initReservesByHelper, enableReservesToBorrowByHelper, @@ -45,6 +47,7 @@ import { getLendingPoolConfiguratorProxy, getPairsTokenAggregator, } from '../helpers/contracts-getters'; +import {Weth9Mocked} from '../types/Weth9Mocked'; const MOCK_USD_PRICE_IN_WEI = AaveConfig.ProtocolGlobalParams.MockUsdPriceInWei; const ALL_ASSETS_INITIAL_PRICES = AaveConfig.Mocks.AllAssetsInitialPrices; @@ -53,12 +56,17 @@ const MOCK_CHAINLINK_AGGREGATORS_PRICES = AaveConfig.Mocks.ChainlinkAggregatorPr const LENDING_RATE_ORACLE_RATES_COMMON = AaveConfig.LendingRateOracleRatesCommon; const deployAllMockTokens = async (deployer: Signer) => { - const tokens: {[symbol: string]: MockContract | MintableERC20} = {}; + const tokens: {[symbol: string]: MockContract | MintableERC20 | Weth9Mocked} = {}; const protoConfigData = getReservesConfigByPool(AavePools.proto); const secondaryConfigData = getReservesConfigByPool(AavePools.secondary); for (const tokenSymbol of Object.keys(TokenContractId)) { + if (tokenSymbol === 'WETH') { + tokens[tokenSymbol] = await deployWETHMocked(); + await registerContractInJsonDb(tokenSymbol.toUpperCase(), tokens[tokenSymbol]); + continue; + } let decimals = 18; let configData = (protoConfigData)[tokenSymbol]; @@ -87,9 +95,20 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => { const aaveAdmin = await deployer.getAddress(); const mockTokens = await deployAllMockTokens(deployer); + const mockTokenAddress = Object.keys(mockTokens).reduce<{[key: string]: string}>((acc, key) => { + acc[key] = mockTokens[key].address; + return acc; + }, {}); const addressesProvider = await deployLendingPoolAddressesProvider(); - await waitForTx(await addressesProvider.setAaveAdmin(aaveAdmin)); + await waitForTx(await addressesProvider.setPoolAdmin(aaveAdmin)); + + //setting users[1] as emergency admin, which is in position 2 in the DRE addresses list + const addressList = await Promise.all( + (await DRE.ethers.getSigners()).map((signer) => signer.getAddress()) + ); + + await waitForTx(await addressesProvider.setEmergencyAdmin(addressList[2])); const addressesProviderRegistry = await deployLendingPoolAddressesProviderRegistry(); await waitForTx( @@ -100,8 +119,8 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => { await waitForTx(await addressesProvider.setLendingPoolImpl(lendingPoolImpl.address)); - const address = await addressesProvider.getLendingPool(); - const lendingPoolProxy = await getLendingPool(address); + const lendingPoolAddress = await addressesProvider.getLendingPool(); + const lendingPoolProxy = await getLendingPool(lendingPoolAddress); await insertContractAddressInDb(eContractid.LendingPool, lendingPoolProxy.address); @@ -136,7 +155,7 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => { USDC: mockTokens.USDC.address, USDT: mockTokens.USDT.address, SUSD: mockTokens.SUSD.address, - LEND: mockTokens.LEND.address, + AAVE: mockTokens.AAVE.address, BAT: mockTokens.BAT.address, REP: mockTokens.REP.address, MKR: mockTokens.MKR.address, @@ -147,7 +166,10 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => { ZRX: mockTokens.ZRX.address, SNX: mockTokens.SNX.address, BUSD: mockTokens.BUSD.address, - + YFI: mockTokens.BUSD.address, + REN: mockTokens.REN.address, + UNI: mockTokens.UNI.address, + ENJ: mockTokens.ENJ.address, USD: USD_ADDRESS, UNI_DAI_ETH: mockTokens.UNI_DAI_ETH.address, @@ -183,6 +205,7 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => { tokens, aggregators, fallbackOracle.address, + mockTokens.WETH.address, ]); await waitForTx(await addressesProvider.setPriceOracle(fallbackOracle.address)); @@ -212,9 +235,9 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => { const reservesParams = getReservesConfigByPool(AavePools.proto); - const testHelpers = await deployAaveProtocolTestHelpers(addressesProvider.address); + const testHelpers = await deployAaveProtocolDataProvider(addressesProvider.address); - await insertContractAddressInDb(eContractid.AaveProtocolTestHelpers, testHelpers.address); + await insertContractAddressInDb(eContractid.AaveProtocolDataProvider, testHelpers.address); const admin = await deployer.getAddress(); console.log('Initialize configuration'); @@ -242,11 +265,13 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => { await deployWalletBalancerProvider(addressesProvider.address); + await deployWETHGateway([mockTokens.WETH.address, lendingPoolAddress]); + console.timeEnd('setup'); }; before(async () => { - await rawBRE.run('set-bre'); + await rawBRE.run('set-DRE'); const [deployer, secondaryWallet] = await getEthersSigners(); console.log('-> Deploying test environment...'); await buildTestEnv(deployer, secondaryWallet); diff --git a/test/atoken-permit.spec.ts b/test/atoken-permit.spec.ts index 44c90008..28c980e1 100644 --- a/test/atoken-permit.spec.ts +++ b/test/atoken-permit.spec.ts @@ -5,7 +5,7 @@ import {expect} from 'chai'; import {ethers} from 'ethers'; import {eEthereumNetwork} from '../helpers/types'; import {makeSuite, TestEnv} from './helpers/make-suite'; -import {BRE} from '../helpers/misc-utils'; +import {DRE} from '../helpers/misc-utils'; import { ConfigNames, getATokenDomainSeparatorPerNetwork, @@ -20,7 +20,7 @@ makeSuite('AToken: Permit', (testEnv: TestEnv) => { it('Checks the domain separator', async () => { const DOMAIN_SEPARATOR_ENCODED = getATokenDomainSeparatorPerNetwork( - eEthereumNetwork.buidlerevm, + eEthereumNetwork.hardhat, poolConfig ); @@ -47,7 +47,7 @@ makeSuite('AToken: Permit', (testEnv: TestEnv) => { const tokenName = await aDai.name(); - const chainId = BRE.network.config.chainId || BUIDLEREVM_CHAINID; + const chainId = DRE.network.config.chainId || BUIDLEREVM_CHAINID; const expiration = 0; const nonce = (await aDai._nonces(owner.address)).toNumber(); const permitAmount = ethers.utils.parseEther('2').toString(); @@ -92,7 +92,7 @@ makeSuite('AToken: Permit', (testEnv: TestEnv) => { const owner = deployer; const spender = users[1]; - const chainId = BRE.network.config.chainId || BUIDLEREVM_CHAINID; + const chainId = DRE.network.config.chainId || BUIDLEREVM_CHAINID; const deadline = MAX_UINT_AMOUNT; const nonce = (await aDai._nonces(owner.address)).toNumber(); const permitAmount = parseEther('2').toString(); @@ -134,7 +134,7 @@ makeSuite('AToken: Permit', (testEnv: TestEnv) => { const owner = deployer; const spender = users[1]; - const chainId = BRE.network.config.chainId || BUIDLEREVM_CHAINID; + const chainId = DRE.network.config.chainId || BUIDLEREVM_CHAINID; const deadline = MAX_UINT_AMOUNT; const nonce = (await aDai._nonces(owner.address)).toNumber(); const permitAmount = '0'; @@ -180,7 +180,7 @@ makeSuite('AToken: Permit', (testEnv: TestEnv) => { const owner = deployer; const spender = users[1]; - const chainId = BRE.network.config.chainId || BUIDLEREVM_CHAINID; + const chainId = DRE.network.config.chainId || BUIDLEREVM_CHAINID; const deadline = MAX_UINT_AMOUNT; const nonce = 1000; const permitAmount = '0'; @@ -215,7 +215,7 @@ makeSuite('AToken: Permit', (testEnv: TestEnv) => { const owner = deployer; const spender = users[1]; - const chainId = BRE.network.config.chainId || BUIDLEREVM_CHAINID; + const chainId = DRE.network.config.chainId || BUIDLEREVM_CHAINID; const expiration = '1'; const nonce = (await aDai._nonces(owner.address)).toNumber(); const permitAmount = '0'; @@ -250,7 +250,7 @@ makeSuite('AToken: Permit', (testEnv: TestEnv) => { const owner = deployer; const spender = users[1]; - const chainId = BRE.network.config.chainId || BUIDLEREVM_CHAINID; + const chainId = DRE.network.config.chainId || BUIDLEREVM_CHAINID; const deadline = MAX_UINT_AMOUNT; const nonce = (await aDai._nonces(owner.address)).toNumber(); const permitAmount = '0'; @@ -285,7 +285,7 @@ makeSuite('AToken: Permit', (testEnv: TestEnv) => { const owner = deployer; const spender = users[1]; - const chainId = BRE.network.config.chainId || BUIDLEREVM_CHAINID; + const chainId = DRE.network.config.chainId || BUIDLEREVM_CHAINID; const expiration = MAX_UINT_AMOUNT; const nonce = (await aDai._nonces(owner.address)).toNumber(); const permitAmount = '0'; diff --git a/test/configurator.spec.ts b/test/configurator.spec.ts index 315dc26e..79af55c5 100644 --- a/test/configurator.spec.ts +++ b/test/configurator.spec.ts @@ -11,7 +11,7 @@ const {expect} = require('chai'); makeSuite('LendingPoolConfigurator', (testEnv: TestEnv) => { const { - LPC_CALLER_NOT_AAVE_ADMIN, + CALLER_NOT_POOL_ADMIN, LPC_RESERVE_LIQUIDITY_NOT_0, RC_INVALID_LTV, RC_INVALID_LIQ_THRESHOLD, @@ -48,16 +48,6 @@ makeSuite('LendingPoolConfigurator', (testEnv: TestEnv) => { ).to.be.revertedWith(RC_INVALID_LIQ_BONUS); }); - it('Reverts trying to set an invalid reserve decimals', async () => { - const {configurator, weth} = testEnv; - - const invalidDecimals = 256; - - await expect(configurator.setReserveDecimals(weth.address, invalidDecimals)).to.be.revertedWith( - RC_INVALID_DECIMALS - ); - }); - it('Reverts trying to set an invalid reserve factor', async () => { const {configurator, weth} = testEnv; @@ -87,16 +77,16 @@ makeSuite('LendingPoolConfigurator', (testEnv: TestEnv) => { const {configurator, users, weth} = testEnv; await expect( configurator.connect(users[2].signer).deactivateReserve(weth.address), - LPC_CALLER_NOT_AAVE_ADMIN - ).to.be.revertedWith(LPC_CALLER_NOT_AAVE_ADMIN); + CALLER_NOT_POOL_ADMIN + ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); }); it('Check the onlyAaveAdmin on activateReserve ', async () => { const {configurator, users, weth} = testEnv; await expect( configurator.connect(users[2].signer).activateReserve(weth.address), - LPC_CALLER_NOT_AAVE_ADMIN - ).to.be.revertedWith(LPC_CALLER_NOT_AAVE_ADMIN); + CALLER_NOT_POOL_ADMIN + ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); }); it('Freezes the ETH reserve', async () => { @@ -156,16 +146,16 @@ makeSuite('LendingPoolConfigurator', (testEnv: TestEnv) => { const {configurator, users, weth} = testEnv; await expect( configurator.connect(users[2].signer).freezeReserve(weth.address), - LPC_CALLER_NOT_AAVE_ADMIN - ).to.be.revertedWith(LPC_CALLER_NOT_AAVE_ADMIN); + CALLER_NOT_POOL_ADMIN + ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); }); it('Check the onlyAaveAdmin on unfreezeReserve ', async () => { const {configurator, users, weth} = testEnv; await expect( configurator.connect(users[2].signer).unfreezeReserve(weth.address), - LPC_CALLER_NOT_AAVE_ADMIN - ).to.be.revertedWith(LPC_CALLER_NOT_AAVE_ADMIN); + CALLER_NOT_POOL_ADMIN + ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); }); it('Deactivates the ETH reserve for borrowing', async () => { @@ -228,16 +218,16 @@ makeSuite('LendingPoolConfigurator', (testEnv: TestEnv) => { const {configurator, users, weth} = testEnv; await expect( configurator.connect(users[2].signer).disableBorrowingOnReserve(weth.address), - LPC_CALLER_NOT_AAVE_ADMIN - ).to.be.revertedWith(LPC_CALLER_NOT_AAVE_ADMIN); + CALLER_NOT_POOL_ADMIN + ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); }); it('Check the onlyAaveAdmin on enableBorrowingOnReserve ', async () => { const {configurator, users, weth} = testEnv; await expect( configurator.connect(users[2].signer).enableBorrowingOnReserve(weth.address, true), - LPC_CALLER_NOT_AAVE_ADMIN - ).to.be.revertedWith(LPC_CALLER_NOT_AAVE_ADMIN); + CALLER_NOT_POOL_ADMIN + ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); }); it('Deactivates the ETH reserve as collateral', async () => { @@ -300,8 +290,8 @@ makeSuite('LendingPoolConfigurator', (testEnv: TestEnv) => { configurator .connect(users[2].signer) .configureReserveAsCollateral(weth.address, '7500', '8000', '10500'), - LPC_CALLER_NOT_AAVE_ADMIN - ).to.be.revertedWith(LPC_CALLER_NOT_AAVE_ADMIN); + CALLER_NOT_POOL_ADMIN + ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); }); it('Disable stable borrow rate on the ETH reserve', async () => { @@ -360,16 +350,16 @@ makeSuite('LendingPoolConfigurator', (testEnv: TestEnv) => { const {configurator, users, weth} = testEnv; await expect( configurator.connect(users[2].signer).disableReserveStableRate(weth.address), - LPC_CALLER_NOT_AAVE_ADMIN - ).to.be.revertedWith(LPC_CALLER_NOT_AAVE_ADMIN); + CALLER_NOT_POOL_ADMIN + ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); }); it('Check the onlyAaveAdmin on enableReserveStableRate', async () => { const {configurator, users, weth} = testEnv; await expect( configurator.connect(users[2].signer).enableReserveStableRate(weth.address), - LPC_CALLER_NOT_AAVE_ADMIN - ).to.be.revertedWith(LPC_CALLER_NOT_AAVE_ADMIN); + CALLER_NOT_POOL_ADMIN + ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); }); it('Changes LTV of the reserve', async () => { @@ -402,8 +392,8 @@ makeSuite('LendingPoolConfigurator', (testEnv: TestEnv) => { const {configurator, users, weth} = testEnv; await expect( configurator.connect(users[2].signer).setLtv(weth.address, '75'), - LPC_CALLER_NOT_AAVE_ADMIN - ).to.be.revertedWith(LPC_CALLER_NOT_AAVE_ADMIN); + CALLER_NOT_POOL_ADMIN + ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); }); it('Changes the reserve factor of the reserve', async () => { @@ -436,8 +426,8 @@ makeSuite('LendingPoolConfigurator', (testEnv: TestEnv) => { const {configurator, users, weth} = testEnv; await expect( configurator.connect(users[2].signer).setReserveFactor(weth.address, '2000'), - LPC_CALLER_NOT_AAVE_ADMIN - ).to.be.revertedWith(LPC_CALLER_NOT_AAVE_ADMIN); + CALLER_NOT_POOL_ADMIN + ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); }); it('Changes liquidation threshold of the reserve', async () => { @@ -470,8 +460,8 @@ makeSuite('LendingPoolConfigurator', (testEnv: TestEnv) => { const {configurator, users, weth} = testEnv; await expect( configurator.connect(users[2].signer).setLiquidationThreshold(weth.address, '80'), - LPC_CALLER_NOT_AAVE_ADMIN - ).to.be.revertedWith(LPC_CALLER_NOT_AAVE_ADMIN); + CALLER_NOT_POOL_ADMIN + ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); }); it('Changes liquidation bonus of the reserve', async () => { @@ -504,24 +494,16 @@ makeSuite('LendingPoolConfigurator', (testEnv: TestEnv) => { const {configurator, users, weth} = testEnv; await expect( configurator.connect(users[2].signer).setLiquidationBonus(weth.address, '80'), - LPC_CALLER_NOT_AAVE_ADMIN - ).to.be.revertedWith(LPC_CALLER_NOT_AAVE_ADMIN); - }); - - it('Check the onlyAaveAdmin on setReserveDecimals', async () => { - const {configurator, users, weth} = testEnv; - await expect( - configurator.connect(users[2].signer).setReserveDecimals(weth.address, '80'), - LPC_CALLER_NOT_AAVE_ADMIN - ).to.be.revertedWith(LPC_CALLER_NOT_AAVE_ADMIN); + CALLER_NOT_POOL_ADMIN + ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); }); it('Check the onlyAaveAdmin on setLiquidationBonus', async () => { const {configurator, users, weth} = testEnv; await expect( configurator.connect(users[2].signer).setLiquidationBonus(weth.address, '80'), - LPC_CALLER_NOT_AAVE_ADMIN - ).to.be.revertedWith(LPC_CALLER_NOT_AAVE_ADMIN); + CALLER_NOT_POOL_ADMIN + ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); }); it('Reverts when trying to disable the DAI reserve with liquidity on it', async () => { diff --git a/test/delegation-aware-atoken.spec.ts b/test/delegation-aware-atoken.spec.ts new file mode 100644 index 00000000..ae1e7783 --- /dev/null +++ b/test/delegation-aware-atoken.spec.ts @@ -0,0 +1,58 @@ +import {MAX_UINT_AMOUNT, ZERO_ADDRESS} from '../helpers/constants'; +import {BUIDLEREVM_CHAINID} from '../helpers/buidler-constants'; +import {buildPermitParams, getSignatureFromTypedData} from '../helpers/contracts-helpers'; +import {expect} from 'chai'; +import {ethers} from 'ethers'; +import {eEthereumNetwork, ProtocolErrors} from '../helpers/types'; +import {makeSuite, TestEnv} from './helpers/make-suite'; +import {DRE} from '../helpers/misc-utils'; +import { + ConfigNames, + getATokenDomainSeparatorPerNetwork, + loadPoolConfig, +} from '../helpers/configuration'; +import {waitForTx} from '../helpers/misc-utils'; +import { + deployDelegationAwareAToken, + deployMintableDelegationERC20, +} from '../helpers/contracts-deployments'; +import {DelegationAwareATokenFactory} from '../types'; +import {DelegationAwareAToken} from '../types/DelegationAwareAToken'; +import {MintableDelegationErc20} from '../types/MintableDelegationErc20'; + +const {parseEther} = ethers.utils; + +makeSuite('AToken: underlying delegation', (testEnv: TestEnv) => { + const poolConfig = loadPoolConfig(ConfigNames.Commons); + let delegationAToken = {}; + let delegationERC20 = {}; + + it('Deploys a new MintableDelegationERC20 and a DelegationAwareAToken', async () => { + const {pool} = testEnv; + + delegationERC20 = await deployMintableDelegationERC20(['DEL', 'DEL', '18']); + + delegationAToken = await deployDelegationAwareAToken( + [pool.address, delegationERC20.address, 'aDEL', 'aDEL', ZERO_ADDRESS], + false + ); + }); + + it('Tries to delegate with the caller not being the Aave admin', async () => { + const {users} = testEnv; + + await expect( + delegationAToken.connect(users[1].signer).delegateUnderlyingTo(users[2].address) + ).to.be.revertedWith(ProtocolErrors.CALLER_NOT_POOL_ADMIN); + }); + + it('Tries to delegate to user 2', async () => { + const {users} = testEnv; + + await delegationAToken.delegateUnderlyingTo(users[2].address); + + const delegateeAddress = await delegationERC20.delegatee(); + + expect(delegateeAddress).to.be.equal(users[2].address); + }); +}); diff --git a/test/flashloan.spec.ts b/test/flashloan.spec.ts index 387a091a..b5978d1a 100644 --- a/test/flashloan.spec.ts +++ b/test/flashloan.spec.ts @@ -24,7 +24,7 @@ makeSuite('LendingPool FlashLoan function', (testEnv: TestEnv) => { LP_INVALID_FLASHLOAN_MODE, SAFEERC20_LOWLEVEL_CALL, LP_INVALID_FLASH_LOAN_EXECUTOR_RETURN, - LP_BORROW_ALLOWANCE_ARE_NOT_ENOUGH, + LP_BORROW_ALLOWANCE_NOT_ENOUGH, } = ProtocolErrors; before(async () => { @@ -443,7 +443,7 @@ makeSuite('LendingPool FlashLoan function', (testEnv: TestEnv) => { '0x10', '0' ) - ).to.be.revertedWith(LP_BORROW_ALLOWANCE_ARE_NOT_ENOUGH); + ).to.be.revertedWith(LP_BORROW_ALLOWANCE_NOT_ENOUGH); }); it('Caller takes a WETH flashloan with mode = 1 onBehalfOf user with allowance. A loan for onBehalfOf is creatd.', async () => { @@ -454,10 +454,12 @@ makeSuite('LendingPool FlashLoan function', (testEnv: TestEnv) => { const flashAmount = ethers.utils.parseEther('0.8'); + const reserveData = await pool.getReserveData(weth.address); + + const stableDebtToken = await getVariableDebtToken(reserveData.stableDebtTokenAddress); + // Deposited for onBehalfOf user already, delegate borrow allowance - await pool - .connect(onBehalfOf.signer) - .delegateBorrowAllowance([weth.address], caller.address, [1], [flashAmount]); + await stableDebtToken.connect(onBehalfOf.signer).approveDelegation(caller.address, flashAmount); await _mockFlashLoanReceiver.setFailExecutionTransfer(true); diff --git a/test/helpers/actions.ts b/test/helpers/actions.ts index d998962b..bdd286f5 100644 --- a/test/helpers/actions.ts +++ b/test/helpers/actions.ts @@ -18,10 +18,15 @@ import { import {getReserveAddressFromSymbol, getReserveData, getUserData} from './utils/helpers'; import {convertToCurrencyDecimals} from '../../helpers/contracts-helpers'; -import {getAToken, getMintableErc20} from '../../helpers/contracts-getters'; +import { + getAToken, + getMintableErc20, + getStableDebtToken, + getVariableDebtToken, +} from '../../helpers/contracts-getters'; import {MAX_UINT_AMOUNT, ONE_YEAR} from '../../helpers/constants'; import {SignerWithAddress, TestEnv} from './make-suite'; -import {BRE, increaseTime, timeLatest, waitForTx} from '../../helpers/misc-utils'; +import {DRE, increaseTime, timeLatest, waitForTx} from '../../helpers/misc-utils'; import chai from 'chai'; import {ReserveData, UserReserveData} from './utils/interfaces'; @@ -277,9 +282,9 @@ export const withdraw = async ( }; export const delegateBorrowAllowance = async ( - reserveSymbols: string[], - amounts: string[], - interestRateModes: string[], + reserve: string, + amount: string, + interestRateMode: string, user: SignerWithAddress, receiver: tEthereumAddress, expectedResult: string, @@ -288,32 +293,33 @@ export const delegateBorrowAllowance = async ( ) => { const {pool} = testEnv; - const reserves: tEthereumAddress[] = []; - const amountsToDelegate: tEthereumAddress[] = []; - for (const reserveSymbol of reserveSymbols) { - const newLength = reserves.push(await getReserveAddressFromSymbol(reserveSymbol)); - amountsToDelegate.push( - await ( - await convertToCurrencyDecimals(reserves[newLength - 1], amounts[newLength - 1]) - ).toString() - ); - } + const reserveAddress: tEthereumAddress = await getReserveAddressFromSymbol(reserve); - const delegateAllowancePromise = pool + const amountToDelegate: string = await ( + await convertToCurrencyDecimals(reserveAddress, amount) + ).toString(); + + const reserveData = await pool.getReserveData(reserveAddress); + + const debtToken = + interestRateMode === '1' + ? await getStableDebtToken(reserveData.stableDebtTokenAddress) + : await getVariableDebtToken(reserveData.variableDebtTokenAddress); + + const delegateAllowancePromise = debtToken .connect(user.signer) - .delegateBorrowAllowance(reserves, receiver, interestRateModes, amountsToDelegate); - if (expectedResult === 'revert') { - await expect(delegateAllowancePromise, revertMessage).to.be.reverted; + .approveDelegation(receiver, amountToDelegate); + + if (expectedResult === 'revert' && revertMessage) { + await expect(delegateAllowancePromise, revertMessage).to.be.revertedWith(revertMessage); return; } else { await delegateAllowancePromise; - for (const [i, reserve] of reserves.entries()) { - expect( - ( - await pool.getBorrowAllowance(user.address, receiver, reserve, interestRateModes[i]) - ).toString() - ).to.be.equal(amountsToDelegate[i], 'borrowAllowance are set incorrectly'); - } + const allowance = await debtToken.borrowAllowance(user.address, receiver); + expect(allowance.toString()).to.be.equal( + amountToDelegate, + 'borrowAllowance is set incorrectly' + ); } }; @@ -729,9 +735,9 @@ export const getTxCostAndTimestamp = async (tx: ContractReceipt) => { if (!tx.blockNumber || !tx.transactionHash || !tx.cumulativeGasUsed) { throw new Error('No tx blocknumber'); } - const txTimestamp = new BigNumber((await BRE.ethers.provider.getBlock(tx.blockNumber)).timestamp); + const txTimestamp = new BigNumber((await DRE.ethers.provider.getBlock(tx.blockNumber)).timestamp); - const txInfo = await BRE.ethers.provider.getTransaction(tx.transactionHash); + const txInfo = await DRE.ethers.provider.getTransaction(tx.transactionHash); const txCost = new BigNumber(tx.cumulativeGasUsed.toString()).multipliedBy( txInfo.gasPrice.toString() ); diff --git a/test/helpers/make-suite.ts b/test/helpers/make-suite.ts index 62eb1e39..cd927c5b 100644 --- a/test/helpers/make-suite.ts +++ b/test/helpers/make-suite.ts @@ -1,18 +1,20 @@ -import {evmRevert, evmSnapshot, BRE} from '../../helpers/misc-utils'; +import {evmRevert, evmSnapshot, DRE} from '../../helpers/misc-utils'; import {Signer} from 'ethers'; import { getLendingPool, getLendingPoolAddressesProvider, - getAaveProtocolTestHelpers, + getAaveProtocolDataProvider, getAToken, getMintableErc20, getLendingPoolConfiguratorProxy, getPriceOracle, getLendingPoolAddressesProviderRegistry, + getWETHMocked, + getWETHGateway, } from '../../helpers/contracts-getters'; import {tEthereumAddress} from '../../helpers/types'; import {LendingPool} from '../../types/LendingPool'; -import {AaveProtocolTestHelpers} from '../../types/AaveProtocolTestHelpers'; +import {AaveProtocolDataProvider} from '../../types/AaveProtocolDataProvider'; import {MintableErc20 as MintableERC20} from '../../types/MintableErc20'; import {AToken} from '../../types/AToken'; import {LendingPoolConfigurator} from '../../types/LendingPoolConfigurator'; @@ -25,8 +27,13 @@ import {PriceOracle} from '../../types/PriceOracle'; import {LendingPoolAddressesProvider} from '../../types/LendingPoolAddressesProvider'; import {LendingPoolAddressesProviderRegistry} from '../../types/LendingPoolAddressesProviderRegistry'; import {getEthersSigners} from '../../helpers/contracts-helpers'; +import {Weth9Mocked} from '../../types/Weth9Mocked'; +import {WethGateway} from '../../types/WethGateway'; +import {solidity} from 'ethereum-waffle'; + chai.use(bignumberChai()); chai.use(almostEqual()); +chai.use(solidity); export interface SignerWithAddress { signer: Signer; @@ -38,20 +45,21 @@ export interface TestEnv { pool: LendingPool; configurator: LendingPoolConfigurator; oracle: PriceOracle; - helpersContract: AaveProtocolTestHelpers; - weth: MintableERC20; + helpersContract: AaveProtocolDataProvider; + weth: Weth9Mocked; aWETH: AToken; dai: MintableERC20; aDai: AToken; usdc: MintableERC20; - lend: MintableERC20; + aave: MintableERC20; addressesProvider: LendingPoolAddressesProvider; registry: LendingPoolAddressesProviderRegistry; + wethGateway: WethGateway; } let buidlerevmSnapshotId: string = '0x1'; const setBuidlerevmSnapshotId = (id: string) => { - if (BRE.network.name === 'buidlerevm') { + if (DRE.network.name === 'hardhat') { buidlerevmSnapshotId = id; } }; @@ -61,16 +69,17 @@ const testEnv: TestEnv = { users: [] as SignerWithAddress[], pool: {} as LendingPool, configurator: {} as LendingPoolConfigurator, - helpersContract: {} as AaveProtocolTestHelpers, + helpersContract: {} as AaveProtocolDataProvider, oracle: {} as PriceOracle, - weth: {} as MintableERC20, + weth: {} as Weth9Mocked, aWETH: {} as AToken, dai: {} as MintableERC20, aDai: {} as AToken, usdc: {} as MintableERC20, - lend: {} as MintableERC20, + aave: {} as MintableERC20, addressesProvider: {} as LendingPoolAddressesProvider, registry: {} as LendingPoolAddressesProviderRegistry, + wethGateway: {} as WethGateway, } as TestEnv; export async function initializeMakeSuite() { @@ -95,7 +104,7 @@ export async function initializeMakeSuite() { testEnv.addressesProvider = await getLendingPoolAddressesProvider(); testEnv.registry = await getLendingPoolAddressesProviderRegistry(); - testEnv.helpersContract = await getAaveProtocolTestHelpers(); + testEnv.helpersContract = await getAaveProtocolDataProvider(); const allTokens = await testEnv.helpersContract.getAllATokens(); @@ -107,14 +116,14 @@ export async function initializeMakeSuite() { const daiAddress = reservesTokens.find((token) => token.symbol === 'DAI')?.tokenAddress; const usdcAddress = reservesTokens.find((token) => token.symbol === 'USDC')?.tokenAddress; - const lendAddress = reservesTokens.find((token) => token.symbol === 'LEND')?.tokenAddress; + const aaveAddress = reservesTokens.find((token) => token.symbol === 'AAVE')?.tokenAddress; const wethAddress = reservesTokens.find((token) => token.symbol === 'WETH')?.tokenAddress; if (!aDaiAddress || !aWEthAddress) { console.log(`atoken-modifiers.spec: aTokens not correctly initialized`); process.exit(1); } - if (!daiAddress || !usdcAddress || !lendAddress || !wethAddress) { + if (!daiAddress || !usdcAddress || !aaveAddress || !wethAddress) { console.log(`atoken-modifiers.spec: USDC or DAI not correctly initialized`); process.exit(1); } @@ -124,8 +133,9 @@ export async function initializeMakeSuite() { testEnv.dai = await getMintableErc20(daiAddress); testEnv.usdc = await getMintableErc20(usdcAddress); - testEnv.lend = await getMintableErc20(lendAddress); - testEnv.weth = await getMintableErc20(wethAddress); + testEnv.aave = await getMintableErc20(aaveAddress); + testEnv.weth = await getWETHMocked(wethAddress); + testEnv.wethGateway = await getWETHGateway(); } export function makeSuite(name: string, tests: (testEnv: TestEnv) => void) { diff --git a/test/helpers/scenario-engine.ts b/test/helpers/scenario-engine.ts index fe2e302a..bb4f82f8 100644 --- a/test/helpers/scenario-engine.ts +++ b/test/helpers/scenario-engine.ts @@ -121,9 +121,9 @@ const executeAction = async (action: Action, users: SignerWithAddress[], testEnv } await delegateBorrowAllowance( - [reserve], - [amount], - [rateMode], + reserve, + amount, + rateMode, user, toUser, expected, diff --git a/test/helpers/scenarios/credit-delegation.json b/test/helpers/scenarios/credit-delegation.json index a67924ee..a0aecf1b 100644 --- a/test/helpers/scenarios/credit-delegation.json +++ b/test/helpers/scenarios/credit-delegation.json @@ -68,7 +68,7 @@ "borrowRateMode": "stable" }, "expected": "revert", - "revertMessage": "54" + "revertMessage": "59" } ] }, @@ -96,7 +96,7 @@ "borrowRateMode": "variable" }, "expected": "revert", - "revertMessage": "54" + "revertMessage": "59" } ] }, @@ -126,23 +126,6 @@ "expected": "success" } ] - }, - { - "description": "User 0 delegates borrowing of 1 WETH to user 2 with wrong borrowRateMode, revert expected", - "actions": [ - { - "name": "delegateBorrowAllowance", - "args": { - "reserve": "WETH", - "amount": "1", - "user": "0", - "borrowRateMode": "random", - "toUser": "2" - }, - "expected": "revert", - "revertMessage": "8" - } - ] } ] } diff --git a/test/helpers/scenarios/set-use-as-collateral.json b/test/helpers/scenarios/set-use-as-collateral.json index 871a78b9..53b5128e 100644 --- a/test/helpers/scenarios/set-use-as-collateral.json +++ b/test/helpers/scenarios/set-use-as-collateral.json @@ -136,13 +136,13 @@ ] }, { - "description": "User 1 Deposits 1000 LEND, disables WETH as collateral. Should revert as 1000 LEND are not enough to cover the debt (revert expected)", + "description": "User 1 Deposits 1000 AAVE, disables WETH as collateral. Should revert as 1000 AAVE are not enough to cover the debt (revert expected)", "actions": [ { "name": "mint", "args": { - "reserve": "LEND", - "amount": "1000", + "reserve": "AAVE", + "amount": "10", "user": "1" }, "expected": "success" @@ -150,7 +150,7 @@ { "name": "approve", "args": { - "reserve": "LEND", + "reserve": "AAVE", "user": "1" }, "expected": "success" @@ -158,9 +158,9 @@ { "name": "deposit", "args": { - "reserve": "LEND", + "reserve": "AAVE", - "amount": "1000", + "amount": "10", "user": "1" }, "expected": "success" @@ -178,13 +178,13 @@ ] }, { - "description": "User 1 Deposits 64000 more LEND (enough to cover the DAI debt), disables WETH as collateral", + "description": "User 1 Deposits 640 more AAVE (enough to cover the DAI debt), disables WETH as collateral", "actions": [ { "name": "mint", "args": { - "reserve": "LEND", - "amount": "64000", + "reserve": "AAVE", + "amount": "640", "user": "1" }, "expected": "success" @@ -192,9 +192,9 @@ { "name": "deposit", "args": { - "reserve": "LEND", + "reserve": "AAVE", - "amount": "64000", + "amount": "640", "user": "1" }, "expected": "success" @@ -212,17 +212,32 @@ ] }, { - "description": "User 1 disables LEND as collateral (revert expected)", + "description": "User 1 disables AAVE as collateral (revert expected)", "actions": [ { "name": "setUseAsCollateral", "args": { - "reserve": "LEND", + "reserve": "AAVE", "user": "1", "useAsCollateral": "false" }, - "expected": "User deposit is already being used as collateral" + "expected": "revert" + } + ] + }, + { + "description": "User 1 reenables WETH as collateral", + "actions": [ + { + "name": "setUseAsCollateral", + "args": { + "reserve": "WETH", + + "user": "1", + "useAsCollateral": "true" + }, + "expected": "success" } ] } diff --git a/test/helpers/utils/helpers.ts b/test/helpers/utils/helpers.ts index 7a909c20..f36a8fdb 100644 --- a/test/helpers/utils/helpers.ts +++ b/test/helpers/utils/helpers.ts @@ -10,11 +10,11 @@ import { } from '../../../helpers/contracts-getters'; import {tEthereumAddress} from '../../../helpers/types'; import BigNumber from 'bignumber.js'; -import {getDb, BRE} from '../../../helpers/misc-utils'; -import {AaveProtocolTestHelpers} from '../../../types/AaveProtocolTestHelpers'; +import {getDb, DRE} from '../../../helpers/misc-utils'; +import {AaveProtocolDataProvider} from '../../../types/AaveProtocolDataProvider'; export const getReserveData = async ( - helper: AaveProtocolTestHelpers, + helper: AaveProtocolDataProvider, reserve: tEthereumAddress ): Promise => { const [reserveData, tokenAddresses, rateOracle, token] = await Promise.all([ @@ -74,7 +74,7 @@ export const getReserveData = async ( export const getUserData = async ( pool: LendingPool, - helper: AaveProtocolTestHelpers, + helper: AaveProtocolDataProvider, reserve: string, user: tEthereumAddress, sender?: tEthereumAddress @@ -104,7 +104,7 @@ export const getUserData = async ( export const getReserveAddressFromSymbol = async (symbol: string) => { const token = await getMintableErc20( - (await getDb().get(`${symbol}.${BRE.network.name}`).value()).address + (await getDb().get(`${symbol}.${DRE.network.name}`).value()).address ); if (!token) { @@ -116,7 +116,7 @@ export const getReserveAddressFromSymbol = async (symbol: string) => { const getATokenUserData = async ( reserve: string, user: string, - helpersContract: AaveProtocolTestHelpers + helpersContract: AaveProtocolDataProvider ) => { const aTokenAddress: string = (await helpersContract.getReserveTokensAddresses(reserve)) .aTokenAddress; diff --git a/test/lending-pool-addresses-provider.spec.ts b/test/lending-pool-addresses-provider.spec.ts index 4858531a..97327d4f 100644 --- a/test/lending-pool-addresses-provider.spec.ts +++ b/test/lending-pool-addresses-provider.spec.ts @@ -21,7 +21,7 @@ makeSuite('LendingPoolAddressesProvider', (testEnv: TestEnv) => { addressesProvider.setLendingPoolImpl, addressesProvider.setLendingPoolConfiguratorImpl, addressesProvider.setLendingPoolCollateralManager, - addressesProvider.setAaveAdmin, + addressesProvider.setPoolAdmin, addressesProvider.setPriceOracle, addressesProvider.setLendingRateOracle, ]) { @@ -31,28 +31,61 @@ makeSuite('LendingPoolAddressesProvider', (testEnv: TestEnv) => { await expect( addressesProvider.setAddress( utils.keccak256(utils.toUtf8Bytes('RANDOM_ID')), - mockAddress, - ZERO_ADDRESS + mockAddress ) ).to.be.revertedWith(INVALID_OWNER_REVERT_MSG); + + await expect( + addressesProvider.setAddressAsProxy( + utils.keccak256(utils.toUtf8Bytes('RANDOM_ID')), + mockAddress + ) + ).to.be.revertedWith(INVALID_OWNER_REVERT_MSG); + }); - it('Tests adding both a proxied and non-proxied addres with `setAddress()`', async () => { + it('Tests adding a proxied address with `setAddressAsProxy()`', async () => { const {addressesProvider, users} = testEnv; const {INVALID_OWNER_REVERT_MSG} = ProtocolErrors; const currentAddressesProviderOwner = users[1]; - const mockNonProxiedAddress = createRandomAddress(); - const nonProxiedAddressId = utils.keccak256(utils.toUtf8Bytes('RANDOM_NON_PROXIED')); const mockLendingPool = await deployLendingPool(); const proxiedAddressId = utils.keccak256(utils.toUtf8Bytes('RANDOM_PROXIED')); + const proxiedAddressSetReceipt = await waitForTx( + await addressesProvider + .connect(currentAddressesProviderOwner.signer) + .setAddressAsProxy(proxiedAddressId, mockLendingPool.address) + ); + + if (!proxiedAddressSetReceipt.events || proxiedAddressSetReceipt.events?.length < 1) { + throw new Error('INVALID_EVENT_EMMITED'); + } + + expect(proxiedAddressSetReceipt.events[0].event).to.be.equal('ProxyCreated'); + expect(proxiedAddressSetReceipt.events[1].event).to.be.equal('AddressSet'); + expect(proxiedAddressSetReceipt.events[1].args?.id).to.be.equal(proxiedAddressId); + expect(proxiedAddressSetReceipt.events[1].args?.newAddress).to.be.equal( + mockLendingPool.address + ); + expect(proxiedAddressSetReceipt.events[1].args?.hasProxy).to.be.equal(true); + }); + + + it('Tests adding a non proxied address with `setAddress()`', async () => { + const {addressesProvider, users} = testEnv; + const {INVALID_OWNER_REVERT_MSG} = ProtocolErrors; + + const currentAddressesProviderOwner = users[1]; + const mockNonProxiedAddress = createRandomAddress(); + const nonProxiedAddressId = utils.keccak256(utils.toUtf8Bytes('RANDOM_NON_PROXIED')); + const nonProxiedAddressSetReceipt = await waitForTx( await addressesProvider .connect(currentAddressesProviderOwner.signer) - .setAddress(nonProxiedAddressId, mockNonProxiedAddress, ZERO_ADDRESS) + .setAddress(nonProxiedAddressId, mockNonProxiedAddress) ); expect(mockNonProxiedAddress.toLowerCase()).to.be.equal( @@ -70,22 +103,5 @@ makeSuite('LendingPoolAddressesProvider', (testEnv: TestEnv) => { ); expect(nonProxiedAddressSetReceipt.events[0].args?.hasProxy).to.be.equal(false); - const proxiedAddressSetReceipt = await waitForTx( - await addressesProvider - .connect(currentAddressesProviderOwner.signer) - .setAddress(proxiedAddressId, ZERO_ADDRESS, mockLendingPool.address) - ); - - if (!proxiedAddressSetReceipt.events || proxiedAddressSetReceipt.events?.length < 2) { - throw new Error('INVALID_EVENT_EMMITED'); - } - - expect(proxiedAddressSetReceipt.events[0].event).to.be.equal('ProxyCreated'); - expect(proxiedAddressSetReceipt.events[1].event).to.be.equal('AddressSet'); - expect(proxiedAddressSetReceipt.events[1].args?.id).to.be.equal(proxiedAddressId); - expect(proxiedAddressSetReceipt.events[1].args?.newAddress).to.be.equal( - mockLendingPool.address - ); - expect(proxiedAddressSetReceipt.events[1].args?.hasProxy).to.be.equal(true); }); }); diff --git a/test/liquidation-atoken.spec.ts b/test/liquidation-atoken.spec.ts index 8d4ba803..b0f65336 100644 --- a/test/liquidation-atoken.spec.ts +++ b/test/liquidation-atoken.spec.ts @@ -1,6 +1,6 @@ import BigNumber from 'bignumber.js'; -import {BRE} from '../helpers/misc-utils'; +import {DRE} from '../helpers/misc-utils'; import {oneEther} from '../helpers/constants'; import {convertToCurrencyDecimals} from '../helpers/contracts-helpers'; import {makeSuite} from './helpers/make-suite'; @@ -96,7 +96,10 @@ makeSuite('LendingPool liquidation - liquidator receiving aToken', (testEnv) => const userGlobalData = await pool.getUserAccountData(borrower.address); - expect(userGlobalData.healthFactor.toString()).to.be.bignumber.lt(oneEther, INVALID_HF); + expect(userGlobalData.healthFactor.toString()).to.be.bignumber.lt( + oneEther.toString(), + INVALID_HF + ); }); it('LIQUIDATION - Tries to liquidate a different currency than the loan principal', async () => { @@ -182,7 +185,7 @@ makeSuite('LendingPool liquidation - liquidator receiving aToken', (testEnv) => } const txTimestamp = new BigNumber( - (await BRE.ethers.provider.getBlock(tx.blockNumber)).timestamp + (await DRE.ethers.provider.getBlock(tx.blockNumber)).timestamp ); const variableDebtBeforeTx = calcExpectedVariableDebtTokenBalance( diff --git a/test/liquidation-underlying.spec.ts b/test/liquidation-underlying.spec.ts index 1bba749d..cccd46e8 100644 --- a/test/liquidation-underlying.spec.ts +++ b/test/liquidation-underlying.spec.ts @@ -1,6 +1,6 @@ import BigNumber from 'bignumber.js'; -import {BRE, increaseTime} from '../helpers/misc-utils'; +import {DRE, increaseTime} from '../helpers/misc-utils'; import {oneEther} from '../helpers/constants'; import {convertToCurrencyDecimals} from '../helpers/contracts-helpers'; import {makeSuite} from './helpers/make-suite'; @@ -185,7 +185,7 @@ makeSuite('LendingPool liquidation - liquidator receiving the underlying asset', return; } const txTimestamp = new BigNumber( - (await BRE.ethers.provider.getBlock(tx.blockNumber)).timestamp + (await DRE.ethers.provider.getBlock(tx.blockNumber)).timestamp ); const stableDebtBeforeTx = calcExpectedStableDebtTokenBalance( @@ -302,7 +302,7 @@ makeSuite('LendingPool liquidation - liquidator receiving the underlying asset', const usdcReserveDataBefore = await helpersContract.getReserveData(usdc.address); const ethReserveDataBefore = await helpersContract.getReserveData(weth.address); - const amountToLiquidate = BRE.ethers.BigNumber.from( + const amountToLiquidate = DRE.ethers.BigNumber.from( userReserveDataBefore.currentStableDebt.toString() ) .div(2) @@ -380,25 +380,25 @@ makeSuite('LendingPool liquidation - liquidator receiving the underlying asset', ); }); - it('User 4 deposits 1000 LEND - drops HF, liquidates the LEND, which results on a lower amount being liquidated', async () => { - const {lend, usdc, users, pool, oracle, helpersContract} = testEnv; + it('User 4 deposits 10 AAVE - drops HF, liquidates the AAVE, which results on a lower amount being liquidated', async () => { + const {aave, usdc, users, pool, oracle, helpersContract} = testEnv; const depositor = users[3]; const borrower = users[4]; const liquidator = users[5]; - //mints LEND to borrower - await lend.connect(borrower.signer).mint(await convertToCurrencyDecimals(lend.address, '1000')); + //mints AAVE to borrower + await aave.connect(borrower.signer).mint(await convertToCurrencyDecimals(aave.address, '10')); //approve protocol to access the borrower wallet - await lend.connect(borrower.signer).approve(pool.address, APPROVAL_AMOUNT_LENDING_POOL); + await aave.connect(borrower.signer).approve(pool.address, APPROVAL_AMOUNT_LENDING_POOL); - //borrower deposits 1000 LEND - const amountLENDtoDeposit = await convertToCurrencyDecimals(lend.address, '1000'); + //borrower deposits 10 AAVE + const amountToDeposit = await convertToCurrencyDecimals(aave.address, '10'); await pool .connect(borrower.signer) - .deposit(lend.address, amountLENDtoDeposit, borrower.address, '0'); + .deposit(aave.address, amountToDeposit, borrower.address, '0'); const usdcPrice = await oracle.getAssetPrice(usdc.address); //drops HF below 1 @@ -421,19 +421,19 @@ makeSuite('LendingPool liquidation - liquidator receiving the underlying asset', ); const usdcReserveDataBefore = await helpersContract.getReserveData(usdc.address); - const lendReserveDataBefore = await helpersContract.getReserveData(lend.address); + const aaveReserveDataBefore = await helpersContract.getReserveData(aave.address); const amountToLiquidate = new BigNumber(userReserveDataBefore.currentStableDebt.toString()) .div(2) .decimalPlaces(0, BigNumber.ROUND_DOWN) .toFixed(0); - const collateralPrice = await oracle.getAssetPrice(lend.address); + const collateralPrice = await oracle.getAssetPrice(aave.address); const principalPrice = await oracle.getAssetPrice(usdc.address); await pool .connect(liquidator.signer) - .liquidationCall(lend.address, usdc.address, borrower.address, amountToLiquidate, false); + .liquidationCall(aave.address, usdc.address, borrower.address, amountToLiquidate, false); const userReserveDataAfter = await helpersContract.getUserReserveData( usdc.address, @@ -443,17 +443,17 @@ makeSuite('LendingPool liquidation - liquidator receiving the underlying asset', const userGlobalDataAfter = await pool.getUserAccountData(borrower.address); const usdcReserveDataAfter = await helpersContract.getReserveData(usdc.address); - const lendReserveDataAfter = await helpersContract.getReserveData(lend.address); + const aaveReserveDataAfter = await helpersContract.getReserveData(aave.address); - const lendConfiguration = await helpersContract.getReserveConfigurationData(lend.address); - const collateralDecimals = lendConfiguration.decimals.toString(); - const liquidationBonus = lendConfiguration.liquidationBonus.toString(); + const aaveConfiguration = await helpersContract.getReserveConfigurationData(aave.address); + const collateralDecimals = aaveConfiguration.decimals.toString(); + const liquidationBonus = aaveConfiguration.liquidationBonus.toString(); const principalDecimals = ( await helpersContract.getReserveConfigurationData(usdc.address) ).decimals.toString(); - const expectedCollateralLiquidated = oneEther.multipliedBy('1000'); + const expectedCollateralLiquidated = oneEther.multipliedBy('10'); const expectedPrincipal = new BigNumber(collateralPrice.toString()) .times(expectedCollateralLiquidated) @@ -484,8 +484,8 @@ makeSuite('LendingPool liquidation - liquidator receiving the underlying asset', 'Invalid principal available liquidity' ); - expect(lendReserveDataAfter.availableLiquidity.toString()).to.be.bignumber.almostEqual( - new BigNumber(lendReserveDataBefore.availableLiquidity.toString()) + expect(aaveReserveDataAfter.availableLiquidity.toString()).to.be.bignumber.almostEqual( + new BigNumber(aaveReserveDataBefore.availableLiquidity.toString()) .minus(expectedCollateralLiquidated) .toFixed(0), 'Invalid collateral available liquidity' diff --git a/test/pausable-functions.spec.ts b/test/pausable-functions.spec.ts index 9c7f6473..56278f66 100644 --- a/test/pausable-functions.spec.ts +++ b/test/pausable-functions.spec.ts @@ -39,7 +39,7 @@ makeSuite('Pausable Pool', (testEnv: TestEnv) => { const user1Balance = await aDai.balanceOf(users[1].address); // Configurator pauses the pool - await configurator.setPoolPause(true); + await configurator.connect(users[1].signer).setPoolPause(true); // User 0 tries the transfer to User 1 await expect( @@ -59,7 +59,7 @@ makeSuite('Pausable Pool', (testEnv: TestEnv) => { ); // Configurator unpauses the pool - await configurator.setPoolPause(false); + await configurator.connect(users[1].signer).setPoolPause(false); // User 0 succeeds transfer to User 1 await aDai.connect(users[0].signer).transfer(users[1].address, amountDAItoDeposit); @@ -88,13 +88,13 @@ makeSuite('Pausable Pool', (testEnv: TestEnv) => { await dai.connect(users[0].signer).approve(pool.address, APPROVAL_AMOUNT_LENDING_POOL); // Configurator pauses the pool - await configurator.setPoolPause(true); + await configurator.connect(users[1].signer).setPoolPause(true); await expect( pool.connect(users[0].signer).deposit(dai.address, amountDAItoDeposit, users[0].address, '0') ).to.revertedWith(LP_IS_PAUSED); // Configurator unpauses the pool - await configurator.setPoolPause(false); + await configurator.connect(users[1].signer).setPoolPause(false); }); it('Withdraw', async () => { @@ -111,7 +111,7 @@ makeSuite('Pausable Pool', (testEnv: TestEnv) => { .deposit(dai.address, amountDAItoDeposit, users[0].address, '0'); // Configurator pauses the pool - await configurator.setPoolPause(true); + await configurator.connect(users[1].signer).setPoolPause(true); // user tries to burn await expect( @@ -119,24 +119,7 @@ makeSuite('Pausable Pool', (testEnv: TestEnv) => { ).to.revertedWith(LP_IS_PAUSED); // Configurator unpauses the pool - await configurator.setPoolPause(false); - }); - - it('DelegateBorrowAllowance', async () => { - const {pool, dai, users, configurator} = testEnv; - - const user = users[1]; - const toUser = users[2]; - // Pause the pool - await configurator.setPoolPause(true); - - // Try to execute liquidation - await expect( - pool.connect(user.signer).delegateBorrowAllowance([dai.address], toUser.address, ['1'], ['1']) - ).revertedWith(LP_IS_PAUSED); - - // Unpause the pool - await configurator.setPoolPause(false); + await configurator.connect(users[1].signer).setPoolPause(false); }); it('Borrow', async () => { @@ -144,7 +127,7 @@ makeSuite('Pausable Pool', (testEnv: TestEnv) => { const user = users[1]; // Pause the pool - await configurator.setPoolPause(true); + await configurator.connect(users[1].signer).setPoolPause(true); // Try to execute liquidation await expect( @@ -152,7 +135,7 @@ makeSuite('Pausable Pool', (testEnv: TestEnv) => { ).revertedWith(LP_IS_PAUSED); // Unpause the pool - await configurator.setPoolPause(false); + await configurator.connect(users[1].signer).setPoolPause(false); }); it('Repay', async () => { @@ -160,7 +143,7 @@ makeSuite('Pausable Pool', (testEnv: TestEnv) => { const user = users[1]; // Pause the pool - await configurator.setPoolPause(true); + await configurator.connect(users[1].signer).setPoolPause(true); // Try to execute liquidation await expect(pool.connect(user.signer).repay(dai.address, '1', '1', user.address)).revertedWith( @@ -168,7 +151,7 @@ makeSuite('Pausable Pool', (testEnv: TestEnv) => { ); // Unpause the pool - await configurator.setPoolPause(false); + await configurator.connect(users[1].signer).setPoolPause(false); }); it('Flash loan', async () => { @@ -181,7 +164,7 @@ makeSuite('Pausable Pool', (testEnv: TestEnv) => { await _mockFlashLoanReceiver.setFailExecutionTransfer(true); // Pause pool - await configurator.setPoolPause(true); + await configurator.connect(users[1].signer).setPoolPause(true); await expect( pool @@ -198,7 +181,7 @@ makeSuite('Pausable Pool', (testEnv: TestEnv) => { ).revertedWith(LP_IS_PAUSED); // Unpause pool - await configurator.setPoolPause(false); + await configurator.connect(users[1].signer).setPoolPause(false); }); it('Liquidation call', async () => { @@ -271,15 +254,15 @@ makeSuite('Pausable Pool', (testEnv: TestEnv) => { .toFixed(0); // Pause pool - await configurator.setPoolPause(true); + await configurator.connect(users[1].signer).setPoolPause(true); // Do liquidation - expect( + await expect( pool.liquidationCall(weth.address, usdc.address, borrower.address, amountToLiquidate, true) ).revertedWith(LP_IS_PAUSED); // Unpause pool - await configurator.setPoolPause(false); + await configurator.connect(users[1].signer).setPoolPause(false); }); it('SwapBorrowRateMode', async () => { @@ -300,7 +283,7 @@ makeSuite('Pausable Pool', (testEnv: TestEnv) => { await pool.connect(user.signer).borrow(usdc.address, amountToBorrow, 2, 0, user.address); // Pause pool - await configurator.setPoolPause(true); + await configurator.connect(users[1].signer).setPoolPause(true); // Try to repay await expect( @@ -308,21 +291,21 @@ makeSuite('Pausable Pool', (testEnv: TestEnv) => { ).revertedWith(LP_IS_PAUSED); // Unpause pool - await configurator.setPoolPause(false); + await configurator.connect(users[1].signer).setPoolPause(false); }); it('RebalanceStableBorrowRate', async () => { const {pool, dai, users, configurator} = testEnv; const user = users[1]; // Pause pool - await configurator.setPoolPause(true); + await configurator.connect(users[1].signer).setPoolPause(true); await expect( pool.connect(user.signer).rebalanceStableBorrowRate(dai.address, user.address) ).revertedWith(LP_IS_PAUSED); // Unpause pool - await configurator.setPoolPause(false); + await configurator.connect(users[1].signer).setPoolPause(false); }); it('setUserUseReserveAsCollateral', async () => { @@ -335,13 +318,13 @@ makeSuite('Pausable Pool', (testEnv: TestEnv) => { await pool.connect(user.signer).deposit(weth.address, amountWETHToDeposit, user.address, '0'); // Pause pool - await configurator.setPoolPause(true); + await configurator.connect(users[1].signer).setPoolPause(true); await expect( pool.connect(user.signer).setUserUseReserveAsCollateral(weth.address, false) ).revertedWith(LP_IS_PAUSED); // Unpause pool - await configurator.setPoolPause(false); + await configurator.connect(users[1].signer).setPoolPause(false); }); }); diff --git a/test/stable-token.spec.ts b/test/stable-token.spec.ts index 02348d8b..fecc3e78 100644 --- a/test/stable-token.spec.ts +++ b/test/stable-token.spec.ts @@ -16,9 +16,9 @@ makeSuite('Stable debt token tests', (testEnv: TestEnv) => { const stableDebtContract = await getStableDebtToken(daiStableDebtTokenAddress); - await expect(stableDebtContract.mint(deployer.address, '1', '1')).to.be.revertedWith( - AT_CALLER_MUST_BE_LENDING_POOL - ); + await expect( + stableDebtContract.mint(deployer.address, deployer.address, '1', '1') + ).to.be.revertedWith(AT_CALLER_MUST_BE_LENDING_POOL); }); it('Tries to invoke burn not being the LendingPool', async () => { diff --git a/test/token-distributor.spec.ts b/test/token-distributor.spec.ts deleted file mode 100644 index fc8c822b..00000000 --- a/test/token-distributor.spec.ts +++ /dev/null @@ -1,277 +0,0 @@ -// import { -// ITestEnv, -// ContractsInstancesOrigin, -// iBasicDistributionParams, -// iTokenBalances, -// iDistributionParams, -// } from '../utils/types'; -// import { -// TokenDistributorInstance, -// MintableERC20Instance, -// } from '../utils/typechain-types/truffle-contracts'; -// import {testEnvProvider} from '../utils/truffle/dlp-tests-env'; -// import { -// TOKEN_DISTRIBUTOR_PERCENTAGE_BASE, -// ETHEREUM_ADDRESS, -// ONE_ADDRESS, -// NIL_ADDRESS, -// } from '../utils/constants'; -// import BigNumber from 'bignumber.js'; - -// import {expect} from 'chai'; - -// const testAndExecMintAndTransferTokens = async ( -// tokenInstance: MintableERC20Instance, -// amount: string, -// minter: string, -// receiver: string -// ) => { -// const initialMinterBalance = new BigNumber(await tokenInstance.balanceOf(minter)); -// const initialReceiverBalance = new BigNumber(await tokenInstance.balanceOf(receiver)); -// await tokenInstance.mint(amount, { -// from: minter, -// }); - -// expect(initialMinterBalance.plus(amount).toFixed()).to.be.equal( -// new BigNumber(await tokenInstance.balanceOf(minter)).toFixed() -// ); - -// await tokenInstance.transfer(receiver, amount, {from: minter}); - -// expect(initialReceiverBalance.plus(amount).toFixed()).to.be.equal( -// new BigNumber(await tokenInstance.balanceOf(receiver)).toFixed() -// ); -// }; - -// const testAndExecEthTransfer = async ( -// amount: string, -// sender: string, -// receiver: string, -// web3: Web3 -// ) => { -// const initialReceiverEthBalance = await web3.eth.getBalance(receiver); -// await web3.eth.sendTransaction({ -// from: sender, -// to: receiver, -// value: amount, -// }); - -// expect(new BigNumber(initialReceiverEthBalance).plus(amount).toFixed()).to.be.equal( -// await web3.eth.getBalance(receiver) -// ); -// }; - -// const testAndExecDistributeToken = async ( -// tokenInstances: MintableERC20Instance[], -// tokenToBurnInstance: MintableERC20Instance, -// tokenDistributorInstance: TokenDistributorInstance, -// distributionParams: iBasicDistributionParams[] -// ) => { -// const tokenBalancesBefore: iTokenBalances[] = []; -// for (const [index, tokenInstance] of tokenInstances.entries()) { -// const {receivers} = distributionParams[index]; -// const tokenBalancesReceiversBefore: string[][] = [[], []]; -// for (const receiver of receivers) { -// if (receiver.toUpperCase() !== NIL_ADDRESS.toUpperCase()) { -// tokenBalancesReceiversBefore[index].push( -// (await tokenInstance.balanceOf(receiver)).toString() -// ); -// } else { -// tokenBalancesReceiversBefore[index].push( -// (await tokenToBurnInstance.balanceOf( -// await tokenDistributorInstance.recipientBurn() -// )).toString() -// ); -// } -// } -// tokenBalancesBefore.push({ -// tokenDistributor: (await tokenInstance.balanceOf( -// tokenDistributorInstance.address -// )).toString(), -// receivers: tokenBalancesReceiversBefore[index], -// }); -// } - -// const tokenDistribution = await tokenDistributorInstance.getDistribution(); - -// await tokenDistributorInstance.distribute( -// tokenInstances.map(tokenInstance => tokenInstance.address) -// ); - -// const tokenBalanceOfDistributorAfter: string[] = []; -// for (const [indexToken, tokenInstance] of tokenInstances.entries()) { -// const newLength = tokenBalanceOfDistributorAfter.push( -// (await tokenInstance.balanceOf(tokenDistributorInstance.address)).toString() -// ); -// const receivers = distributionParams[indexToken].receivers; -// expect(parseInt(tokenBalanceOfDistributorAfter[newLength - 1])).to.be.within( -// 0, -// receivers.length - 1 -// ); - -// for (const [indexReceiver, receiver] of receivers.entries()) { -// const receiverPercentage = new BigNumber(tokenDistribution[1][indexReceiver]).toFixed(); -// const tokenAmountToReceiver = new BigNumber(tokenBalancesBefore[indexToken].tokenDistributor) -// .multipliedBy(receiverPercentage) -// .dividedBy(TOKEN_DISTRIBUTOR_PERCENTAGE_BASE) -// .toFixed(0, BigNumber.ROUND_DOWN); -// const tokenBalanceOfReceiverAfter = (await tokenInstance.balanceOf(receiver)).toString(); -// const recipientBurnBalanceAfter = (await tokenToBurnInstance.balanceOf( -// await tokenDistributorInstance.recipientBurn() -// )).toString(); -// if (receiver.toUpperCase() !== NIL_ADDRESS.toUpperCase()) { -// expect(tokenBalanceOfReceiverAfter).to.be.equal( -// new BigNumber(tokenBalancesBefore[indexToken].receivers[indexReceiver]) -// .plus(tokenAmountToReceiver) -// .toFixed() -// ); -// } else { -// // 1 ether received from "burning" DAI and 264 LEND wei received from the 34% of the 777 LEND amount sent to the token distributor -// expect(recipientBurnBalanceAfter).to.be.equal('1000000000000000264'); -// } -// } -// } -// }; - -// const testAndExecDistributeEth = async ( -// tokenDistributorInstance: TokenDistributorInstance, -// tokenToBurnInstance: MintableERC20Instance, -// distributionParams: iBasicDistributionParams, -// web3: Web3 -// ) => { -// const {receivers} = distributionParams; - -// const ethBalancesReceiversBefore = []; -// for (const receiver of receivers) { -// if (receiver.toUpperCase() !== NIL_ADDRESS.toUpperCase()) { -// ethBalancesReceiversBefore.push(await web3.eth.getBalance(receiver)); -// } else { -// ethBalancesReceiversBefore.push(await web3.eth.getBalance(ONE_ADDRESS)); -// } -// } -// const ethBalancesBefore: iTokenBalances = { -// tokenDistributor: await web3.eth.getBalance(tokenDistributorInstance.address), -// receivers: ethBalancesReceiversBefore, -// }; - -// const ethDistribution = await tokenDistributorInstance.getDistribution(); - -// await tokenDistributorInstance.distribute([ETHEREUM_ADDRESS]); - -// const ethBalanceOfDistributorAfter = await web3.eth.getBalance(tokenDistributorInstance.address); - -// expect(parseInt(ethBalanceOfDistributorAfter)).to.be.within(0, receivers.length - 1); - -// for (const [index, receiver] of receivers.entries()) { -// const receiverPercentage = new BigNumber(ethDistribution[1][index]).toFixed(); -// const ethAmountToReceiver = new BigNumber(ethBalancesBefore.tokenDistributor) -// .multipliedBy(receiverPercentage) -// .dividedBy(TOKEN_DISTRIBUTOR_PERCENTAGE_BASE) -// .toFixed(0, BigNumber.ROUND_DOWN); -// const ethBalanceOfReceiverAfter = await web3.eth.getBalance(receiver); -// const recipientBurnBalanceAfter = (await tokenToBurnInstance.balanceOf( -// await tokenDistributorInstance.recipientBurn() -// )).toString(); -// if (receiver.toUpperCase() !== NIL_ADDRESS.toUpperCase()) { -// expect(ethBalanceOfReceiverAfter).to.be.equal( -// new BigNumber(ethBalancesBefore.receivers[index]).plus(ethAmountToReceiver).toFixed() -// ); -// } else { -// // 1 ether received from "burning" DAI, 1 ether from ETH and 264 LEND wei received from the 34% of the 777 LEND amount sent to the token distributor -// expect(recipientBurnBalanceAfter).to.be.equal('2000000000000000264'); -// } -// } -// }; - -// contract('TokenDistributor', async ([deployer, ...users]) => { -// // let _testEnvProvider: ITestEnv; -// // let _tokenDistributorInstance: TokenDistributorInstance; -// // let _tokenInstances: iAavePoolAssets; -// // let _web3: Web3; -// // let _depositorAddress: string; -// // let _daiDistributionParams: iDistributionParams; -// // let _lendDistributionParams: iDistributionParams; -// // let _ethDistributionParams: iDistributionParams; - -// // before('Initializing LendingPoolConfigurator test variables', async () => { -// // _testEnvProvider = await testEnvProvider( -// // artifacts, -// // [deployer, ...users], -// // ContractsInstancesOrigin.TruffleArtifacts -// // ); - -// // const { -// // deployedInstances: {tokenDistributorInstance}, -// // getAllAssetsInstances, -// // getWeb3, -// // getFirstDepositorAddressOnTests, -// // getFeeDistributionParams, -// // } = _testEnvProvider; -// // _tokenDistributorInstance = tokenDistributorInstance; -// // _tokenInstances = await getAllAssetsInstances(); -// // _web3 = await getWeb3(); -// // _depositorAddress = await getFirstDepositorAddressOnTests(); - -// // const {receivers, percentages} = await getFeeDistributionParams(); -// // _daiDistributionParams = { -// // amountToDistribute: '333', -// // receivers, -// // percentages, -// // }; -// // _lendDistributionParams = { -// // amountToDistribute: '777', -// // receivers, -// // percentages, -// // }; -// // _ethDistributionParams = { -// // amountToDistribute: '2534', -// // receivers, -// // percentages, -// // }; -// // }); - -// // it('Transfers ETH to the TokenDistributor', async () => { -// // await testAndExecEthTransfer( -// // _ethDistributionParams.amountToDistribute, -// // deployer, -// // _tokenDistributorInstance.address, -// // _web3 -// // ); -// // }); - -// // it('Mints and transfers DAI to the TokenDistributor', async () => { -// // await testAndExecMintAndTransferTokens( -// // _tokenInstances.DAI, -// // _daiDistributionParams.amountToDistribute, -// // _depositorAddress, -// // _tokenDistributorInstance.address -// // ); -// // }); - -// // it('Mints and transfers LEND to the TokenDistributor', async () => { -// // await testAndExecMintAndTransferTokens( -// // _tokenInstances.LEND, -// // _lendDistributionParams.amountToDistribute, -// // _depositorAddress, -// // _tokenDistributorInstance.address -// // ); -// // }); - -// // it('distribute() for the receivers', async () => { -// // await testAndExecDistributeToken( -// // [_tokenInstances.DAI, _tokenInstances.LEND], -// // _tokenInstances.LEND, -// // _tokenDistributorInstance, -// // [_daiDistributionParams, _lendDistributionParams] -// // ); -// // }); - -// // it('Distributes the ETH to the receivers', async () => { -// // await testAndExecDistributeEth( -// // _tokenDistributorInstance, -// // _tokenInstances.LEND, -// // _ethDistributionParams, -// // _web3 -// // ); -// // }); -// }); diff --git a/test/upgradeability.spec.ts b/test/upgradeability.spec.ts index 93fb1ddd..92ab1ee1 100644 --- a/test/upgradeability.spec.ts +++ b/test/upgradeability.spec.ts @@ -19,7 +19,7 @@ import { } from '../helpers/contracts-deployments'; makeSuite('Upgradeability', (testEnv: TestEnv) => { - const {LPC_CALLER_NOT_AAVE_ADMIN} = ProtocolErrors; + const {CALLER_NOT_POOL_ADMIN} = ProtocolErrors; let newATokenAddress: string; let newStableTokenAddress: string; let newVariableTokenAddress: string; @@ -61,7 +61,7 @@ makeSuite('Upgradeability', (testEnv: TestEnv) => { await expect( configurator.connect(users[1].signer).updateAToken(dai.address, newATokenAddress) - ).to.be.revertedWith(LPC_CALLER_NOT_AAVE_ADMIN); + ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); }); it('Upgrades the DAI Atoken implementation ', async () => { @@ -83,7 +83,7 @@ makeSuite('Upgradeability', (testEnv: TestEnv) => { configurator .connect(users[1].signer) .updateStableDebtToken(dai.address, newStableTokenAddress) - ).to.be.revertedWith(LPC_CALLER_NOT_AAVE_ADMIN); + ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); }); it('Upgrades the DAI stable debt token implementation ', async () => { @@ -109,7 +109,7 @@ makeSuite('Upgradeability', (testEnv: TestEnv) => { configurator .connect(users[1].signer) .updateVariableDebtToken(dai.address, newVariableTokenAddress) - ).to.be.revertedWith(LPC_CALLER_NOT_AAVE_ADMIN); + ).to.be.revertedWith(CALLER_NOT_POOL_ADMIN); }); it('Upgrades the DAI variable debt token implementation ', async () => { diff --git a/test/variable-debt-token.spec.ts b/test/variable-debt-token.spec.ts index 5e21f939..6c177096 100644 --- a/test/variable-debt-token.spec.ts +++ b/test/variable-debt-token.spec.ts @@ -15,9 +15,9 @@ makeSuite('Variable debt token tests', (testEnv: TestEnv) => { const variableDebtContract = await getVariableDebtToken(daiVariableDebtTokenAddress); - await expect(variableDebtContract.mint(deployer.address, '1', '1')).to.be.revertedWith( - AT_CALLER_MUST_BE_LENDING_POOL - ); + await expect( + variableDebtContract.mint(deployer.address, deployer.address, '1', '1') + ).to.be.revertedWith(AT_CALLER_MUST_BE_LENDING_POOL); }); it('Tries to invoke burn not being the LendingPool', async () => { diff --git a/test/weth-gateway.spec.ts b/test/weth-gateway.spec.ts new file mode 100644 index 00000000..20393b85 --- /dev/null +++ b/test/weth-gateway.spec.ts @@ -0,0 +1,350 @@ +import {MAX_UINT_AMOUNT} from '../helpers/constants'; +import {convertToCurrencyDecimals} from '../helpers/contracts-helpers'; +import {makeSuite, TestEnv} from './helpers/make-suite'; +import {parseEther} from 'ethers/lib/utils'; +import {DRE, waitForTx} from '../helpers/misc-utils'; +import {BigNumber} from 'ethers'; +import {getStableDebtToken, getVariableDebtToken} from '../helpers/contracts-getters'; +import {deploySelfdestructTransferMock} from '../helpers/contracts-deployments'; + +const {expect} = require('chai'); + +makeSuite('Use native ETH at LendingPool via WETHGateway', (testEnv: TestEnv) => { + const zero = BigNumber.from('0'); + const depositSize = parseEther('5'); + + it('Deposit WETH', async () => { + const {users, wethGateway, aWETH, pool} = testEnv; + + const user = users[1]; + + // Deposit with native ETH + await wethGateway.connect(user.signer).depositETH(user.address, '0', {value: depositSize}); + + const aTokensBalance = await aWETH.balanceOf(user.address); + + expect(aTokensBalance).to.be.gt(zero); + expect(aTokensBalance).to.be.gte(depositSize); + }); + + it('Withdraw WETH - Partial', async () => { + const {users, wethGateway, aWETH, pool} = testEnv; + + const user = users[1]; + const priorEthersBalance = await user.signer.getBalance(); + const aTokensBalance = await aWETH.balanceOf(user.address); + + expect(aTokensBalance).to.be.gt(zero, 'User should have aTokens.'); + + // Partially withdraw native ETH + const partialWithdraw = await convertToCurrencyDecimals(aWETH.address, '2'); + + // Approve the aTokens to Gateway so Gateway can withdraw and convert to Ether + const approveTx = await aWETH + .connect(user.signer) + .approve(wethGateway.address, MAX_UINT_AMOUNT); + const {gasUsed: approveGas} = await waitForTx(approveTx); + + // Partial Withdraw and send native Ether to user + const {gasUsed: withdrawGas} = await waitForTx( + await wethGateway.connect(user.signer).withdrawETH(partialWithdraw, user.address) + ); + + const afterPartialEtherBalance = await user.signer.getBalance(); + const afterPartialATokensBalance = await aWETH.balanceOf(user.address); + const gasCosts = approveGas.add(withdrawGas).mul(approveTx.gasPrice); + + expect(afterPartialEtherBalance).to.be.equal( + priorEthersBalance.add(partialWithdraw).sub(gasCosts), + 'User ETHER balance should contain the partial withdraw' + ); + expect(afterPartialATokensBalance).to.be.equal( + aTokensBalance.sub(partialWithdraw), + 'User aWETH balance should be substracted' + ); + }); + + it('Withdraw WETH - Full', async () => { + const {users, aWETH, wethGateway, pool} = testEnv; + + const user = users[1]; + const priorEthersBalance = await user.signer.getBalance(); + const aTokensBalance = await aWETH.balanceOf(user.address); + + expect(aTokensBalance).to.be.gt(zero, 'User should have aTokens.'); + + // Approve the aTokens to Gateway so Gateway can withdraw and convert to Ether + const approveTx = await aWETH + .connect(user.signer) + .approve(wethGateway.address, MAX_UINT_AMOUNT); + const {gasUsed: approveGas} = await waitForTx(approveTx); + + // Full withdraw + const {gasUsed: withdrawGas} = await waitForTx( + await wethGateway.connect(user.signer).withdrawETH(MAX_UINT_AMOUNT, user.address) + ); + + const afterFullEtherBalance = await user.signer.getBalance(); + const afterFullATokensBalance = await aWETH.balanceOf(user.address); + const gasCosts = approveGas.add(withdrawGas).mul(approveTx.gasPrice); + + expect(afterFullEtherBalance).to.be.eq( + priorEthersBalance.add(aTokensBalance).sub(gasCosts), + 'User ETHER balance should contain the full withdraw' + ); + expect(afterFullATokensBalance).to.be.eq(0, 'User aWETH balance should be zero'); + }); + + it('Borrow stable WETH and Full Repay with ETH', async () => { + const {users, wethGateway, aWETH, weth, pool, helpersContract} = testEnv; + const borrowSize = parseEther('1'); + const repaySize = borrowSize.add(borrowSize.mul(5).div(100)); + const user = users[1]; + + const {stableDebtTokenAddress} = await helpersContract.getReserveTokensAddresses(weth.address); + + const stableDebtToken = await getStableDebtToken(stableDebtTokenAddress); + + // Deposit with native ETH + await wethGateway.connect(user.signer).depositETH(user.address, '0', {value: depositSize}); + + const aTokensBalance = await aWETH.balanceOf(user.address); + + expect(aTokensBalance).to.be.gt(zero); + expect(aTokensBalance).to.be.gte(depositSize); + + // Borrow WETH with WETH as collateral + await waitForTx( + await pool.connect(user.signer).borrow(weth.address, borrowSize, '1', '0', user.address) + ); + + const debtBalance = await stableDebtToken.balanceOf(user.address); + + expect(debtBalance).to.be.gt(zero); + + // Full Repay WETH with native ETH + await waitForTx( + await wethGateway + .connect(user.signer) + .repayETH(MAX_UINT_AMOUNT, '1', user.address, {value: repaySize}) + ); + + const debtBalanceAfterRepay = await stableDebtToken.balanceOf(user.address); + expect(debtBalanceAfterRepay).to.be.eq(zero); + }); + + it('Borrow variable WETH and Full Repay with ETH', async () => { + const {users, wethGateway, aWETH, weth, pool, helpersContract} = testEnv; + const borrowSize = parseEther('1'); + const repaySize = borrowSize.add(borrowSize.mul(5).div(100)); + const user = users[1]; + + const {variableDebtTokenAddress} = await helpersContract.getReserveTokensAddresses( + weth.address + ); + + const varDebtToken = await getVariableDebtToken(variableDebtTokenAddress); + + // Deposit with native ETH + await wethGateway.connect(user.signer).depositETH(user.address, '0', {value: depositSize}); + + const aTokensBalance = await aWETH.balanceOf(user.address); + + expect(aTokensBalance).to.be.gt(zero); + expect(aTokensBalance).to.be.gte(depositSize); + + // Borrow WETH with WETH as collateral + await waitForTx( + await pool.connect(user.signer).borrow(weth.address, borrowSize, '2', '0', user.address) + ); + + const debtBalance = await varDebtToken.balanceOf(user.address); + + expect(debtBalance).to.be.gt(zero); + + // Partial Repay WETH loan with native ETH + const partialPayment = repaySize.div(2); + await waitForTx( + await wethGateway + .connect(user.signer) + .repayETH(partialPayment, '2', user.address, {value: partialPayment}) + ); + + const debtBalanceAfterPartialRepay = await varDebtToken.balanceOf(user.address); + expect(debtBalanceAfterPartialRepay).to.be.lt(debtBalance); + + // Full Repay WETH loan with native ETH + await waitForTx( + await wethGateway + .connect(user.signer) + .repayETH(MAX_UINT_AMOUNT, '2', user.address, {value: repaySize}) + ); + const debtBalanceAfterFullRepay = await varDebtToken.balanceOf(user.address); + expect(debtBalanceAfterFullRepay).to.be.eq(zero); + }); + + it('Borrow ETH via delegateApprove ETH and repays back', async () => { + const {users, wethGateway, aWETH, weth, helpersContract} = testEnv; + const borrowSize = parseEther('1'); + const user = users[2]; + const {variableDebtTokenAddress} = await helpersContract.getReserveTokensAddresses( + weth.address + ); + const varDebtToken = await getVariableDebtToken(variableDebtTokenAddress); + + const priorDebtBalance = await varDebtToken.balanceOf(user.address); + expect(priorDebtBalance).to.be.eq(zero); + + // Deposit WETH with native ETH + await wethGateway.connect(user.signer).depositETH(user.address, '0', {value: depositSize}); + + const aTokensBalance = await aWETH.balanceOf(user.address); + + expect(aTokensBalance).to.be.gt(zero); + expect(aTokensBalance).to.be.gte(depositSize); + + // Delegates borrowing power of WETH to WETHGateway + await waitForTx( + await varDebtToken.connect(user.signer).approveDelegation(wethGateway.address, borrowSize) + ); + + // Borrows ETH with WETH as collateral + await waitForTx(await wethGateway.connect(user.signer).borrowETH(borrowSize, '2', '0')); + + const debtBalance = await varDebtToken.balanceOf(user.address); + + expect(debtBalance).to.be.gt(zero); + + // Full Repay WETH loan with native ETH + await waitForTx( + await wethGateway + .connect(user.signer) + .repayETH(MAX_UINT_AMOUNT, '2', user.address, {value: borrowSize.mul(2)}) + ); + const debtBalanceAfterFullRepay = await varDebtToken.balanceOf(user.address); + expect(debtBalanceAfterFullRepay).to.be.eq(zero); + }); + + it('Should revert if receiver function receives Ether if not WETH', async () => { + const {users, wethGateway} = testEnv; + const user = users[0]; + const amount = parseEther('1'); + + // Call receiver function (empty data + value) + await expect( + user.signer.sendTransaction({ + to: wethGateway.address, + value: amount, + gasLimit: DRE.network.config.gas, + }) + ).to.be.revertedWith('Receive not allowed'); + }); + + it('Should revert if fallback functions is called with Ether', async () => { + const {users, wethGateway} = testEnv; + const user = users[0]; + const amount = parseEther('1'); + const fakeABI = ['function wantToCallFallback()']; + const abiCoder = new DRE.ethers.utils.Interface(fakeABI); + const fakeMethodEncoded = abiCoder.encodeFunctionData('wantToCallFallback', []); + + // Call fallback function with value + await expect( + user.signer.sendTransaction({ + to: wethGateway.address, + data: fakeMethodEncoded, + value: amount, + gasLimit: DRE.network.config.gas, + }) + ).to.be.revertedWith('Fallback not allowed'); + }); + + it('Should revert if fallback functions is called', async () => { + const {users, wethGateway} = testEnv; + const user = users[0]; + + const fakeABI = ['function wantToCallFallback()']; + const abiCoder = new DRE.ethers.utils.Interface(fakeABI); + const fakeMethodEncoded = abiCoder.encodeFunctionData('wantToCallFallback', []); + + // Call fallback function without value + await expect( + user.signer.sendTransaction({ + to: wethGateway.address, + data: fakeMethodEncoded, + gasLimit: DRE.network.config.gas, + }) + ).to.be.revertedWith('Fallback not allowed'); + }); + + it('Getters should retrieve correct state', async () => { + const {aWETH, weth, pool, wethGateway} = testEnv; + + const WETHAddress = await wethGateway.getWETHAddress(); + const aWETHAddress = await wethGateway.getAWETHAddress(); + const poolAddress = await wethGateway.getLendingPoolAddress(); + + expect(WETHAddress).to.be.equal(weth.address); + expect(aWETHAddress).to.be.equal(aWETH.address); + expect(poolAddress).to.be.equal(pool.address); + }); + + it('Owner can do emergency token recovery', async () => { + const {users, dai, wethGateway, deployer} = testEnv; + const user = users[0]; + const amount = parseEther('1'); + + await dai.connect(user.signer).mint(amount); + const daiBalanceAfterMint = await dai.balanceOf(user.address); + + await dai.connect(user.signer).transfer(wethGateway.address, amount); + const daiBalanceAfterBadTransfer = await dai.balanceOf(user.address); + expect(daiBalanceAfterBadTransfer).to.be.eq( + daiBalanceAfterMint.sub(amount), + 'User should have lost the funds here.' + ); + + await wethGateway + .connect(deployer.signer) + .emergencyTokenTransfer(dai.address, user.address, amount); + const daiBalanceAfterRecovery = await dai.balanceOf(user.address); + + expect(daiBalanceAfterRecovery).to.be.eq( + daiBalanceAfterMint, + 'User should recover the funds due emergency token transfer' + ); + }); + + it('Owner can do emergency native ETH recovery', async () => { + const {users, wethGateway, deployer} = testEnv; + const user = users[0]; + const amount = parseEther('1'); + const userBalancePriorCall = await user.signer.getBalance(); + + // Deploy contract with payable selfdestruct contract + const selfdestructContract = await deploySelfdestructTransferMock(); + + // Selfdestruct the mock, pointing to WETHGateway address + const callTx = await selfdestructContract + .connect(user.signer) + .destroyAndTransfer(wethGateway.address, {value: amount}); + const {gasUsed} = await waitForTx(callTx); + const gasFees = gasUsed.mul(callTx.gasPrice); + const userBalanceAfterCall = await user.signer.getBalance(); + + expect(userBalanceAfterCall).to.be.eq(userBalancePriorCall.sub(amount).sub(gasFees), ''); + 'User should have lost the funds'; + + // Recover the funds from the contract and sends back to the user + await wethGateway.connect(deployer.signer).emergencyEtherTransfer(user.address, amount); + + const userBalanceAfterRecovery = await user.signer.getBalance(); + const wethGatewayAfterRecovery = await DRE.ethers.provider.getBalance(wethGateway.address); + + expect(userBalanceAfterRecovery).to.be.eq( + userBalancePriorCall.sub(gasFees), + 'User should recover the funds due emergency eth transfer.' + ); + expect(wethGatewayAfterRecovery).to.be.eq('0', 'WETHGateway ether balance should be zero.'); + }); +}); diff --git a/tsconfig.json b/tsconfig.json index edf9e693..e6a15a81 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,16 +1,14 @@ { "compilerOptions": { - "target": "ES2019", + "target": "es2019", "module": "commonjs", "strict": true, "esModuleInterop": true, - "outDir": "dist", - "resolveJsonModule": true, - "downlevelIteration": true + "outDir": "dist" }, - "include": ["./**/*"], + "include": ["./scripts", "./test"], "files": [ - "./buidler.config.ts", + "./hardhat.config.ts", "node_modules/@nomiclabs/buidler-ethers/src/type-extensions.d.ts", "node_modules/buidler-typechain/src/type-extensions.d.ts", "node_modules/@nomiclabs/buidler-waffle/src/type-extensions.d.ts",